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[])
{
// 00401080 55 push ebp
// 00401081 8B EC

本文介绍了WIN32 Inline Hook技术,这是一种类似于代码注入的原理,通过修改汇编指令实现在目标函数前插入自定义逻辑。在自定义函数内,需保持寄存器值和堆栈状态的一致性,通常使用裸函数来实现。文中还提到,如果被替换的代码不涉及堆栈修改,可以使用call和ret指令简化跳转。示例代码展示了如何设置和卸载HOOK,并验证其效果。
最低0.47元/天 解锁文章
690

被折叠的 条评论
为什么被折叠?



