在Linux系统中,实现内核hook的方法有多种,以下是一些常见的方法: LKM(Loadable Kernel Module):通过编写可加载内核模块,在模块加载时修改内核函数指针,实现hook功能。 c #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> // 假设我们要hook的函数原型 void...
注入.so对特定function函数进行hook要保持原始业务的兼容性典型的hook的做法应该是 hook_function() { save ori_function_address; /* do something in here span some time delay */ call ori_function; } hook函数在执行完自己的逻辑后,应该要及时调用被hook前的"原始函数",保持对原有业务逻辑的透明 4. 尽量...
目前流行和成熟的kernel inline hook技术就是修改内核函数的opcode,通过写入jmp或push ret等指令跳转到新的内核函数中,从而达到修改或过滤的功能。这些技术的共同点就是都会覆盖原有的指令,这样很容易在函数中通过查找jmp,push ret等指令来查出来,因此这种inline hook方式不够隐蔽。本文将使用一种高级inline hook技术来...
内核模块(Kernel Module):编写内核模块,使用sys_call_table等内核数据结构进行Hook。 eBPF(Extended Berkeley Packet Filter):通过eBPF程序在内核中动态注入代码,实现Hook。 示例代码(使用LD_PRELOAD) 假设有一个简单的系统调用open,我们希望通过Hook来记录每次调用的文件名。
/* hook system call */ asmlinkage int myhook_open(const char *filename, int flags, int mode); 系统调用号在unistd_64.h(x86_64)或unistd_32.h(x86_32)中定义: (3)获取系统调用表地址,上面介绍过了 /* get system call table address */ static void* aquire_sys_call_table(void* start_add...
本文是《Hooking Linux Kernel Functions, Part 2: How to Hook Functions with Ftrace》的翻译文章 前言 Ftrace是一个用于跟踪Linux内核函数的Linux内核框架。 但是,当我们尝试启用系统活动监控以阻止可疑进程时,我们的团队设法找到了一种使用ftrace的新方法。 事实证明,ftrace允许你从可加载的GPL模块安装钩子而无需重...
一、简述 目前流行和成熟的kernel inline hook技术就是修改内核函数的opcode,通过写入jmp或push ret等指令跳转到新的内核函数中,从而达到修改或过滤的功能。这些技术的共同点就是都会覆盖原有的指令,这样很容易在函数中通过查找jmp,push ret等指令来查出来,因此这种i
技术分析与实现高级Linux Kernel Inline Hook…… 一、简述 目前流行和成熟的kernel inline hook技术就是修改内核函数的opcode,通过写入jmp或push ret等指令跳转到新的内核函数中,从而达到修改或过滤的功能。这些技术的共同点就是都会覆盖原有的指令,这样很容易在函数中通过查找jmp,push ret等指令来查出来,因此这种inl...
/* Hook a function call with a parameter */ unsigned int hook(int fd, int (*hook_addr)(int, char*), long p1){ long *kbuf;struct pt_regs orig_regs;/* Allocate memory for the hook */ kbuf = kmalloc(sizeof(long) * 3, GFP_KERNEL);/* Install the hook */ memset(&...
int hooknum; int priority; }; 1. 2. 3. 4. 5. 6. 7. 8. list:链表头,用来把各个处理函数组织成一个表,初始化为{NULL,NULL}; hook:我们定义的处理函数的指针,它的返回值必须为前面所说的几个常量之一; pf:协议族,表示这个HOOK属于哪个协议族; ...