-
-
分享一个简洁的inlinehook的c源码
-
发表于: 2024-12-11 11:40 804
-
先说说特别之处,inlinehook的时候因为需要计算函数头涉及的指令长度,通常会引入一个汇编指令解析引擎库,找了一遍发现有的开源项目太厚重了,引入一个外部库挺烦的,最后找到一段精致的x86的dasm的shellcode,非常有趣,基于这个我写了一个简洁的inline hook,以后一些hook场景只需要引入这个hook.c文件就可以了。
下面是介绍,看看使用起来有多简单,基本就是sihook_create和sihook_enable。
sihook_create的时候只是计算指令长度、备份指令到可执行内存和生成inline指令,sihook_enable的时候才把inline指令写入到目标地址。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #include "sihook/hook.h" typedef int WINAPI typedef_MessageBoxExA( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType, WORD wLanguageId); typedef_MessageBoxExA * org_MessageBoxExA = NULL; int WINAPI myMessageBoxExA( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType, WORD wLanguageId) { return org_MessageBoxExA(hWnd, "hooked" , lpCaption, uType, wLanguageId); } int main() { int n; n = sihook_create(MessageBoxExA, - 1 , myMessageBoxExA, (void * * )&org_MessageBoxExA); sihook_enable(org_MessageBoxExA, 1 ); MessageBoxExA( 0 , "will be replaced to 'hooked'" , "sihook" , MB_ICONINFORMATION, 0 ); sihook_free(org_MessageBoxExA); MessageBoxExA( 0 , "test-free" , "sihook" , MB_ICONINFORMATION, 0 ); } |
sihook
simple inline hook.
简单的适用windows或linux环境的inline_hook,支持架构x86、x86_64.
特点
- 简化引入其他汇编指令解析引擎库,直接用预编译好的ldasm的shellcode来计算inlinehook时涉及的指令长度。这块功能代码取自开源项目 github.com/thejanit0r/x86_ldasm
- 接口简洁,仅sihook_create sihook_enable sihook_free三个函数。
- 近跳需要5字节的inline指令,64位远跳则需要14字节。
- win/linux目前已测试
不足
- 仅适用函数头前面几个指令是位置无关的,与位置相关的指令备份移动后没有修正处理。
赞赏记录
参与人
雪币
留言
时间
ylp1332
感谢你分享这么好的资源!
6天前
iamasbcx
+2
感谢你的贡献,论坛因你而更加精彩!
2024-12-11 15:27
wtujoxk
+1
这个讨论对我很有帮助,谢谢!
2024-12-11 13:43
赞赏
看原图
赞赏
雪币:
留言: