1.3 内存挂与游戏的关系
在这一节中,我们将主要讨论内存挂与游戏的关系。对非内存挂,我们会在第1.4节讲解。
对内存挂而言,如果从模块的角度看,它主要由一个负责启动的EXE程序和一个或若干个实现核心功能的DLL或SYS模块组成。从更为形象的角度,我们可以把外挂看作一把装了子弹的枪——枪本身是负责启动的EXE程序,而子弹是实现核心功能的模块,当某个特定条件发生(如目标游戏进程启动等),子弹就会射出,进而击中目标。内存挂的工作目的是释放核心模块并将其注入目标游戏进程。
图1-1从内存布局结构上描绘了内存挂。
图1-1 内存挂的内存布局
从图1-1中可知,负责启动/注入的EXE模块与核心模块之间是包含与被包含关系。针对这种PE打包方式,有以下两种情况。
➢ 核心模块以资源的形式打包在外挂的启动EXE模块中。
➢ 核心模块以数据的形式打包在外挂的启动EXE模块中。
内存挂在启动之后,首先会遍历进程以定位目标游戏进程,然后将核心功能模块(如WG.DLL)释放到驱动目录下,把WG.DLL注入游戏进程空间,同时退出自己的启动模块,以防止被反外挂系统检测到。之后,外挂的作弊功能都由核心模块负责提供。
内存挂与游戏的内存布局如图1-2所示,我们可以从中看出内存挂与游戏内存布局的关系。就像微生物世界里的寄生虫与宿主之间的关系一样,寄生虫的生存空间和时间依赖于宿主,同样的道理,外挂的生成空间和时间也依赖于特定游戏的特定版本。因为每当游戏更新版本之后,之前外挂获取的关键数据点、Call函数的地址等往往会发生变化,所以外挂也要更新,发布新版本——反外挂和外挂不停地在攻防对抗中锻炼着彼此的思维能力和耐力。
图1-2 内存挂与游戏的关系
外挂DLL包含了内存挂所拥有的全部核心功能(假设该外挂无驱动),包括自我隐藏、Call函数、修改代码或数据、Hook等。对这些细节,本书的后续章节中会结合外挂的常用功能(如加速、无敌、吸怪、自动攻击等)进行详细剖析,并从反外挂的角度给出防御方案,让读者在外挂与反外挂的思维对抗中学到思考方法和技术。