分享一款自己写的linux kernel inline hook引擎
2022-12-10 18:38:51 Author: bbs.pediy.com(查看原文) 阅读量:50 收藏

分享一款自己写的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. 支持情况

  1. 调用原函数之前的回调 -> 调用原函数 -> 调用原函数之后的回调 -> 返回到正常流程
  2. 调用原函数之前的回调 -> 调用原函数 -> 返回到正常流程

4. 限制

该模块目前支持的架构:

  1. x86 (测试通过)
  2. x86_64 (测试通过)
  3. Arm (arm模式测试通过但是thumb模式没有进行测试)
  4. Arm64 (测试通过)

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

  1. 目前支持hook参数为8个及8个以下的内核函数

5. 额外功能

  1. 可以在前回调中修改调用原函数的参数
  2. 可以在前回调中获取调用原函数的参数,作相关的验证
  3. 可以在后回调中查看原函数的返回值,也可以修改原函数的返回值

6. 构建

  1. 正常构建先make再insmod加载模块
  2. 如果要在x86架构的机器上构建arm架构下的内核模块:make ARCH=arm64 or arm CROSS_COMPILE=交叉编译工具链
  3. 如果要添加hook函数,需要在Makefile中添加相应的.o文件路径,在install/p_install中添加相应的头文件,在hook文件夹中添加相应的文件,并在p_lkrg_main.c中添加对应的信息

7. 注意

  1. 如果内核版本大于5.7.0,加载模块时需要传入参数。 例如:insmod hook_engine.ko kallsyms_lookup_name_address=0xffffffc0100d4dc8
  2. 如果钩子函数很多,卸载的时候系统会卡顿一会,因为在等待内存释放,才会进行卸载。

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. 使用场景

  1. 当linux内核不支持kprobe等自带的监控时,可以使用该项目进行函数监控

看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~

最后于 5天前 被榆一编辑 ,原因:


文章来源: https://bbs.pediy.com/thread-275488.htm
如有侵权请联系:admin#unsafe.sh