linux-kernel模块中的系统调用拦截(内核3.5)

2023-12-21

我需要用我自己的实现替换标准系统调用(例如 SYS_mkdir)。

正如我在一些来源中读到的,包括这个问题 https://stackoverflow.com/questions/12613301/loadable-kernel-module-programming-and-system-call-interception在 Stackoverflow 上,sys_call_table自内核版本以来未导出符号2.6.

我尝试了以下代码:

    #include <linux/module.h> 
    #include <linux/kernel.h> 
    #include <linux/unistd.h> 
    #include <asm/syscall.h> 

    int (*orig_mkdir)(const char *path); 

    ....

    int init_module(void) 
    { 
            orig_mkdir=sys_call_table[__NR_mkdir]; 
            sys_call_table[__NR_mkdir]=own_mkdir;  
            printk("sys_mkdir replaced\n"); 
            return(0); 
    } 

    ....

不幸的是我收到编译器错误:

 error: assignment of read-only location ‘sys_call_table[83]’

如何替换系统调用?

EDIT:有没有不用打内核补丁的解决方案?


这对我有用。

See Linux 内核:系统调用挂钩示例 https://stackoverflow.com/questions/2103315/linux-kernel-system-call-hooking-example and https://bbs.archlinux.org/viewtopic.php?id=139406 https://bbs.archlinux.org/viewtopic.php?id=139406

asmlinkage long (*ref_sys_open)(const char __user *filename, int flags, umode_t mode);
asmlinkage long new_sys_open(const char __user *filename, int flags, umode_t mode)
{
  return ref_sys_open(filename, flags, mode);
}

static unsigned long **aquire_sys_call_table(void)
{
  unsigned long int offset = PAGE_OFFSET;
  unsigned long **sct;

  while (offset < ULLONG_MAX) {
    sct = (unsigned long **)offset;

    if (sct[__NR_close] == (unsigned long *) sys_close) 
      return sct;

    offset += sizeof(void *);
  }
  print("Getting syscall table failed. :(");
  return NULL;
}


// Crazy copypasted asm stuff. Could use linux function as well...
// but this works and will work in the future they say.
static void disable_page_protection(void) 
{
  unsigned long value;
  asm volatile("mov %%cr0, %0" : "=r" (value));

  if(!(value & 0x00010000))
    return;

  asm volatile("mov %0, %%cr0" : : "r" (value & ~0x00010000));
}

static void enable_page_protection(void) 
{
  unsigned long value;
  asm volatile("mov %%cr0, %0" : "=r" (value));

  if((value & 0x00010000))
    return;

  asm volatile("mov %0, %%cr0" : : "r" (value | 0x00010000));
}


static int __init rootkit_start(void) 
{

  //Hide me

  print("loaded");

  if(!(sys_call_table = aquire_sys_call_table()))
    return -1;

  disable_page_protection(); 
  {
    ref_sys_open = (void *)sys_call_table[__NR_open];
    sys_call_table[__NR_open] = (unsigned long *)new_sys_open;
  }
  enable_page_protection();
  return 0;
}

static void __exit rootkit_end(void) 
{
  print("exiting");

  if(!sys_call_table) {
    return;
  }

  disable_page_protection();
  {
    sys_call_table[__NR_open] = (unsigned long *)ref_sys_open;
  }
  enable_page_protection();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux-kernel模块中的系统调用拦截(内核3.5) 的相关文章

随机推荐

  • Mac 上的 Cocoa 中区分单击和双击

    我有一个习惯NSView 这是其中之一 他们都住在一个NSCollectionView 我认为这不相关 但谁知道呢 当我单击视图时 我希望它更改其选择状态 并相应地重新绘制自身 当我双击视图时 我希望它为刚刚双击的对象弹出一个更大的预览窗口
  • Windows 中的 Visual Studio 文件关联

    在 Windows 资源管理器中 当我双击任何 Visual Studio 文件时 cs csproj等 它打开的是旧版本的 VS 而不是最新版本 VS 2017 而且VS与太多的文件类型有关联 我怎样才能改变default视觉工作室 对于
  • Python:使用 tarfile 提取但忽略目录

    如果我有一个带有文件的 tar 文件 path to file txt 有没有办法 在Python中 将文件提取到指定目录而不重新创建目录 path to 我也遇到了这个问题 并根据 ekhumoro 的回答列出了完整的示例 import
  • Angular HttpClient 获取请求 URL 删除主题标签/数字符号

    我正在使用 httpclient get 当我有 在请求 URL 中 它会删除后面的所有内容 Example 预期要求 https jsonplaceholder typicode com users 1 TEST 实际要求 https j
  • 具有自定义子项的 MUI 选择组件

    我正在尝试创建一个Select具有通过列表映射的一系列自定义项的组件 每个项目都有一个特定的类型 并且根据该类型 菜单项将具有特定的 MUI 图标 我创建了一个特定的组件来管理整个Select组件和另一个特定组件来显示每个项目 其值及其图标
  • 将内存中的 H2 数据库保存到磁盘

    如何以二进制模式将完整的嵌入式 h2 内存数据库保存 加载到某个文件或目录以加快加载速度 我想用它来缓存数据 这样我就不必每次都运行创建表 插入子句的所有行 您可以使用常规 持久 数据库 而不是使用内存数据库 即使这样 您仍然可以使用内存表
  • Python 3.6 urllib TypeError:无法将字节连接到 str

    我正在尝试使用 Python 3 6 中的 urllib 从 API 中提取一些 JSON 数据 它需要传递标头信息以进行授权 这是我的代码 import urllib request json headers authorization
  • 提升精神气整数,文字默认值

    我想解析具有特定文字默认值的数字 例如 如果程序接收到 nan 或 n a 则整数默认值为 1 Example program include
  • ElasticSearch 在哪里存储持久设置?

    当我通过以下方式获取 ElasticSearch 服务器设置时 curl XGET localhost 9200 cluster settings 我看到持久性和瞬态设置 persistent cluster routing allocat
  • 通过 powershell 或 Azure Devops 管道步骤在 Azure 数据工厂上以编程方式“发布”

    这个问题不会有任何代码 因为到目前为止我还没有找到任何可能的方法 但甚至没有直接的方法不 这是不可能的 Azure 数据工厂使用adf 发布分支作为 master 之上的官方分支 当用户在 GUI 上单击时 ADF 将所有管道 触发器 链接
  • 检查所有 AsyncTask 是否已完成

    我有 3 个AsyncTasks and 1 ProgressBar 我希望当任何任务执行时 进度条可见 当所有任务完成时 进度条不可见 在Java中 有ExecutorService isTerminated检查所有可运行程序是否已完成
  • 数据表是否缓存 ajaxSource 的结果?

    我已经在 portlet war 文件中嵌入了 jquery 数据表 并且遇到了一些有趣的行为 我需要一些解释 这就是我的 javascript 的样子 http pastebin com qXpwt9A7 http pastebin co
  • 密码保护 CSV 文件

    我正在使用 csv 文件来验证用户登录 是否可以使用密码保护 CSV 文件 我不希望任何人能够通过 url 下载 csv 文件 我用谷歌搜索 发现无法用密码保护 csv 文件 还有其他方法可以用密码保护文件吗 简而言之 答案是否定的 CSV
  • 遗传算法——染色体可以是树吗?

    我正在写我的学位论文 我正在尝试创建一个 GA 以程序化的方式为游戏创建关卡 即使 GA 不是最好的技术 也是可能的 不管怎样 因为我从未与他们一起工作过 所以我正在阅读一些关于 GA 介绍的书籍 问题是 是否有必要将染色体表示为位 或者它
  • ON [主要] 是什么意思?

    我正在创建一个 SQL 设置脚本 并使用其他人的脚本作为示例 这是脚本的示例 SET ANSI NULLS ON GO SET QUOTED IDENTIFIER ON GO CREATE TABLE dbo be Categories C
  • 在 web.config 中设置后,maintainScrollPositionOnPostback="true" 不起作用,但在页面级别起作用,我该怎么办?

    setting 维护ScrollPositionOnPostback true 全局在 web config 中确实有效在我的 xp sp3 中 iis 5 1 下 但不适用于生产服务器 带有 NET 3 5 sp1 和 IIS 6 的 w
  • 我可以将 gRPC 和 webapi 应用程序组合到 C# 中的 .NET Core 3.0 中吗?

    我使用的是 net core 3 0 我有 gRPC 应用程序 我可以通过 gRPC 协议与其进行通信 我认为我的下一步是添加一些 RESTful API 支持 我修改了我的启动类以添加控制器 路由等 当我尝试使用浏览器导航到 API 时
  • org.xml.sax 包可以从多个模块访问:、java.xml

    我们很久以前就写好了 Eclipse 插件 合规级别为 java 1 8 现在我已经将其更改为java 11 我们正在使用and 在构建时 我收到以下错误 org xml sax 包可以从多个模块访问 java xml 有人可以帮忙吗 提前
  • Ruby 音频库

    有没有好的 Ruby 音频库可供我们构建 需要管理 编辑mp3文件 有一个界面 http rubyforge org projects id3lib ruby 到 C mp3 编辑器 以及一个活动的纯红宝石 http rubyforge o
  • linux-kernel模块中的系统调用拦截(内核3.5)

    我需要用我自己的实现替换标准系统调用 例如 SYS mkdir 正如我在一些来源中读到的 包括这个问题 https stackoverflow com questions 12613301 loadable kernel module pr