首页
社区
课程
招聘
分享一个简洁的inlinehook的c源码
发表于: 2024-12-11 11:40 804

分享一个简洁的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目前已测试

不足

  • 仅适用函数头前面几个指令是位置无关的,与位置相关的指令备份移动后没有修正处理。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 3
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//