ubuntu18.04怎么hook内核函数,不使用inlime hook方式
时间: 2024-05-01 07:23:37 浏览: 112
在 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 内核函数需要更多的工作。在编写内核模块时,请确保您了解内核的工作原理,并小心使用。
阅读全文