正文
切到CE,发起新的搜索,搜索10。
搜到了5400多条结果,你可能会犯糊涂,到底哪个是手枪弹药的地址?不要担心,现在继续搜索。
回到游戏,打出去几个枪子儿
此时弹夹剩7发子弹,现在回到CE,搜索7,点击“再次扫描”,搜索到的地址数量会越来越少,直至剩下一个,我比较幸运,搜了两次就找到了。
当时的手枪弹药的动态地址为0x18A4991C,我们先双击添加到内存修改列表中,并备注“手枪弹夹弹药动态地址”。
知道手枪弹夹弹药动态地址了,不妨来试一下修改弹药吧,如图所示,双击数值7,弹出数组修改窗口,输入你要修改的数值,我们就填50吧。
点击“确定”,选中这个地址按空格键就可以锁定手枪弹夹弹药量。回到游戏,瞧,弹药量变了吧,并且打出子弹后,弹药量会立马复原。
这是你成功的第一步,后面的路途还很遥远。OK,别急着继续,我们先分析一下,手枪开火,弹药会减少,弹药减少,就一定有相应的汇编操作码来完成操作,弹药减少,相应的内存地址的数据也会被改写,那么接下来我们来寻找是哪一行汇编语句改写了弹药地址里的数值。寻找相应的汇编操作码有两种方法,一个方法是通过CE的“找出是什么改写了这个地址”功能来定位相应的语句,另一个方法是通过内存断点来定位相应的操作码,先解锁地址数值,下面一一介绍。
方法一:通过“找出是什么改写了这个地址”功能来定位(推荐)
选中刚才的手枪弹夹弹药的地址,按F6或者右键菜单选择“找出是什么改写了这个地址”,调出操作码搜索框
如果弹出了这个对话框,不用理会,直接选“是”。
这时把这个窗口放到一边别管它,回到游戏。我又打出了两发子弹,这时操作码搜索框显示出了开火时的操作码,计数为2。
选中此行,点击“显示反汇编程序”,即可来到汇编窗口并定位到该操作码。
定位到了shanghai.exe+2F37B处。
方法二:通过内存断点来定位(备用)
如图所示,选中手枪弹药地址,点击“查看内存”,进入汇编窗口。
CE会帮我们定位到手枪弹药地址0x18A4991C处。
仔细观察一下,现在这个地址的十六进制字节值是不是当前弹药余量的十进制值呢?
右击0x30这个值,如图所示,选择“写入时中断”
这时0x30数值会变为深绿色,回到游戏,开火射出子弹,这时游戏假死,断点触发成功,回到CE的汇编窗口,这时中断在shanghai.exe+2F37D处。
你会突然发现,咦?两个方法为什么定位的地方差了一行?这里就要讲一讲CE的“找出是什么改写了这个地址”与内存断点工作机制的异同了。“找出是什么改写了这个地址”是在指令执行前设置,当指定地址被改写时,它能记录改写情况,定位到改写操作发生时的汇编指令处,比如在打出子弹前设置,打出后定位到开火操作码位置。而内存断点是在指令执行后起作用,像对弹药地址设置“写入时中断”,需等游戏执行写入操作(子弹射出)导致游戏假死断点触发,定位位置会和前者有差异 。综述,如果是用内存断点定位操作码,就要关注其上一行的操作码。定位到相关操作码了,接下来就可以分析0x18A4991C这个地址是如何被操作的了。分析前要对开火的操作码下断点,以确定是不是开火操作。如图,我们选中shanghai.exe+2F37B行,就在此处下断点,按F5键或点击左上方的“切换断点”,这时此行变绿,未选中时变红。
回到游戏,再次开火
,游戏假死,CE中断。
观察EDI和ECX寄存器,正是手枪弹药地址和手枪弹药余量,ECX寄存器操作着弹药余量。
再来看这一行的操作码:
复制代码 隐藏代码
mov [edi],ecx
同学们应该明白了,就是将当前ECX寄存器的值放入当前EDI寄存器的值所对应的地址中,继续向上跟踪,这时看到了shanghai.exe+2F377处的操作码为dec ecx。
这说明了这里是开火时打出一发子弹,使用DEC指令来自减1,既然到这里了,不妨来整活儿吧,改一下汇编代码,来体验一把子弹杀敌后飞回枪膛的快感吧!
如图所示,双击此行操作码,把“dec ecx”改为“inc ecx”
点击“确定”,暂时去掉刚才的断点,按F9继续运行,回到游戏,走你!看,是不是很带劲儿!?
当然NOP也是可以的,实现了弹药锁定的效果。
接下来继续分析,主要追踪EDI寄存器里的0x18A4991C,一点点的向上翻看代码,注意操作EDI寄存器的行,从相关行或者临近行下断,以保证EDI寄存器里的值为0x18A4991C
经过了一系列追踪,发现了这两行
复制代码 隐藏代码
shanghai.exe+2F2CE C2 0400 ret 0004
shanghai.exe+2F2D1 83 83 FB 02 cmp ebx,02
如果在shanghai.exe+2F2D1处下断,CE断了下来,但是上一行就没有,这是为什么呢?众所周知,程序是按顺序执行的,除非加了某些条件,这说明先前的操作码可能通过JMP、JE、JZ、JNZ、CALL等控制转移类指令跳转到了这一行。这时就要向上找是谁调用了shanghai.exe+2F2D1这一行,继续上翻代码,在shanghai.exe+2F25F处看到了“jg shanghai.exe+2F2D1”,为了验证这个说法,给shanghai.exe+2F25F和shanghai.exe+2F2D1都下断点,再次开火,断在了shanghai.exe+2F25F,EDI寄存器依然为0x18A4991C
然后按F7逐步执行语句,这时它的下一句就是shanghai.exe+2F2D1,说法成立。
突然,发现了一行特别的操作码
复制代码 隐藏代码
shanghai.exe+2F253 8D 8C 31 EC000000 lea edi,[ecx+esi+000000EC]
刚才也介绍过了,ESI是源变址寄存器,那就可以确定手枪的弹药地址只有一级偏移0xEC,既然是相加操作,那么先前ESI里的值就是0x18A4991C-0xEC所得值0x18A49830喽。到了这里,我们就可以试一下搜索是否有基址的指针指向0x18A49830,回到CE主窗口,发起新的扫描,搜索目标为18A49830,记得勾选十六进制,否则不会搜到有关内容。