【原创】CheatEngine课堂之初中篇 - 次元门 | 多元位面碎片集散地

访客需注册方可查看全部版块内容 请您花费一分钟时间完成注册过程 ( 登录 | 注册 )

 
Reply to this topicStart new topic
> 【原创】CheatEngine课堂之初中篇, ——浅淡动态锁定,从锁AP(行动点)开始讲起
会飞的猪
post 2018.01.24, 20:40
楼层 #1
编号: 42,910
帖数: 34
美刀: 141
组别: 列兵 R_18正式成员
注册: 2010.12.14, 11:36
物品: 查看

以下内容皆为本人原创,铁资网首发,转载请注明出处。
作者:会飞的猪 QQ:283915763 三楼楼长


相关课程:
【原创】CheatEngine课堂之高中篇
【原创】CheatEngine课堂之课外活动

什么?小学篇?没有!有的话也只是讲讲CE的各种搜索功能,——太简单懒得写。老规矩,先列贴子大纲,让看官先有个清晰的脉络。
一、前言。——为什么要用CheatEngine(以下简称CE)。
二、动态锁定。——都是基址惹的祸
1、为什么要找基址
2、绕圈的开始:以锁AP为例,上溯到基址
3、再绕回来:从基址出发,到锁定AP


前言
玩铁血的坛友基本都是三四十的老哥们了,喜欢修改的坛友应该大多还停留在当年风靡的游戏修改工具“金山游侠”上。对于一般修改来说,游侠确实够了,不过各位是否注意到,虽然游侠有保存修改的功能,但对于很多游戏来说,重开几次后保存的修改就没作用了,于是又要重新查找,一两个还好,要修改的东西比较多再查一次甭提有多烦了。作为喜欢为省事而折腾的我,从DOS时代的PCTools到FPE,再到GM、金山游侠、东方不败,用过的修改工具算是不少了,直到发现了CE,个人认为这是当下最强大的游戏修改工具,没有之一。

之所以如此推崇CE,作为游戏修改最基本的各种搜索功能这些都不值一提!最强大的功能就是其动态锁定和反汇编、代码注入,这是前面提到的所有游戏修改工具都不具备的。另外,现在很多网络游戏的外挂也是在其基础上制作,足见其之强大。下面我先从解决以前保存的修改重启游戏无用的问题开始,先说说“动态锁定”。


动态锁定

1、为什么要找基址
所谓动态锁定,其中最重要的概念就是“基址”。以前的老游戏地址基本都是固定的,即使使用了指针,其地址也是早就分配好的,所以找到地址后保存修改,再启动游戏也仍然有效。但随着技术的发展,现在都是面向对象编程,很多数据都是在运行时动态分配内存,所以这次找到的地址,下次再开游戏重新分配了,地址自然就变了。

——但在变化中仍然有不变的东西,那就是基址,基址的部分作用是保存在运行时会动态分配内存的对象的指针。程序在操作数据时,先在基址上取得要操作目标对象的位置,再追踪过去得到要操作的数据。打个比方,整个程序就像地球,那么要轰炸某个目标,我们要先知道“经纬度”。其中一个目标叫张三,那么“张三的经纬度”就是一个基址,虽然张三会移动,但有个专人负责测量记录张三的经纬度,所以作为轰炸人员,我们要做的就是“呼叫总部,请告知‘张三的经纬度’”,总部就会将“张三的经纬度”那一栏中记录的张三的当前经纬度的具体值反馈给我们,我们得到张三的经纬度的具体值后即可开始轰炸。

由上面的例子可知,无论张三如何移动,任何轰炸人员只需说一句固定的话就能取得张三当前的位置并进行操作。而假设不存在“张三的经纬度”这个概念,那么每次轰炸张三时,每个轰炸人员都要先自己找到张三的位置才能进行轰炸了。“基址”的作用就在于此——无论如何分配内存,我们保存的修改总是从基址开始,这样就避免了反复查找的操作,即“一次操作,永久有效”,而且喜欢分享的朋友还能把修改记录保存下来分发给一起在玩这个游戏的朋友,让他们也能享受修改的乐趣。

2、绕圈的开始。闲话到此为止,这里以锁AP为例,讲讲如何找到基址。

首先还是先把CE附加到游戏进程上。


搜索AP值,用过游戏修改工具的朋友应该都会,这里就不多言了。为方便后续分析,我选择第1个得到的佣兵进行分析,改变几次AP值后结果如下:


小知识:将搜索值表示为X,那么X≤255占1字节,255<X<65536占2字节,X≥65536为4字节。

注:单纯对数据来说大于等于65536还要看是否小于16777216,如果是就是3字节,但在编程的基本数据类型中没有3字节的数据类型,只有1、2、4、8。那么这里只针对初学修改的朋友提一下:未知当前要搜索的数据占用字节数,也不知道如何选择“数值类型”的话,就看要搜索的值最终会达到的大小——注意不是要搜索的当前值的大小,是该值在已知的变化中能达到的大小。比如要搜索金钱,就算不知道金钱的上限,但谁都应该有过七八万的钱,那在一开始就可以把“数值类型”设为4字节,这样能加快搜索速度,减少搜索次数。如果知道数据的排列顺序,还可以选择byte数组。

简单判断第一条为目标结果后,双击该结果将其加入下面的地址列表,然后右键点击列表中添加的那条记录,选择“找出是什么改写了这个地址”后出现提示框。


点击确定后会弹出一个窗口,左边都是空白的,这时进入游戏,再次改变一下AP值,切出来后就会发现窗口中出现一条指令mov [edi+18],ax


双击这条指令(或单击再点击右侧的“详细信息”),出现如下窗口,蓝框中是一些汇编代码,先不解释太多,右键在红框范围内单击,选择“复制简易猜测到剪贴板”。


回到CE主界面,点击“新的扫描”,注意红框的设置,将刚才复制的简易猜测粘贴到搜索框后搜索,结果如图所示

注:这个简易猜测70%左右的情况是可用的,也有不对的时候,比如搜枪的子弹数,再想继续按此法跟踪就找不到。

黑色地址不用看,上面红框5个绿色是哪个需要按Ctrl + B浏览一下内存判断一下,从上到下按1-5编号,浏览后1、4、5显示如下。可以看到比较乱,没什么规律:


地址2、3显示如下。


为避免后面描述上都会称为地址的混淆,把第2个地址对应的内存区域叫A区,第3个叫B区。可以看到,A区的前两行和B区的前两行一模一样,而A区的第9行前4个与B区的第3行前4个一样。小知识:指针占4字节。刚才我们是找指向AP值的地址的时候找到了这里,而这里每4个值作为一组排列都很有规律,数值看上去也都差不多。

于是可以试一下,第一组A8 41 23 04倒过来就是刚才我们找的值,不用看就可以肯定跳过去是我们搜索AP时对应的第1个佣兵。那么第2组的值就是04234BD4,在内存区域任意位置上点右键,选择“前往”,输入04234BD4确定,看看右边的名字,这不正是第2个佣兵么。同样的我们跳到蓝框值0424E2B4指示的地址位置,刚好是车的名字。再数一下上图前面相同的两行,一行16个值按4个一组分,相同的两行刚好一共8组,对应游戏里的8个佣兵的数量。


那么可以肯定基址就是这两个其中之一了,至于是哪个,先简单分析一下,B区与A区的首地址的差是4233B10-4233718=3F8,再除以4得FE,换成10进制刚好是254,而1.13限定的佣兵数量也正好是254个,说明A区预留的是所有佣兵的地址位,然后在游戏中解雇第2个佣兵后发现B区上第2组值被清0了,A区对应位置没变化,再新雇一个佣兵后,两个区的第2组值仍然没变,但A区的第2组值对应的地址指向数据却变成新佣兵的。所以得出结论:正确基址是A区的首地址即“4233718”。


3、再绕回来:从基址出发,到锁定AP。前面我们从查到的AP记录出发,往上追踪到其基址,那么现在我们再从基础出发回取AP。

关掉内存浏览窗口回到主界面,点击界面靠右下位置的“手动加入地址”


输入刚才得到的基址“4233718”


还记得前面说要“记着这个+18”吗?细箭头所指处填入18,填完后对比一下红框里的地址值是不是变成一样啦,不过黄框的值还是不对,继续按粗箭头所指,把 4 Bytes 改成 2 Bytes ,再看看绿框是不是数值也变一样啦,最近把描述改为“AP”方便以后再用时知道这条记录是干什么的。


点击确定后地址列表就多了一条记录(跟上面那一行记录对比一下看看有什么区别),点击一下新增的记录前“锁定”那一列的小框(上面那一行记录已经没什么用了,删掉),回到游戏奔跑吧兄弟。


闲话。对比两条记录,第一条是直接搜索得到的结果,第二条是在第一条的基础上找到基址后,再从基址出发跳转到的结果,最终表现都一样:从地址042341D5的位置得到AP值。不同的是第一条多次重启游戏后,地址042341D5的位置就不一定是AP值了,而第二条就算在别人电脑上运行也能取得AP值。

好了,动态锁定的入门就讲到这里了,这篇主要是讲如何利用查找到的一个值追踪其基础的方法,那是不是锁什么值都要按这篇的方法去找基址呢?亦或是每个想锁定的值都要这样去找一遍基址?当然不是。那什么时候该找,什么时候不用找,还能利用已找到的基址做些什么,有兴趣的朋友可以接着看下一篇“CheatEngine课堂之高中篇——充分发挥基址的作用,与AP所在地址相关的数据统统锁定”。

本主题由 会飞的猪 于 2018.01.25, 12:50 修改




Go to the top of the page
 
+Quote Post
1 位会员正在查看此主题 (1 位访客和 0 位隐身会员)
0 位注册会员:
Reply to this topicStart new topic
 



[ COPYRIGHT ©2003-2018 CIYUAN.MEN ]   当前时间: 2018.11.15, 11:49