CheatEngine

    xiaoxiao2021-03-25  337

    这题我最后一关没有做出来,所以直接引用pcat的(侵删)

    1、准备CheatEngine5.6.1版本(其他版本也可以),为了方便,我就在xp里运行。

    分别打开CheatEngine和题目的Virtual_Game.exe 选择进程,选择“Virtual_Game.exe”,点击“打开” 在Virtual_Game界面(以下简称VG)点击“下一步”,就可以看到第一个挑战。 -----pcat:02----- 2、精确值扫描 首先得说明的是CheatEngine是一款内存修改编辑工具,这里健康值100也是驻留在内存里,而点击“打我”就可以随机减少该值,只要“精确扫描”初始值,再扫描下变化值,一般就可以找到其内存地址,就可以把这个值锁定,修改为1000达到下一关条件 先输入100,精确扫描,4字节(一般int型就选这个),点击“首次扫描” 左边出来一大堆地址(其值都为100),这时候点击VG的“打我”,留意CE左边变化的值,如果哪个值变化为VG上新的健康值,那么我们找的很大可能是它了。 如果不敢保证就重新输入VG上的新值(例如99,这个值不是固定的,要看你自己VG上显示的值),再点击“再次扫描”(千万别点击“新的扫描”),左边一般就只会出现一个地址(如果出现不止一个,就再重复“打我”这个操作,看看哪个地址的值变了) 对着左边栏的地址双击就会出现下面的编辑栏里,在“值”那区域双击就可以更改值为1000,这时候点击VG上的“下一步”就到了下一关。 -----pcat:03----- 3、未知的初值 底部蓝色的进度条是跟一个未知的数值相关,每点击“打我”这个数值就会随机减少,要求我们修改这个数值为5000就过关。 先点击“新的扫描”,扫描类型选择“未知的初始值”,照样4个字节,再点击“首次扫描”,会found很多结果,但不会列举出来。 这时候点击VG的“打我”,再在CE里选择“减少的数值”,再点击“再次扫描”,左边栏会列举一些,再重复“打我”→“减少的数值”这个步骤,直到左边栏剩下一个地址或者有一个地址的值在0到500之间,就确定是它了。 双击它,进入下面编辑栏,编辑值为5000,然后VG上就可以按下一关。

    -----pcat:04----- 4、浮点数 其实跟第一关没多大区别,只是第一关精确定位是选择“4字节”,这关可以分别选择“浮点数”以及“双精度浮点数”。在“开火”那里可以通过“减少的数值”来找到。(条条大路通罗马) 修改2个值为5000即可过。 -----pcat:05----- 5、代码查找 按第一关的步骤,“新的扫描”,初值100,精确扫描,4字节,“首次扫描” 然后VG上“改变数值”,CE上修改为新值,“再次扫描”,基本上就会定位到地址,双击进入下面编辑,右键“找出是什么改写了这个地址(T) /查找写入该地址的代码(T) /Find out what writes to this address”  弹出框“将使用CE调试器调试当前进程,继续?”,点击“是” 出现一个白框, 再在VG上点击“改变数值”,这个窗口就多了一个汇编语句,选中它,点击“替换” 把这句汇编语句修改为nop(汇编的空语句),点“确定”,再点“停止”,点“关闭”,再点“改变数值”,就通过了。 这时候新手们心里可能会有大大的问号:到底我们在其中做了什么? 本关的关键汇编代码如下:(其中[P]为我们所找到的地址) mov eax,[P] mov [ebp-08],eax mov eax,[ebp-04] mov [P],eax mov eax,[P] cmp [ebp-08],eax - - - mov A,B 就是把B的值赋值给A, cmp A,B 就是比较A、B的值 整理下逻辑就是,把[P]赋值给eax,再把eax赋值给[ebp-08](这时候3个值是相同的) 然后这时候又把[ebp-04]赋值给eax,再把eax赋值给[P],随后又把[P]赋值给eax, 最后比较[ebp-08]与eax的值,如果相等就过关,然而[ebp-04]这个值是随机的,所以逻辑上很难相等,就只能去修改汇编代码了。 最简单的写法就是把mov [P],eax替换为nop,那么[P],eax,[ebp-08]的值都会相等。 (如果有兴趣的话,可以尝试修改别的汇编语句) ps.有同学可能想到勾选“锁定”键来防止[P]被修改,但锁定数值的原理是1ms定时器不断修改值,而点击改变数值”这个操作很快,毫秒内就会修改[P]的值并做了以上操作,故很难实现。 -----pcat:06----- 6、指针 先按照之前的步骤找到一个地址,在编辑栏里右键“找出是什么改写了这个地址(T)”,出来白框后,点击VG上“改变数值”,白框里就会有一条汇编语句,选中它,点击“详细信息”,红色的为刚才那句汇编语句mov [ecx+eax*4],edx 另外eax为00000030,这里要求+eax*4,也就是c0的偏移量 在“复制内存”那里右键出现“复制简易猜测到剪贴板”,点击下,得到值00186EA0(如果你得到的值不同也不要紧,步骤对即可)。然后“确定”,“停止”,“关闭” “新的扫描”,勾选“Hex”,对着输入框右键粘贴刚才复制的值00186EA0,“首次扫描”,得到一个地址 点击“手动添加地址”,弹出窗口后勾选“指针”,AddressOfPointer填写刚才得到的那个地址,Offset偏移值填写刚才算出的c0,然后确定 锁定指针的值,并修改值为5000,然后点击VG的“改变指针”,等待3秒即可过关。 -----pcat:07----- 7、代码注入 先按照之前的步骤找到一个地址,在编辑栏里右键“找出是什么改写了这个地址(T)”,出来白框后,点击VG上“打我”,白框里就会有一条汇编语句,选中它,点击“显示反汇编程序”, 出来“内存浏览器”,满屏的汇编语句,点击菜单栏的“工具”→“自动汇编” “模板”→“代码注入” 打算在哪条地址上跳转?默认都会填写好,如果没有的话,就填写那第一行的地址 把dec [00d40d48](具体数值看你自己里面的)改为add [00d40d28],2 (dec是自减,add是添加,这样修改的话就会达到点击一次“打我”就会得到2格血的效果,当然可以有其他的写法达到同样的效果) 点击“执行”,再点“是”,“确定”,关闭除了CE、VG以外的子窗口,再点击VG上的“打我”,就过关了。 -----pcat:08----- 8、多级指针 这个是最难的,在本关中,你将看到4级指针,它由第一个指针指向第二个指针,再由第二个指针指向第三个指针,由第三个指针指向第四个指针,最终指向血值的真正地址。 【先来个简单的过法】 先按照之前的步骤找到一个地址,右键“扫描当前指针地址”,出来2个窗口,按默认填写的就可以,然后“正在扫描的线程”可以填写大一点,我就填写了个3,然后按下“确定” “为存储的结果指定名称”,随便填写个名字,如111,保存。 之后就会进行“指针扫描”,等待一段时间(如果扫描的时间太少了,待会可能会搜不到)再按“停止”,出来“警告”,点“确定”即可 然后出来一大堆扫描结果,记得左上角得是“4字节”,再点击VG的“改变指针”,然后3秒后VG上的数值会变,记下它,例如变成715, 点击指针扫描器→“重新扫描内存-移除没有指向正确地址的指针(Z)”,出来窗口后,选择“数值查找”,输入刚才记下的715,点击“确定”,会再弹出保存窗口,随便存储名字,例如222

    这时候满足条件的扫描数就很少了,如果你的pointercount为0的话,估计就是前面搜索的时间太少了(重来这关吧),然后选择第一条(其他有些也可以),双击它,就显示在CE的编辑栏里了

    锁定它,修改为5000,再去VG里点击“改变指针”,等待3秒就过关。

    【复杂的过法,手动查找各级指针】 ( # ▽ # ),我就不截图,全靠描述。 1)先按照之前的步骤找到一个地址(记录下,1F5288),在编辑栏里右键“找出是什么改写了这个地址(T)”,出来白框后,点击VG上“打我”,白框里就会有一条汇编语句,选中它,点击“详细信息”,看到mov [ecx+eax*4],edx 这里一个诀窍是[]里第一个是基址,在窗口里看ECX的值(而不要去关注复制内存那里显示的可能的值,都说了是可能的),以我找到的为例,ECX=1F5128,然后跟上一个地址的差值160就是待会要用到的偏移量(嗯,偏移量这么去算就可以) 2)“新的扫描”,勾上Hex,输入1F5128,“首次搜索”,得到地址1886A0,点击“手动添加地址”,勾选“指针”,输入1886A0,偏移160,确定,在编辑栏出来,然后右键“找出是什么访问了这个地址(S) /查找访问该地址的代码(S) /Find out what accesses this address”,点击“找出是什么访问了这个指针”,出来白框后,点击VG上“打我”,白框里就会有一条汇编语句,选中它,点击“详细信息”,看到mov eax,[ecx+eax*4](后面指针都会出现这个的),记住我刚才所说的,记录下ECX的值即可,我记下了是1881C8,相对刚才的1886A0,偏移量就是4D8 3)再去“新的扫描”,输入1881C8,得到地址1C7F40,点击“手动添加地址”,勾选“指针”,输入1886A0,偏移4D8,再点击“添加指针”,偏移量为上次的160,然后确定,再重复去找哪个访问了这个地址,还是会看到mov eax,[ecx+eax*4],不管,继续ECX的值1C7EDC,相对上一个地址1C7F40偏移量就是64 4)继续新的扫描1C7EDC,得到地址211E80,手动添加地址211E80,偏移64,添加指针偏移4D8,再添加指针偏移160,确定,再对其找哪个访问了,记录ECX的值211E3C,相对211E80偏移了44 5)新扫描211E3C,得到地址D40D2C,再手动添加地址D40D2C,偏移44,添加指针偏移64,再添加指针偏移4D8,再添加指针偏移160,确定,再找哪个访问了,结果出来两条一样的,都是push [00d40d2c] 这就是最后一次了,这个地址跟我们上面D40D2C一致,所以偏移量为0 6)新扫描D40D2C,左边栏会出现一些绿色的地址(绿色就是胜利的标志了),我们这里就取第一个吧,40F129,手动添加地址40F129,偏移0,添加指针偏移44,再添加指针偏移64,再添加指针偏移4D8,再添加指针偏移160,确定后出现在编辑栏,对其锁定,修改值为5000,然后在VG里点击“改变指针”,3秒后就过关。 -----pcat:09----- 9、注入++

    这个本意就是注入c语言脚本去让健康值与时间挂钩。

    先按照之前的步骤找到一个地址,在编辑栏里右键“找出是什么改写了这个地址(T)”,出来白框后,点击VG上“打我”,白框里就会有一条汇编语句,选中它,点击“显示反汇编程序”

    点击内存浏览器“工具”→“脚本引擎”,弹出一个窗口,把VG界面上c语言代码复制到里面,在timep赋值前加上int addresstochange=你最初找到的地址

    再点击菜单栏的“注入”→“注入当前的进程”,出来“自动汇编”的窗口,点击“模板”→“代码注入”,按我下面的图那样去修改代码(把下面的call剪切到上面,并把dec语句注释掉),然后点击“执行”,再点击“确定”,“确定”

    再点击“打我”,就过关,注意flag在弹框内容里,别看漏了。
    转载请注明原文地址: https://ju.6miu.com/read-101589.html

    最新回复(0)