inline hook

inline hook

inline hook的核心是通过修改机器码改变程序的执行流程,实现跳转有很多种方式,如JMP的短跳(EB)、近跳(E9)、远跳(EA),其中短跳和进跳的的操作数是相对于EIP的偏移,其满足“目标地址 = 当前指令地址 + 指令长度 + RVA”,而远跳的操作数是一个绝对地址;又如 push+retn 的组合(原理是 retn = pop eip);又如 mov eax + jmp eax 等手段。

x86

以JMP为例:

首先需要找到hook的位置,这可能是某个功能处,也可能是程序起始位置。如使用GetProcAddress获取某个API的地址,例如:

char* target = (char*)GetProcAddress(GetModuleHandleA("Kernel32.dll"), "CreateFileA");

或者是 &CreateFileA。

接着修改该处的内存属性和写入相应的内容,因为代码段默认是可读可执行的,是不可写的,需要修改属性。这里可以是可读可写、也可以是可读可写可执行。因为写入了相应的跳转指令后会修改回原来的属性。修改的字节数可以是五字节、六字节、七字节等。写入的内容是上述的跳转指令,如JMP、push等以及跳转的偏移。

最后把上述内存地址属性修改为原属性,可读可执行。

x64

64位环境下,实现跳转的方式可以是:mov rax,xxxxxxxx;jmp rax;当然也可以是mov rax,xxxxxxxx;push rax;ret 或者是 jmp qword ptr[xxxxxxxx]。

其他与x86下大同小异

热门相关:布衣官道   诛明   恶明   史上第一宠婚:慕少的娇妻   都市狐仙养成记