昨天讲了JAVA的JNI,今天讲一下如何用CE(Cheat Engine)查找游戏的基址,
基址就是游戏在内存中的一个静态的内存地址,可以通过偏移找到本次游戏的数据地址。
今天就拿最经典的游戏植物大战僵尸来练手,首先每个版本的植物大战僵尸的基址和偏移都不同,
但是原理都是一样的,最后我会把我用的CE和植物大战僵尸都打包发出来。
打开游戏之后,在CE打开游戏
然后进行游戏,在CE中搜索当前的阳光值
在游戏当中使阳光改变,在CE中输入新的阳光值,并点继续扫描
现在就剩7个值了,可以重复以上步骤,找到最终的地址,
现在找到了存放阳光的内存地址,
加入到下面,修改最后的值,可以看到游戏里面的阳光也跟随改变
但是这个不是我们最终要找的地址,因为重新打开一次游戏,
存放阳光的地址也会跟随改变,那我们就要找到存放阳光的基址。
在阳光的内存地址,右键选择“找出是什么改写了这个地址”
点击“是”
看到里面都是空白,那我们就需要在游戏里面改变一下阳光值
改变游戏阳光值之后,可以看到里面产生了一条记录,
右键复制粘贴文本里面进行分析,
EAX=0000039D
EBX=00000032
ECX=FFFFFFFF
EDX=0E959068
ESI=0000036B
EDI=0E959068
EBP=0019FB8C
ESP=0019FAE0
EIP=00433F8C
指针基址可能是 =0E959068
00433F82 - jg 00433F90
00433F84 - sub esi,ebx //esi - ebx
00433F86 - mov [edi+00005578],esi
00433F8C - mov al,01
00433F8E - pop esi
00433F86 - mov [edi+00005578],esi
mov指令是数据传送指令,用于将一个数据从源地址传送到目标地址
esi 赋给 [edi+00005578]
esi的值是十六进制的36B等于十进制的875,就是阳光值
偏移值是0x5578,edi的值是0E959068加上5578 等于 0E95E5E0
那么,写入的地址就是[edi+0x5578]
edi寄存器的值:0E959068 在CE中查找这个值
在CE中,勾选前面的“16进制”,输入这个值点击新的扫描,
可以看到搜索出了55条的地址,只能一条一条排查,
选中一条记录,右键“找出是什么访问了这个地址”
可以看到都是空白,所以肯定不是这条,那就讲一个技巧,
就是看那条不是太一样,就观察那一条
这一条应该就是我们要找的,双击第一条的mov指令
右键复制,粘贴到文本分析一下,
EAX=00475350
EBX=00000001
ECX=04A0B4F0
EDX=0072CB80
ESI=04A0B4F0
EDI=0E959068
EBP=00000001
ESP=0019FCA0
EIP=00475379
指针基址可能是 =04A0B4F0
0047536A - cmp byte ptr [esi+0000053F],00
00475371 - je 0047539B
00475373 - mov edi,[esi+00000868]
00475379 - test edi,edi
0047537B - je 0047539B
00475373 - mov edi,[esi+00000868]
[esi+00000868] 赋给 edi
偏移就是0x868,将[esi+0x868]地址的值赋给edi
那么继续搜索esi的值:04A0B4F0
勾选“16进制”,输入esi的值,点击新的扫描
搜索之后,出现了1196条记录,那么要排查太费事了,
那这里我们只看绿色的部分,绿色代表的是静态地址,
发现了007794F8,这个就是我们要找的阳光基址
然后我们串一下:
007794F8(值:04A0B4F0) + 868 = 0E959068(值:04a0bd58) + 5578 = 0e95e5e0(阳光)
基址的值 + 一级偏移868 = 04a0bd58再用它的地址0E959068 + 二级偏移5578 = 0e95e5e0
接下来我们就要在CE中手动模拟一下了。
点击CE的“手动添加地址”,
勾选指针,并添加两个偏移,依次输入我们的基址和两个偏移值
就可以看到最终的阳光地址和当前的阳光值。
好了,到这里我们就成功的找到了植物大战僵尸的阳光基址,
找基址是编写游戏外挂最重要的一部分,下一篇就正式开始编写外挂。
植物大战僵尸下载地址:
链接: https://pan.baidu.com/s/1Ux3qkwBZBCvez1lYUUFlbw 密码: x9c8
CE6.8下载地址:
链接: https://pan.baidu.com/s/1iYjhJSbycAH5qNopQqk51Q 密码: 2b2n