Gloomy's Blog

Gloomy's Blog Website

0%

探寻最基本外挂原理

<Excerpt in index | 首页摘要>

探寻外挂最基本的原理

<The rest of contents | 余下全文>

外挂原理

最近学习ndk方面,复习了一下c.

突然想起来外挂这个东西(我会写最基本的植物大战僵尸的免CD、无线金钱,哈哈~)

其实外挂的原理很简单.

计算机程序运行过程中所使用的数据都在内存中.

比如,我有一个代码:

1
2
3
4
void main(){
int x = 100;
printf("%d", x);
}

上述代码中使用的x,就被保存在了内存当中.

而在游戏中(只讲单机游戏),我们一般所有的金钱、HP、MP、cd。

都是需要临时保存在内存中,供程序调用。

最简单、最基本的外挂就是找到这个内存地址然后修改其值,来达到目的。

比如说,我有100的金币,然后找到保存这个金币的变量的内存地址(指针),然后修改它的值,就可以做到无限金币(用了再加)。

代码实现一个简单的外挂

光说肯定没用,用一段十分简单的demo来讲。

就不用游戏来做了,不然还得找基值之类的。我们写一个demo程序,保存一个值,然后直接打印内存地址出来,然后用一个模拟的外挂去修改这个内存地址。

首先创建一个project,然后添加一个c文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
int main(int argc, char* argv[])
{
int gameTime = 60 * 60;//游戏时间
printf("基值为: 0x%x \n", &gameTime);
while(gameTime > 0){
printf("你还可以玩本游戏 %d 秒钟\n", gameTime);

gameTime--;
Sleep(1000);
}
system("pause");
return 0;
}

把这个项目跑起来.

注意,我们是不能直接在另一个程序中寻找这个地址然后修改它的值的。

从windows多少开始我也不知道,操作系统给每个运行的程序会分不同的内存区域,然后程序跑得起来之后每程序的地址都是虚拟地址。

所以假设上面这个代码跑出来的地址是0x001,然后你在另一个程序中直接去修改这个0x001实际上修改的是外挂程序内存0x001.

那么要如何修改呢?其实就是将外挂作为dll文件注入到游戏程序里面去。

(网游这块封杀的很厉害,我了解到的例如,dnf,cf等 不是注入dll了,而是伪装外挂成为一个输入法ime文件然后注入到游戏里面去)。

总的来说,目的是一样的,就是要外挂成为游戏的一部分,这样才能够共享一块内存区域。

外挂代码:

#include <stdlib.h>
#include <stdio.h>

__declspec(dllexport) int modify(){
    //修改time变量的值
    int *p = (int*)0x18ff44;
    *p = 999999;
    printf("内存外挂修改完毕\n");
    return 0;
}

首先我们跑起来游戏程序(伪),然后copy内存地址,复制到外挂的内存地址区域,然后编译成dll文件。

然后利用dll注入程序,将生成的dll注入进去,然后注入程序会提示需要执行什么函数,例如我这里就是modify。

然后观察游戏程序,就会首先输出一行:“内存你外挂修改完毕”

然后游戏剩余时间就变成了999999。

哈哈,很简单吧,这个就是最基本的外挂原理。