我想使用 open 系统调用的拦截。由于我的内核版本为4.18,因此我应该从 / boot 文件夹中的 System.map 文件获取系统调用表的地址。所以,
grep sys_call_table System.map-4.18.0-10-generic
给我以下字符串:
ffffffff81e001c0 R sys_call_table
ffffffff81e015a0 R ia32_sys_call_table
我在代码中使用了该地址(从第一个字符串开始),但 insmod 在.ko执行后返回“已杀死”。
我不知道这件事,您的提示对我有很大帮助!
unsigned long *sys_call_table = (unsigned long *)0xffffffff81e001c0;
asmlinkage int (*original_call) (const char *, int, int);
asmlinkage int our_sys_open(const char *filename, int flags, int mode)
{
int i = 0;
char ch;
do {
get_user(ch, filename + i);
i++;
printk("%c", ch);
} while (ch != 0);
printk("\n");
return original_call(filename, flags, mode);
}
int init_module()
{
original_call = (void *) sys_call_table[__NR_open];
sys_call_table[__NR_open] = (unsigned long) our_sys_open;
return 0;
}
void cleanup_module()
{
sys_call_table[__NR_open] = original_call;
}
MODULE_LICENSE("GPL");