Linux内核中无效的系统调用拦截

时间:2018-11-20 16:39:06

标签: c linux linux-kernel

我想使用 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");

0 个答案:

没有答案