CE全称Cheat Engine,主要用于对软件内存数据的扫描和调试,其功能可以说非常强大,下面我们对其功能一一讲解 (1)CE的下载 CE的下载建议从官网下载最新版本 https://www.cheatengine.org/downloads.php 目前是7.4版本 也可以百度下载一些有中文补丁的版本,不过熟悉了以后还是用原版比较好 (2)CE的主界面 打开CE以后,我们可以看到如下主界面,至于初次打开时弹出的窗口全部取消或者关闭即可 在标题下面是一排选项卡,我们放到后面说。 最左边是应用的图标,然后是其PID以及进程名 当我们同时调试多个相同名字的窗口时,可以根据PID来选择正确的进程 选好进程后,直接双击或者点击下面的open就可以打开进程开始扫描了。 当然如果需要对程序进行附加调试,则可以选择Attach debugger to process,不过要注意的是,如果CE附加程序之后,就不可以在用其他程序重复附加了,因为同时只能有一个调试器对某个程序进行调试。如果我们在CE附加调试后,想用其他的调试器,可以用CE重新open这个进程或者其他进程即可,也可以干脆关闭了CE。 在附加按钮的旁边还有2个按钮 右边的Next Scan是下一次扫描,只有在首次扫描以后才可以被点击,而有变动Undo Scan则是退回上一次扫描,只有在点击一次下一次扫描后才可以被点击。注意,退回上一次扫描结果只能连续退回一次,如果你不小心点错了一次Next Scan,可以通过这个来回退,如果点了两次,那你可能已经没有回头路了,重新扫描吧。 (3)首次扫描 首次扫描前,我们可以通过下面的选项来配置首次扫描的条件,Hex左边的方框如果选中,表示用16进制扫描,否则默认10进制。Scan Type表示扫描类型,在首次扫描时我们有五种选择,分别是精确扫描,比...大,比...小,在两者之间,未知的初始值。 Value Tpye表示扫描的数据类型,我们有11中类型可以选择 Binary应用的并不是特别多,因为当某一位改变时,其实也代表这一位所在的字节也发生了变化 Grouped是分组扫描,当2个及以上不相邻的地址同步改变时,我们可以使用这种扫描方式 事实上这种方式也只是为了更精准的定位到我们想要的数据而已,前面的几种数据类型已经满足了我们扫描的所有需求。 在右边有一个Lua formula和Not,前者我们后面再说,Not表示非当前条件,比如我们选择的是在5和8之间的数值,如果选中Not后则变为不在这两者之间,即小于5或者大于8的数据 在右侧有一个Unrandomizer功能,表示禁用随机数效果,然而这功能只在少数特定环境下生效 还有一个是加速功能 下面的Writable表示是否可写,大部分时候我们需要把这个勾选上 另外两个我们默认即可,一个是可执行,一个是写入时复制,对我们的常规扫描几乎没有什么帮助。 Fast Scan快速扫描选项表示扫描的结果按照几字节对齐,当我们扫描一个数据得不到任何结果时,可以考虑将快速扫描去掉,或者改成1。此时没有内存对齐的结果也可以扫描出来 在我们CE的左下角,可以看到一个按钮,写着Advanced Options,这个按钮也可以实现暂停游戏的功能,并且是随时暂停 当首次扫描以后,下面的大部分选项都会变为不可修改状态 只要按照字面意思去筛选数据即可。 在扫描时我们会发现结果里有一些值是绿色的,这些地址所指向数值的含义是不会随着程序重启而变化的,他们可能是全局变量,或者在全局变量的附近 数据的观察与处理 扫描到结果以后,我们可以将结果拉到下面的列表中一一进行观察和处理 这种方法有一定的局限性,如果和程序中的写入函数频繁冲突,可能会造成崩溃等问题,而对于网络验证频繁的程序也可能会出现掉线或者检测等问题。所以并不是所有的数据都可以进行锁定的,要分析具体的情况来判断是否可行。 Description则是表述,备注,在数据较多的时候,可以用他来备注我们已经选定关键数据 Address Type Value分别是地址,数据类型,值,这三个才是我们需要操作的关键 选中一个地址进行双击,会弹出修改和添加偏移的窗口 下面的Hexadecimal则是是否用16进制查看,在右键点击列表也能实现这个功能 Signed表示否有用无符号查看,这个可以用处并不大,默认即可 Pointer是个关键,点击它可以增加一层偏移,并出现增加和减少偏移的按钮 (5)部分扫描实例 快速扫描 快速扫描主要针对的是没有内存对齐的数据,我们用DWORD型正常扫描下图中的b,发现可以得到一个结果,但是并不是一个基地址,而且修改之后也没有任何效果 于是我们将内存扫描去掉,并再次重复以上操作,并最终得到一个float类型的地址 在下面的程序中,由于数值刷新的非常快,我们无法准确的获取要扫描的数值 在下面的程序中,数值刷新的非常快,并且我们需要将数值改为0一百次才可能跳出循环 这是因为,锁定的原理其实是像内存中不断的写入数值,而我们锁定的写入速度并没有程序的写入速度(10ms/次)快,所以失败的数量会很多,其实锁定之后成功100次只需要短短的几秒钟。 由于我们扫描到的结果不一定是基地址,所以我们需要通过访问代码来获取数据的的每一层偏移,并最终得到基地址 那么如果获取访问代码呢? 我们可以在结果上点击右键,发现可供选择的选项很多 对于选择访问还是写入,要根据具体情况去分析。比如,我们已经确定了某个地址就是我们想要的地址,无需分析其写入过程,则此时用访问代码即可。 如果我们得到的地址只是一个临时的地址,只有在特定操作时才是想要的结果,此时需要用写入断点。比如,有一个地址,里面存放的是每次使用物品的ID,但是当物品使用之后这个地址就不在访问了,或者在做其他操作的时候会写入其他的数值,那么我们可以对这个地址查看写入代码,再次使用物品时去分析写入的来源,这样会有很大几率得到物品ID在对象内的偏移地址。 在我们扫描自己编写的小程序时,得到了一个可以改变实际数值的结果 右键,查看访问代码,此时会弹出一个窗口 点击Yes后,弹出访问代码窗口 再向右可以看到一小段字节集,表示这条代码的机器码,也就是最右边的汇编代码在内存中的存放形态。 任选一条代码,左键选中后,右边的选项被激活,同时下面的窗口中显示出这条代码周围的5条代码,以及访问时寄存器的数值 Show disassembler是显示反汇编窗口,这个我们放到后面再说 Add to the codelist表示将选中代码添加到Code list列表中,也就是我们点击游戏暂停的那个窗口 接下来我们看最后一项 我们可以在这个窗口上点击右键,然后点击 不过在点击右键时要注意,如果我们在中间的一排小字上点右键,则复制出来的只是eax的地址 如果一条数据有多个偏移的话,我们可以对扫描到的地址重复访问的操作,并最终得到基地址 通过访问代码和CE扫描可以得到偏移表达式,但是如果我们下的写入断点,想找到写入来源,这个方法就不可以了,因为写入代码中是没有我们想要的偏移的。所以这种情况只能通过分析汇编代码来继续分析,最起码要把第一个偏移分析出来后才可以继续用前面的方式继续分析。(7)内存查看器 由于访问和写入代码能够查看的汇编代码只有5条,有时候并不能满足我们需求,因为并不是所有的数据都可以用简单的访问和扫描来完成,所以我们需要用过内存查看器窗口来进行更深入的分析 在扫描结果窗口的左上方,有一个Memory view按钮,点击他可以打开内存查看器 首先我们来看顶部的File按钮,点击后打开一个选项卡 接下来看第二个Search按钮,点开后的选项卡中有2个选项 我们先来看查找内存 点开之后是一个小窗口,可以设置要查找的内存和范围 在扫描按钮的右边是视图按钮,点开之后是所有的可以设置的视图, 在此时,堆栈追踪选项被激活,点击打开后可以看到堆栈的返回信息 这里其实我们主要用到的是断点列表,他用于对用户设置的断点进行操作 比如我们在对某个数据下了一个写入断点,在某个代码下了一个F5断点,在断点列表里都会显示出来 在第一个区域的下面,有一个All string所有字符串和Memory regions内存区域,这两个是比较重要的 首先所有字符串点开以后,会弹出一个小窗口 下面我们来看一下反汇编窗口中的信息和功能。 (8)反汇编窗口 反汇编窗口就是内存查看器最中间的主要区域,他显示着程序的汇编代码 我们可以点击ctrl+g跳转到任意地址的代码处,当然要保证这个地址是在代码段 在任意代码上点击右键就可以看到,最上面的3个选项就是上面提到的三个功能 其他的功能在实际的应用中并不常用,除了F5设置断点,这个在之前我们已经讲过了 (9)数据断下访问断点分析数据 内存窗口的左下角是数据窗口,当我们扫描到一个地址,想对其下访问或者写入断点时,可以选中这条地址,按ctrl+F2,此时会打开内存窗口并在数据断跳转到这个地址 编辑我们可以通过双击实现 搜索内存在之前已经讲过,只是他在这里又出现了,至于搜索可以访问的字符串,这个暂时没什么用 第二部分的两个功能呢分别是复制和粘贴,选中一部分内存,然后操作一下就明白了 第三个区域比较重要,第一个选项是查看的数据类型,通常我们选择4字节HEX,当然特定的数据要用特定的方式看 第二个选项是文本编码,根据需求选择即可 第三个选项分隔符,可以忽略 第四个选项是自定义的对齐方式,最实用方便的观察方式其实是用4对齐 然后我们来看下最后部分的最后一个功能,数据断点 展开选项后我们会发现断点的设置方式和类型有很多 最上面的部分则是断点的方式,分别是写入和访问断点,这个要根据分析需求来设置 而中间的部分的后两个则是查找访问代码和写入代码,在上面已经讲过了,第一个break and trace是中断和跟踪,这个暂时用不上,后面再说 那么接下来我们就用硬件访问和写入断点去分析下数据 首先我们对刚刚找到的地址下一个硬件访问断点,由于这个数据在不断的被写入和访问,所以我们下断会立刻断下 观察访问代码,我们发现这处访问代码其实是拿基地址里的值和0进行比较 由于CE分析偏移表达式不如xllydbg方便,所以我们很少用它来找基地址,但是他有一个很强大的功能,可以无需分析,躺平找基地址,这个功能就是指针扫描。 然后我们任意扫描一个地址,尽量不要用绿色的,先通过查找访问代码去得到第一层偏移+C 下面的部分是设置扫描的线程9条,和最大允许的偏移4095,以及最大的偏移级别7 由于我自己编写的程序较小,所以只得到了一个结果 CE还有很多其他的黑科技我们没有讲到,这里只是先讲一部分比较基础的功能进行了讲解,下一篇CE文章我们再对CE的其他功能进行讲解。 免费评分
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
举报 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
blackdarks 发表于 2022-10-22 16:57 在修改某单机游戏,每消耗1个装备可以增加1个精华,CE只有选all才能扫描出变化的数字,但是即使修改了数据,游戏中还是虚假的并无实际作用 | |
goushilong520 发表于 2022-10-22 14:44 功能非常强大,值得学习,感谢分享! | |
chengdragon 发表于 2022-10-22 14:46 很详细。谢谢分享,收藏慢慢看。 | |
HorkeuKamui 发表于 2022-10-22 15:37 支持楼主把这个教程继续做下去! | |