CE修改器:外挂制作高级技巧

Wesley13
• 阅读 2242

Cheat Engine 一般简称CE,是一个开放源代码的作弊软件,其功能包括:内存扫描、十六进制编辑器、调试工具,Cheat Engine 自身附带了外挂制作工具,可以用它直接生成外挂工具,CE可以说是目前最优秀的游戏修改器不是之一,这个工具绝对值得你去学习,这里希望你能够活学活用。

人造指针的使用技巧

实验目标:通过向游戏中注入一段特殊的汇编代码,实现自动获取动态地址,省略找基址的麻烦。该方法适用于游戏基址层数过多无法直接获取到基址,游戏根本无法找到基址。

1.打开CE工具并附加游戏进程,首先通过遍历的方式找到阳光的动态地址,然后在地址栏上右键选择【找出是什么改写了这个地址】如下所示我们选择【mov eax,[esi+5560]】这条汇编代码。

CE修改器:外挂制作高级技巧

2.上图可以看到有两条汇编指令,而前面的计数器一直在增加,说明有时钟一直在访问这个地址,我们以第2条汇编指令为例,点击【反汇编当前地址】在XOR指令上按下【F5】下断点,其中【mov eax,[esi+5560]】则表示将当前阳光数量赋值给EAX寄存器,我们可以看到右侧寄存器窗口【eax=32】,其中的32正好就是阳光的十六进制表示形式,注意【mov eax,[esi+5560]】这条指令,观察该指令在注入前与注入后会有什么变化?

CE修改器:外挂制作高级技巧

3.直接点击【工具列表】-> 【选择自动汇编】 ->【模版】->【代码注入】-> 【确定按钮】,如下图所示:

CE修改器:外挂制作高级技巧

4.我们需要在【mov eax,[esi+00005560]】这条汇编指令执行之前获取到里面的阳光数据,此时可以在【originalcode】之前写入以下汇编代码,其中【push eax,pop eax】分别是压栈与出栈,因为我们要使用EAX寄存器暂存数据,此时必须要将原始的EAX寄存器里面的内容进行保存,在代码执行完毕以后必须通过POP指令归位,否则会导致程序异常或堆栈失衡,【mov eax,[esi+5560]】则表示将【[esi+5560]】中的数据取出来,此处就是阳光的数量。

CE修改器:外挂制作高级技巧

5.接着我们需要找一个相对固定的内存地址,并将其填充到【mov [xxxx],eax】方框中,此时我们回到CE中(自动汇编窗口不要关闭),在内存查看器窗口选择【视图】->【内存区域】

CE修改器:外挂制作高级技巧

我们需要浏览内存区域,找出一个具有读写权限的空地址,并且类型为映像的,这里还需要看后面的模块一定要是植物大战僵尸文件里的模块,此处我找到了一个内存地址 【0B4CF000】,双击即可跳转到相应的位置,这里我们不能选择【02CA9000】这个内存地址,因为这个地址是QQ拼音的模块。

CE修改器:外挂制作高级技巧

6.通过双击【0B4CF000】地址,即跳转到相应的内存区域,如下在内存查看器中,标红处。

CE修改器:外挂制作高级技巧

我们直接将【0b4cf000】这个内存地址填入到我们的汇编代码中,此时只要程序获取到阳光,会默认将阳光的数量放入0B4CF000这个内存中进行保存。

CE修改器:外挂制作高级技巧

完成获取以后,我们直接在CE中添加这个内存地址,并开启自动汇编CT脚本,此时阳光的数量就可以获取到了。

CE修改器:外挂制作高级技巧

我们再次来到反汇编窗口观察注入后的变化,可以看到CE是直接在【D6679600】处写入了 jmp 指令直接跳转到了我们自己写的代码中去执行了。

CE修改器:外挂制作高级技巧

跟随【00DF0000】这个地址即可看到如下代码,没错!这些代码正是我们在CT表中分配的,当执行完获取数据以后则会自动跳转到原始地址【0048982B】继续执行原始代码。

CE修改器:外挂制作高级技巧

总结:上方的的人造指针有一个小问题,那就是我们无法修改阳光的数量,其实这个问题很简单,在开头我们说过该地址有一个时钟一直在给这个地址赋值,而我们在开头查找的是内存访问,如果要修改数据,应该要找内存写入相关的地址。

通过CE寻找本地Call

实验目标:本地CALL就是程序中的过程调用,通过调用已知的本地CALL即可实现某些变态功能,这些变态功能往往是通过修改数值参数也做不到的,接下来我们将通过遍历阳光产生的时间,寻找阳光产生的本地Call,并使用代码注入器注入,自定义生成阳光。

遍历阳光产生时间的技巧:

进入游戏-> 当出现阳光后->马上搜索未知初始数值
返回游戏-> 马上切回CE-> 搜索减少的数值 -> 掉一点搜一点
最后排查出它的掉落地址-> 锁定1即可实现无限掉落

1.首先你必须通过上方的阳光遍历技巧找到一个地址,将其锁定为1即可实现无限阳光掉落,此处我排查到的地址是【13DC2DB8】

CE修改器:外挂制作高级技巧

2.我们在【13DC2DB8】地址上右键,选择【找出是什么访问了这个地址】,等待阳光的出现,当出现阳光后地址栏中会多出一条汇编指令,我们记下这条汇编指令的地址。

CE修改器:外挂制作高级技巧

3.接着关闭内存访问窗口,点击CE左下角的【查看内存】,然后我们按下快捷键【Ctrl +G】输入刚刚记下的那个内存地址【00413BCB】并跳转过去。

CE修改器:外挂制作高级技巧

4.此处由于我们不知道到底是哪个Call调用了生成阳光,所以我们需要去段首下【F5】断点,如何确定断首?你可以向上推鼠标一般断首的前面是int3停机指令,下断以后我们回到游戏,默认情况下CE会断在【mov eax,[esi+554C]】这一行。

CE修改器:外挂制作高级技巧

5.此时我们可以猜测,游戏中的阳光有大的也有小的,那么我们需要找的Call应该是有参数的,在32位汇编中参数是由堆栈传递的,所以我们应该找在Call前面带push指令的,我们单步【F8】向下走,如下图可以看到有三个CALL指令,但是这三个CALL并没有实际的参数传递,固应该不太可能是阳光生成的Call.

CE修改器:外挂制作高级技巧

6.继续单步【F8】向下走,会发现在最后末尾的位置有一个看似很像阳光Call的代码片段,出现了多个Push指令,明显是在传递参数,为了验证这一猜想我们在【00413BE4】的位置下断点。

CE修改器:外挂制作高级技巧

7.下好断点以后回到游戏,发现阳光在出现之前会断下,说明这个地址确实与阳光的生成有关系,此时我们单步【F8】记下它所传递的隐藏参数,如下我已备注好。

CE修改器:外挂制作高级技巧

8.此时我们通过代码注入器,向程序中注入代码,即可实现产出阳光,到此还没有结束,下方的注入代码有一个变量【13DBD880】这个动态内存地址每次启动游戏都会发生变化。

CE修改器:外挂制作高级技巧

9.为了找到这个动态地址的基址,我们直接在CE中搜索【13DBD880】这个地址,此处我们随意选择一个,这里就选择【00FE85C8】。

CE修改器:外挂制作高级技巧

10.在这个地址上面,右键选择【查看是什么访问了这个地址】,然后能看到偏移地址是【768】下一个指针地址是【00FE7E60】。

CE修改器:外挂制作高级技巧

11.我们直接搜索【00FE7E60】这个内存地址,然后会看到绿色的基址【006A9EC0】,手动添加偏移地址即可得到当前的动态地址【13DBD880】,这里的【333174912(十进制)=13DBD880(十六进制)】。

CE修改器:外挂制作高级技巧

CE之特征码定位技术

通过基址加偏移的方式我们可以找到游戏中的指定参数,但这种找基址的方式并不是白用百灵的,在一些网络游戏中基址加密后根本无从下手,如果此时我们需要在程序中打补丁该如何定位到我们所需要的指令上呢,接下来将介绍一种全新的找地址方式,特征码定位技术。

特征码定位技术的应用非常广泛,我们所熟知的杀毒软件的查杀原理多半是基于特征码定位技术实现查杀的,在外挂技术领域特征码定位主要用于,版本的通杀,制作一键基址获取器,动态地址的定位等。

同样的提取特征码也需要尽量找变化比较小的,并具有唯一性标志的汇编指令片段,像是call 或者大跳转,一般而言我们不能用它作为特征码。

无冷却遍历技巧:

打开CE-> 搜索类型选择字节类型-> 在植物亮的状态时搜索1
拿起植物-> 搜0 -> 放下植物搜1 ->拿起植物搜0-> 一直重复-> 地址一般在最后面

1.首先你要通过上面的遍历技巧找到这个动态地址,将其锁定1后植物即可无限种植,效果如下所示:

CE修改器:外挂制作高级技巧

2.接着在该地址上面右键,选择【是什么改写了这个地址】,然后我们回到游戏,拿起植物然后直接右键放下,会出现两条汇编指令。

CE修改器:外挂制作高级技巧

汇编代码分析:

@当我们放下植物后出现: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】这些机器码。

CE修改器:外挂制作高级技巧

4.接着我们通过CE来验证一下是否能够定位到相应的地址上,在CE中选择搜索【字节数组】,然后能够搜到【00488E64】这个地址,而我们需要定位到【00488E73】,可以将两个地址相减得到相对偏移【0xF(也就是十进制的15)】就等于我们想要的地址,公式为【00488e64 + 0xF = 当前地址】。

CE修改器:外挂制作高级技巧

5.直接使用易语言配合我封装好的【特征码定位模块】,即可实现定位基地址,需要模块可以联系我。

CE修改器:外挂制作高级技巧

 6.最后附一张注入成功后的效果图,如下所示:

CE修改器:外挂制作高级技巧

通过手工计算偏移地址

首先我们思考一个问题,为什么我们需要手工计算偏移地址,CE找不开心吗?当然不是,有些游戏比如像CF,只要查找改写的地址游戏就会崩溃,严重的话则会弹出TP警告框,但查找访问则不会出现这个情况,此时我们就需要进行手工计算偏移地址,来得到基址数据。

1.首先打开CE工具,并通过前期所学的内容快速的找到阳光的动态地址,然后我们在 【141A0C90】地址上选择【查找访问地址】,我们需要记下【5560】这个偏移地址。

CE修改器:外挂制作高级技巧

上图我们通过动态地址【141A0C90 - 5560 】即可得到上一个指针【1419B730】地址,直接在CE中继续搜索这个地址。

CE修改器:外挂制作高级技巧

2.此时我们选择第二个动态地址,然后再次查找是什么【访问了这个地址】,可以看到是偏移是【768】,继续用【00FE85C8 - 768】得到【FE7E60】 。

CE修改器:外挂制作高级技巧

3.继续查找这个动态地址【FE7E60】,此时我们可以看到基址【006A9EC0】,通过手工计算我们已经知道了其公式为【006A9EC0 + 768 + 5560】完成。

CE修改器:外挂制作高级技巧

------------------------------------------------------------------
搜索阳光的动态地址: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 = 阳光
------------------------------------------------------------------

写教程不容易,转载请加出处!谢谢

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这