【CheatEngine基础教程】拾遗篇(附交流群)

您所在的位置:网站首页 ce修改器设置 【CheatEngine基础教程】拾遗篇(附交流群)

【CheatEngine基础教程】拾遗篇(附交流群)

#【CheatEngine基础教程】拾遗篇(附交流群)| 来源: 网络整理| 查看: 265

在拾遗篇里我将简单介绍一下之前章节中漏掉或者不成系统的内容,随缘更新。

话说我今天灵机一动,想用Mac版的CE的小游戏做个教程,结果发现里面压根没有。。。

Mac版CE

彻底没辙了,不是我偷懒是真办不到……只能等我有显卡了再补。。。。

1、如何学习CE的原理

当然是直接阅读CE的源码了:

CE的源码有三大类,Delphi(Free Pascal)、C语言,C++,这意味着除了必备的Lazarus,你还应该有一个支持代码着色的文本编辑器,或者一个IDE。对于不熟悉这些内容的读者,我推荐直接安个VsCode甚至Visual studio,一步到位,干脆好好学一学,总没有坏处。

把这些原理学通了——不需要学会大部分,只要按需学会自己需要的部分,就可以上手自己写一个修改器了。

CE是可以制作修改器的,我没讲这方面的内容的主要原因在于,如果只是生成一个简单的修改器,很简单,点点鼠标就完成了,但如果是用它做一个复杂的修改器,与其去研究Delphi(cheat form),还不如用自己熟悉的编程语言自己写,会更顺手。

2、CE中一些有用的小功能

CE中有一些有用的小功能,可以让我们更方便的做修改器。一个比较特殊的例子是主界面右侧的Unrandomizer,禁止游戏的随机数效果,让它只返回随机数值,这个功能看上去很美,但实际上它只是在少部分游戏和环境中随缘生效……

2.1 lua表达式限定搜索范围

我们发现CE已经有很多搜索方式了,未知的数值,增加/减少的数值,数值增加/减少了,数值大于/小于,两者之间的数值……再加上底下的那个Compare to first scan(与第一次搜索比较),以及侧面的not(不等于此数值),已经很够用。

但实际上,通过lua表达式(lua formula),我们可以以更准确的方式来表达目标值的范围。顾名思义,我们可以用lua的逻辑运算符来指令要搜索的值的范围。

关于lua的逻辑运算符可以看这里:

lua表达式搜索用value来指代要搜索的值,CE中给了我们一个例子,例如我们知道要搜索的值大于5,但肯定不是8,则可以这样搜索:

>不必解释,~=表示不等于, and是逻辑运算符,表示前后的表达式都成立。

很简单吧?

2.2 脚本中避免分配内存的解决方法

有的时候我们在写脚本的时候不想用alloc,有人可能是觉得会有性能开销,还有就是有些人写脚本是用来做修改器的,但如果分配内存,我们在编程写脚本时往往需要额外的操作,比较麻烦。

比如跳转指令,跳转指令的实质是,指令字节+偏移量,偏移量的算法是目标地址-当前地址-当前指令长度。这个要是自己写修改器需要额外的计算。

所以我们可以用CE的内存查看功能寻找合适我们注入代码的内存。在Memory Viewer中的Memory regions(Ctrl+R)里我们可以查看游戏中分配的内存。如果可以找到一个基址(绿色的),且它的内存类型(type)不是mapped,且状态(state)是Commit,就可以用来写代码了,至于内存保护,CE自己会改的,我们写修改器的时候用API改一下也可以,不费事。

不过这个功能并不是对所有游戏都有效,一般还是应用于C++的游戏。

2.3 CEShare

有时候你可能懒得自己做表格,又或者某游戏的修改缺乏思路,这个时候比起发帖求助或者搜索关键字+CT,另一个简单的方法是使用CEShare。CEShare是一个在线的共享服务器,你可以在CE的设置里设置这个地址,通常我们设为以下内容就可以了:

然后在CE的主菜单上就能发现多出了CE Share菜单,可以查找/上传各种CE表格了。

还有一个玩法,熟悉网站开发的读者,可以根据CEShare制作一个自己的作弊表格服务器,支持帐号密码验证,为指定人群提供CE表格。关于CEShare的API格式可以参考CE的开源仓库:

2.4 字符串常量和函数参考

2.5 DBVM和Ultimap

注:Mac版CE不包括DBVM功能。

这一节的内容有些超范围了,因为难免涉及到了Crack的内容。我简单讲一下吧。

CE支持内核级调试。但首先要开启DBVM功能。要开启DBVM功能,你需要:

CPU支持Intel虚拟化技术(现在CPU都支持)。

在Bios开启Intel 虚拟化支持。

尽量关闭一切防护软件,因为可能会影响内核。

禁用使用虚化技术的虚拟机。(下图我就是开了虚拟机服务懒得关所以无法激活)。

禁用系统的内核隔离(Win10系统在设置窗口搜索内核隔离即可)。

接着在CE的关于窗口可以开启DBVM:

能开启的话这里是绿色的。。。

一旦成功开启,你就可以在设置中选择内核级调试器了:

内核级调试器

另外,在Memory Viewer窗口,可以通过快捷键Ctrl+Alt+U进入Ultimap窗口,监视一切指令,通过比对定位我们要找的指令。

这些内核级功能在应对某些数据加密的单机游戏的时候很有用。相关教程有不少,不多说了。

3 CE 7.3中自动汇编的新增功能

2021年8月14日,CE面向patreon会员推出了最新的7.3版,这里面新增了诸如Grouped 搜索支持指针类型的通配符等很多有用的功能。而在这些功能之中,最为重要的就是对于自动汇编的改进。在7.3中,我们可以直接在自动汇编代码(脚本)中写lua/c语言代码,而且这些代码将以字节指令的形式注入到目标区域。对于不熟悉汇编的人,或者想要用汇编实现一些复杂功能的场景,这个功能非常好用。

3.1 内联C语言

这里我直接用CE教程X86版第九关(31337157)为例对这些功能进行说明。考虑到读者不一定会加入CE的会员,这里我会说明的详细一些。

其实CE会员很便宜的,2.5刀一个月,相当于十几块钱……只不过需要信用卡。

在第九关,要求我们做到敌方团队全灭,而我方至少1名角色生存。

前置的内容不说了,两张图搞定:

0x04:生命值;0x10:阵营,我方=1,敌方=2Tutorial-i386.exe+28BC9 的蓝色高亮代码是将新数值(eax)写入生命值地址([ebx+04])的公共代码

所以我们想要修改,需要在这里注入代码,然后判断[ebx+0x10],即目标阵营的值。

然后有两个思路,1是无敌,也就是说如果[ebx+0x10]=1则可以不执行mov [ebx+04],eax。

另一个思路一击必杀,也就是说如果[ebx+0x10]=2则让eax=0。

当然也可以两种思路都用:

这个脚本,在CE 7.3中我们可以写成这种形式:

对于本例而言,这种写法无疑是比较麻烦的,但如果我们要实现复杂的代码,这种写法就非常又优势了。我之前改多娜多娜的时候,为了添加物品功能,硬是用汇编手写了个排序算法,虽然不算难,但依然比较麻烦,因为要考虑到维护寄存器和堆栈的状态,不过如果用这个功能来实现,一切都很简单。

注入的代码

首先它先在我们要注入C语句的地方搞了一个无参数的call,这个call不是常规调用约定,由被调用方维护堆栈。而如下图所示,它内部会保存所有标志位寄存器和通用寄存器:

黑框就是保护寄存器的操作。

执行完这些操作后,才会再使用一个call执行我们注入的C语言代码,然后还原寄存器,非常安全。

总结一下,这种方法的优势是:

不用记忆复杂的跳转指令和寄存器关系

不用维护寄存器

不用维护堆栈

可读性更强

但也不是没有缺点:它注入的代码量更多,效率明显低于手写汇编。

 让我们再来看看当函数有返回值的时候如何处理,其实也很简单。

3.2 内联lua语言

lua的注入和C语言注入类似,只不过它不能像C语言那样定义方法:

3.3 CE的代码注入约定

具体内容可以参考CE作者的介绍:

很简单的,这里大致说一下。

对于{$LUACODE} 和 {$CCODE},在他们后头可以跟随寄存器参数。

寄存器参数以 参数名:寄存器名 的方式定义,不同参数之间通过空格分隔。

任何通用寄存器都可以作为参数,因为CE会把他们全部保存。

至于浮点数的传递,32位和64位都可以用xmm寄存器来传递,一个xmm寄存器可以存储4个单浮点数或2个双浮点数,访问方式举例:

xmm0.0F :(xmm0中第一个单浮点数)

xmm0.1F :(xmm0中第二个单浮点数)

xmm1.1D :(xmm1中第二个双浮点数)

另外对于64位程序而言,还可以用特殊的寄存器标识RAXF,RBXF,RCXF来传递浮点数。

嗯就这些了。还有一些内容自己看文档吧,下班了我去做个汗蒸。。。

最后加个交流群

756575539



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3