简单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
待续...