采用修改导入节的HOOK方式使用范围

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Ubuntu 18.04 中,可以使用内核模块来 hook 内核函数,不必使用 inline hook 方式。 以下是一个简单的例子,用于 hook 内核中的 sys_open 函数: 1. 创建一个 C 文件,例如 hook_sys_open.c,编写 hook 函数: ``` #include <linux/module.h> #include <linux/kernel.h> #include <linux/unistd.h> // 原函数指针 asmlinkage long (*sys_open_orig)(const char *filename, int flags, umode_t mode); // hook 函数 asmlinkage long hook_sys_open(const char *filename, int flags, umode_t mode) { printk(KERN_INFO "Hooked sys_open!\n"); return sys_open_orig(filename, flags, mode); } // 模块初始化函数 static int __init hook_sys_open_init(void) { // 获取原函数地址 sys_open_orig = sys_call_table[__NR_sys_open]; // 关闭写保护 write_cr0(read_cr0() & (~0x10000)); // 替换原函数地址 sys_call_table[__NR_sys_open] = hook_sys_open; // 打开写保护 write_cr0(read_cr0() | 0x10000); printk(KERN_INFO "Hook sys_open successfully!\n"); return 0; } // 模块卸载函数 static void __exit hook_sys_open_exit(void) { // 关闭写保护 write_cr0(read_cr0() & (~0x10000)); // 恢复原函数地址 sys_call_table[__NR_sys_open] = sys_open_orig; // 打开写保护 write_cr0(read_cr0() | 0x10000); printk(KERN_INFO "Unhook sys_open successfully!\n"); } module_init(hook_sys_open_init); module_exit(hook_sys_open_exit); MODULE_LICENSE("GPL"); ``` 2. 编译模块: ``` make -C /lib/modules/$(uname -r)/build M=$(pwd) modules ``` 3. 加载模块: ``` sudo insmod hook_sys_open.ko ``` 4. 测试: ``` touch testfile.txt ``` 在控制台中应该会输出 "Hooked sys_open!"。 5. 卸载模块: ``` sudo rmmod hook_sys_open ``` 请注意,这只是一个简单的例子,实际 hook 内核函数需要更多的工作。在编写内核模块时,请确保您了解内核的工作原理,并小心使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值