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