泓泰

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

admin
C++天龙八部xdbg逆向分析背包数据-第1张-游戏相关-泓泰

前言:

当前兄弟们对“天【tiān】龙八部如【rú】何保存设【shè】置”大致比【bǐ】较重视,兄弟们都需要了解【jiě】一些【xiē】“天龙【lóng】八部如何保存设置”的相关知【zhī】识。那么小【xiǎo】编在【zài】网络上汇集了一些【xiē】有关“天龙【lóng】八部如何保存设置””的相【xiàng】关【guān】资讯,希望【wàng】看官们能喜欢,朋【péng】友们【men】快快【kuài】来学习一下吧!
CE分析数据突破口

背包是一【yī】个【gè】二维数组,每一个物品是【shì】一【yī】个对象,物【wù】品里面的【de】具体【tǐ】内容则应该是在物【wù】品对象基础之上进【jìn】一步偏移。

首先,我们通【tōng】过选中某个【gè】物品【pǐn】拖动到背包方格【gé】,二维数【shù】组在内存中依然是线性的【de】,下【xià】标【biāo】从0开始。

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

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

xdbg追溯背包基址

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

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

Ctrl+F9跳转到函数ret,F8跳出当【dāng】前【qián】函数,返【fǎn】回上一【yī】层调用。

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

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

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

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

……

函数内部为明显【xiǎn】的【de】数组【zǔ】结构,搜索地址:[ecx+0x15D28]

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

[[0x00C4F974]+0x15D28]

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


背包物品数据分析

以【yǐ】馒头【tóu】为例,通过查找字【zì】符串,并用二分法【fǎ】给找到的数据改名,最终【zhōng】确【què】定“馒头”字符串的【de】地址。

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

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

物品名称:+0x2C+0x18

使用等级:+0x2C+0x20

物品等级:+0x2C+0x54

[[ecx+0x2C]+0x18]

注意:

背【bèi】包物品【pǐn】类型不同,偏移也【yě】有所不【bú】同,本次查找的偏移【yí】仅【jǐn】限于具【jù】有使【shǐ】用【yòng】等级和物品等级的背包物品【pǐn】,其他类型物品偏移需要进一步确定。

C++读取背包数据

我的背包中只有前5种【zhǒng】物品符【fú】合要【yào】求,循【xún】环遍【biàn】历【lì】5次,其【qí】他类型物品需要大家自行查找:

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);}

标签: #天龙八部如何保存设置