注入器注入代码
大约 2 分钟cpp
概述
代码注入是为了有目标的找到想要的函数(游戏中释放技能)进行调用,需要用到两个工具 xdbg32 和 代码注入器。本案例用到的知识点有:函数调用约定、内外平栈
代码注入的原理是向宿主程序中创建了一个线程,在该线程中又调用了主线程的某个函数
实现
制作游戏客户端
制作一个控制台程序充当游戏客户端,其中有个加法函数充当游戏中的技能 call,通过 xdbg32 找到函数地址然后在代码注入器中编写汇编指令调用函数,制作游戏客户端以及其中源码见 创建控制台应用程序作为游戏客户端
源码截图
创建控制台应用程序后由于有自动添加的注释导致代码的行号同上面图片中不一致,实际源码如下
可以看到入口函数中行号18是调用函数的
xdbg32找到目标函数地址
将编译后的文件 gameclient.exe 拖放到 x32dbg.exe 中,工具会自动阻止目标程序的运行,此时在 x32dbg.exe 中使用组合键 ctrl+g 搜索 _main 定位到程序的入口处,继续向下看,x32dbg 提供的行号不一定对,函数真实地址见下图 
代码注入
接下来打开 代码注入器32位x86用.exe 并如下图附加游戏客户端
由于本案例做了两次,导致下面注入代码时的函数地址和上面 x32dbg.exe 中看到不一样,也表示目标程序每次重启函数地址都会改变 
打印函数地址
下面代码中的 main 函数中主动打印出当前程序中函数的地址,自己做试验时就可以通过代码注入器直接 call 这个地址,如上图一样,记得平栈
int add(int a, int b) {
printf("=================================\r\n");
printf("调用技能传入参数:\r\n十进制:a:%d,b:%d\r\n十六进制:a:%X,b:%X\r\n",a,b,a,b);
return a + b;
}
int main()
{
add(10,12);
printf("main函数中打印add函数的地址:%p\n", add);
getchar();
}
本文的前置知识见:注入用宿主进程
