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]。文章来源:https://www.toymoban.com/news/detail-794353.html
其他与x86下大同小异文章来源地址https://www.toymoban.com/news/detail-794353.html
到了这里,关于inline hook的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!