Cheat Engine 一般简称CE,是一个开放源代码的作弊软件,其功能包括:内存扫描、十六进制编辑器、调试工具,Cheat Engine 自身附带了外挂制作工具,可以用它直接生成外挂工具,CE可以说是目前最优秀的游戏修改器不是之一,这个工具绝对值得你去学习,这里希望你能够活学活用。
人造指针的使用技巧
实验目标:通过向游戏中注入一段特殊的汇编代码,实现自动获取动态地址,省略找基址的麻烦。该方法适用于游戏基址层数过多无法直接获取到基址,游戏根本无法找到基址。
1.打开CE工具并附加游戏进程,首先通过遍历的方式找到阳光的动态地址,然后在地址栏上右键选择【找出是什么改写了这个地址】如下所示我们选择【mov eax,[esi+5560]】这条汇编代码。
2.上图可以看到有两条汇编指令,而前面的计数器一直在增加,说明有时钟一直在访问这个地址,我们以第2条汇编指令为例,点击【反汇编当前地址】在XOR指令上按下【F5】下断点,其中【mov eax,[esi+5560]】则表示将当前阳光数量赋值给EAX寄存器,我们可以看到右侧寄存器窗口【eax=32】,其中的32正好就是阳光的十六进制表示形式,注意【mov eax,[esi+5560]】这条指令,观察该指令在注入前与注入后会有什么变化?
3.直接点击【工具列表】-> 【选择自动汇编】 ->【模版】->【代码注入】-> 【确定按钮】,如下图所示:
4.我们需要在【mov eax,[esi+00005560]】这条汇编指令执行之前获取到里面的阳光数据,此时可以在【originalcode】之前写入以下汇编代码,其中【push eax,pop eax】分别是压栈与出栈,因为我们要使用EAX寄存器暂存数据,此时必须要将原始的EAX寄存器里面的内容进行保存,在代码执行完毕以后必须通过POP指令归位,否则会导致程序异常或堆栈失衡,【mov eax,[esi+5560]】则表示将【[esi+5560]】中的数据取出来,此处就是阳光的数量。
5.接着我们需要找一个相对固定的内存地址,并将其填充到【mov [xxxx],eax】方框中,此时我们回到CE中(自动汇编窗口不要关闭),在内存查看器窗口选择【视图】->【内存区域】
我们需要浏览内存区域,找出一个具有读写权限的空地址,并且类型为映像的,这里还需要看后面的模块一定要是植物大战僵尸文件里的模块,此处我找到了一个内存地址 【0B4CF000】,双击即可跳转到相应的位置,这里我们不能选择【02CA9000】这个内存地址,因为这个地址是QQ拼音的模块。
6.通过双击【0B4CF000】地址,即跳转到相应的内存区域,如下在内存查看器中,标红处。
我们直接将【0b4cf000】这个内存地址填入到我们的汇编代码中,此时只要程序获取到阳光,会默认将阳光的数量放入0B4CF000这个内存中进行保存。
完成获取以后,我们直接在CE中添加这个内存地址,并开启自动汇编CT脚本,此时阳光的数量就可以获取到了。
我们再次来到反汇编窗口观察注入后的变化,可以看到CE是直接在【D6679600】处写入了 jmp 指令直接跳转到了我们自己写的代码中去执行了。
跟随【00DF0000】这个地址即可看到如下代码,没错!这些代码正是我们在CT表中分配的,当执行完获取数据以后则会自动跳转到原始地址【0048982B】继续执行原始代码。
总结:上方的的人造指针有一个小问题,那就是我们无法修改阳光的数量,其实这个问题很简单,在开头我们说过该地址有一个时钟一直在给这个地址赋值,而我们在开头查找的是内存访问,如果要修改数据,应该要找内存写入相关的地址。
通过CE寻找本地Call
实验目标:本地CALL就是程序中的过程调用,通过调用已知的本地CALL即可实现某些变态功能,这些变态功能往往是通过修改数值参数也做不到的,接下来我们将通过遍历阳光产生的时间,寻找阳光产生的本地Call,并使用代码注入器注入,自定义生成阳光。
遍历阳光产生时间的技巧:
进入游戏-> 当出现阳光后->马上搜索未知初始数值
返回游戏-> 马上切回CE-> 搜索减少的数值 -> 掉一点搜一点
最后排查出它的掉落地址-> 锁定1即可实现无限掉落
1.首先你必须通过上方的阳光遍历技巧找到一个地址,将其锁定为1即可实现无限阳光掉落,此处我排查到的地址是【13DC2DB8】
2.我们在【13DC2DB8】地址上右键,选择【找出是什么访问了这个地址】,等待阳光的出现,当出现阳光后地址栏中会多出一条汇编指令,我们记下这条汇编指令的地址。
3.接着关闭内存访问窗口,点击CE左下角的【查看内存】,然后我们按下快捷键【Ctrl +G】输入刚刚记下的那个内存地址【00413BCB】并跳转过去。
4.此处由于我们不知道到底是哪个Call调用了生成阳光,所以我们需要去段首下【F5】断点,如何确定断首?你可以向上推鼠标一般断首的前面是int3停机指令,下断以后我们回到游戏,默认情况下CE会断在【mov eax,[esi+554C]】这一行。
5.此时我们可以猜测,游戏中的阳光有大的也有小的,那么我们需要找的Call应该是有参数的,在32位汇编中参数是由堆栈传递的,所以我们应该找在Call前面带push指令的,我们单步【F8】向下走,如下图可以看到有三个CALL指令,但是这三个CALL并没有实际的参数传递,固应该不太可能是阳光生成的Call.
6.继续单步【F8】向下走,会发现在最后末尾的位置有一个看似很像阳光Call的代码片段,出现了多个Push指令,明显是在传递参数,为了验证这一猜想我们在【00413BE4】的位置下断点。
7.下好断点以后回到游戏,发现阳光在出现之前会断下,说明这个地址确实与阳光的生成有关系,此时我们单步【F8】记下它所传递的隐藏参数,如下我已备注好。
8.此时我们通过代码注入器,向程序中注入代码,即可实现产出阳光,到此还没有结束,下方的注入代码有一个变量【13DBD880】这个动态内存地址每次启动游戏都会发生变化。
9.为了找到这个动态地址的基址,我们直接在CE中搜索【13DBD880】这个地址,此处我们随意选择一个,这里就选择【00FE85C8】。
10.在这个地址上面,右键选择【查看是什么访问了这个地址】,然后能看到偏移地址是【768】下一个指针地址是【00FE7E60】。
11.我们直接搜索【00FE7E60】这个内存地址,然后会看到绿色的基址【006A9EC0】,手动添加偏移地址即可得到当前的动态地址【13DBD880】,这里的【333174912(十进制)=13DBD880(十六进制)】。
CE之特征码定位技术
通过基址加偏移的方式我们可以找到游戏中的指定参数,但这种找基址的方式并不是白用百灵的,在一些网络游戏中基址加密后根本无从下手,如果此时我们需要在程序中打补丁该如何定位到我们所需要的指令上呢,接下来将介绍一种全新的找地址方式,特征码定位技术。
特征码定位技术的应用非常广泛,我们所熟知的杀毒软件的查杀原理多半是基于特征码定位技术实现查杀的,在外挂技术领域特征码定位主要用于,版本的通杀,制作一键基址获取器,动态地址的定位等。
同样的提取特征码也需要尽量找变化比较小的,并具有唯一性标志的汇编指令片段,像是call 或者大跳转,一般而言我们不能用它作为特征码。
无冷却遍历技巧:
打开CE-> 搜索类型选择字节类型-> 在植物亮的状态时搜索1
拿起植物-> 搜0 -> 放下植物搜1 ->拿起植物搜0-> 一直重复-> 地址一般在最后面
1.首先你要通过上面的遍历技巧找到这个动态地址,将其锁定1后植物即可无限种植,效果如下所示:
2.接着在该地址上面右键,选择【是什么改写了这个地址】,然后我们回到游戏,拿起植物然后直接右键放下,会出现两条汇编指令。
汇编代码分析:
@当我们放下植物后出现:0040CDEA - C6 44 08 70 01 - mov byte ptr [eax+ecx+70],01 { 1 }
@当我们拿起植物后出现:00488E73 - C6 45 48 00 - mov byte ptr [ebp+48],00 { 0 }
3.我们直接点击【00488E73 - C6 45 48 00 - mov byte ptr [ebp+48],00】 这条指令,因为这条指令是拿起植物是的状态,我们需要将代码中的00改为01即可,查看反汇编代码并提取在它之上的几条指令作为特征码,此处我们提取特征为【83 f8 1c 75 08 6a 1e】这些机器码。
4.接着我们通过CE来验证一下是否能够定位到相应的地址上,在CE中选择搜索【字节数组】,然后能够搜到【00488E64】这个地址,而我们需要定位到【00488E73】,可以将两个地址相减得到相对偏移【0xF(也就是十进制的15)】就等于我们想要的地址,公式为【00488e64 + 0xF = 当前地址】。
5.直接使用易语言配合我封装好的【特征码定位模块】,即可实现定位基地址,需要模块可以联系我。
6.最后附一张注入成功后的效果图,如下所示:
通过手工计算偏移地址
首先我们思考一个问题,为什么我们需要手工计算偏移地址,CE找不开心吗?当然不是,有些游戏比如像CF,只要查找改写的地址游戏就会崩溃,严重的话则会弹出TP警告框,但查找访问则不会出现这个情况,此时我们就需要进行手工计算偏移地址,来得到基址数据。
1.首先打开CE工具,并通过前期所学的内容快速的找到阳光的动态地址,然后我们在 【141A0C90】地址上选择【查找访问地址】,我们需要记下【5560】这个偏移地址。
上图我们通过动态地址【141A0C90 - 5560 】即可得到上一个指针【1419B730】地址,直接在CE中继续搜索这个地址。
2.此时我们选择第二个动态地址,然后再次查找是什么【访问了这个地址】,可以看到是偏移是【768】,继续用【00FE85C8 - 768】得到【FE7E60】 。
3.继续查找这个动态地址【FE7E60】,此时我们可以看到基址【006A9EC0】,通过手工计算我们已经知道了其公式为【006A9EC0 + 768 + 5560】完成。
------------------------------------------------------------------
搜索阳光的动态地址:18664588
00430A11 - 01 88 60550000 - add [eax+00005560],ecx <<
通过动态地址 - 偏移地址 =eax的地址
18664588 - 5560 = 1865F028
------------------------------------------------------------------
继续搜索:1865F028
0045B6FD - 8B 81 68070000 - mov eax,[ecx+00000768] <<
通过动态地址 - 偏移地址 =eax的地址
025B9E18 - 768 = 025B9E18
------------------------------------------------------------------
基址(绿了说明到头了):025B9E18
PlantsVsZombies.exe+2A9EC0
------------------------------------------------------------------
总结:025B9E18 + 768 + 5560 = 阳光
------------------------------------------------------------------
写教程不容易,转载请加出处!谢谢