既然是修改器那么肯定需要的是软件了,再次我们需要的软件是CE 和VB,CE版本是CheatEngine5.6.1,VB就是我们微软的VB6.0(使用VB.NET的话需要把API函数数值型调整)。CE去哪里下载呢?老老实实的把百度打开,搜索下载。那VB6.0去哪里下载呢?VB6.0由于W7以上版本对VB6.0兼容不是很好,大家可以下载VB6 Mini版(高手整合版兼容W7和W8而且体积很小只有13M但功能很齐全)
然后我再次申明一下,以下教程是一种方法,你可能不会VB但是你只要会用C,C++,JAVA,C#,VB.NET,易语言„„等任何一种编程语言都可以融会贯通,当然如果一种都不会那就老老实实使用CE修改吧
那我们就先认识一下CE吧,以下是运行截图:
理论上只需要CE就可以修改游戏内存数据了但是每次要重新找数据地址很麻烦,所以我们还需要编程语言记录我们找到的数据地址,做成软件下次直接使用。 然后是我们的VB6.0 MINI版截图:
可视化编程界面,拖拖控件写点代码就可以了。
第二章 基本概念
A问:什么是游戏修改器
B答:废话的问题,顾名思义就是修改游戏的么! A问:那么我们修改游戏?修改游戏的什么呢? B答:当然是各种数据了比如人物的力量。
A问:哦!原来是通过修改数据来修改游戏啊!但是数据在哪里呢? B答:额?^数据当然在游戏里了!
A问:那么问题来了!数据在游戏里,游戏有两种状态,一种是未运行,一种是运行ing! B反问:那我们今天的教程是针对哪一种游戏状态来修改呢? A答:就是运行ing的游戏
B问:为什么不是未运行的呢?
A答:对未运行的游戏修改是指修改游戏原始数据比如魔球就属于此类修改器,此类修改器还有一个比较好听的名字叫做,ROM静态修改器。 对运行时的游戏修改主要是通过修改运行数据来实现,也叫做动态修改器,此类修改器如果用在网游上就是大家较熟悉的外挂,当然这个教程是做单机游戏的修改器。
A问:这下我们就清楚了我们要做的目的,还有一个问题就是游戏数据在哪里找? B答:是不是使用软件来需要,反正我是不可能把电脑卸了找 A答:对,那么我就开始寻找这些数据然后修改吧!
第三章 CE的强大寻找
我们的目的是使用CE找到游戏数据修改地址
第一步:打开游戏(为了方便我们以窗体模式启动M&b,教程中为1.165)
第二步:用CE打开游戏进程 1打开左上角的小电脑图标:
2就会出现 进程列表
3,选择骑马与砍杀的进程然后单击打开即可 第三步:查找经验
因为在游戏中经验是最容易变动的所以我们用它作为我们突破游戏的软肋 我们看到主角的经验是200000 1,我们在如图位置输入200000
,2,然后
单击首次扫描,出现地址
第四步:游戏等待几天天(目的是为了使经验变动)
1, 此时经验为200022,然后单击再次扫描
,
2, 在CE左侧出现地址
此时出现3B6F02D8(尤其注意,此时的地址时变值,每次打开的游戏都不同,所以你的电脑显示的地址不同乃正常现象无需紧张)
我们双击次地址就会添加到CE程序下面的程序列表中如图
此时你可以双击值的位置修改值,然后确定
我们的 主角程序是不是
好到此动态地址修改结束,如果你不懂编程的话,教程就到此结束了,你可以通过这个地址修改游戏中的动态数据,比如兵力。
如果你懂编程那么很好,我们的教程既可以继续了
本章的题目是CE的强大寻找,可是貌似我们发现也不强大么,这是因为我们的工作还没有结束句,细心的你也许发现了,我刚才说我们找到的地址3B6F02D8是变动的每次打开游戏都会不同,那么我们需要一个静态地址(就是不随会变动的地址,无论安装在哪一台电脑上,无论重启游戏多少次,都不会变动的地址,此地址也叫做绿色地址) 接下来,我们就看是找这个可恶又可爱的绿色地址
我们右击CE程序下面地址栏中已有的地址(注意是右击)
出现一个列表栏,由于无法截图所以我用文字描述,出现的列表兰中有这么一列“找出是什么改写了这个地址(T)”单击------确定
出现
黄色叉号的窗口不要管它,无视即可
然后我们回到游戏继续等待(目的是使主角经验变动,你也可以在竞技场打一会当然要获取经验哦,然后找出改变地址)
刚才我们修复521,现在变成529了
然后我们的CE程序是不是多了一行数据,(如果不是一行怎么办?那就双击随便一行)别问我这是什么我不懂,让后我们双击这行数据
出现
大家可以看到红色一行,(注意只看红色一行就可以了)ESI+000002b4,下面的ESI=3B6F0024,不正好是3B6F02D8(我们第一次搜索出来的数据么)
然后我们继续用CE找这个值找那个ESI红色地址(此时为ESI=3B6F0024),把Hex勾上(十六进制开)输入ESI的值,点击新的扫描----首次扫描
出现
我们看到左侧地址列表出现了新地址,有时是很多个(你选第一个错不了),双击这个地址加入到CE下面的地址列表
我们右击此地址行,出现上次的快捷菜单列表,这次我们单击“找出是什么访问了这个地址(S)” 然后哎呀!!!怎么啦,警告啊!仔细一看哦哦哦我们还有一个东西没关闭呢
就是这俩窗口啊,占用了我们的搜索,关了它们
关闭之后
我们继续右击刚才地址行,出现上次的快捷菜单列表,这次我们单击“找出是什么访问了这个地址(S)”
一开始是空白的等一会就可以了,哇!又出现了很多数据呢
我们随便双击一个
还是看红色地址EBX+000140EC,然后EBX=32AF8FE8,那EBX+000140EC结果不就是3B6F0024,我们曾找到的第二个地址
,然后继续找EBX地址在哪里,新的扫描------------------首次扫描
出来了一个绿色地址008EA2D0既然是绿色到此就找到了那个永恒不变的地址了,你可继续重复上述步骤,你会发现到怎么都不会有什么改变他了008EA2D0
好了刚才是逆思维,我们正思维顺一下 地址008EA2D0有一个值32AF8FE8 值+偏移就是一个新地址 32AF8FE8+140EC=3B6F0024 然后继续偏移
3B6F0024+002b4=3B6F02D8
而3B6F02D8这个值作为一个新地址它指向的值就是529,好了
原来绿色地址偏移了两次地址成了经验地址了好接下来我们要利用API函数是这个绿色地址发挥它的作用
第四章 VB实现动态修改器
我又要声明了,以下教程是VB调用API函数,虽说是VB教程但按照此教程步骤不妨碍其他编程思路
由于是VB教程,为了不局限其他编程语言,故直接说明模块代码 来吧,让我们一气呵成
VB设计程序界面,小巧玲珑并不妨碍它的使用
添加代码
API函数声明部分
Private Declare Function FindWindow Lib \"user32\" Alias \"FindWindowA\" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib \"user32\" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib \"kernel32\" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function WriteProcessMemory Lib \"kernel32\" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function ReadProcessMemory Lib \"kernel32\" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
'以上是必要API函数声明
FindWindow函数,参数说明lpClassName是类名(可以用SPy++获取,百度多得是可自行下载)lpWindowName是窗口名(窗口名就是任务栏下面的窗体名字) 此函数最终返回程序句柄(什么事句柄,你可以理解成程序运行在电脑内存中的合法身份证)
GetWindowThreadProcessId 参数说明hwnd是句柄(由FindWindow函数得到),lpdwProcessId 是将该句柄下程序的进程的赋值给lpdwProcessId
OpenProcess参数说明dwDesiredAccess是进程控制权限常量,bInheritHandle=0, dwProcessId是进程地址,然后返回获得权限的操作句柄
ReadProcessMemory 在地址处读出值,参数说明hProcess是获得权限的操作句柄,lpBaseAddress地址X,lpBuffer把地址X的值赋值变量,nSize字节,lpNumberOfBytesWritten实际读出字节
WriteProcessMemory同上不过是在地址处写入 然后是
'以下是进程常量声明
Private Const PROCESS_ALL_ACCESS = &H1F0FFF
获取进程权限的常量 以下是所有代码:
Private Declare Function FindWindow Lib \"user32\" Alias \"FindWindowA\" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib \"user32\" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib \"kernel32\" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function WriteProcessMemory Lib \"kernel32\" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function ReadProcessMemory Lib \"kernel32\" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
'以上是必要API函数声明 '以下是进程常量声明
Private Const PROCESS_ALL_ACCESS = &H1F0FFF '以下是事件过程
Private Sub Command1_Click()
Dim Whwnd As Long, Ehwnd As Long, id As Long, hok As Long, ass As Long, jg As Long Whwnd = FindWindow(\"MB Window\ '获得窗口句柄 If Whwnd = 0 Then Dim ts As Byte
ts = MsgBox(\"骑马与砍杀战团1.165没有运行\提示\") Exit Sub End If
GetWindowThreadProcessId Whwnd, id
hok = OpenProcess(PROCESS_ALL_ACCESS, 0, id)
ReadProcessMemory ByVal hok, ByVal (&H8EA2D0), ByVal VarPtr(ass), 4, 0& '得到第1次VAL&H8EA2D0)是我们找到的绿色地址,他的值付给ass
ReadProcessMemory ByVal hok, ByVal (ass + &H140EC), ByVal VarPtr(ass), 4, 0& '得到第2次VAL
ass+140ec偏移然后赋值给ass
'ReadProcessMemory ByVal hok, ByVal (ass + &H2B4), ByVal VarPtr(jg), 4, 0& '加偏移得到动态地址在ass(已经是两次片以后的地址)测试代码 Dim Z As Long Z = Val(Text1.Text) Dim Z1 As Long Z1 = Val(Text2.Text)
WriteProcessMemory hok, ByVal (ass + &H2B4), Z, 4, 0& '加偏移得到动态地址,并写入值
WriteProcessMemory hok, ByVal (ass + &H2B4 + &H31C), Z1, 4, 0& '加偏移得到动态地址,并写入值
Dim DZ As Long Dim I As Long For I = 0 To 15
DZ = ass + &H2B4 + &HBF590 + &HFC8 * I '此处的BF590是波尔查的偏移地址,然后每个NPC中间差FC8值
WriteProcessMemory hok, ByVal (DZ), Z, 4, 0& '加偏移得到动态地址,并写入值
'hok=获取程序的完全控制句柄,DZ=修改的地址(切记需要偏移求得不能直接使用地址),Z输入的值long型,4就是
'输入数字字节long是4个字节所以用4,0&是实际写入的数字类型值 Next I End Sub
运行效果就是一次性把所有NPC经验调到值
总结
绿色地址的第二次偏移有游戏运行的所有数据,比如金钱都可以通过求二次偏移后的地址,经行求差,就可以得到我们的 绿色地址——》的值X X+偏移1——》的值Y Y+偏移2——》的值Z
Z的上下左右前后都是游戏数据地址所以在教程中DZ = ass + &H2B4 + &HBF590 + &HFC8 * I '这句代码就是循环求出NPC经验地址原理就是主角地址+NPC1的偏移差+每个NPC的差*I 到此教程就在结束了,送给喜欢玩单机的朋友,在现实你也许很穷很受气,但我决不允许我在游戏里还那么戳!
最后一句话骑马与砍杀战团1.158和1.165的绿色地址或者偏移不一样,可能从网上下载的动态修改器不适用了,看了本教程是不是也想做一款强大的修改呢。
注:教程技术属于个人知识产权,允许学习,转载注明出处!
因篇幅问题不能全部显示,请点此查看更多更全内容