CheatMaker教学进阶之一 - 基地址与指针

CheatMaker目前还是有一些需要完善的地方
最大的一个缺点是无法用控件直接使用指针寻址的方法写地址
不过软件作者表示这个将在CheatMaker 1.70时解决

但是本文的主旨是来说明CheatMaker是个及其便捷的修改器设计器
特别是对于不怎么懂计算机语言的人

Frame:窗体


窗体是设计器的基本,所有的界面设计都是在窗体上完成的,一个CMF可以建立多个窗体
--------------系统--------------
【名  称】:通用操作,控件名称标识
【文  本】:通用操作,控件显示文字,这里即窗口标题栏所表示的文字
--------------布局--------------
【坐  标】:通用操作,如果你选择的窗体位置为坐标指定则有用,否则无用
【大  小】:通用操作,不解释...
【窗体位置】:有<坐标指定>、<屏幕剧中>、<窗体居中>,窗体居中只在按钮创建内置窗体时会有效果,用得很少
--------------样式--------------
【背景颜色】:通用操作,不解释...
【图像文件】:窗体的底图,用于美化修改器
【图像模式】:对于底图的显示模式,同Windows桌面,不解释
【图标文件】:窗体的ICO,创建独立EXE修改器时会修改器变成指定的图标
【无标题栏】:顾名思义,只是如果没标题栏就不会有右上角的X来关闭窗口,则需要用按钮的退出窗体属性或者Alt+F4来退出了
【窗体透明度】:运行时可以按照百分比透明,美化用,不错的东西
接下来的楼层是各个控件的介绍,控件介绍凡是相关到通用型操作的就不累叙

Button:按钮控件


用于数据控件的操作或者窗体的操作,现在也可以执行控件操作的脚本,具体见功能解说部分
--------------系统--------------
【名  称】:虽然是通用操作,但是窗体内各种控件的名称,在写控件脚本的时候会被调用,如果不写脚本基本可不用管
【附加数据】:按钮控件目前尚无系统默认支持的附加数据可用
【脚  本】:执行一些脚本,可以动态的控制控件功能、显示、相关操作等,以后有空专门介绍下,这里略过
--------------样式--------------
【是否禁用】:禁用后运行时控件显示为灰色不可操作
【是否显示】:运行是是否显示在界面上,当然不显示也无法操作,这个通常用于GroupBox控件,也有用于脚本的
【字  体】:不解释...
【风  格】:控件显示在界面上的样式,自己试试就知道了,根据Windows主题的不同,效果显示往往也不一样
【图像文件】:可以用一个图像来显示按钮,具体如下图
       
--------------定制--------------
【功  能】:这个是重点,目前支持的功能如下
       <保存数据>:将你修改的数据保存到内存
       <读取数据>:读取内存里当前的数据
       <锁定保存>:锁定内存数据
       <锁定读取>:这个...基本没用
       <读取默认数据>:在数据操作控件中有个【默认值】,这个按钮就是可以让数据控件写上这个默认值,通常用来制作类似[能力值MAX]这种快捷操作按钮
       <创建文档窗体>:如下图,在设计的时候一个修改器可以创建多个内置窗体
       
       而内置窗体的调用就是通过按钮来控制的,当你选择创建文档窗体后又会多出几个选项
       
       【创建文档】:是个拉选框,如果有多个内置窗体,就会有多个窗体名称选项
       【模态显示】:表示修改器运行后多个窗体间可以自由切换,如果不能自由切换,则必须要关闭窗体后才能操作另一个窗体
       【内置窗体】:如果填写的坐标,则运行后创建窗体时不会创建一个新窗口,而是在本窗体的对应坐标为左上起点来显示新的窗体
       <退出窗体>:平常没什么用,但是如果窗体选择了【无标题栏】则用于窗体退出
       <只执行脚本>:这个很有用,不过也相对复杂,以后有空专门写个教学
-------------数据--------------
【操作范围】:这个要跟GroupBox(框架控件)联系起来讲,默认的Frame是这个窗体内的所有数据控件都会被操作到,但是如果窗体内用到了GroupBox,则可以选择只控制GroupBox范围内的数据控件
       如下图,保存数据时可以选择只保存某个框架控件内的控件数据操作,这个在<读取默认数据>时用得多,另外就是ListBox(列表控件)用得多,ListBox后续再讲
TextBox:文本控件


用于内存数据的显示,数据类型可自定,除了数据也可以直接显示ASCII码或者文本
--------------系统--------------
【文  本】:虽然是通用操作,但是这里想说明下,在TextBox中这个属性没效果
【附加数据】:目前系统自带的Value_Fix插件定义了两个附加数据20和21
       附加数据21,后跟参数(H)和(L),表示将同一个字节的数据分高4bit和低4bit显示,例如在三国志III中,武将的隐藏能力值,冷静和勇猛是同一个字节,如关羽的是CD,其实是表示12(C)的冷静和13(D)的勇猛,需要拆开来显示并操作这个数据,就会用21(H),21(L)来填写附加数据
       附加数据20,后跟参数(运算),通常有些游戏表面显示数值和内存内的数值是不一样的,比如梦幻模拟战2中的金钱,游戏中显示的50000,内存中只有5000,那怎么同步显示呢,给个附加数据20(*10)即可,表示把内存的数据读出后先运算完再显示在TextBox中,当然写数据保存的时候会自动反运算,如这里就是自动(/10),注意/是会取整数的,所以不用担心数据写入不对,当然加减运算更不是问题
--------------样式--------------
【排  列】:<居左>、<居中>、<居右>,不解释
-------------数据--------------
【地  址】:当然就是内存地址了,如果程序指定了基地址,那么这里需要填写的就是偏移地址,据作者说下一个版本在这个地址栏可以直接填写多级指针,我们不放期待一下
       另外就是地址可以不是一个,而是多个,如定义:A410,A510,A610...,就是分别往这些地址写上数据,也支持简化格式A410-A418这样的定义,相当于往A410,A412,A414,A416,A418里分别写上数据
【数值大小】:在数据类型非二进制的情况下,这里的数字表示从【地址】算起显示和操作的字节数,默认的虽然是1、2、4、8,但其实也可以操作单数的字节数,如填写3,则读取和操作内存时就会只操作3个字节,第四个字节就不会动
       如果数据类型选择的是二进制,则对应一个字节里的8个二进制位置,对应关系如下,即二进制时,数据大小表示显示和控制的是地址的字节里的第几个bit位,二进制通常用于CheckBox、CheckListBox、RadioButton控件,TextBox控件很少会有用二进制的时候
       00000001 数值大小 8
       00000010 数值大小 7
       00000100 数值大小 6
       00001000 数值大小 5
       00010000 数值大小 4
       00100000 数值大小 3
       01000000 数值大小 2
       10000000 数值大小 1
【默 认 值】:定义了默认值后,对应按钮控件功能中的<读取默认数据>就有作用了,可以制作快捷按钮,不用手工一个个数据填写,而做到一键填写数据
【数据类型】:<十进制>、<十六进制>、<浮点数>、<二进制>、<字符串>,这几个就是基本的类型,至于<连续字符串>、<连续十六进制>基本就没用到过
       <二进制>数据长度固定为1字节,注意<二进制>跟【数值大小】的定义关系
       <浮点数>数据长度固定为4字节,操作的有效位是7位

Lable:标签控件


就是在设计界面上添加文字说明的控件,用得最多,但是不操作数据,没什么可以解释的
--------------样式--------------
【背景透明】:如上图所示,两个文本框对比就知道什么作用了,美化修改器界面用

CheckBox:选择控件


选择控件也是个用得很多的控件,很多人做修改器,如CheatEngine做的修改器大多都是后台定义好了各种数据修改,然后让你选择“是/否”修改,这种定义和这个控件的操作就比较类似
CheatMaker里的CheckBox也可以不仅仅定义一个地址和数据,可好像CE写Enable的脚本一样在里面定义多个地址和数据
--------------系统--------------
【附加数据】:系统默认的支持附加数据1,表示是否写入取消值,如上图这般写的话,表示勾选了保存修改后,就把地址A140写上数据100(这里的64因为是选择的十六进制),而取消这个勾选时则往地址A140写上数据0
-------------数据--------------
【取 消 值】:当附加数据为1时,勾选掉这个选项时,写入定义的取消值数据到地址
【数据格式】:<单一数据>、<集合数据>,单一数据就是表示只定义一个地址列表(为什么是列表?因为前面说道了地址是可以定义多值的)和一个数据,<集合数据>在选择后出现以下图片
       
       【数据集合】:点击后出现数据列表,可以定义多个地址,多个数据大小,多种数值,值得注意的是这里的数据类型都是统一的,如果在上面图中选择的十六进制则这里的数据也要写十六进制,如果定义的二进制,数值大小满足之前说道的二进制取值关系,即1-8分别对应一个地址的8个bit位
       

11.jpg (24 KB, 下载次数: 8)

下载附件 保存到相册

2011-6-10 09:34 上传


       最后如果要定义集合数据的里每个地址和数据的取消值怎么办的问题,目前因为程序没有支持写取消值,则我们需要定义两个CheckBox的集合数据,第二个CheckBox的集合写上第一个CheckBox的值的取消,不过因为CheckBox是可以多选的,不明所以的用户如果把两个都勾上同时保存程序就会按照优先级选择其中一个数据写进内存了,所以这种方法最好的运用不是用在这个控件而是用在一个和这个类似的控件RadioButton(单选按钮)中,这个我们后面会有介绍
综上,目前CheckBox现在还有两个缺点,一个是不能像Lable控件一样设置背景透明,那么在界面美化时会遇到一点障碍,不过对这个缺点有取巧的方法,就是拆分两部分,用Lablel来写CheckBox的说明,而把CheckBox缩小到只有那个选择框
另一个缺点是CheckBox使用集合数据时,无法针对每个数据集合中的每个地址定义取消值

GomboBox:组合控件


组合控件也是最实用的控件,他的作用和ListBox(列表控件)其实完全相同,只是两个在界面上的显示不同而已,还有就是系统默认的是ComboBox为操作数据,ListBox为操作地址
我们知道内存只认得数字,但是这些数字在游戏中经常表示为其他的东西,比如道具的代码,这个控件最初就是为把数字和文字做对应的关系而存在的,至于控制地址的功能是后来加上的
--------------系统--------------
【文  本】:这个文本和TextBox的文本一样,在实际操作中没有任何作用
【附加数据】:系统默认支持的附加数据为1,后跟参数(十六进制数据),用于<控制地址>的操作方式,在ListBox中进行说明
--------------样式--------------
【图像文件】:这里的图像文件要和这里的图像大小联合起来说,这里添加进去的图像是横向的,而图像大小就是对这个图像按照定义的像素进行切割显示
       值得注意的是这里图像文件透明色的掩码是RGB(FF00FF),即玫红色,见后面的举例图
【图像大小】:指ComboBox的数值列表的每一行对应的图片的大小,结合后面说到的数值列表,会举实例说明这个图像定义的作用
-------------数据--------------
【数值列表】:定义内存里的数据与所显示的文字的对应关系,格式为“数据-文字”,如下图所示

【功能类型】:有<数据操作>、<控制地址>、<控制数值>、<控制数值列表>4种,默认的是<数据操作>,<控制地址>的在ListBox控件说明的时候再来举例,暂时不讲
       <控制数值列表>和>、<控制数值>虽然用得没前两者多,但也是个比较强的功能,和<控制地址>一起在ListBox里去说明
-------------定制--------------
【列表高度】:这是这个控件唯一区别于ListBox的地方,这个控件在实际修改器界面中是个拉选框,如后面举例图二所示,而拉选框的框架高度就是这里定义的,含义不大,默认即可
图片的一个举例:图一是某修改器的道具的一个图片定义,结合上图中的那个数值列表定义,图二是实际运行后的修改器的这个控件的显示效果,不知道各位看明白没
图一

图二

GroupBox:框架控件


框架控件虽然没有直接操作数据,但是是界面上一个非常重要的辅助控件,其框架所框入的控件会计入这个框架,那么对应ComboBox、ListBox的<控制地址>的功能类型,以及Button的【操作范围】的功能就可以被使用了
可以做到一个ListBox控制指定的特定的某个或某几个框架内的数据控件来地址偏移,ListBox的控制功能后面马上就会说到
-------------系统--------------
【名  称】:注意这里的名称不仅仅可以被脚本调用,也可以被上面所说的操作范围属性来调用,如下图就是ComboBox的控制地址的功能所对应的【操作范围】属性,一个界面有两个GroupBox,就是对应的名称来进行区分的
PictureBox:图像控件


图像控件目前的功能局限于美化界面了,当然有时候Lable控件的文字说明不容易分辨时,上个图片代替Lable控件不光美化了界面,也起到了很好的说明作用
虽然脚本可以调用,脚本写起来相对还是麻烦的,但是以后如果脚本功能若不光用于按钮控件,还能对ListBox和ComboBox中<控制地址>的属性中每一行来写脚本的话,图像控件就可以用于辅助的说明
图像控件的操作都是一些通用功能,但注意图像控件里的图片的透明背景需要用本身就是透明背景的gif图片,而不是和之前说到的ComboBox的图像文件是用的RGB(FF00FF)做透明掩码

ListBox:列表控件


列表控件是CheatMaker最实用最方便的一个控件,特别是操作一些有规律的内存数据排列,这个比较好的例子就是三国志英杰传的例子,见下面这个帖子
http://bbs.52miji.com/thread-19795-1-1.html
除了没有【列表高度】属性外和ComboBox的操作方式是完全一样的,包括图像文件的应用,也可以是<操作数据>的方式,不过ListBox操作数据不如ComboBox直观,所以系统默认的是<控制地址>的功能类型,所以着重将这个方式
--------------系统--------------
【附加数据】:当ComboBox和ListBox用于<控制地址>的功能是有效,系统支持的附加数据为1,后跟参数(十六进制数据),表示定义的地址列表每行地址偏移间隔为所定义的数据
       如在三国志英杰传的实例中,ListBox数据为:0-刘备、2C-关羽、58-张飞,但实际上当列表比较大时可以简化这一偏移的计算,只要附加数据写上“1(2C)”,则无论列表怎么定义,当选择下一行时,就会在前一行的地址基础上增加2C的偏移,此时无论是定义的:0-刘备、2C-关羽、58-张飞,还是定义的:100-刘备、101-关羽、102-张飞,得到的都是同一个效果
       但是同时这也是一把双刃剑,一旦用附加数据后,你无法对你的列表进行排序了,比如如果我不启用附加数据,可以定义:2C-关羽、0-刘备、58-张飞,但是如果用了附加数据的方式,还按前面这个顺序定义的话,你选关羽的时候看到的仍然会是刘备的数据,选刘备仍然看到的是关羽的数据,所以这个附加数据如果你想把列表排序则不能使用(其实利用一个进制转换的小程序和Excel表的功能同样可以迅速的写出大列表的偏移,所以用不用这个附加数据不是大问题)
-------------数据--------------
【数值列表】:数值列表的添加格式和ComboBox一样,“数据-说明”,但是如果是<控制地址>时,列表的添加的数据就是写的地址的相对偏移地址了,一般的默认第一行是“0-XXX”,表示当前操作的控件的地址是初始的地址,不做任何偏移,而第二行开始就是写相对第一行的地址偏移了,这个在上面的举例帖子里有说明,不做累叙
【操作范围】:默认是Frame,表示全部的窗体控件地址都做偏移,但是前面讲到GroupBox的时候说到过,GroupBox是可以对控件进行分组划分的,分组后,ListBox对控件地址偏移的控制也可以控制到某一个组
【功能类型】:和ComboBox相同,但是界面显示的效果不一样,ComboBox是一个下拉框,ListBox则是一个可支持滚动条的框架,《永恒传说》修改器中就对ListBox有个具体的应用,见下图,只需要写一次界面,增加一个ListBox就可以控制到游戏中7个主人公的属性修改

我们现在来讲一下<控制数值列表>的功能,以上面说到的三国志英杰传为例子
ListBox里我们说道了<控制地址>的功能,添加的方式是

对应的兵力的TextBox控件填写的地址是401D4
事实上我们可以对<控制地址>的方式这么填写

那么这个时候对应的兵力的TextBox控件的地址用默认的0就可以了
看懂了的人应该明白,其实就是个相对偏移和绝对偏移地址的问题
而<控制数值列表>的作用可以动态的控制ListBox的<控制地址>的列表
比如我们依然可以按照前面那种相对偏移的列表来写上列表,即“0-刘备...”,但是我依然把TextBox写上地址0
我现在使用一个<控制数值列表>的功能改变ListBox的列表,相当于控制别的控件的ListBox被控制了,如下面两个图


这个修改器在运行后效果如下

改变一下控制ListBox的ComboBox,得到的图如下,显然兵力的显示变得正常了

<控制数值列表>根据修改器需求的不同也可以有各种用法,其中之一的比较容易想到的用法就是“版本切换”,比如不同版本游戏的地址有相对的偏移,可以通过这种方式做个版本选择框出来
不过在动态脚本功能出现后,这个功能的作用被弱化了许多,因为用脚本来实现版本切换更具有实用性,不过这依然是个很好的功能
<控制数值>的功能有点类似,但是控制的不是“列表”(ComboBox、ListBox、TabCtrl)的数据,而是控制的TextBox和CheckBox的数据,控制里面的数据增加一个量,但这两个控件被控制时需要用十六进制

CheckListBox:多选列表


从控件操作使用上来说CheckListBox和CheckBox的<集合数据>格式十分类似,具体见6楼的说明,但是增加了图片文件的功能,图片的运用和ComboBox相同,具体见7楼的说明
但是CheckListBox是将CheckBox的<集合数据>每行分开显示并可操作
--------------系统--------------
【附加数据】:虽然和CheckBox相同,但是还是强调一下,附加数据1,后不跟参数,表示当勾选项取消时往勾选项所在的地址里写上取消值,这个和CheckBox一样,因为只能定义一个取消值则每一行的勾取消时都是写入这个值而无法逐行定义每行数据取消值,算是个不够自由化的缺点
举例说明一下,下图一是梦幻模拟战的人物可雇佣的兵种的设定,图二是修改器运行的效果
图一

图二

ProgressBox:进度控件


就是将一个地址的数据显示成进度条的样式,当然需要设置该数据的最大值,不过也非常遗憾的告诉各位,该控件目前只是纯美化用,不起任何控制作用,也不能由鼠标拖动该进度条
--------------布局--------------
【大  小】:ProgressBox的大小是控制进度条的长宽显示,越长进度条显示的精度越大,相对比较有用
--------------样式--------------
【背景颜色】:进度条的颜色显示,可根据界面风格来选定
--------------数据--------------
【数  值】:这里的数值不起任何控制作用,表示进度条所定义的地址上的数据大于等于这个数值时,进度条就显示满进度
除了进度条不能被鼠标相应的缺点外,另外就是不能自定义图片来表示进度,简单的说虽然是纯粹起美化作用的控件,但还无法完全自定义美化方式,而只能确定下颜色,下图是进度条的一个应用
 
  

13
 楼主 | 发表于 2011-6-10 09:43:34 | 只看该作者
TabCtrl:多标框架


多标控件的标签栏相当于一个按钮,相当于按钮<创建文档窗体>的内置窗体功能,可以在同一个界面上完成对多个内置窗体的切换
--------------系统--------------
【附加数据】:目前没有可支持附加数据,因为该控件并不是控制控件的地址偏移,数值列表是填什么下面马上就会说明
--------------样式--------------
【图像文件】:和ComboBox和ListBox等定义方法相同,图片按照大小切割后显示在每个标签标题栏
--------------数据--------------
【数值列表】:这个是重点,这里并不是添加“数值”的列表,而是添加窗体名称的列表,格式为:“窗体名称-显示文本”,窗体名称可以是中文,见下图

这么定义后,标签栏就会显示状态、道具、武器、防具、魔法几个标签,标签切换对应内置窗体的切换,运行效果见下两个图

RadioButton:单选按钮


首先要声明虽然有“按钮”两个字,但和Button控件无关,是一个有点类似CheckBox的控制功能,单选嘛,所以要有对比项,这个控件使用一般是2个以上的数量出现
可以是控制同地址,也可以是控制不同地址,一般都要调用“互斥”机制,即选择了一个组里面的其中一个,就要取消另外两个的数据
--------------系统--------------
【附加数据】:和CheckBox一样,附加数据1表示写入取消值,这个附加数据一般应用于不同地址的“互斥”操作,因为不同地址单选其中一个时,另一个应该要写入取消值,所以会用到附加数据,但是同地址的单选,只是往地址上写上不同的值的选择而已,所以是不能用上附加数据1的
--------------样式--------------
【背景透明】:和Lable一样,贴心的用于界面美化的功能,我很郁闷为什么单选控件有此功能而选择控件CheckBox却没有这功能
--------------样式--------------
【操作范围】:这个和重要,单选控件一般是几个几个为一组来存在的,这个范围就是对这些控件进行分组管理的,都是通过GroupBox来进行分组,这样几组单选控件就可以独立操作互不影响
【数据格式】:注意单选控件也是支持<集合数据>的,操作方式和CheckBox相同,至于使用集合数据的时候怎么进行“互斥”操作可以根据实际情况来确定是否启用附加数据1
这个控件不做什么举例说明了,在CheatMaker官方下载的软件里有个Demo的演示窗体有个举例说明,我用得不多,就在某个修改器中用来操作了一个同地址的互斥,选择性别为:男/女




---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


我们从最简单的人物兵力开始入手

01.jpg (132.86 KB, 下载次数: 23)

下载附件 保存到相册

2011-6-6 20:27 上传


我用FPE找了一下人物兵力(为什么用FPE...个人喜好...因为FPE的编辑框看着舒服)

当然这个兵力地址下次启动游戏的时候说不定就变了,所以下一步要找基地址
启用CE调试刘备的兵力地址

找到基地址后验证一下

现在启用CheatMaker,因为CM1.62版本并没有添加对dosbox0.74的支持,所以添加一个程序支持

把刚才搜索到的基地址添加进去,另外如果这里是2级指针,则在基地址后边加上“,地址”,并把附加数据填上“1”

添加完毕后选择对应的进程,启动内存编辑,看一下刚才的地址偏移,现在可以确认程序支持没有问题了

然后启用CM的“运行设计器”,添加一个lable控件和一个TextBox控件,并对TextBox控件做如图红色框的编辑

再添加一个ListBox控件,点击“数据列表”,然后写上个列表,为什么图上这么写,因为根据图一中的那些文字说明
这里每行之间是写上一个相对第一行的偏移地址,第一行则认为是0
其实ListBox附加数据可以简化这个流程,附加数据写上“1(2C)“,则认为每行的间隔地址为2C,不需要去计算了
只需要写上
1-刘备
2-关羽
3-张飞
这样的东西
但是这么添加不好对列表排序,所以暂时还是按图片中的添加方法来

添加完保存下,然后运行一下 修改器

可以看到如图的效果,然后再多添加一些地址进去吧,别忘了添加一个按钮
按钮有几个功能,读取数据、保存数据是两个最基本的功能
创建窗体也是个实用功能,本次不讲这个

我最后 设计完毕的效果如下图所示,最后会提供这个CMF源文件,大家可以随意打开看下

最后是生成EXE的独立修改器,如下图所示,选好对应的支持程序后,对应的类名和标识也会自动填上(因为程序之前已经添加到了支持程序列表里)
这里的插件,如果独立修改器有用到插件的话,则CM目录里的Plugins文件夹的对应插件需要和独立的EXE保留在同同一目录下(具体清参考我做的太阁4修改器,里面用到了一个插件),插件是可自行开发的,会编程的朋友可以任意添加新插件到CM里
因为这里没用到特殊插件,故可直接生成即可


最后是该修改器的源文件随意参考下



---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


基地址的查找与特征数据


  所谓基地址其实就是指针,基地址就是指的某一个数据在程序模块中的固定指向,最广泛的应用是在模拟器这种东西,每次模拟游戏时游戏里的【数据段】都是相对于某一个地址的偏移地址,所以与其每次都取写这个指针,不如把这个地址记录下来作为这个模拟器的基地址,则可以在做相同模拟器的游戏的时候方便很多
  指针怎么查找?CM其实目前没有反汇编的功能,所以关于指针的查找还是建议使用CheatEngine或者OllyDBG,我个人推荐前者
  CheatEngine简称CE,这软件功能十分强大,但是直到6.0版本,对于修改器界面的设计始终功能比较简单,无法做出比较随心所欲的修改器,而纯粹以编程的方式去处理修改器界面则门槛相对较高,所以也有了CheatMaker这一类的中间软件层的存在,所以就笔者我而言,是属于用CE寻址,然后用CM实现界面设计的这一类人(另一说,CE 6.1的版本已经可以推出了比较好的修改器设计功能,但是到目前为止笔者尚未研究出头绪…)

以SFC模拟器:Snex9X为例子,模拟器版本Ver 1.52,游戏三国志III,如下图查找金钱



得到了唯一地址:013BF460



然后对这个数据跟踪,得到一个可能的地址指针值,注意这个地址指针值的013BCBA0是对应ESI的值,而EBX的值是28C0,这个是指的平原金钱的偏移地址
值得注意的是[ebx+esi]的模式esi通常将不是固定值,这种时候,指针的好处就特别明显了,因为每次用模拟器模拟同一个游戏,对应的数据的搜索的绝对地址往往都在变动
但是相对esi的ebx的偏移地址则是固定的



直接搜索相关这个地址的内容可以得到以下结果



如果得到的结果很多需要做一些进一步的测试和跟踪, 其实这里搜索到的这些都可以作为这个版本 模拟器的基地址,比如任意选择一个0076448C



我们可以看到,指针指向的地址的数据已经和原地址数据一致了 ,这里的28C0是之前的ebx的值,就是刚才平原城金钱的相对偏移地址
那么我们把这个指针添加到CM的支持程序管理





这里的最大偏移量是指的相对于这个基地址所指向的地址,最大允许的偏移量是多少,SFC游戏几乎不会超过20000,但其实这里填0表示不限制,也没有关系
添加完毕后,我在CM里搜索平原城的金钱地址得到如下图片



这个时候,对应的CM地址等于了原来的ebx的值,即这个金钱地址的相对偏移地址,我们的基地址添加成功了

但是这么添加基地址,仅仅只是支持了Snes9X Ver 1.52版,如果用户换了一个版本的模拟器,则将出现不支持的情况,这是因为一个程序的升级通常会让基地址发生变化,所以在模拟器里要能够支持一个系列全版本的模拟器,就需要使用动态定位基地址的方法,于是采用了“基址特征数据”这个概念

回到我们之前的搜索出很多基地址的那个步骤,这里选择基地址其实是有诀窍的,我们启动另一个版本的Snes9X模拟器,模拟同样的游戏,同样搜索平原金钱的地址指针
我们保留之前的 模拟器进程和调试器进程,同时启动不同版本的模拟器进程双开另一个调试进程来进行跟踪调试以方便对比



采用同样的方法得到了 也可以得到基地址列表
那么现在需要从这些基地址里面找到可以通用的特征码,这个比较考验经验,查看特数据的方式可以右键点击任意基地址,点击“反汇编该内存区域”
然后找到两个不同版本的模拟器之间的通用的一个基地址特征数据,如果找不到甚至要开始进行2级或者多级指针查找
所谓的基址特征数据就是指的通过一段内存数据的搜索可以定位到一个固定地址,然后通过这个固定地址增加一个偏移值就可以定位到基地址
比如这里SFC模拟器SNes9X我们就用2级指针来进行基地址搜索以及确定基址特征码,首先以0076448C作为一级指针来追踪二级指针
(如果这里对于多级指针的查找和添加方法看不明白的,请在网上搜索CheatEngine八步教学的教程自学一下)



重新读取一下游戏就可以找到以下代码



使用深度扫描可以找到对应007311C8的指针



这个时候对于基地址的添加就多了一种方式,使用2级指针进行寻址,这时候【附加数据】需要填上1,才能正常寻址



改完后我们可以尝试搜索平原的金钱,可以看到添加2级指针的基地址的结果和之前的效果相同



但是换一个版本的 模拟器时同样无法使用
所以我们对于其他版本的模拟器(笔者这里用的Snes9X 1.53)以同样的方法和选地址方式进行这个2级指针的寻址,得到对比结果如下



可以看到两个版本的模拟器,对应的2级指针地址很接近但并不相同,那么我需要一种可以自动定位到各个版本的基地址的方法,这种自动定位的方法就是“特征码寻址”
我们分别对上图的红框内的2级指针地址查看反汇编的代码,如下图



然后又可以得到一个对比图,下图中选中的部分就是相关到2级指针的地址的代码



通过观察可以看到,虽然2级指针的地址和代码不同的模拟器版本有一些区别,但是在这段代码前两者确有一段共同的代码:2B C7 48 C1 E0 05 50
我们不妨对这段代码进行搜索,如下图,注意反汇编里看到的字节搜索的时候要反过来,2B C7 48 C1,搜索就要搜索C148C72B



非常幸运的,这段代码在 模拟器的程序里具有唯一性,那么我们就可以通过这段代码定位到之前的2级指针的地址
这段代码的地址是00409664,2级指针的地址是00409674,两个地址之前相差10(H),那么我通过定位到00409664,然后增加10(H)的偏移就可以得到2级指针的基地址00409674
我们在看一下另一个版本的模拟器,这段代码定位的地址是00409FD4,而2级指针的地址是00409FE4,差值也是10(H)
那么这两个版本的模拟器的共性我们就找到了(这种共性肯定不止一处,这里只是介绍方法)
最后我们就是要把共性统一成模拟器的基地址



这里的基址特征数据就是用刚才我们所说的不同版本模拟器的共性进行定位到基地址,而这里的附加数据“5”表示找到的基地址的指向的地址的偏移,我们再把前面添加2级指针的基地址的图来对比一下



按照基址特征数据的方式,我们尝试一下对其他版本的模拟器搜索金钱地址的结果,之前我搜索的是Snes9X 1.52版,现在我来搜索1.53版





我们可以看到,现在两个版本的 模拟器通过特征地址的方式统一了搜索的结果,但是这样其实我们还只是作出了通用1.52和1.53两个版本的模拟器
如果想作出更大的兼容性,则还需要拿更多的版本的Snes9X来做这种共性的测试,最终找到一个共性地址
值得说明的是,这里的基址特征数据可以用?做替代,比如2BC748C1E00550作为特征地址码的话可以写成2B??48C1????50,这样其实可以模糊出更多的版本共性出來
本文可以看作一篇实例教学,关于附加数据和添加说明写法的详细说明,还可以参考 http://www.cheatmaker.org/Help/supportDoc/supportDoc.html

这里最下面的位置写了各个基地址和附加数据的写法和作用


指针型数据的使用

有关本楼举例的植物大战僵尸的修改器及其cmf源码下载
http://bbs.52miji.com/thread-23170-1-1.html

  上述关于基地址的概念其实就是指针,笔者之所以拿模拟器来举例子是因为基地址的应用大多在模拟器领域,而有很多PC游戏不同的数据用的“基地址”不是一个,这样就无法通过定义一个“基地址”来解决问题,对于这种多基地址的PC游戏,直接使用控件调用指针是最好的方法,在控件的基础教学里我们都有提到过一些控件的【附加数据】这个功能,但是其实所有的地址控件都有一个通用的附件数据“9”,9后面跟参数(第一指针,第一级偏移,第二级偏移...),这样一个控件就可以在修改器进程里做指针寻址,而不是单纯的静态寻址

我们以《植物大战僵尸》(应该没有人没玩过了吧…)这个游戏为例,使用的版本是年度版的汉化版,下图是通过指针寻址得到的游戏中的“阳光”这个数据的地址



可以看到,这个数据的基地址是7784F8,第一级的偏移是868,第二级的偏移是5578,在CheatEngine里通过这种定义方式就可以准确的得到阳光的地址和数据
那么这个数据怎么在CheatMaker里制作修改器时进行添加,则可以如下图所示



对应数据控件的地址写上指针的最后一级的偏移地址,对应这里的就是5578,而在附加数据部分,9(第一级指针7794F8,第一级偏移868),就完成了和CheatEngine相同的动态寻址效果
我们再看一下游戏中的花园里那个喷雾剂的寻址结果



游戏中是17,对应内存地址的数据是1017,有个简单的防修改算法,那么添加到CheatMaker寻址的方法和上述类似,但是我用了两个附加数据以控制数据的显示,如下图



这里9(7794F8,950)以及地址里的224,和上述金钱的一样,不解释了,附加数据的后半截,用“|”符号进行了间隔,20这个附加数据是对读出的地址进行运算后再显示,这个在控件教学的TextBox控件里是有说明的,同时你写入的数据也会根据这个运算反算后再写回内存
其实我想说的是,控件的附加数据是可以用多个的,中间只需要用“|”符号间隔,我们可以看一下修改器运行的效果对比



看上图就可以知道这样写可以让我们的修改器读起来更顺畅
但是我强调关于附加数据可叠加使用的目的是另一个,就是配合附加数据“9”来使用的另一个附加数据“6”
我们之前说过了,关于进程的“基地址”或者“特征地址”的查询和添加方法,如果一个进程被定义好了基地址,那么对这个进程做的搜索个控件地址控制操作都是以这个基地址为前提的,那么有些游戏,比如模拟器,大多数游戏的大多数数据都有一个固定的“基地址”,一般情况下只需要添加好了这个基地址就可以解决了,但是少数游戏的数据并不受这个绝大多数基地址的控制,而是另一个基地址,那么对这少部分数据我不需要按照这个进程所对应的基地址进行寻址,而想使用Windows下的一般进程的指针寻址,那么对于这种已经添加了基地址的进程,控件想要使用一般寻址来调用指针的话,则需要在把附加数据“9”和附加数据“6”一起用,格式一般为:6|9(指针),附加数据“6”后面没有参数,仅仅表示这个控件的寻址不受进程基地址的限制,而使用绝对指针寻址



上图是NDS游戏《光与影的英雄》的修改器,对应的DeSmuME模拟器,该模拟器已经添加好了特征码,95%的游戏都可以使用这个特征码进行相对偏移地址的寻址,但是《光与影的英雄》这个游戏就是特例,部分数据不使用通用的那个基地址,于是我想在不改变DeSmuME.exe的进程的通用基地址的情况下,单独定义这个游戏的一些数据的基地址,就可以采用上图中的那种附加数据的调用方式



  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 黑客帝国 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值