Windows上的InlineHook学习

简单Demo

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

简单Demo代码

#include 
#include 
 
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

你可能感兴趣的:(hook,windows,c)