|
很多朋友都在问背包基址的查找问题,下面发个我查找的过程,希望对大家有帮助
背包基址查找
1、用CE查找第一格的背包物品数量,得到下面的程序段
EAX=0000000F
EBX=092E82FC
ECX=00000000
EDX=00000000
ESI=14DD81FC
EDI=092E7F64
EBP=14DD81FC
ESP=0012FB70
EIP=0053C0BC
Probable base pointer =092E82FC
0053c0aa - mov [ebx+00000098],edx
0053c0b0 - mov eax,[ebp+0000009c]
0053c0b6 - mov [ebx+0000009c],eax
0053c0bc - mov ecx,[ebp+000000a0]
0053c0c2 - mov [ebx+000000a0],ecx
说明+9c是背包物品数量的偏移
2、关掉CE,打开OD,用CTRL+G,跳到上面找到的地址0053c0b6
3、在这个位置下断,并改变这一格背包物品的数量
4、发现背包的地址是EBX
5、到这个函数的头部下断,并返回上一层,得到以下结果:
0074A2D0 8B1CB9 mov ebx,dword ptr ds:[ecx+edi*4]
说明edi是背包的格数(从0开始)
6、接下来查找ecx的值,往上移动可以看到
0074A2B2 8B8E A0030000 mov ecx,dword ptr ds:[esi+0x3A0]
得到1个偏移3A0 再往上可见
0074A26C 8BF1 mov esi,ecx
7、接下来查找ecx
由于这个函数体内不能查找到ecx的来历,所以到函数头下断继续返回
返回后地道ecx的值是0bb1c034
8、从函数头下断一步步跟到esi的值出现。得到以下程序段:
00918D0B 8B0D 2CA52601 mov ecx,dword ptr ds:[0x126A52C]
00918D11 E8 AA09F1FF call sro_clie.008296C0
00918D16 8BC8 mov ecx,eax
00918D18 E8 53C6E1FF call sro_clie.00735370
这个CALL的返回值就是要找的ECX的值0bb1c034
所以要从这个CALL查eax的值
9、进入这个CALL00735370
0073539D 8B86 C0070000 mov eax,dword ptr ds:[esi+0x7C0]
这个偏移是7C0
10、查esi的来历
在此处不能下断,所以返回上一层地址00918D11
下断后重新跟入这个CALL,单步执行到0073539D 8B86 C0070000 mov eax,dword ptr ds:[esi+0x7C0]
这里后在寄存器窗口得到ESI的值是12BC37C4
用二进制查找发查找esi的值
a、在od的命令栏输入 dd [0126A52C]
b、在地址栏用右键选择“查找”---“二进制字串”
C、在最下面的框内输入C4 37 BC 12(esi值双位反过来,即从地位到高位查找)
d、得到的地址与[0126A52C]值比较相差710
11、于是得到背包的基址是[[[[[0126A52C]+710]+7C0]+3A0]+背包格数*4]
|
|