首页 > 解决方案 > Linux内核中的无效系统调用拦截

问题描述

我想使用开放系统调用的拦截。由于我的内核版本是 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 执行后返回“Killed”。

我不知道这件事,你的建议会对我有很大帮助!

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");

标签: clinuxlinux-kernel

解决方案


推荐阅读