以cheat engine自带的Tutorial.exe程序为例: 1.搜索生命值 2.将找到的地址加入列表 3.在地址上点右键“找出什么读写这个地址”,然后“change Value” 4.得出:mov [eax+18],esi ::eax=009ca668 搜索009ca668 得出 009ca5ec 解释:在009ca5ec中存放了009ca668这个地址 程序运行时 再mov eax, 009ca5ec 因为eax是寄存器 所以要得到eax的值必须得到传值给它的地址。等下我们就必须找出又是谁把值给的009ca5ec 现在先来记录一下我们刚刚找出的一级基址009ca5ec和一级指针P->009ca680。一级偏移为18. 5. Add address manually ==> Point => Pointer: 009ca5ec, Offset:18 => OK =>P->009ca680 解释:创建[eax+18]指针P 即P指向地址009ca680 P指向的地址的值(即009ca680的值)就是血的值 现在开始通过009ca5ec找出存放它的二级指针 6. 在列表项 P->009ca680 上点右键 => Find out what accresses this pointer => Change Value 解释:找出正在读该指针的进程。(我们给一个指针赋值的例子:int ***p=5,在赋值的过程中P的值是不会变的 但是需要读取P的值才能知道整型存放的地址在什么地方 所以我们使用Find out what accresses this pointer 找出谁在读这个地址)
7. mov eax, [eax] eax: 009ca668 ==> 搜索009ca668 ==> 009ca5ec ==> 009ca5c4 解释:通过改变血 我们得到以上指令 同4的解释 我们知道eax: 009ca668 (注意令第一个eax为eax1: 009ca668:, eax2: 009ca5ec mov eax2,009ca5c4) 通过搜索009ca5ec得到009ca5c4。我们得知009ca5c4存放了009ca5ec 从而得到了二级基址,那为什么我们不用一级基址009ca5c4直接搜索二级基址009ca5ec 等下我们看了第10步就会明白了,提示我们还要考虑偏移量的问题。 所以我们得出了二级基址009ca5c4和二级指针P->009ca680。二级偏移地址为0 8. 编辑列表项 P->009ca680,添加指针项,Pointer: 009ca5c4, Offset:0 => OK 现在开始通过009ca5c4找出存放它的三级指针 9. 在列表项 P->009ca680 上点右键 => Find out what accresses this pointer => Change Value 10. mov eax, [eax+14] => eax: 009ca5ec => 009ca5c4 => 计算:009ca5c4-14=009ca5b0 => 搜索009ca5b0 => 009ca544 解释:(注意令第一个eax为eax1: 009 ca5ec:, eax2: 009ca5b0 mov eax2, 009ca544) 要想知道7中留下的问题吗?其实就是在[eax2+14]中,009ca5c4中的值是[eax2+14],所以要得到eax2的值必须减去14。 我们就得出了三级基址009ca544和三级指针P->009ca680。三级偏移是14 11. 编辑列表项 P->009ca680,添加指针项,Pointer: 009ca544, Offset:14 => OK 12. 在列表项 P->009ca680 上点右键 => Find out what accresses this pointer => Change Value 13. mov eax, [eax+0c] =>eax: 009ca5b0 => 009ca544 => 计算:009ca5b0-c=009ca538 => 搜索009ca538 => 0045cc18(绿色显示) 解释:这步骤的解释就和10中完全一样了 要解释的就是0045cc18(绿色显示) 绿色显示就是说这个地址是静态的(就是不会改变的地址) 英文意思就是congratulations 14. 编辑列表项 P->009ca680,添加指针项,Pointer: 0045cc18, Offset:c => OK 最后,将数值改为5000,本步教学终于算是完成了。 15.最后 血=[[[[[[[四级基址(就是绿色的)+四级偏移]]+三级偏移]]+二级偏移]]+一级偏移] |