老丝路的背包基址查找(方法)
很多朋友都在问背包基址的查找问题,下面发个我查找的过程,希望对大家有帮助背包基址查找
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 ,edx
0053c0b0 - mov eax,
0053c0b6 - mov ,eax
0053c0bc - mov ecx,
0053c0c2 - mov ,ecx
说明+9c是背包物品数量的偏移
2、关掉CE,打开OD,用CTRL+G,跳到上面找到的地址0053c0b6
3、在这个位置下断,并改变这一格背包物品的数量
4、发现背包的地址是EBX
5、到这个函数的头部下断,并返回上一层,得到以下结果:
0074A2D0 8B1CB9 mov ebx,dword ptr ds:
说明edi是背包的格数(从0开始)
6、接下来查找ecx的值,往上移动可以看到
0074A2B2 8B8E A0030000 mov ecx,dword ptr ds:
得到1个偏移3A0 再往上可见
0074A26C 8BF1 mov esi,ecx
7、接下来查找ecx
由于这个函数体内不能查找到ecx的来历,所以到函数头下断继续返回
返回后地道ecx的值是0bb1c034
8、从函数头下断一步步跟到esi的值出现。得到以下程序段:
00918D0B 8B0D 2CA52601 mov ecx,dword ptr ds:
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:
这个偏移是7C0
10、查esi的来历
在此处不能下断,所以返回上一层地址00918D11
下断后重新跟入这个CALL,单步执行到0073539D 8B86 C0070000 mov eax,dword ptr ds:
这里后在寄存器窗口得到ESI的值是12BC37C4
用二进制查找发查找esi的值
a、在od的命令栏输入 dd
b、在地址栏用右键选择“查找”---“二进制字串”
C、在最下面的框内输入C4 37 BC 12(esi值双位反过来,即从地位到高位查找)
d、得到的地址与值比较相差710
11、于是得到背包的基址是[[[[+710]+7C0]+3A0]+背包格数*4]
学习了,呵呵,感谢!我可以找到 [[+3A0]+n*4]+ xx,只是没有想到最初的偏移 710是怎么来的,呵呵。 {:1_99:}有这么复杂么 7c0 前面好像还有另外一种偏移方式,不过我找不来。 {:1_99:}ce 找出数量 地址
用OD下断 单步 看谁改了值 一路往上找就能找到7c0
12BC37C4这值是 某call的返回值 下断就知道了
谢谢高手啊!学习了!! 围观楼主{:1_103:} 哦,这方法不错{:1_81:}
页:
[1]