修改内核中的只读区内容

研究到 apparmor 内核源码,其中涉及到只读变量 __lsm_ro_after_init,研究怎么修改只读区实现部分功能,这里记录一下。

思路上很简单,修改的时候禁用写保护,或者修改pte写保护属性。

实现上第一种更简单,所以采用第一种。

主要函数为 disable_write_protection,修改cr0的写保护位即可。


inline void mywrite_cr0(unsigned long cr0) {
  asm volatile("mov %0,%%cr0" : "+r"(cr0), "+m"(__force_order));
}

void enable_write_protection(void) {
  unsigned long cr0 = read_cr0();
  set_bit(16, &cr0);
  mywrite_cr0(cr0);
}

void disable_write_protection(void) {
  unsigned long cr0 = read_cr0();
  clear_bit(16, &cr0);
  mywrite_cr0(cr0);
}

static int hook_apparmor_func(void *arg)
{
    union security_list_options *tmp = arg;

    disable_write_protection();
    tmp->file_permission = some_func;
    enable_write_protection();
    return 0;
}

static int recover_apparmor_func(void *arg)
{
    union security_list_options *tmp = arg;

    disable_write_protection();
    tmp->file_permission = orig_apparmor_file_permission ;
    enable_write_protection();
    return 0;
}

void hook_apparmor(void)
{
    struct security_hook_list *P;
    struct hlist_head *head = &(orig_security_hook_heads->file_permission);
        hlist_for_each_entry(P, head, list) {
        if(strcmp(P->lsm, "apparmor") == 0){
            orig_apparmor_file_permission = P->hook.file_permission;
            stop_machine(hook_apparmor_func, (void*)&(P->hook), 0);
        }
   }
}

void recover_apparmor(void)
{
    struct security_hook_list *P;
    struct hlist_head *head = &(orig_security_hook_heads->file_permission);
        hlist_for_each_entry(P, head, list) {
        if(strcmp(P->lsm, "apparmor") == 0){
            stop_machine(recover_apparmor_func, (void*)&(P->hook), 0);
        }
   }
}

Original: https://www.cnblogs.com/RayWHL/p/16263555.html
Author: RayWHL
Title: 修改内核中的只读区内容

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607415/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Nginx 平滑升级(不需要关闭Nginx升级)

    Nginx 平滑升级 对Nginx的版本进行更新,或者要增添新的模块,最简单的方法就是停止当前的Nginx服务,重新编译安装nginx,然后开启新的Nginx服务。但是这样会导致在…

    Linux 2023年6月13日
    090
  • CentOS7 源码安装Nginx及Nginx基本管理设置

    CentOS7 安装 参考文档 CentOS7最小安装后初始化安装工具 1:yum install net-tools 参考文档 2:源码安装wget 参考文档 或者执行 yum …

    Linux 2023年5月27日
    0123
  • 自定义Naive UI的数据表格Data Table中按钮Button图标

    { title: "Action", key: "actions", render(row) { return h( NButton, { …

    Linux 2023年6月8日
    0112
  • 数据结构——光纤网络设计

    设计进度安排 1、分析居民区光纤网络的数据属性,并依据光纤铺设的功能要求,确定算法设计方案; 2、完成网络光纤铺设的数据结构设计工作,包括图文件的结构与存储结构、最小生成树的存储结…

    Linux 2023年6月6日
    092
  • 关于阿里云ECS Centos 5/6/7 Linux Glibc库严重安全漏洞修复方法

    本文来自转载http://www.shidehui.com/jingyan/about-ali-cloud-ecs-centos-567-linux-glibc-library-s…

    Linux 2023年6月13日
    0133
  • kafka能做什么?kafka集群配置 (卡夫卡 大数据)

    什么是Kafka 官网介绍: 几个概念: 详细介绍 : 操作kafka: kafka集群 消息测试 问题检测 什么是Kafka 官网介绍: ApacheKafka®是一个分布式流媒…

    Linux 2023年6月7日
    0133
  • IOC Unity

    控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Depende…

    Linux 2023年6月13日
    0105
  • [20220909]bbed关于删除记录恢复的问题.txt

    [20220909]bbed关于删除记录恢复的问题.txt –//快下班被别人问的关于删除记录使用bbed恢复的问题,我开始以为很快讲解完,删除记录oracle仅仅打上…

    Linux 2023年6月13日
    083
  • shell脚本中 /dev/null 的用途

    /dev/null 是一个特殊的设备文件,它丢弃一切写入其中的数据 可以将它 视为一个黑洞, 它等效于只写文件, 写入其中的所有内容都会消失, 尝试从中读取或输出不会有任何结果,同…

    Linux 2023年6月13日
    0109
  • 代码规范浅谈

    代码规范这东西网上很容易百度到一堆,除了天下文章一大抄的问题,另外,多数只给了结果,原因没有充分说明,或者非常的纠结于大写小写,一个函数可以写几行的细节。感觉有点容易让新人误入歧途…

    Linux 2023年6月13日
    0112
  • Jenkins配置国内插件源

    由于Jenkins插件下载慢,配置国内源 进入Jenkins的更新目录: jenkins-home 下的updates 目录 替换目录里面的default.json 文件内容(je…

    Linux 2023年6月14日
    0299
  • short, int, long, long long各个类型的范围

    类型名称 字节数 取值范围 signed char 1 -2^7 ~ 2^7-1 -128~+127 short int 2 -2^14 ~ 2^14-1 -32768~+3276…

    Linux 2023年6月8日
    089
  • CH343芯片应用—硬件设计

    CH343属于沁恒第三代USB转串口芯片系列的单串口型号,基于经典版CH340芯片完成技术革新,实现USB转高速异步串口,支持最高6Mbps串口波特率。 电源设计 CH343芯片有…

    Linux 2023年6月7日
    0172
  • 添加SSH服务

    1、基于commit命令创建 1.1 启动容器 [root@master ~]# docker run -it ubuntu:18.04 bash #更&am…

    Linux 2023年6月13日
    0106
  • [20211217]滑稽可笑的程序代码2.txt

    [20211217]滑稽可笑的程序代码2.txt –//实在不知道如何取标题..感觉很无奈无语… –//昨天上午快下班的时候我使用ashtop看…

    Linux 2023年6月13日
    080
  • 高等代数:6 二次型 矩阵的合同

    6 二次型 (\cdot) 矩阵的合同 1、定义1:数域K上一个 n元二次型是系数在K中的n个变量的二次齐次多项式,它的一般形式是 [\begin{aligned} &f(…

    Linux 2023年6月8日
    0126
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球