分享免费的编程资源和教程

网站首页 > 技术教程 正文

C++天龙八部xdbg逆向分析背包数据

goqiw 2024-11-18 12:15:08 技术教程 33 ℃ 0 评论

CE分析数据突破口

背包是一个二维数组,每一个物品是一个对象,物品里面的具体内容则应该是在物品对象基础之上进一步偏移。

首先,我们通过选中某个物品拖动到背包方格,二维数组在内存中依然是线性的,下标从0开始。

以桃木剑为例,当前索引为2:

通过改变桃木剑所在格子下标进行初步地址查找:

xdbg追溯背包基址

下硬件写入字节断点,然后更改桃木剑下标。

当前物品对象下标地址为:ecx+0x10

Ctrl+F9跳转到函数ret,F8跳出当前函数,返回上一层调用。

ebp:存放调用函数前ebp的值

ebp+4:存放call指令调用函数时压入堆栈的EIP

ebp+8:存放函数传参第一个参数地址

ebp+C:存放函数传参第二个参数地址

……

函数内部为明显的数组结构,搜索地址:[ecx+0x15D28]

返回上一层函数,得到最终的偏移:

[[0x00C4F974]+0x15D28]

[["Game.exe"+0x0045F974]+0x15D28


背包物品数据分析

以馒头为例,通过查找字符串,并用二分法给找到的数据改名,最终确定“馒头”字符串的地址。

然后在xdbg中查找馒头的地址,下硬件访问断点。

然后追溯eax,eax应该来自于其上方的call。

物品名称:+0x2C+0x18

使用等级:+0x2C+0x20

物品等级:+0x2C+0x54

[[ecx+0x2C]+0x18]

注意:

背包物品类型不同,偏移也有所不同,本次查找的偏移仅限于具有使用等级和物品等级的背包物品,其他类型物品偏移需要进一步确定。

C++读取背包数据

我的背包中只有前5种物品符合要求,循环遍历5次,其他类型物品需要大家自行查找:

void CMyDialog::OnBnClickedBtnTraverseBag()
{

	DWORD base_addr = g_dw_base_addr + 0x0045F974;

	CString str;
	for (int i = 0; i < 5; i++) {
		DWORD tmp_addr = 0;
		cat->ReadMemory(g_process_handle, &tmp_addr, sizeof(tmp_addr), base_addr, 0x15D28, -1);
		//DWORD item_obj_addr = *(DWORD*)(tmp_addr + 0x4 * i);
		tmp_addr += 0x4 * i;

		DWORD item_name_addr = 0, item_use_level_addr = 0, item_self_level_addr = 0;
		cat->ReadMemory(g_process_handle, &item_name_addr, sizeof(item_name_addr), tmp_addr, 0x2C, 0x18, -1);
		
		CHAR* ch_item_name_addr = (CHAR*)item_name_addr;
		CString str_item_name_addr(ch_item_name_addr);

		str += str_item_name_addr + TEXT("\r\n");
	}

	//cat->MsgBox(str);
	m_editv_show_bag_info = str;
	UpdateData(FALSE);
}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表