小黑盒游戏新闻 ( ) • 2024-05-04 18:17

有什么工具是电子阳痿的根源,可以快速消耗一个游戏的游玩寿命?

又是什么工具让人欲罢不能,"将游戏最后一滴价值榨出来".

很多人的答案都会是--风灵月影。

选择修改器这件事,本来就存在两面性,无法下定义好与坏,很多时候选择修改器,是为了规避不友好的关卡设计、时间不充裕的前提下快速通关,或者对框架内的玩法感到倦怠,只想体验最纯粹的剧情。

但是今天不是从修改器的选择出发,而是分析修改器背后的原理(我也要当风灵月影宗长老

对于单机游戏而言,游戏中绝大部分的参数(比如血、蓝、能量亦或是金币)都存储在计算机的堆栈中,一些类似剧情进度的则加密后写入本地的自定义配置文件中,一些防护性强大的游戏为了避免玩家作弊,会在上述的步骤中设置加密,来保证玩家的用户体验(或者纯纯为了恶心玩家)。

在此之前,我们来了解一些基础知识:

数据类型:游戏中的血量、蓝、生命值等,我们将他们称之为变量,变量位于内存中,包含了变量名称和数据类型,如果可以找到对应变量在内存中的地址,就可以将其修改并得到想要的数值。

进程:每一个应用程序/游戏启动,都会产生至少一个进程Process,在任务管理器里可以看到进程名称和进程PID,大家在修改器界面可以看到这个进程。

句柄:英文HANDLE,一个整数值。数据的地址需要变动,变动以后就需要有人来记录管理变动,就好像户籍管理一样,因此系统用句柄来记载数据地址的变更

进入正题,我们该怎么找到需要修改的变量的地址呢?一般要参考一下路线:

修改变量的数值→找到存储变量的内存地址→找到游戏窗口的句柄→找到游戏的进程。

这里给出一个获得内存地址的思路,Windows系统库的kernel32.dll库文件中包含了内存操作的API,其中VirtualQueryEx用于查询地址空间中内存地址的信息。

此函数负责获取内存信息,而查询内存信息中具体存放数值则用到另一函数ReadProcessMemory,将根据句柄读取该进程的某个内存空间,并将读取到的字节数写入到我们开辟的一块空间中,而此空间存放的正是我们苦苦追寻的“有意义的数值”。此函数的部分参数依赖于上一个函数VirtualQueryEx产生的结果。

根据上面的API,来看怎么获取窗体句柄,同样的kernel32.dll提供了名为OpenProcess的函数用来打开一个已存在的进程对象,并返回进程的句柄。

我们获取到进程的PID以后,就可以调用OpenProcess获取窗体的句柄,然后利用函数VirtualQueryEx遍历内存查找地址信息,根据地址利用ReadProcessMemory查找具体存放的值,最后利用WriteProcessMemory把修改后的值写入该地址,这样就完成了一次数据的修改。

到了这里,修改游戏数值的原理和套路已经很明白了,甚至脱离游戏来讲,任何的应用如果没有对缓存中的数据进行良好的加密,都是存在很大的风险隐患的,这也是为什么运行作弊软件时,360经常报毒的原因。

上篇先了解一下常用到的名词和API的运用。具体如何利用代码进一步调用API,以及更详细的剖析每一步的逻辑,留在中篇和下篇继续写吧(立个flag吧