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博客 它的代码为基础进行修改
效果图:
经过分析背包与物品的数据(也就是它们对象的指针),发现几个问题,就是找到一个好的切入点,那么会容易非常多,如果没有好的切入点,就会很累很累,这是第一个问题,然后第二个问题,现在写代码的方式,在将来扩展起来会发现,会很轻松很容易,管理起来会很方便。
新加读取装备信息按钮:
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_TIMEenum { IDD = IDD_PAGE_1 };
#endifprotected: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);}}
}