1 先找到物品背包格子
移开物品搜0, 放置物品搜大于0
其地址里的数值 即为 格子里物品对象的首地址(物品对象指针)
2 再找出是什么访问了这个地址
00838E5F - 8B 15 E4D3E302 - mov edx,[Client.exe+2A3D3E4] //其实就是基址,待会用OD看它到底是多少
00838E65 - 8B 84 8A 3C040000 - mov eax,[edx+ecx*4+0000043C] <<
3 再次用CE打开一次游戏,卸载掉调试器,再用OD附加,找到前面那个地址
4 在内存窗口中转到第一个背包对应的地址,看它里面的值是多少,检查发现与CE数据完全一致,那么这就是我们要找的背包列表
DWORD型物品对象指针:[2E3D3E4]+43C+4*ecx //ecx表示背包列表 下标0-35
5 再分析物品属性,看第三格装的金刚石这个结构里的属性
6 找到对齐时的偏移
[物品对象+64] //物品名
[物品对象+0F9] //物品功能描述
[物品对象+238] //具体属性
7 找到物品数量对应的偏移,显然,在内存区域附近没有199
8 用CE从这个物品对象指针 开始搜,这个最近的C7C与030隔了比较远,猜测物品数量可能不是4字节,应该是2字节,表示的最大上限是65535
9 2字节搜出来还是这个地址,那应该就是它了
10 复制这个地址,以42C45030为参照,查到42C45C7C的偏移为C4C
11 这个数值似曾相识,正是上一节我们找的
[物品对象+C4C] //物品数量
12 总结
背包基址:02E3D3E4
物品对象指针:[2E3D3E4]+43C+4ecx //ecx表示背包列表下标,范围为0-35
物品对象:[[2E3D3E4]+43C+4ecx ]
[物品对象+64] //物品名
[物品对象+0F9] //物品功能描述
[物品对象+238] //具体属性
[物品对象+C4C] //物品数量
查看第1格物品的数量对应的地址与值:dd [[2E3D3E4]+43C+4*0]+0C4C
附 背包列表特征码
00838E22 /75 32 jnz short Client.00838E56
00838E24 |A1 F0D3E302 mov eax,dword ptr ds:[0x2E3D3F0]
00838E29 |8B8488 3C040000 mov eax,dword ptr ds:[eax+ecx4+0x43C]
00838E30 |8B48 58 mov ecx,dword ptr ds:[eax+0x58]
00838E33 |8B50 54 mov edx,dword ptr ds:[eax+0x54]
00838E36 |A1 5C452501 mov eax,dword ptr ds:[0x125455C]
00838E3B |51 push ecx
00838E3C |8B88 30020000 mov ecx,dword ptr ds:[eax+0x230]
00838E42 |52 push edx
00838E43 |E8 F8D8FDFF call Client.00816740
00838E48 |85C0 test eax,eax
00838E4A |0F85 925C0000 jnz Client.0083EAE2
00838E50 |8B8D 200FFFFF mov ecx,dword ptr ss:[ebp+0xFFFF0F20]
00838E56 \83FB 01 cmp ebx,0x1
00838E59 0F85 FA000000 jnz Client.00838F59
00838E5F 8B15 E4D3E302 mov edx,dword ptr ds:[0x2E3D3E4] ; 背包基址
00838E65 8B848A 3C040000 mov eax,dword ptr ds:[edx+ecx4+0x43C] ; 背包列表
00838E6C 8BB0 E40C0000 mov esi,dword ptr ds:[eax+0xCE4]
00838E72 8BB8 E80C0000 mov edi,dword ptr ds:[eax+0xCE8]
00838E78 8BC6 mov eax,esi
00838E7A 0BC7 or eax,edi
00838E7C 0F84 97010000 je Client.00839019
00838E82 837D 08 00 cmp dword ptr ss:[ebp+0x8],0x0
00838E86 0F85 36030000 jnz Client.008391C2