Windows上的InlineHook学习

简单Demo

原理介绍
InlineHook 的原理非常简单,举个栗子方便阐述:函数 func1() 是原始函数,函数 func2() 是挂钩在 func1() 的函数!我们将函数 func1() 的前几个字节修改为 jmp func2,此时调用 func1() 的时候就会跳转到 func2(),简言之就是将被hook函数前五个字节修改为jmp xxx

简单Demo代码

#include <stdio.h>
#include <windows.h>
 
void func1(){
    printf("HelloWorld!\n");
}

void func2(){
    printf("InlineHook Success!\n");
}
 
int main(int argc, char* argv[]){
    func1();
    DWORD dwOldProtect,dwNewProtect,dwWritten = 0;
    LPVOID originalFunc = func1,hookFunc = func2; // LPVOID=PVOID=void *
    if(VirtualProtect(originalFunc,5,PAGE_EXECUTE_READWRITE,&dwOldProtect)){
        HANDLE handle0 = GetCurrentProcess();
        BYTE shellCode[5] = {0};
        shellCode[0] = 0xe9; // jmp offset
        *((DWORD *)(&shellCode[1])) = (DWORD)hookFunc - (DWORD)originalFunc - 5; // hookAddr-originAddr-5
        if (WriteProcessMemory(handle0,originalFunc,shellCode,5,&dwWritten) && dwWritten == 5){
            printf("Write OK!\n");
        }
        CloseHandle(handle0);
    }
    VirtualProtect(originalFunc,5,dwOldProtect,&dwNewProtect);
    func1();
    getchar();
    return 0;
}

运行结果

注意事项
要使用 gcc Inlinehook.c -m32 -o hook2.exe 编译成 32 位程序,编译成 64 位程序会有很多警告但是不影响运行,原因是:64位程序的变量长度与32位程序有所区别,在强制类型转换时会弹出类型长度不匹配的警告,也可以自行修改类型后编译成 64 位程序

进阶Demo

待续...

END

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值