泓泰

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

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

前言:

当前兄弟【dì】们对【duì】“天龙八部如何保存设置”大致比【bǐ】较重【chóng】视,兄弟【dì】们都需要了解一些“天龙八部【bù】如【rú】何保存设置【zhì】”的相关知识。那么小编【biān】在【zài】网络上【shàng】汇【huì】集了一些有关“天龙八【bā】部【bù】如何保存【cún】设置””的相【xiàng】关资讯【xùn】,希望看官们能喜欢,朋友【yǒu】们快快来学习一下吧!
CE分析数据突破口

背包是一个【gè】二【èr】维【wéi】数组,每一个物品是一个对象,物品里面的具体内容【róng】则应该是在物品【pǐn】对象基础之【zhī】上【shàng】进一步【bù】偏【piān】移。

首先,我们【men】通过选中某个物品拖动到背包方【fāng】格,二维数【shù】组【zǔ】在【zài】内存中依然是线性的,下标【biāo】从0开始。

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

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

xdbg追溯背包基址

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

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

Ctrl+F9跳【tiào】转到【dào】函数ret,F8跳【tiào】出当前函数,返【fǎn】回上一层调用。

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

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

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

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

……

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

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

[[0x00C4F974]+0x15D28]

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


背包物品数据分析

以馒头为例,通过查【chá】找字符串【chuàn】,并用【yòng】二分法给【gěi】找到的数【shù】据改名,最【zuì】终确定【dìng】“馒头”字符串的地【dì】址。

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

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

物品名称:+0x2C+0x18

使用等级:+0x2C+0x20

物品等级:+0x2C+0x54

[[ecx+0x2C]+0x18]

注意:

背包物品类型不同【tóng】,偏移也有所不同,本【běn】次查【chá】找的偏移仅限于具有【yǒu】使用【yòng】等级和【hé】物品等级的背包物品【pǐn】,其他类【lèi】型物品偏移需【xū】要进一步【bù】确【què】定。

C++读取背包数据

我的背包【bāo】中【zhōng】只有前5种物品符合【hé】要求,循环遍历5次【cì】,其他类型物品需要大【dà】家自行查【chá】找:

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

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