【CheatEngine基础教程】拾遗篇(附交流群) |
您所在的位置:网站首页 › ce修改器设置 › 【CheatEngine基础教程】拾遗篇(附交流群) |
在拾遗篇里我将简单介绍一下之前章节中漏掉或者不成系统的内容,随缘更新。 话说我今天灵机一动,想用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 |