首页
社区
课程
招聘
分享一款自己写的linux kernel inline hook引擎
发表于: 2022-12-10 17:16 22488

分享一款自己写的linux kernel inline hook引擎

2022-12-10 17:16
22488

https://github.com/stdhu/kernel-inline-hook

该内核模块是一个支持不同架构的linux内核inline hook模块。 用于inline hook linux 内核函数。 该模块主要可用于在调用某个内核函数之前或之后插入自定义代码,实现类似函数监控的功能。

该模块目前支持的架构:

该模块目前支持hook的函数情况:

hook函数结构示例

回调函数示例

hook函数数组信息示例

图片描述

//普通函数
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 //系统调用号
};
//普通函数
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 //系统调用号
};
//parameter1: 调用原函数后的返回地址
//parameter2: 调用原函数时寄存器的情况
int p_generic_permission_ret(unsigned long ret_addr,hk_regs * regs);
//parameter1: 调用原函数后的返回地址
//parameter2: 调用原函数时寄存器的情况
int p_generic_permission_ret(unsigned long ret_addr,hk_regs * regs);
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} //数组结尾
};
static const struct p_functions_hooks{
    const char *name;
    int (*install)(int p_isra);
    void (*uninstall)(void);
    int is_sys;
}p_functions_hooks_array[]={

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2022-12-10 17:16 被榆一编辑 ,原因:
收藏
免费 7
支持
分享
最新回复 (6)
雪    币: 4437
活跃值: (6666)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
很实用的hook
2022-12-10 17:20
0
雪    币: 29
活跃值: (5647)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3

看了一下,其实就是用户空间的那套inlinehook,而且不支持pc relative指令。不知道有没有兴趣开一个项目,把substrate或者dobby之类的内核模块化的想法?把内存申请释放,权限修改等替换为内核函数

最后于 2022-12-10 19:48 被不吃早饭编辑 ,原因:
2022-12-10 18:37
0
雪    币: 3772
活跃值: (3039)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错  感谢分享
2022-12-18 21:07
0
雪    币: 14492
活跃值: (17493)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
5
感谢分享
2022-12-19 11:00
0
雪    币: 47
活跃值: (207)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
代码写得很漂亮。作者很用心也费了不少心血,如果不是一点一点测试,不会有那么多的版本条件编译。棒棒的!!!作者绝对可以为之自豪。
2023-1-18 09:42
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
支持 redhat吗,执行到下面代码会崩溃
 new_target = vm_map_ram(&page, 1, -1,PAGE_KERNEL_EXEC);
    
    if (!new_target) {
        p_print_log("Remap address %p failed\n", target);
        return -EFAULT;
    } else {
        memcpy(new_target + ((unsigned long)target & (~ PAGE_MASK)), source, size);
        vm_unmap_ram(new_target, 1);
        flush_icache_range((unsigned long)target, (unsigned long)target + size);
        
        return 0;
    }
2023-8-24 16:16
0
游客
登录 | 注册 方可回帖
返回
//