新人福利——Cheat Engine功能之基础篇

14 篇文章 7 订阅
13 篇文章 8 订阅

CE全程Cheat Engine,主要用于对软件内存数据的扫描和调试,其功能可以说非常强大,下面我们对其功能一一讲解

(1)CE的下载

CE的下载建议从官网下载最新版本

Cheat Engine

目前是7.4版本

也可以百度下载一些有中文补丁的版本,不过熟悉了以后还是用原版比较好

(2)CE的主界面

打开CE以后,我们可以看到如下主界面,至于初次打开时弹出的窗口全部取消或者关闭即可

在左上角我们可以看到CE的版本是7.4,这是目前的最新版,当然使用一些特殊的工具打开CE时可以将这个标题隐藏或者变成乱码,以便于隐藏进程防止反调试

在标题下面是一排选项卡,我们放到后面说。

在这些选项的下面有一个带有放大镜按钮

点开这个按钮,我们可以看到当前可以附加的应用,进程以及窗口

通常我们只需要在Applications中选择应用即可

最左边是应用的图标,然后是其PID以及进程名

当我们同时调试多个相同名字的窗口时,可以根据PID来选择正确的进程

选好进程后,直接双击或者点击下面的open就可以打开进程开始扫描了。

当然如果需要对程序进行附加调试,则可以选择Attach debugger to process,不过要注意的是,如果CE附加程序之后,就不可以在用其他程序重复附加了,因为同时只能有一个调试器对某个程序进行调试。如果我们在CE附加调试后,想用其他的调试器,可以用CE重新open这个进程或者其他进程即可,也可以干脆关闭了CE。

在附加按钮的旁边还有2个按钮

这两个按钮分别是打开之前保存的扫描结果和保存当前扫描的结果,文件后缀为.CT

在成功附加进程后,我们会发现原来界面上的No process selected已经变成要调试的进程

在这条信息下面有一个灰色的进度条,用来显示当前扫描的进度

进度条下面就是CE扫描的主界面了,左边的很大的空白处(似乎这里应该叫“空黑处”)是扫描结果窗口,上面显示Found:XXX表示当前有多少个结果,下面分别是Address地址,Value值,Previous上一次的结果。当我们任意扫描一个数值只后,会多出来一项First表示初次扫描结果

当我们锁定一部分结果后,可以选中双击将他们一一存放到下面的储存窗口中

当然,如果有很多的结果都疑似或者确定是有用的,我们可以按住shift+左键按区域批量选中,或者按ctrl+左键逐个批量选中,然后点击右边的红色箭头,将它们一起存放到下面的窗口中

接下来我们看一下扫描选项

首次扫描我们可以点First Scan,当我们首次扫描以后,他会变成New Scan,再次点击则准备开始重新扫描

右边的Next Scan是下一次扫描,只有在首次扫描以后才可以被点击,而有变动Undo Scan则是退回上一次扫描,只有在点击一次下一次扫描后才可以被点击。注意,退回上一次扫描结果只能连续退回一次,如果你不小心点错了一次Next Scan,可以通过这个来回退,如果点了两次,那你可能已经没有回头路了,重新扫描吧。

(3)首次扫描

首次扫描前,我们可以通过下面的选项来配置首次扫描的条件,Hex左边的方框如果选中,表示用16进制扫描,否则默认10进制。Scan Type表示扫描类型,在首次扫描时我们有五种选择,分别是精确扫描,比...大,比...小,在两者之间,未知的初始值。

这里要注意的是,选择两者之间时,如果是两个负数的区间,绝对值越小的负数越大,千万不要写成比-10大,比-20小,这是很低级的错误。

Value Tpye表示扫描的数据类型,我们有11中类型可以选择

由于操作内存的最小单位是字节,所以我们常用的类型是Byte到Array of byte,如果我们无法确定类型,也可以选择All,如果扫描很庞大的程序,可能会让扫描的过程变的很慢,尤其是同时选择了未知初始值。

Binary应用的并不是特别多,因为当某一位改变时,其实也代表这一位所在的字节也发生了变化

Grouped是分组扫描,当2个及以上不相邻的地址同步改变时,我们可以使用这种扫描方式

这表示我们需要同时扫描2个数值,其中一个为4字节的1,另一个为float型的2

事实上这种方式也只是为了更精准的定位到我们想要的数据而已,前面的几种数据类型已经满足了我们扫描的所有需求。

在右边有一个Lua formula和Not,前者我们后面再说,Not表示非当前条件,比如我们选择的是在5和8之间的数值,如果选中Not后则变为不在这两者之间,即小于5或者大于8的数据

在基础的扫描选项下面有扫描内存的范围

我们可以点击All所在的选项卡,来选择要扫描的模块

也可以自定义要扫描的范围

在右侧有一个Unrandomizer功能,表示禁用随机数效果,然而这功能只在少数特定环境下生效

还有一个是加速功能

这功能看似强大,但是也仅限于部分弱联网或者单机程序,在网络通信频繁的程序中使用加速效果,可能会造成毁灭性的后果,比如程序崩溃,或者账户禁用等等。

下面的Writable表示是否可写,大部分时候我们需要把这个勾选上

当我们扫描一个数据时,发现明明在某个地址存放这个数值,却无法扫描到,此时我们可以考虑讲这个选项点掉,因为这个地址的页面属性可能是不可写的,比如XOX游戏的角色基地址。

另外两个我们默认即可,一个是可执行,一个是写入时复制,对我们的常规扫描几乎没有什么帮助。

Fast Scan快速扫描选项表示扫描的结果按照几字节对齐,当我们扫描一个数据得不到任何结果时,可以考虑将快速扫描去掉,或者改成1。此时没有内存对齐的结果也可以扫描出来

最后一条选项表示在扫描时暂停游戏,这个功能应用在数据变化特别频繁的时候

如果扫描一些大型的程序,这个功能尽量不要使用,因为在程序暂停的时候会影响网络通信,造成掉线等问题。

在我们CE的左下角,可以看到一个按钮,写着Advanced Options,这个按钮也可以实现暂停游戏的功能,并且是随时暂停

点击以后我们可以看到一个新的窗口,左上角的小方块就是暂停和继续游戏的按钮,这个窗口的其他功能我们放到后面去说

在我们选择字符串扫描时,扫描选项的右侧会出现几个选项

Case sensitive表示是否区分大小写,这个默认勾选就可以,上面两个选项如果都不选则表示扫描的是UTF-8编码,如果勾选Codepage表示扫描ASCII编码,勾选UTF-16则是UTF-16,也就是Unicode编码。除此之外,如果想扫描BIG5等编码,则需要转成字节集之后用字节集扫描,也就是

(4)再次扫描

当首次扫描以后,下面的大部分选项都会变为不可修改状态

此时扫描方式会变的不一样

这里的选项分别是精确数值,比...大,比...小,两者之间,增加的数值,增加了多少,减少的数值,减少了多少,变动的数值,未变动的数值,与初次扫描比较。其中增加和减少了多少也可以按百分比去扫描。

只要按照字面意思去筛选数据即可。

在扫描时我们会发现结果里有一些值是绿色的,这些地址所指向数值的含义是不会随着程序重启而变化的,他们可能是全局变量,或者在全局变量的附近

这个结果在不同版本的CE中表示方式也不同,新版的CE会以模块+偏移的方式去显示,因为有些模块的基地址是随着程序重启而改变的。

数据的观察与处理

扫描到结果以后,我们可以将结果拉到下面的列表中一一进行观察和处理

在这个列表的最左侧,Active表示是否锁定结果,如果点击以后,则会对锁定的结果进行频繁的写入锁定时的结果。

这种方法有一定的局限性,如果和程序中的写入函数频繁冲突,可能会造成崩溃等问题,而对于网络验证频繁的程序也可能会出现掉线或者检测等问题。所以并不是所有的数据都可以进行锁定的,要分析具体的情况来判断是否可行。

Description则是表述,备注,在数据较多的时候,可以用他来备注我们已经选定关键数据

Address Type Value分别是地址,数据类型,值,这三个才是我们需要操作的关键

选中一个地址进行双击,会弹出修改和添加偏移的窗口

在Type里可以修改查看的数据类型,同样双击列表中的Type也可以实现这个功能

下面的Hexadecimal则是是否用16进制查看,在右键点击列表也能实现这个功能

Signed表示否有用无符号查看,这个可以用处并不大,默认即可

Pointer是个关键,点击它可以增加一层偏移,并出现增加和减少偏移的按钮

图中的数据的公式为[[RNFCE2.exe+BDA38C]+C] 结果为float型的292.1288147

(5)部分扫描实例

快速扫描

快速扫描主要针对的是没有内存对齐的数据,我们用DWORD型正常扫描下图中的b,发现可以得到一个结果,但是并不是一个基地址,而且修改之后也没有任何效果

我们尝试用其他的数据类型去扫描,发现都无法得到正确的数据,此时怀疑可能是内存没有对其。

于是我们将内存扫描去掉,并再次重复以上操作,并最终得到一个float类型的地址

再将a扫描出来之后,将a和b同时改为0,跳出循环,程序结束

暂停程序

在下面的程序中,由于数值刷新的非常快,我们无法准确的获取要扫描的数值

程序每个0.1s随机打印一个数值,为了能够准确的进行扫描,我们可以点击上面提到的暂停按钮来将程序暂停,扫描之后再将程序运行

运行后数值就实时显示在已经扫描到的结果上了

锁定内存

在下面的程序中,数值刷新的非常快,并且我们需要将数值改为0一百次才可能跳出循环

此时我们首先需要用暂停程序的办法扫描到正确的地址

运行之后,我们将数值改为0之后,次数增加了1

如果想要快速的跳出去,改100次自然是不现实的,但是我们可以利用锁定的方式将数值锁定为0,这样就可以程序自我运行来跳出循环

我们会发现,当我们锁定0以后,程序并不会连续输出100次成功,而是每两次成功之间会间隔很多失败

这是因为,锁定的原理其实是像内存中不断的写入数值,而我们锁定的写入速度并没有程序的写入速度(10ms/次)快,所以失败的数量会很多,其实锁定之后成功100次只需要短短的几秒钟。

(6)查看访问和写入代码

由于我们扫描到的结果不一定是基地址,所以我们需要通过访问代码来获取数据的的每一层偏移,并最终得到基地址

那么如果获取访问代码呢?

我们可以在结果上点击右键,发现可供选择的选项很多

这里的F5和F6两个快捷键所在的功能分别是查看访问当前地址的代码和查看写入当前地址的代码

对于选择访问还是写入,要根据具体情况去分析。比如,我们已经确定了某个地址就是我们想要的地址,无需分析其写入过程,则此时用访问代码即可。

如果我们得到的地址只是一个临时的地址,只有在特定操作时才是想要的结果,此时需要用写入断点。比如,有一个地址,里面存放的是每次使用物品的ID,但是当物品使用之后这个地址就不在访问了,或者在做其他操作的时候会写入其他的数值,那么我们可以对这个地址查看写入代码,再次使用物品时去分析写入的来源,这样会有很大几率得到物品ID在对象内的偏移地址。

在我们扫描自己编写的小程序时,得到了一个可以改变实际数值的结果

此时的地址并不是绿色的,所以每次重新启动程序,这个地址是会变化的,为了能够得到基地址,我们需要查看访问它的代码。

右键,查看访问代码,此时会弹出一个窗口

这个窗口和我们最开始附加调试程序的窗口是一样的,也就是说,当我们点击Yes以后,这个程序就开始被CE调试了,如果我们要用其他的程序去调试它,则需要CE重新附加程序或者关闭CE。

点击Yes后,弹出访问代码窗口

在不做任何操作时,这里是没有代码的,也就是说这个地址此时没有被任何代码访问。当我们点击程序上的“点击修改”按钮后,窗口中出现了若干条代码

每一条代码左边都显示1,这表明当前这个代码只访问了这个地址1次,而右边的地址则表示这条代码在内存中的地址

再向右可以看到一小段字节集,表示这条代码的机器码,也就是最右边的汇编代码在内存中的存放形态。

任选一条代码,左键选中后,右边的选项被激活,同时下面的窗口中显示出这条代码周围的5条代码,以及访问时寄存器的数值

右边的第一个选项Replace是修改代码,如果仅仅是为了查找数据来源,这个功能是没有什么用的,不过如果我们想让这条代码失效或者实现其他的功能,则可以适当的使用这个功能去进行修改。比如第二个结果很明显是像这个地址里写入数据,如果把他改成nop,那么无论我们怎么点击按钮,这个内存中的数值都不会被改变。

Show disassembler是显示反汇编窗口,这个我们放到后面再说

Add to the codelist表示将选中代码添加到Code list列表中,也就是我们点击游戏暂停的那个窗口

这个列表用来保存关键代码,毕竟访问窗口不可以一直开着,后面想对这个代码进行操作都可以到这个列表里来操作。

接下来我们看最后一项

点击之后弹出的信息,和代码窗口下面的小窗口中显示的内容是一致的,只是看起来方便一些

对于这条访问代码,我们需要继续分析的来源是寄存器eax,偏移为+C,我们可以直接在CE中扫描eax,也就是0x0994B50,可以得到基地址

同样也可以直接顺着代码向上分析,因为在这条代码的上一条就是eax的来源

我们可以在这个窗口上点击右键,然后点击

也可以直接Ctrl+C复制整个窗口的信息。

不过在点击右键时要注意,如果我们在中间的一排小字上点右键,则复制出来的只是eax的地址

这样我们就完成了一次偏移的分析,并成功得到了基地址和偏移表达式[[RNFCE2.exe+BDA38C]+C]

如果一条数据有多个偏移的话,我们可以对扫描到的地址重复访问的操作,并最终得到基地址

通过访问代码和CE扫描可以得到偏移表达式,但是如果我们下的写入断点,想找到写入来源,这个方法就不可以了,因为写入代码中是没有我们想要的偏移的。所以这种情况只能通过分析汇编代码来继续分析,最起码要把第一个偏移分析出来后才可以继续用前面的方式继续分析。

(7)内存查看器

由于访问和写入代码能够查看的汇编代码只有5条,有时候并不能满足我们需求,因为并不是所有的数据都可以用简单的访问和扫描来完成,所以我们需要用过内存查看器窗口来进行更深入的分析

在扫描结果窗口的左上方,有一个Memory view按钮,点击他可以打开内存查看器

同样在查看访问代码的窗口中,我们也可以点击

这个按钮来打开内存查看器,并将代码跟随到这条代码处

这个窗口的功能非常多,虽然用起来可能没有xllydbg那么方便,但是也基本上可以满足所有的需求。

首先我们来看顶部的File按钮,点击后打开一个选项卡

第一个选项是可以打开一个新的内存查看窗口,我们可以同时观察多段代码和内存

第二个选项是保存反汇编输出,也就是说我们可以批量选中并保存反汇编代码到文本文档里

其他的选项我们暂时用不到,后面在做讲解

接下来看第二个Search按钮,点开后的选项卡中有2个选项

第一个选项是查找内存,第二个是查找代码

我们先来看查找内存

点开之后是一个小窗口,可以设置要查找的内存和范围

这里还可以设置要查找的字节集,或者文本,这个功能在到某个对象中寻找某个数值的数据时可以用到,比如我们要搜索一个字符串123,他会直接调到第一个出现123的位置

查找代码就很容易理解了,我们写入一个或者一段汇编代码,他会把范围内的所有符合的代码都查找出来

如果扫描范围很大,则速度会慢一些,当然,一般来说我们都是按照模块取扫描的

在扫描按钮的右边是视图按钮,点开之后是所有的可以设置的视图,

上面区域中的主要是调试时用到的,第一个是堆栈追踪,我们任意找一条正在执行的代码,点F5下断让其断下,此时在窗口中多了一些按钮

这些按钮都是下断调试时会用到的功能,左侧的红点相当于F5设置断点,然后依次是运行,单步步入,单步步过,执行到返回,执行到。

在此时,堆栈追踪选项被激活,点击打开后可以看到堆栈的返回信息

堆栈追踪下面一次是监视列表,断点列表,线程列表,调试字符串,调试事件和用户写入日志

这里其实我们主要用到的是断点列表,他用于对用户设置的断点进行操作

比如我们在对某个数据下了一个写入断点,在某个代码下了一个F5断点,在断点列表里都会显示出来

右键点击带有delete的选项就可以删除该断点

在第一个区域的下面,有一个All string所有字符串和Memory regions内存区域,这两个是比较重要的

首先所有字符串点开以后,会弹出一个小窗口

我们先点击右上方的Generate string map来生成字符串映射,然后点击下面的show list可以显示出来所有字符串

内存区域的主要作用是观察内存中的不同区域的作用和页面属性,暂时用不到,后面再说

接下来的两个选项,分别是枚举DLL和符号表,以及图形内存视图,后者用处不大

枚举DLL和符号表可以帮助我们快速找到一些模块的基地址及函数信息

视图窗口最下面的区域主要是一些窗口和信息的显示,通常默认即可,最后一条设置字体颜色等等,自行翻译然后自定义即可

视图的右边是调试选项,和上面讲到的切换断点等功能是一致的,我们可以在选项卡里看到快捷键,方便我们快速操作反汇编窗口

右边的Tools是工具选项,我们后面用到再说

下面我们来看一下反汇编窗口中的信息和功能。

(8)反汇编窗口

反汇编窗口就是内存查看器最中间的主要区域,他显示着程序的汇编代码

左边的区域是地址,通常会以模块+偏移的形式显示,然后是机器码,汇编代码和注释

我们可以点击ctrl+g跳转到任意地址的代码处,当然要保证这个地址是在代码段

在call和跳转上点空格可以跳转到指向的地址,同样也可以用删除键来进行回退

在任意代码上点击右键就可以看到,最上面的3个选项就是上面提到的三个功能

下面的两个选项是设置书签和跳转到书签,由于CE不能像xdbg那样灵活的运用和找到注释,所以书签的作用就是再重新打开CE时找到我们上一次记录的代码。虽然CE也可以设置注释,但是确没有转到注释的功能

其他的功能在实际的应用中并不常用,除了F5设置断点,这个在之前我们已经讲过了

(9)数据断下访问断点分析数据

内存窗口的左下角是数据窗口,当我们扫描到一个地址,想对其下访问或者写入断点时,可以选中这条地址,按ctrl+F2,此时会打开内存窗口并在数据断跳转到这个地址

在数据窗口的某个地址上点右键,可以弹出很多功能

第一部分的4个功能分别是编辑,转到地址,搜索内存和搜索可以访问的字符串

编辑我们可以通过双击实现

转到地址其实和汇编窗口的ctrl+g是相同的,他适用于各个窗口

搜索内存在之前已经讲过,只是他在这里又出现了,至于搜索可以访问的字符串,这个暂时没什么用

第二部分的两个功能呢分别是复制和粘贴,选中一部分内存,然后操作一下就明白了

第三个区域比较重要,第一个选项是查看的数据类型,通常我们选择4字节HEX,当然特定的数据要用特定的方式看

第二个选项是文本编码,根据需求选择即可

第三个选项分隔符,可以忽略

第四个选项是自定义的对齐方式,最实用方便的观察方式其实是用4对齐

第五个选项是相对地址,也就是偏移,在xdbg中双击地址就可以实现,但是在CE里麻烦一些

然后我们来看下最后部分的最后一个功能,数据断点

展开选项后我们会发现断点的设置方式和类型有很多

最下面的部分是设置断点的类型,一般情况下我们选择第一个硬件断点,第二个是内存断点,也就是异常断点,这个断点设置后会很卡,甚至可能会崩溃,所以用的很少,最后一个是DBVM断点,在特定情况下会用到

最上面的部分则是断点的方式,分别是写入和访问断点,这个要根据分析需求来设置

而中间的部分的后两个则是查找访问代码和写入代码,在上面已经讲过了,第一个break and trace是中断和跟踪,这个暂时用不上,后面再说

那么接下来我们就用硬件访问和写入断点去分析下数据

首先我们对刚刚找到的地址下一个硬件访问断点,由于这个数据在不断的被写入和访问,所以我们下断会立刻断下

设置之后我们可以在上面讲到的断点窗口把断点删掉,也可以在数据上点右键,此时最下的选项会变为删除断点

我们习惯性先删除断点再进行分析

观察访问代码,我们发现这处访问代码其实是拿基地址里的值和0进行比较

我们可以直接将下一条的跳转改成jmp,这样就无需锁定跳出循环

(10)指针扫描

由于CE分析偏移表达式不如xllydbg方便,所以我们很少用它来找基地址,但是他有一个很强大的功能,可以无需分析,躺平找基地址,这个功能就是指针扫描。

然后我们任意扫描一个地址,尽量不要用绿色的,先通过查找访问代码去得到第一层偏移+C

然后在这个地址上右键,选择point scan for this address

在这个窗口中,我们需要进行一些设置,首先是已经勾选的Max different offsets per node后面的数值我们要填4,表示每个节点的偏移最大相差4,因为32位程序的地址是4字节的,然后勾选下面pointers must end with specific offsets,数值填C,表示表达式必须要以+C偏移结尾

下面的部分是设置扫描的线程9条,和最大允许的偏移4095,以及最大的偏移级别7

当然这些数量可以根据具体情况进行修改,保证扫描的效率和准确性,这里我将其改成5,2047和5,然后点击OK,为扫描结果保存一个文件

由于我自己编写的程序较小,所以只得到了一个结果

如果程序较大,得到的结果较多,我们可以通过上面的Use saved pointermap导入上一次扫描的结果(指针映射集),并通过与其他的保存的映射集进行比较来得到准确的结果,毕竟有很多的结果在程序重启之后就失效了。

CE还有很多其他的黑科技我们没有讲到,这里只是先讲一部分比较基础的功能进行了讲解,下一篇CE文章我们再对CE的其他功能进行讲解。欢迎关注公众:任鸟飞逆向进行技术交流和学习!

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cheat Engine V5.6.1 Cheat Engine是一款内存修改编辑工具,它允许你修改你的游戏,所以你将总是赢。它包括16进制编辑,反汇编程序,内存查找工具。与同类修改工具相比,它具有强大的反汇编功能,且自身附带了外挂制作工具,可以用它直接生成外挂。 Fixes: Fixed bug where ce would crash(close) on XP systems on certain type of games when opening a process Fixed the error at "Same as first scan" when using the float type Pointer rescan for value now accepts more than 8 characters Fixed pointerscan for value not supporting more than 1 thread Fixed showing the fpu in the kernelmode debugger Fixed Decreased/Increased by % Dissect Data now detects non-exact floating point values again Disabled executing the aobscan when assigning a script to the table Some disassembler fixes Again some more DPI fixes The byte-editor in the hexeditor window is now properly aligned at the proper height The XMM registers are now shown for kernelmode debugging as well Implemented the stop button for kernelmode "Find what addresses this code accesses" Fixed error message when pressing enter and no address is selected in the addresslist Fixed samememory regions so the last byte is now included as well Fixed the simple-copy/paste option in settings (it now has effect) Fixed bug where pressing alt made a lot of controls invisible in vista and later Fixed the pointerscan bug that caused out of memory problems for the scan (Was already secretly fixed and released for 5.6 one week after the official release, but still mentioning it) Changes: Rightclicking on registers(multiple locations) saves them to the clipboard The values of dissect data can now be saved to disk Auto Assembler script entries have a small <script> text you can click for easier script editing The commonmodulelist.txt has been updated with some extra dll's that have nothing to do with the game (thanks to psych) AutoAssembler: You can't move the cursor beyond the end of a line anymore Pointerscan: Pointerscanner now tells you that pressing stop is a stupid thing to do Pointerscan: doubleclicking an pointer with invalid base now adds it anyhow. (In case the base becomes valid again later) Several extra window positions are now saved when the option to save the position is enabled (included pointerscan and autoassembler) CE now notifies you if it thinks there's not enough dispace left Default pointer option is now set back to insert instead of append Added a "Same as first scan" hotkey option When opening a new process and chosing to disable everything now also disables entries in advanced options
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值