CheatEngine使用教程

Home / Article MrLee 2015-11-17 8183

原来为了做外挂学习过一阵子汇编,虽然没有精通,但是入门多少理解一些。然后又继续研究了如何使用CheatEngine和Ollydb这两款软件(很NB的大神都是用这俩,还有一个静态的逆向IDA),由于没啥业务怕时间久了淡忘掉,所以觉得很有必要把这个纪录下来!
下面拿一个传奇SF作为例子,我们来读取人物的相关数据。首先打开CheatEngine,我用的是6.4汉化版本。当然了,其它版本也可以的。操作基本上也是一样。然后打开游戏进程,

20151117135520


为了方便数据搜索快速性,我们从人物的坐标开始入手(人物走动坐标马上发生变化易于查找)。题外话:从编程思路来说,我们要定义一个角色,肯定是写一个类,比如Human,然后这个类有自己的属性,什么name,x,y,hp,mp……相关的成员变量,如果我们找到了x的值的内存地址的话,那我们可能就从它推导出地址偏移得到基址!说到基址,就是你的程序加载到内存,你的那个类的地址始终是在程序进程固定的位置,比如说0x00624688是人物的基址,你程序每次启动都会在这里,除非你的程序发生了更新,版本升级。我现在人物坐标是

20151117140003

177,310,我们就输入177吧,因为坐标肯定是小于10000以下的,最多4个字节足矣,像传奇都是以3位数的,2字节就够了。不过我们这里演示还是用4字节。点击搜索,然后结果如下图:

20151117140221


有90个符合的结果,还有3个绿色的,这个是基址,其它都是可变的或者说是由其它基址通过地址偏移得来的。这里,我们还不能确定哪个是人物的基址,为啥?因为一个游戏里面177的数据太多了,不能凭借一个值就能断定基址对吧。那我们该如何操作呢?很简单,让人物简单走动一下,改变坐标即可。

20151117140503

我现在的坐标变成了185:316,那我刚才是177,那就把搜索内容改成185后再次扫描,一定是再次扫描,不能是新的扫描!再次扫描结果只有4个了!如下图:

QQ截图20151117140641


没有一个是绿色的,也就是说,还没有找到基址。不急,慢慢来!继续走动,再看看CE(我后面就简称CheatEngine为CE了),数值都变成我们当前的坐标,而且颜色也变红了。这就是说明有其它的地方把值给改了对吧!不然怎么会变呢?

QQ截图20151117140739


这次4个都变了,我们也不知道用哪个,干脆直接全部加入选择的地址到地址清单

QQ截图20151117140950


然后下面就多了4条数据,我们任意选一条,右键,选择下图选项,一定要是改写哦,虽然读取也行,但是读的地方可能有很多,我们需要花更长的时间去找,如果选改的话,相对来说肯定要少一些,至少我们人物不动的话,他的坐标不会发生变化。

QQ截图20151117141141


点人物再次走动,然后CE那个内存窗口就多了一些汇编指令,如下图:

QQ截图20151117141320


直接选中双击或者详细信息查看,这一步骤是关键点。先看图,我慢慢解析。

QQ截图20151117141406

这里,常用的一些寄存器都有对应的值或者内存地址,像什么eax,ebx,ecx,edx,还有段地址啥的。我们从头往下看,首先,内存地址00580241处有一句汇编代码,mov eax,[ebp-2C],这个我们不用管,我们看下CE给我们提示的,看那个红色的一行,有没有?00580247- mov [edx+24],eax。这句话意思是把eax寄存器的值赋值给[edx+24]内存所指的值,我们看下EAX的值是多少,下面有显示,EAX=000000B8,EDX=07137360,那这句话相当于是 mov [07137360+24],000000B8,相当于是把内存07137384这块指的针改成B8。注意了:我们此时要了解,这个24其实是内存偏移量,我们真正要关心的是EDX的值,也就是07137360,这明显是一个内存地址,通过这个地址进行偏移可以得到一些数据,这个暂时我们不管,我们继续搜索07137360,记住点新的扫描,然后16进制的勾选,如下图:

QQ截图20151117142625


上图结果已经出现了一个绿色的结果,这就是基址,当然了,我们还暂时不能完全的肯定它就是正确的人物类的基址,需要后面验证。先添加到下面,加入选择的地址到地址清单。
以下步骤是我猜的啊,不过验证确实是正确的。先看图后解析:

20151117143311

QQ截图20151117143722


在上面,我们说到了一个偏移量是24,而这个24就是X的坐标,这个坐标我解释下是怎么来的。因为我们现在有了基址嘛,首先是:00624688,基址00624688指向的是内存07137360,然后07137360+24处的地址就是x坐标值了。大胆想象。先看一段C++代码:
class Humen{
   int x;
   int y;
   int hp;
   int mp;
}

我们假设上面这个类就是传奇里面的类,这个类的基址是00624688,在内存空间07137360处开始(new一个有内存地址的嘛,对吧!),现在x坐标我们已经知道是24,那y就是28,hp是32,mp是36,int为4个字节嘛偏移为4个单位,这个应该好理解吧。所以上图中,我们把基址输入00624688后再添加一个28偏移得到了人物的y坐标。在这里,教程基本上结束了,最后还需要验证一次基址是否完全找对,我们把程序退出,然后再重新进入程序,用以上方法找到的基址是否可以读取人物的坐标,如果可以的话,那证明是真的基址,否则需要重新再找。

本文链接:https://www.it72.com/6961.htm

推荐阅读
最新回复 (0)
返回