前言:
当前兄弟们对“天【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】来学习一下吧!背包是一【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);}
标签: #天龙八部如何保存设置