<Excerpt in index | 首页摘要>
探寻外挂最基本的原理
<The rest of contents | 余下全文>
外挂原理
最近学习ndk方面,复习了一下c.
突然想起来外挂这个东西(我会写最基本的植物大战僵尸的免CD、无线金钱,哈哈~)
其实外挂的原理很简单.
计算机程序运行过程中所使用的数据都在内存中.
比如,我有一个代码:
1 | void main(){ |
上述代码中使用的x,就被保存在了内存当中.
而在游戏中(只讲单机游戏),我们一般所有的金钱、HP、MP、cd。
都是需要临时保存在内存中,供程序调用。
最简单、最基本的外挂就是找到这个内存地址然后修改其值,来达到目的。
比如说,我有100的金币,然后找到保存这个金币的变量的内存地址(指针),然后修改它的值,就可以做到无限金币(用了再加)。
代码实现一个简单的外挂
光说肯定没用,用一段十分简单的demo来讲。
就不用游戏来做了,不然还得找基值之类的。我们写一个demo程序,保存一个值,然后直接打印内存地址出来,然后用一个模拟的外挂去修改这个内存地址。
首先创建一个project,然后添加一个c文件
1 |
|
把这个项目跑起来.
注意,我们是不能直接在另一个程序中寻找这个地址然后修改它的值的。
从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。
哈哈,很简单吧,这个就是最基本的外挂原理。