《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?

通过一个游戏教你入门游戏外挂的开发!仅供学习、研究参考

好久没更新文章了,今天就水一篇吧(手动滑稽~~)

前言

游戏外挂想必大家都知道,是否好奇是怎么来的,外挂开发者是如何一步步写出外挂的?

很多初学编程的萌新感觉学会编程就会写外挂了

其实不然,会编程 ≠ 会写外挂

在整个外挂的制作周期中,编程只占了一部分

真正起到决定性作用的是——逆向分析

对游戏的逆向分析才是外挂的灵魂、核心所在!

所以,本篇文章就结合CEx64dbg汇编知识,讲解一下破解游戏的思路。

视频演示

知识储备

首先,在开始之前要了解一些知识,对于后面的理解会有帮助。

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

可见,了解汇编是逆向分析的第一步

什么是硬盘、内存、虚拟内存、CPU的关系?

硬盘应该都很好理解,平时下载的软件和程序都储存在硬盘里,包括二进制可执行文件里的机器码也储存在硬盘里

内存直观体现就是内存条,程序运行的时候都会从硬盘上装载到内存中,但是有个问题,比如你买了一个4G的内存条,运行游戏需要3.8G内存,那如果一边玩游戏、一边挂QQ、一边听歌,那内存不就爆满了吗,电脑不就崩溃了吗,那为啥现实中并没有出现这种情况,反而运行还很流畅呢?

这就要提到计算机系统内存管理的一种技术——虚拟内存,计算机科学家早就想到了上面会出现的问题,所以他们设计通过系统的某些指令对物理内存进行映射,使得每个程序运行时都拥有4G的独立内存,就很好解决了打开程序过多电脑会崩溃卡死的问题

CPU即中央处理器,是计算机的运算和控制中心,相当于人的大脑,CPU会读取程序装载到内存中的数据,并执行所对应的功能,比如控制音量、麦克风开启/关闭,显示器的画面…….

关系如下图:

图片[2]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

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

首先修改金币,最终的效果实现无限金币(金币不减、越花越多)

进入游戏商店,可以看到金币此时为25361

图片[4]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

在CE中搜索25361

图片[5]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

可以看到,出现了38个地址,我们随便买一个东西,让金币发生变化

图片[6]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

此时金币变为25028,在CE中再次扫描搜索

图片[7]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog
图片[8]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

剩下的两个地址都拖到下面,该数值试一下就知道那个是金币的地址了

图片[9]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

经过筛选,第一个就是金币地址

图片[10]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

当然,我们可以随意更改金币,改成999999也可以,只要你乐意

这种修改很简单,小学生都会的操作,而且这种方法找到的地址是动态地址,如果你重新打开游戏,金币的地址就会发生改变

如果这样的话,你每次想修改都要打开CE重复上面的步骤,很麻烦

那如何做到每次重启游戏,不用CE,金币也可以无限呢?

高级操作

这就需要更高级的操作了,下面才是重点~~~~

在CE找到的那个地址,右键选择 “找出是什么改写了这个地址”,会弹出一个窗口,窗口里什么也没有

图片[11]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog
图片[12]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog
以上是动图,需要点开观看

弹出窗口后,我们在游戏里随便买一个东西

图片[13]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog
以上是动图,需要点开观看

图片[14]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

可以看出,在买完东西的时候,出现了一条汇编代码

我们点击右边的 “显示反汇编程序”

图片[15]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

之后会弹出一个写有汇编代码的窗口,我圈中的两行代码就是我们要修改的代码

图片[16]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

科普一下,可能有些萌新不知道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
图片[18]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog
以上是动图,需要点开观看

修改为nop之后,进入游戏购买东西看看金币会不会发生变化

图片[19]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog
以上是动图,需要点开观看

金币一直是600,没发生过变化,证明修改成功

图片[20]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

当然,我们还可以越买金币越多,还记得上面我圈住的两条汇编代码吗

图片[21]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

我们只对 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
以上是动图,需要点开观看

进入游戏,购买商品,注意观察金币变化情况

可以看见神奇的事情发生了,金币竟然越花越多!(手动滑稽)

图片[23]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog
以上是动图,需要点开观看

一开始金币为600

图片[24]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

购买后金币为3833

图片[25]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

修改到这里就算完成了,但是还有一个问题,前面说过,CE里刚才找到的是金币的动态地址

每次打开游戏,金币的动态地址都不一样,难道每次想修改都要打开CE然后重复上面一大堆操作吗,肯定不行,太繁琐了

如果有个方法,可以每次打开游戏自动无限金币,那不是正好满足我们的需求吗?

x64dbg玩法

接下来就隆重有请 x64dbg 登场~~~

我们打开x64_dbg,那游戏文件拖进去

图片[26]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

然后,我们再回到CE,查看一下刚才修改的汇编代码内存地址是多少,复制下来

图片[27]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

然后在x64_dbg里定位到这个地址,按Ctrl + G,然后把复制的内存地址粘贴上去,点击“OK”

图片[28]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

此时那行灰色的,就是我们要找的那条汇编代码,和CE上的一样

图片[29]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

我们在那条灰色代码上右键,选择Binary(汉化版为“二进制”),再选择Fill with NOPs(汉化版为“用NOP填充”),左键点击即可将 mov 指令变为 nop

修改完成后,我们按下快捷键 Ctrl + P ,选择Patch File(汉化版为“补丁文件”),点击

图片[30]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

点击之后,会让你选择一个位置保存,随便建一个文件夹,把修改后的文件放进去即可,x64_dbg也可以关了

注意:文件名要和原游戏文件名一致

图片[31]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

这个就是我们修改后的游戏文件

还差最后一步——偷天换日

我们把刚才修改的游戏文件放到原游戏文件的目录里,覆盖掉原文件

图片[32]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog
图片[33]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

此时,再次打开游戏,金币自动无限,因为游戏调用的是我们修改过的文件

你还可以把修改的游戏文件给其他小伙伴,其它电脑上替换后也会无限金币,不用担心只能自己用的问题

结语

至此,游戏破解成功

这里只是修改了金币无限子弹无限技能点修改等级修改经验值、修改天赋…..

原理都一样,只有想不到,没有做不到~~~~

可能有小伙伴疑惑,这只是修改、替换了文件,网上的那些外挂又是怎么来的呢?

这里就需要编程了,把我们上面所进行的操作用代码展现出来

不知小伙伴们有没有注意到,x64dbg里最左边的地址和右边的汇编代码区域中间还有一列

图片[34]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog

这一列的每一行所对应的就是该行汇编代码的机器码(用十六进制显示的机器码)

当我们更改汇编代码的时候,相应的机器码也会发生改变

图片[35]-《猎人:野性的呼唤》金币越花越多?汇编知识、逆向技术你学会了吗?-FancyPig's blog
以上是动图,需要点开观看

可以看到,机器码从 44 89 81 40 03 00 00 变为了 90 90 90 90 90 90 90

而 90 对应的就是汇编nop指令

这里需要注意,更改后的机器码最好要和原机器码的字节数保持一致,如果更改后字节数从7字节变为10字节,那该条汇编指令后面的其它指令可能会被覆盖掉,造成游戏崩溃!所以,最好改汇编指令,不要轻易改指令后的数据!

外挂就是在你打开的时候,帮你在对应的内存地址更改机器码,从而达到和手动修改一样的效果~~

感兴趣的小伙伴可以自己尝试写一个外挂,本篇主要是讲一下游戏逆向思路,对具体编程不做讲解

当然,这个游戏基本没有保护可以看到可以随便修改,也不用担心封号问题,压根儿不检测,有些游戏有保护就比较困难了

以上的方法,对于大部分单机游戏均有效(联网游戏可能会有检测,搞不好会封号,单机过过瘾就行了)

学会了赶快找个游戏试试吧~~~

© 版权声明
THE END
喜欢就支持一下吧
点赞32 分享
评论 共65条

请登录后发表评论