通过一个游戏教你入门游戏外挂的开发!仅供学习、研究参考
好久没更新文章了,今天就水一篇吧(手动滑稽~~)
前言
游戏外挂想必大家都知道,是否好奇是怎么来的,外挂开发者是如何一步步写出外挂的?
很多初学编程的萌新感觉学会编程就会写外挂了
其实不然,会编程 ≠ 会写外挂
在整个外挂的制作周期中,编程只占了一部分
真正起到决定性作用的是——逆向分析
对游戏的逆向分析才是外挂的灵魂、核心所在!
所以,本篇文章就结合CE、x64dbg、汇编知识,讲解一下破解游戏的思路。
视频演示
知识储备
首先,在开始之前要了解一些知识,对于后面的理解会有帮助。
1.什么是逆向?
写过代码的小伙伴应该都知道,我们所用的高级语言,比如C/C++、Java、Python等等
这些都是人能看懂的语言,但是电脑看不懂,电脑只能识别0、1机器码
所以,当我们写好一个程序后对它进行编译,编译器就会把我们写的代码编译成电脑能识别的机器码(0和1)
平常看见的exe文件就是Windows下的二进制可执行文件
逆向就是,把二进制机器码翻译为人能看懂的汇编或伪代码
当代码编译成exe文件之后,几乎是不可能知道它的源码是啥
可能有人会说IDA不是可以吗?
IDA反编译的只是伪代码,和源代码肯定会有差异,而且有时候还可能反编译错误。
所以,即使现在很出名的IDA也不一定有十足把握能完整的把exe文件反编译出来
那么,解决问题的关键就是——汇编代码
什么是汇编代码(汇编语言)?
计算机发展早期,程序员写代码都是用0、1写的,很不方便,而且很难记
所以,计算机科学家就发明了一种低级语言——汇编语言,汇编语言一定程度上改善了用机器码写程序的窘境
但是,汇编代码还是比较繁琐,于是计算机科学家们为了更加方便发明了C/C++、Java、Python等高级语言
虽然有其它语言代替了汇编语言,但并不代表汇编语言就没用了,在早期开发汇编语言的时候
汇编代码和机器码是一一对应的关系,也就是说一条汇编代码就对应一段唯一的机器码
那么,问题就很简单了,我们只需要把机器码转换成汇编代码,就可以看懂二进制可执行文件内部到底是如何运行的了
值得注意的是:大多数编译器不是直接把代码编译成二进制可执行文件的,中间会先编译成汇编代码,再从汇编代码编译成机器码
![图片[1]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220112155710563-1024x495-1.webp)
可见,了解汇编是逆向分析的第一步
什么是硬盘、内存、虚拟内存、CPU的关系?
硬盘应该都很好理解,平时下载的软件和程序都储存在硬盘里,包括二进制可执行文件里的机器码也储存在硬盘里
内存直观体现就是内存条,程序运行的时候都会从硬盘上装载到内存中,但是有个问题,比如你买了一个4G的内存条,运行游戏需要3.8G内存,那如果一边玩游戏、一边挂QQ、一边听歌,那内存不就爆满了吗,电脑不就崩溃了吗,那为啥现实中并没有出现这种情况,反而运行还很流畅呢?
这就要提到计算机系统内存管理的一种技术——虚拟内存,计算机科学家早就想到了上面会出现的问题,所以他们设计通过系统的某些指令对物理内存进行映射,使得每个程序运行时都拥有4G的独立内存,就很好解决了打开程序过多电脑会崩溃卡死的问题
CPU即中央处理器,是计算机的运算和控制中心,相当于人的大脑,CPU会读取程序装载到内存中的数据,并执行所对应的功能,比如控制音量、麦克风开启/关闭,显示器的画面…….
关系如下图:
![图片[2]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220112155903799-1024x493-1.webp)
CPU里包括寄存器、运算器、控制器
需要注意的是:CPU一般不会在内存中对数据进行运算,会先把内存中的数据存储到寄存器中,在CPU内部进行运算,然后将运算的结果写进内存中相关区域,因为寄存器在CPU内部,CPU访问寄存器的速度要快于访问内存的速度,所以效率更高
什么是内存地址?
上面说过,程序运行的时候都会从硬盘上装载到内存中,会在内存中拥有一个内存块,内存块大小例如0x00000000—0xFFFFFFFF(16进制表示)在这个内存块中又有很多连续地址用来存放代码里的函数、变量、数据等等
简而言之,假设房间有很多盒子和球,蓝色球放在蓝盒子里,红色球放到红盒子里,白色球放到白盒子里,每一个球都有一个自己的盒子
变量、数据相当于球,内存地址相当于盒子,每一个数据在内存中都有一个属于自己的内存地址,这样就好理解了
关于动态地址、静态地址(基址)我就不再过多讲述了,写了这么多担心小伙伴们会看不下去,感兴趣的网上自己查吧
相信大家看到这里已经迫不及待想看具体的游戏破解操作了,接下来就正式进入操作环节~~
首先准备工具: Cheat Engine(简称CE)、x64dbg(和OD类似)
(如果没有CE、x64dbg也没关系,我会给出链接供大家下载,避免有些萌新看不懂英文,x64dbg我给的是汉化版,演示我用的英文版,旁边有汉化版的标注)
破解的游戏
猎人:荒野的召唤(英文名theHunter:Call of the Wild)
游戏大小:60G(具体的配置要求可到steam、Epic里查看)
此游戏在steam、Epic上均可下载,养老休闲挺好的
游戏外挂的3种主要方式
1.修改内存代码(汇编代码)
2.修改内存数据
3.不对内存进行操作,在游戏外部进行辅助(比如鼠标自动点击、模拟人工操作等等)
工具分享
请评论获取相关工具
实战教程
本篇文章主要进行第一种方式的修改——修改内存代码(汇编代码)
开始操作~~~~
打开CE和游戏,附加进程,如下图
![图片[3]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220112160521532-1024x471-1.webp)
首先修改金币,最终的效果实现无限金币(金币不减、越花越多)
进入游戏商店,可以看到金币此时为25361
![图片[4]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220112160604465-1024x753-1.webp)
在CE中搜索25361
![图片[5]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220112160610573.webp)
可以看到,出现了38个地址,我们随便买一个东西,让金币发生变化
![图片[6]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220112160622185-1024x753-1.webp)
此时金币变为25028,在CE中再次扫描搜索
![图片[7]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220112160704242.webp)
![图片[8]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220112160720611.webp)
剩下的两个地址都拖到下面,该数值试一下就知道那个是金币的地址了
![图片[9]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220112160750152.webp)
经过筛选,第一个就是金币地址
![图片[10]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220112160807210-1024x468-1.webp)
当然,我们可以随意更改金币,改成999999也可以,只要你乐意
这种修改很简单,小学生都会的操作,而且这种方法找到的地址是动态地址,如果你重新打开游戏,金币的地址就会发生改变
如果这样的话,你每次想修改都要打开CE重复上面的步骤,很麻烦
那如何做到每次重启游戏,不用CE,金币也可以无限呢?
高级操作
这就需要更高级的操作了,下面才是重点~~~~
在CE找到的那个地址,右键选择 “找出是什么改写了这个地址”,会弹出一个窗口,窗口里什么也没有
![图片[11]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220112160854792.webp)
![图片[12]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220112160924800.gif)
弹出窗口后,我们在游戏里随便买一个东西
![图片[13]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220112161040310.gif)
![图片[14]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220112161149570-1024x470-1.webp)
可以看出,在买完东西的时候,出现了一条汇编代码
我们点击右边的 “显示反汇编程序”
![图片[15]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220112161328994.webp)
之后会弹出一个写有汇编代码的窗口,我圈中的两行代码就是我们要修改的代码
![图片[16]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220112161346395-1024x446-1.webp)
科普一下,可能有些萌新不知道mov、sub在汇编里是什么意思
为了方便就用a,b代替
mov a,b———- 把b里的值传递给a
sub a,b————-用a减b,相减得到的数再赋值给a
其它汇编指令就不多讲了,因为很多,不可能一一列举解释
这里可以想到什么?我们猜想一下,mov的作用是传递数据或者数值
我们在买完东西的时候调用了mov指令,然后金币下降了,那么………….
我们可以知道,mov [rcx+00000340] ,r8d 中r8d里的值就是我们买完东西之后剩下的金币数
也就是说,将 r8d 里剩余的金币数传到了[rcx+00000340]地址里,从而改变了金币的数量
所以[rcx+00000340]地址里存放的就是金币当前的数量,所以你的脑海里是否想到了一种方法(手动滑稽~~~)
如果我们把这条汇编代码注释掉,不让计算机执行mov操作,那么金币不就永远不会减少了吗(手动滑稽~~~)
汇编语言你里nop指令满足了这个要求,nop指令就是空指令,表示不进行任何操作
把上面的 mov [rcx+00000340] ,r8d 替换为 nop ,就ok了,如下图
![图片[17]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220112161411863.webp)
![图片[18]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220112161419516.gif)
修改为nop之后,进入游戏购买东西看看金币会不会发生变化
![图片[19]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220112161513952.gif)
金币一直是600,没发生过变化,证明修改成功
![图片[20]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220112161450726-1024x527-1.webp)
当然,我们还可以越买金币越多,还记得上面我圈住的两条汇编代码吗
![图片[21]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](20220112161806572.png)
我们只对 mov [rcx+00000340] ,r8d 进行了修改,感觉不过瘾,金币想越花越多怎么办(手动滑稽~~~)
注意观察mov里的 r8d ,有没有发现,r8d 是从上面那条 sub r8d ,eax 指令下来的
也就是说,r8d 是经过 sub 相减之后,把值传递给 mov 的 [rcx+00000340] 地址里
那么,我们直接把 相减(sub)指令 变为 相加(add)指令会怎么样,嘿嘿(手动滑稽~~~~)
让 sub r8d ,eax 变为 add r8d ,eax,然后计算机再执行 mov 指令把相加后的 r8d 传递给 [rcx+00000340] 地址里
那就修改一下看看
![图片[22]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](20220112161922453.gif)
进入游戏,购买商品,注意观察金币变化情况
可以看见神奇的事情发生了,金币竟然越花越多!(手动滑稽)
![图片[23]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](20220112161939700.gif)
一开始金币为600
![图片[24]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](20220112162117679-1024x750.png)
购买后金币为3833
![图片[25]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](20220112162126891-1024x749.png)
修改到这里就算完成了,但是还有一个问题,前面说过,CE里刚才找到的是金币的动态地址
每次打开游戏,金币的动态地址都不一样,难道每次想修改都要打开CE然后重复上面一大堆操作吗,肯定不行,太繁琐了
如果有个方法,可以每次打开游戏自动无限金币,那不是正好满足我们的需求吗?
x64dbg玩法
接下来就隆重有请 x64dbg 登场~~~
我们打开x64_dbg,那游戏文件拖进去
![图片[26]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](20220112162135932.gif)
然后,我们再回到CE,查看一下刚才修改的汇编代码内存地址是多少,复制下来
![图片[27]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](20220112162327204.png)
然后在x64_dbg里定位到这个地址,按Ctrl + G,然后把复制的内存地址粘贴上去,点击“OK”
![图片[28]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](20220112162352207-1024x493.png)
此时那行灰色的,就是我们要找的那条汇编代码,和CE上的一样
![图片[29]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](20220112162401924-1024x354.png)
我们在那条灰色代码上右键,选择Binary(汉化版为“二进制”),再选择Fill with NOPs(汉化版为“用NOP填充”),左键点击即可将 mov 指令变为 nop
修改完成后,我们按下快捷键 Ctrl + P ,选择Patch File(汉化版为“补丁文件”),点击
![图片[30]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](20220112162440532.png)
点击之后,会让你选择一个位置保存,随便建一个文件夹,把修改后的文件放进去即可,x64_dbg也可以关了
注意:文件名要和原游戏文件名一致
![图片[31]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](20220112162457472.png)
这个就是我们修改后的游戏文件
还差最后一步——偷天换日
我们把刚才修改的游戏文件放到原游戏文件的目录里,覆盖掉原文件
![图片[32]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](20220112162512238-1024x472.png)
![图片[33]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](20220112162522849-1024x737.png)
此时,再次打开游戏,金币自动无限,因为游戏调用的是我们修改过的文件
你还可以把修改的游戏文件给其他小伙伴,其它电脑上替换后也会无限金币,不用担心只能自己用的问题
结语
至此,游戏破解成功
这里只是修改了金币,无限子弹、无限技能点、修改等级、修改经验值、修改天赋…..
原理都一样,只有想不到,没有做不到~~~~
可能有小伙伴疑惑,这只是修改、替换了文件,网上的那些外挂又是怎么来的呢?
这里就需要编程了,把我们上面所进行的操作用代码展现出来
不知小伙伴们有没有注意到,x64dbg里最左边的地址和右边的汇编代码区域中间还有一列
![图片[34]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](20220112162607301.png)
这一列的每一行所对应的就是该行汇编代码的机器码(用十六进制显示的机器码)
当我们更改汇编代码的时候,相应的机器码也会发生改变
![图片[35]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog](20220112162411244.gif)
可以看到,机器码从 44 89 81 40 03 00 00 变为了 90 90 90 90 90 90 90
而 90 对应的就是汇编nop指令
这里需要注意,更改后的机器码最好要和原机器码的字节数保持一致,如果更改后字节数从7字节变为10字节,那该条汇编指令后面的其它指令可能会被覆盖掉,造成游戏崩溃!所以,最好改汇编指令,不要轻易改指令后的数据!
外挂就是在你打开的时候,帮你在对应的内存地址更改机器码,从而达到和手动修改一样的效果~~
感兴趣的小伙伴可以自己尝试写一个外挂,本篇主要是讲一下游戏逆向思路,对具体编程不做讲解
当然,这个游戏基本没有保护可以看到可以随便修改,也不用担心封号问题,压根儿不检测,有些游戏有保护就比较困难了
以上的方法,对于大部分单机游戏均有效(联网游戏可能会有检测,搞不好会封号,单机过过瘾就行了)
学会了赶快找个游戏试试吧~~~
暂无评论内容