• <tr id='c785y'><strong id='c785y'></strong><small id='c785y'></small><button id='c785y'></button><li id='c785y'><noscript id='c785y'><big id='c785y'></big><dt id='c785y'></dt></noscript></li></tr><ol id='c785y'><table id='c785y'><blockquote id='c785y'><tbody id='c785y'></tbody></blockquote></table></ol><u id='c785y'></u><kbd id='c785y'><kbd id='c785y'></kbd></kbd>
  • <fieldset id='c785y'></fieldset>
    <span id='c785y'></span>
    <i id='c785y'></i>

    <code id='c785y'><strong id='c785y'></strong></code>

        <ins id='c785y'></ins>
        <dl id='c785y'></dl>

            <i id='c785y'><div id='c785y'><ins id='c785y'></ins></div></i><acronym id='c785y'><em id='c785y'></em><td id='c785y'><div id='c785y'></div></td></acronym><address id='c785y'><big id='c785y'><big id='c785y'></big><legend id='c785y'></legend></big></address>

            Linux中应用高级隐藏技术介绍

            • 时间:
            • 浏览:4
            • 来源:124软件资讯网

              本文深入剖析了Linux情况下文件、历程及模块的高级隐藏手艺  ,其中包罗:Linux可卸载模块编程手艺、修改内存映象直接对系统挪用举行修改手艺 ,通过虚拟文件系统proc隐藏特定历程的手艺 。

                隐藏手艺在盘算机系统宁静中应用十分普遍 ,尤其是在网络攻击中  ,当攻击者乐成侵入一个系统后 ,有用隐藏攻击者的文件、历程及其加载的模块变得尤为主要 。本文将讨论Linux系统中文件、历程及模块的高级隐藏手艺  ,这些手艺有的已经被普遍应用到种种后门或宁静检测法式之中  ,而有一些则刚刚起步  ,仍然处在讨论阶段  ,应用很少  。

                1.隐藏手艺

                1.1.Linux下的中止控制及系统挪用

                Intel x86系列微机支持256种中止  ,为了使处置惩罚器比力容易地识别每种中止源  ,把它们从0~256编号 ,即赋予一其中断类型码n,Intel把它称作中止向量 。

                Linux用一其中断向量(128或者0x80)来实现系统挪用  ,所有的系统挪用都通过唯一的入口system_call来进入内核  ,当用户动态历程执行一条int 0x80汇编指令时  ,CPU就切换到内核态  ,并最先执行system_call函数 ,system_call函数再通过系统挪用表sys_call_table来取得响应系统挪用的地址举行执行  。系统挪用表sys_call_table中存放所有系统挪用函数的地址 ,每个地址可以用系统挪用号来举行索引  ,例如sys_call_table[NR_fork]索引到的就是系统挪用sys_fork()的地址  。

                Linux用中止形貌符(8字节)来表现每其中断的相关信息  ,其花样如下:

                偏移量31….16  一些标志、类型码及保留位

                段选择符      偏移量15….0

                所有的中止形貌符存放在一片一连的地址空间中  ,这个一连的地址空间称作中止形貌符表(IDT)  ,其起始地址存放在中止形貌符表寄存器(IDTR)中 ,其花样如下:

                32位基址值  界线

                其中各个结构的响应联系可以如下表现:

                通过上面的说明可以得出通过IDTR寄存器来找到system_call函数地址的要领:凭据IDTR寄存器找到中止形貌符表  ,中止形貌符表的第0x80项即是system_call函数的地址  ,这个地址将在后面的讨论中应用到  。

                1.2.Linux 的LKM(可装载内核模块)手艺

                为了使内核保持较小的体积并能够利便的举行功效扩展  ,Linux系统提供了模块机制  。模块是内核的一部门  ,但并没有被编译进内核  ,它们被编译成目的文件  ,在运行历程中凭据需要动态的插入内核或者从内核中移除  。由于模块在插入后是作为Linux内核的一部门来运行的  ,以是模块编程现实上就是内核编程  ,因此可以在模块中使用一些由内核导出的资源  ,例如Linux2.4.18版以前的内核导出系统挪用表(sys_call_table)的地址  ,这样就可以凭据该地址直接修改系统挪用的入口 ,从而改变系统挪用  。在模块编程中必须存在初始化函数及扫除函数 ,一样平常情形下  ,这两个函数默以为init_module()以及clearup_module() ,从2.3.13内核版本最先  ,用户也可以给这两个函数重新命名  ,初始化函数在模块被插入系统时挪用  ,在其中可以举行一些函数及符号的注册事情  ,扫除函数则在模块移除系统时举行挪用  ,一些恢复事情通常在该函数中完成 。

                1.3.Linux下的内存映像

                /dev/kmem是一个字符装备 ,是盘算机主存的映像  ,通过它可以测试甚至修改系统  ,当内核不导出sys_call_table地址或者不允许插入模块时可以通过该映像修改系统挪用  ,从而实现隐藏文件、历程或者模块的目的  。

                1.4.proc 文件系统

                proc文件系统是一个虚拟的文件系统  ,它通过文件系统的接口实现  ,用于输出系统运行状态 。它以文件系统的形式  ,为操作系统自己和应用历程之间的通讯提供了一个界面  ,使应用法式能够宁静、利便地获得系统当前的运行状态何内核的内部数据信息 ,并可以修改某些系统的设置信息  。由于proc以文件系统的接口实现 ,因此可以象会见通俗文件一样会见它  ,但它只存在于内存之中 。

                2.手艺剖析

                2.1 隐藏文件

                Linux系统中用来查询文件信息的系统挪用是sys_getdents  ,这一点可以通过strace来视察到 ,例如strace ls 将列出下令ls用到的系统挪用  ,从中可以发现ls是通过sys_getedents来执行操作的  。当查询文件或者目录的相关信息时 ,Linux系统用sys_getedents来执行响应的查询操作  ,并把获得的信息通报给用户空间运行的法式 ,以是若是修改该系统挪用  ,去掉效果中与某些特定文件的相关信息  ,那么所有使用该系统挪用的法式将看不见该文件  ,从而到达了隐藏的目的  。首先先容一下原来的系统挪用  ,其原型为:

                int sys_getdents(unsigned int fd, struct dirent *dirp,unsigned int count)

                其中fd为指向目录文件的文件形貌符 ,该函数凭据fd所指向的目录文件读取响应dirent结构  ,并放入dirp中  ,其中count为dirp中返回的数据量  ,准确时该函数返回值为填充到dirp的字节数  。下图是修改后的系统挪用hacked_getdents执行流程  。

                hacked_getdents函数现实上就是先挪用原来的系统挪用  ,然后从获得的dirent结构中去除与特定文件名相关的文件信息  ,从而应用法式从该系统挪用返回后将看不到该文件的存在  。

                应该注重的是  ,一些较新的版本中是通过sys_getdents64来查询文件信息的  ,但实在现原理与sys_getdents基底细同  ,以是在这些版本中仍然可以用与上面类似的要领来修改该系统挪用 ,隐藏文件  。

                2.2 隐藏模块

                上面剖析了怎样修改系统挪用以隐藏特命名字的文件 ,在现实的处置惩罚中  ,经常会用模块来到达修改系统挪用的目的  ,可是当插入一个模块时  ,若不接纳任何隐藏措施  ,很容易被对方发现 ,一旦对方发现并卸载了所插入的模块  ,那么所有使用该模块来隐藏的文件就袒露了  ,以是应继续剖析怎样来隐藏特命名字的模块 。Linux中用来查询模块信息的系统挪用是sys_query_module  ,以是可以通过修改该系统挪用到达隐藏特定模块的目的 。首先诠释一下原来的系统挪用  ,原来系统挪用的原型为:

                int sys_query_module(const char *name, int which, void *buf, size_t bufsize , size_t *ret)

              123下一页