WIN32 Inline HOOK

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

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[])
{
   
	
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值