83.网游逆向分析与插件开发-背包的获取-自动化助手显示装备数据

内容参考于:易道云信息技术研究院VIP课

上一个内容:装备栏数据与算法的C++还原-CSDN博客

 码云地址(ui显示角色数据 分支):https://gitee.com/dye_your_fingers/sro_-ex.git

码云版本号:849fed846405438d2220b8ab04fda2522e74482a

代码下载地址,在 SRO_EX 目录下,文件名为:SRO_Ex-自动化助手显示装备数据.zip

链接:https://pan.baidu.com/s/1W-JpUcGOWbSJmMdmtMzYZg

提取码:q9n5

--来自百度网盘超级会员V4的分享

HOOK引擎,文件名为:黑兔sdk.zip

链接:https://pan.baidu.com/s/1IB-Zs6hi3yU8LC2f-8hIEw

提取码:78h8

--来自百度网盘超级会员V4的分享

以 82.网游逆向分析与插件开发-背包的获取-装备栏数据与算法的C++还原-CSDN博客 它的代码为基础进行修改

效果图:

83.网游逆向分析与插件开发-背包的获取-自动化助手显示装备数据_第1张图片

经过分析背包与物品的数据(也就是它们对象的指针),发现几个问题,就是找到一个好的切入点,那么会容易非常多,如果没有好的切入点,就会很累很累,这是第一个问题,然后第二个问题,现在写代码的方式,在将来扩展起来会发现,会很轻松很容易,管理起来会很方便。

新加读取装备信息按钮:

83.网游逆向分析与插件开发-背包的获取-自动化助手显示装备数据_第2张图片

EquipPack.h文件的修改,EquipPack类中加 public 修饰符

#pragma once
#include "ITEM.h"

// 装备栏格子索引
enum class EquipType {
	Hat = 0,
	Jacket = 1,
	Showlder = 2,
	Hand = 3,
	Trousers = 4,
	Shoe = 5,
	Weapon = 6,
	WeaponEx = 7,
	Ol = 8,
	Earring = 9,
	NeckLace = 10,
	RingLeft = 11,
	RingRight = 12
};

typedef class EquipPack
{
public:
	PITEM GetItem(EquipType index);
}*PEquipPack;

ITEM.cpp文件的修改,新加GetNameByWide函数,修改了GetName函数

#include "pch.h"
#include "ITEM.h"
#include "extern_all.h"


ITEM::PROC ITEM::_GetItemRes{};
LPVOID ITEM::GetItemRes()
{
	LPVOID resPtr = (this->*_GetItemRes)();
	resPtr = (LPVOID)((DWORD)resPtr + 0x60);
	return resPtr;
}

PSROSTRING ITEM::GetName()
{
	LPVOID p = GetItemRes();
	if (p)	return _pgamebase->SRO_Res->ReadItemTitle(p);
	else return NULL;
}

wchar_t* ITEM::GetNameByWide()
{
	LPVOID p = GetItemRes();
	if (p)	return _pgamebase->SRO_Res->ReadItemTitle(p)->wcstr();
	return L"无法读取";
}

ITEM.h文件的修改,新加 GetNameByWide函数

#pragma once
#include "SRO_String.h"

typedef class ITEM
{
	typedef LPVOID(ITEM::* PROC)();
public:
	static PROC _GetItemRes;
protected:
	char pad_0000[52]; //0x0000
public:
	int Type; //0x0034 类型
protected:
	char pad_0038[84]; //0x0038
public:
	int Elv; //0x008C 装备强化程度
protected:
	char pad_0090[8]; //0x0090
public:
	int Durabillty; //0x0098 耐久度
	int Count; //0x009C 数量
protected:
	char pad_00A0[64]; //0x00A0
public:
	int MaxPhyAttack; //0x00E0 最大物理攻击力
	int MinPhyAttack; //0x00E4 最小物理攻击力
	int MaxMagAttack; //0x00E8 最大魔法攻击力
	int MinMagAttack; //0x00EC 最小魔法攻击力
protected:
	char pad_00F0[48]; //0x00F0
public:
	int MaxDurabillty; //0x0120 最大耐久度
protected:
	char pad_0124[16]; //0x0124
public:
	int mingzhonglv; //0x0134 命中率
protected:
	char pad_0138[152]; //0x0138
public:
	int Plv; //0x01D0 宠物等级
protected:
	char pad_01D4[0xc]; //0x01D4
public:
	LPVOID GetItemRes();
	// 获取物品名
	PSROSTRING GetName();
	wchar_t* GetNameByWide();
}*PITEM; //Size: 0x0488

CUIWnd_1.h文件的修改,新加 OnBnClickedButton2函数声明

#pragma once
#include "afxdialogex.h"

// CUIWnd_1 对话框

class CUIWnd_1 : public CDialogEx
{
	DECLARE_DYNAMIC(CUIWnd_1)

public:
	CUIWnd_1(CWnd* pParent = nullptr);   // 标准构造函数
	virtual ~CUIWnd_1();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_PAGE_1 };
#endif

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedButton1();
	CListBox lstPack;
	afx_msg void OnBnClickedButton2();
};

CUIWnd_1cpp文件的修改,新加 OnBnClickedButton2函数,修改了 BEGIN_MESSAGE_MAP宏

// CUIWnd_1.cpp: 实现文件
//

#include "pch.h"
#include "htdMfcDll.h"
#include "CUIWnd_1.h"
#include "afxdialogex.h"
#include "extern_all.h"


// CUIWnd_1 对话框

IMPLEMENT_DYNAMIC(CUIWnd_1, CDialogEx)

CUIWnd_1::CUIWnd_1(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_PAGE_1, pParent)
{

}

CUIWnd_1::~CUIWnd_1()
{
}

void CUIWnd_1::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST1, lstPack);
}


BEGIN_MESSAGE_MAP(CUIWnd_1, CDialogEx)
	ON_BN_CLICKED(IDC_BUTTON1, &CUIWnd_1::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &CUIWnd_1::OnBnClickedButton2)
END_MESSAGE_MAP()


// CUIWnd_1 消息处理程序


void CUIWnd_1::OnBnClickedButton1()
{
	// int count = _pgamebase->SRO_Control->GetPPack()->GetPackBack()->PackCount();
	CString tmp;
	// tmp.Format(L"%d", count);
	// AfxMessageBox(tmp);
	PBackPack _PackBack = _pgamebase->SRO_Control->GetPPack()->GetPackBack();

	lstPack.ResetContent();
	for (int i = 0; i < _PackBack->PackCount(); i++)
	{

		PITEM item = _PackBack->GetItem(i);
		if ((item != NULL) && (item->Type)) {
			tmp.Format(L"[%s][数量:%d][耐久:%d/%d]\n", item->GetNameByWide(), item->Count, item->Durabillty, item->MaxDurabillty);
			lstPack.AddString(tmp);
		}
	}

}


void CUIWnd_1::OnBnClickedButton2()
{
	// int count = _pgamebase->SRO_Control->GetPPack()->GetPackBack()->PackCount();
	CString tmp;
	// tmp.Format(L"%d", count);
	// AfxMessageBox(tmp);
	PEquipPack _PackBack = _pgamebase->SRO_Control->GetPPack()->GetEquipBack();

	lstPack.ResetContent();
	for (int i = 0; i < 13; i++)
	{

		PITEM item = _PackBack->GetItem((EquipType)i);
		if ((item != NULL) && (item->Type > 0)) {
			tmp.Format(L"[%s][数量:%d][耐久:%d/%d]\n", item->GetNameByWide(), item->Count, item->Durabillty, item->MaxDurabillty);
			lstPack.AddString(tmp);
		}
	}
}

你可能感兴趣的:(网游逆向,游戏)