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中(自动汇编窗口不要关闭),在内存查看器窗口选择【视图】->【内存区域】spa
咱们须要浏览内存区域,找出一个具备读写权限的空地址,而且类型为映像的,这里还须要看后面的模块必定要是植物大战僵尸文件里的模块,此处我找到了一个内存地址 【0B4CF000】,双击便可跳转到相应的位置,这里咱们不能选择【02CA9000】这个内存地址,由于这个地址是QQ拼音的模块。开放源代码
6.经过双击【0B4CF000】地址,即跳转到相应的内存区域,以下在内存查看器中,标红处。3d
咱们直接将【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 = 阳光
------------------------------------------------------------------
写教程不容易,转载请加出处!谢谢