原来为了做外挂学习过一阵子汇编,虽然没有精通,但是入门多少理解一些。然后又继续研究了如何使用CheatEngine和Ollydb这两款软件(很NB的大神都是用这俩,还有一个静态的逆向IDA),由于没啥业务怕时间久了淡忘掉,所以觉得很有必要把这个纪录下来!
下面拿一个传奇SF作为例子,我们来读取人物的相关数据。首先打开CheatEngine,我用的是6.4汉化版本。当然了,其它版本也可以的。操作基本上也是一样。然后打开游戏进程,
为了方便数据搜索快速性,我们从人物的坐标开始入手(人物走动坐标马上发生变化易于查找)。题外话:从编程思路来说,我们要定义一个角色,肯定是写一个类,比如Human,然后这个类有自己的属性,什么name,x,y,hp,mp……相关的成员变量,如果我们找到了x的值的内存地址的话,那我们可能就从它推导出地址偏移得到基址!说到基址,就是你的程序加载到内存,你的那个类的地址始终是在程序进程固定的位置,比如说0x00624688是人物的基址,你程序每次启动都会在这里,除非你的程序发生了更新,版本升级。我现在人物坐标是
有90个符合的结果,还有3个绿色的,这个是基址,其它都是可变的或者说是由其它基址通过地址偏移得来的。这里,我们还不能确定哪个是人物的基址,为啥?因为一个游戏里面177的数据太多了,不能凭借一个值就能断定基址对吧。那我们该如何操作呢?很简单,让人物简单走动一下,改变坐标即可。
没有一个是绿色的,也就是说,还没有找到基址。不急,慢慢来!继续走动,再看看CE(我后面就简称CheatEngine为CE了),数值都变成我们当前的坐标,而且颜色也变红了。这就是说明有其它的地方把值给改了对吧!不然怎么会变呢?
这次4个都变了,我们也不知道用哪个,干脆直接全部加入选择的地址到地址清单
然后下面就多了4条数据,我们任意选一条,右键,选择下图选项,一定要是改写哦,虽然读取也行,但是读的地方可能有很多,我们需要花更长的时间去找,如果选改的话,相对来说肯定要少一些,至少我们人物不动的话,他的坐标不会发生变化。
点人物再次走动,然后CE那个内存窗口就多了一些汇编指令,如下图:
直接选中双击或者详细信息查看,这一步骤是关键点。先看图,我慢慢解析。
上图结果已经出现了一个绿色的结果,这就是基址,当然了,我们还暂时不能完全的肯定它就是正确的人物类的基址,需要后面验证。先添加到下面,加入选择的地址到地址清单。
以下步骤是我猜的啊,不过验证确实是正确的。先看图后解析:
在上面,我们说到了一个偏移量是24,而这个24就是X的坐标,这个坐标我解释下是怎么来的。因为我们现在有了基址嘛,首先是:00624688,基址00624688指向的是内存07137360,然后07137360+24处的地址就是x坐标值了。大胆想象。先看一段C++代码:
我们假设上面这个类就是传奇里面的类,这个类的基址是00624688,在内存空间07137360处开始(new一个有内存地址的嘛,对吧!),现在x坐标我们已经知道是24,那y就是28,hp是32,mp是36,int为4个字节嘛偏移为4个单位,这个应该好理解吧。所以上图中,我们把基址输入00624688后再添加一个28偏移得到了人物的y坐标。在这里,教程基本上结束了,最后还需要验证一次基址是否完全找对,我们把程序退出,然后再重新进入程序,用以上方法找到的基址是否可以读取人物的坐标,如果可以的话,那证明是真的基址,否则需要重新再找。
下面拿一个传奇SF作为例子,我们来读取人物的相关数据。首先打开CheatEngine,我用的是6.4汉化版本。当然了,其它版本也可以的。操作基本上也是一样。然后打开游戏进程,
为了方便数据搜索快速性,我们从人物的坐标开始入手(人物走动坐标马上发生变化易于查找)。题外话:从编程思路来说,我们要定义一个角色,肯定是写一个类,比如Human,然后这个类有自己的属性,什么name,x,y,hp,mp……相关的成员变量,如果我们找到了x的值的内存地址的话,那我们可能就从它推导出地址偏移得到基址!说到基址,就是你的程序加载到内存,你的那个类的地址始终是在程序进程固定的位置,比如说0x00624688是人物的基址,你程序每次启动都会在这里,除非你的程序发生了更新,版本升级。我现在人物坐标是
有90个符合的结果,还有3个绿色的,这个是基址,其它都是可变的或者说是由其它基址通过地址偏移得来的。这里,我们还不能确定哪个是人物的基址,为啥?因为一个游戏里面177的数据太多了,不能凭借一个值就能断定基址对吧。那我们该如何操作呢?很简单,让人物简单走动一下,改变坐标即可。
没有一个是绿色的,也就是说,还没有找到基址。不急,慢慢来!继续走动,再看看CE(我后面就简称CheatEngine为CE了),数值都变成我们当前的坐标,而且颜色也变红了。这就是说明有其它的地方把值给改了对吧!不然怎么会变呢?
这次4个都变了,我们也不知道用哪个,干脆直接全部加入选择的地址到地址清单
然后下面就多了4条数据,我们任意选一条,右键,选择下图选项,一定要是改写哦,虽然读取也行,但是读的地方可能有很多,我们需要花更长的时间去找,如果选改的话,相对来说肯定要少一些,至少我们人物不动的话,他的坐标不会发生变化。
点人物再次走动,然后CE那个内存窗口就多了一些汇编指令,如下图:
直接选中双击或者详细信息查看,这一步骤是关键点。先看图,我慢慢解析。
上图结果已经出现了一个绿色的结果,这就是基址,当然了,我们还暂时不能完全的肯定它就是正确的人物类的基址,需要后面验证。先添加到下面,加入选择的地址到地址清单。
以下步骤是我猜的啊,不过验证确实是正确的。先看图后解析:
在上面,我们说到了一个偏移量是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坐标。在这里,教程基本上结束了,最后还需要验证一次基址是否完全找对,我们把程序退出,然后再重新进入程序,用以上方法找到的基址是否可以读取人物的坐标,如果可以的话,那证明是真的基址,否则需要重新再找。
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2303
- 用户1336
- 访客11116753
每日一句
Labor is the most reliable wealth.
劳动是最可靠的财富。
劳动是最可靠的财富。
新会员