Linux操作系统下的高级隐藏技术详解 .docx
《Linux操作系统下的高级隐藏技术详解 .docx》由会员分享,可在线阅读,更多相关《Linux操作系统下的高级隐藏技术详解 .docx(5页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精品名师归纳总结本文深化分析了Linux环境下文件、进程及模块的高级隐匿技术,其中包括:Linux可卸载模块编程技术、修改内存映象直接对系统调用进行修改技术,通过虚拟文件系统proc隐匿特定进程的技术。隐匿技术在运算机系统安全中应用特别广泛,特别是在网络攻击中,当攻击者胜利侵入一个系统后,有效隐匿攻击者的文件、进程及其加载的模块变得尤为重要。本文将争论Linux系统中文件、进程及模块的高级隐匿技术,这些技术有的已经被广泛应用到各种后门或安全检测程序之中,而有一些就刚刚起步,仍旧处在争论阶段,应用很少。 1. 隐匿技术 1.1.Linux下的中断掌握及系统调用Intelx86系列微机支持 256
2、种中断,为了使处理器比较简单的识别每种中断源,把它们从0256编号,即给予一个中断类型码n,Intel把它称作中断向量。 Linux用一个中断向量 128或者 0x80 ) 来实现系统调用,全部的系统调用都通过唯独的入口system_call来进入内核,当用户动 态进程执行一条int 0x80汇编指令时, CPU 就切换到内核态,并开头执行system_call函数, system_call函数再通过系统调用表sys_call_table来取得相应系统调用的的址进行执行。系统调用表sys_call_table中存放 所 有 系 统 调 用 函 数 的 的 址 , 每 个 的 址 可 以 用 系
3、 统 调 用 号 来 进 行 索 引 , 例 如sys_call_tableNR_fork索引到的就是系统调用sys_fork)的的址。 Linux用中断描述符 8字节)来表示每个中断的相关信息,其格式如下:偏移量 31.16一些标志、类型码及保留位段挑选符偏移量 15.0全部的中断描述符 存放在一片连续的的址空间中,这个连续的的址空间称作中断描述符表IDT),其起始的址存放在中断描述符表寄存器IDTR)中,其格式如下:32位基址值界限其中各个结构的相应联系可以如下表示:通过上面的说明可以得出通过IDTR寄存器来找到 system_call函数的址的方法:依据IDTR寄存器找到中断描述符表,中
4、断描述符表的第 0x80项即是 system_call函数的的址,这个的址将在后面的争论中应用到。1.2.Linux的 LKM 可装载内核模块)技术为了使内核保持较小的体积并能够便利的进行功能扩展, Linux系统供应了模块机制。模块是内核的一部分,但并没有被编译进内 核,它们被编译成目标文件,在运行过程中依据需要动态的插入内核或者从内核中移除。由于模块在插入后是作为Linux内核的一部分来运行的,所以模块编程实际上就是内核编程,因此可以在模块中使用一些由内核导出的资源,例如Linux2.4.18版以前的内核导出系统调用表 以及clearup_module,从 2.3.13内核版本开头,用户也
5、可以给这两个函数重新命名,初始化函数在模块被插入系统时调用,在其中可以进行一些函数及符号的注册工作,清除函数就在模块移除系统时进行调用,一些复原工作通常在该函数中完成。1.3.Linux下的内存映像 /dev/kmem是一个字符设备,是运算机主存的映像,通过它可以测试甚至修改系统,当内核不导出sys_call_table的址或者不答应插入模块时可以通过该映像修改系统调用,从而实现隐匿文件、进程或者模块的目的。1.4.proc文件系统 proc文件系统是一个虚拟的文件系统,它通过文件系统的接口实现,用于输出系统运行状态。它以文件系统的形式,为操作系统本身和应用进程之间的通信供应了一个界面,使应用
6、程序能够安全、 便利的获得系统当前的运行状况何内核的内部数据信息,并可以修改某些系统的配置信息。由于 proc以文件系统的接口实现,因此可以象拜访一般文件一样拜访它,但它只存在于 内存之中2. 技术分析2.1隐匿文件Linux系统中用来查询文件信息的系统调用是sys_getdents,这一点可以通过strace来观看到,例如stracels 将列出命令 ls 用到的系统调用,从中可以发觉ls 是通过 sys_getedents来执行操作的。当查询文件或者目录可编辑资料 - - - 欢迎下载精品名师归纳总结的相关信息时,Linux系统用sys_getedents来执行相应的查询操作,并把得到的信
7、息传递给用户空间运行的程序,所以假如修改该系统调用,去掉结果中与某些特定文件的相关信息,那么全部利用该系统调 用的程序将看不见该文件,从而达到了隐匿的目的。第一介绍一下原先的系统调用,其原 型为: int sys_getdentsunsigned int fd, struct dirent *dirp,unsigned int count其中 fd 为指向目录文件的文件描述符,该函数依据fd 所指向的目录文件读取相应dirent结构,并放入 dirp中,其中 count为 dirp中返回的数据量,正确时该函数返回值为填充到 dirp 的 字 节 数 。 下 图 是 修 改 后 的 系 统 调
8、用 hacked_getdents 执 行 流 程 。hacked_getdents 函数实际上就是先调用原先的系统调用,然后从得到的 dirent 结构中去除与特定文件名相关的文件信息,从而应用程序从该系统调用返回后将看不到该文件的存在。 应当留意的是,一些较新的版本中是通过 sys_getdents64 来查询文件信息的, 但其实现原理与 sys_getdents 基本相同,所以在这些版本中仍旧可以用与上面类似的方法来修改该系统调用,隐匿文件。2.2隐匿模块上面分析了如何修改系统调用以隐匿特定名字的文件,在实际的处理中,常常会用模块来达到修改系统调用的目的,但是当插入一个模块时,如不实行任
9、何隐匿措施,很简单被对方发觉,一旦对方发觉并卸载了所插入的模块,那么全部利用该模块来隐匿的文件就暴露了,所以应连续分析如何来隐匿特定名字的模块。Linux中用来查询模块信息的系统调用是sys_query_module,所以可以通过修改该系 统调用达到隐匿特定模块的目的。第一说明一下原先的系统调用,原先系统调用的原型为:int sys_query_moduleconst char *name, int which, void *buf, size_t bufsize ,size_t*ret假如参数 name不空,就拜访特定的模块,否就拜访的是内核模块, 参数 which说明查询的类型,当whic
10、h=QM_MODULES时,返回全部当前已插入的模块名称,存入 buff, 并且在 ret中存放模块的个数, buffsize是 buf缓冲区的大小。在模块隐匿的过程中只需要对which=QM_MODULES的情形进行处理就可以达到目的。修改后的系统调用工作过程如下:1 )调用原先的系统调用,出错就返回错误代码。2 )假如which不等于 QM_MODULES,就不需要处理,直接返回。3 )从 buf的开头位置进行处理,假如存在特定的名字,就将后面的模块名称向前掩盖该名字。4 )重复 3 ),直处处理处理完全部的名字,正确返回。2.3隐匿进程在 Linux中不存在直接查询进程信息的 系统调用,
11、类似于ps 这样查询进程信息的命令是通过查询proc文件系统来实现的,在背景学问中已经介绍过proc文件系统,由于它应用文件系统的接口实现,因此同样可以用隐 藏 文 件 的 方 法 来 隐 藏 proc文 件 系 统 中 的 文 件 , 只 需 要 在 上 面 的hacked_getdents中 加 入 对 于proc文 件 系 统 的 判 断 即 可 。 由 于proc是特别的文件系统,只存在于内存之中,不存在于任何实际设备之上,所以Linux 内 核 分 配 给 它 一 个 特 定 的 主 设 备 号 0以 及 一 个 特 定 的 次 设 备 号1 ,除此之外,由于在外存上没有与之对应的i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux操作系统下的高级隐藏技术详解 Linux 操作系统 高级 隐藏 技术 详解
限制150内