-
-
分享一款自己写的linux kernel inline hook引擎
-
5天前
2342
-
分享一款自己写的linux kernel inline hook引擎
1. 项目地址
https://github.com/stdhu/kernel-inline-hook
2. 项目介绍
该内核模块是一个支持不同架构的linux内核inline hook模块。 用于inline hook linux 内核函数。 该模块主要可用于在调用某个内核函数之前或之后插入自定义代码,实现类似函数监控的功能。
3. 支持情况
- 调用原函数之前的回调 -> 调用原函数 -> 调用原函数之后的回调 -> 返回到正常流程
- 调用原函数之前的回调 -> 调用原函数 -> 返回到正常流程
4. 限制
该模块目前支持的架构:
- x86 (测试通过)
- x86_64 (测试通过)
- Arm (arm模式测试通过但是thumb模式没有进行测试)
- Arm64 (测试通过)
该模块目前支持hook的函数情况:
- 目前支持hook参数为8个及8个以下的内核函数
5. 额外功能
- 可以在前回调中修改调用原函数的参数
- 可以在前回调中获取调用原函数的参数,作相关的验证
- 可以在后回调中查看原函数的返回值,也可以修改原函数的返回值
6. 构建
- 正常构建先make再insmod加载模块
- 如果要在x86架构的机器上构建arm架构下的内核模块:make ARCH=arm64 or arm CROSS_COMPILE=交叉编译工具链
- 如果要添加hook函数,需要在Makefile中添加相应的.o文件路径,在install/p_install中添加相应的头文件,在hook文件夹中添加相应的文件,并在p_lkrg_main.c中添加对应的信息
7. 注意
- 如果内核版本大于5.7.0,加载模块时需要传入参数。 例如:insmod hook_engine.ko kallsyms_lookup_name_address=0xffffffc0100d4dc8
- 如果钩子函数很多,卸载的时候系统会卡顿一会,因为在等待内存释放,才会进行卸载。
8. 示例
hook函数结构示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | / / 普通函数
static struct p_hook_struct p_generic_permission_hook = {
.entry_fn = p_generic_permission_entry, / / 前回调函数地址
.ret_fn = p_generic_permission_ret, / / 后回调函数地址
.name = "generic_permission" , / / 函数名称
};
/ / 系统调用表中的函数
static struct p_hook_struct p_generic_permission_hook = {
.entry_fn = p_generic_permission_entry,
.ret_fn = p_generic_permission_ret,
.name = "__x64_sys_read" ,
.sys_call_number = __NR_read / / 系统调用号
};
|
回调函数示例
1 2 3 | / / parameter1: 调用原函数后的返回地址
/ / parameter2: 调用原函数时寄存器的情况
int p_generic_permission_ret(unsigned long ret_addr,hk_regs * regs);
|
hook函数数组信息示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | static const struct p_functions_hooks{
const char * name;
int ( * install)( int p_isra);
void ( * uninstall)(void);
int is_sys;
}p_functions_hooks_array[] = {
{
"generic_permission" ,
p_install_generic_permission_hook,
p_uninstall_generic_permission_hook,
0
},
{NULL,NULL,NULL, 0 } / / 数组结尾
};
|
9. 演示
10. 使用场景
- 当linux内核不支持kprobe等自带的监控时,可以使用该项目进行函数监控
看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~
最后于 5天前
被榆一编辑
,原因:
文章来源: https://bbs.pediy.com/thread-275488.htm
如有侵权请联系:admin#unsafe.sh