Inline hook 和CE里面的代码注入很像(应该是一个东西),这个技术的原理是,修改汇编指令,让某个指令跳转到我们定义的函数,然后在函数内完成被替换的指令,然后再跳转回去。在我们定义的函数内,我们可以实时获取寄存器的值,从而可以完成对函数行为的监视和修改。
在我们定义的函数内,需要注意,寄存器的值和堆栈状态,执行前后必须完全一致,否则程序会出错。为了实现这个目的,我们需要用到裸函数。
下面是代码,要注意代码中使用的地址仅在我的机器上有效,如果你要编译这个程序,第一次运行会失败,请根据生成的汇编代码,找到Plus的地址,然后对SetInlineHook的参数1作相应修改。
另外补充一点,如果被替换的代码不含修改堆栈的指令(如push),则可以用call和ret的方式来实现跳转,这样写起来更方便些。
// InlineHook.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <STDIO.H>
int Plus(int x, int y);
void HookAddress();
void SetInlineHook(DWORD originalCodeAddr, DWORD originalSize, DWORD newCodeAddr);
void UnsetInlineHook(DWORD originalCodeAddr);
BYTE g_bOriginCode[64]; // 原始代码,卸载HOOK时用到
DWORD g_dwOriginCodeSize; // 原始代码的大小
DWORD g_ret; // HOOK函数内跳转到原函数的地址
int main(int argc, char* argv[])
{