查看: 4007|回复: 2
收起左侧

[已解决] 深度了解木马之——如何隐藏系统进程

 关闭 [复制链接]
东海
发表于 2011-6-28 10:50:52 | 显示全部楼层 |阅读模式
      进程是如何隐藏的呢?这无可避免的会涉及到一些技术问题,下面我们尽量简单明了的说一说。在这里,我所想达到的目的,并非是让您也同样写出一个能隐藏自身的木马,而是让您明白,什么样的手段可以隐藏木马的进程,木马又为什么会隐藏,而想破解这种解藏将它揪出来,又需要什么样的技术,好有针对性的选择一些专业工具。
同时,需要注意的是,隐藏进程的技术同样适用于隐藏DLL模块程序、隐藏驱动程序,下面为了描述方便,统一说为进程。
      Windows系统给我们的开发人员提供了几种列出系统中所有的进程、模块、与驱动程序的方法,最常见的也是最常用的方法就是调用系统API:CreateToolHelp32Snapshot、EnumProcess、EnumProcessModules等,如果您不是开发人员,您不用关心这几个是什么东西,只需要明白,他们是获取进程列表的第一层手段,我们调用这几个其实就是在告诉系统,我们需要进程列表,然后系统就会将列表返回给我们。而这几个API在接到请求后又做了什么呢?他们会调用ZwQuerySystemInformation,ZwQuerySystemInformation会调用KiSystemService切入内核进入R0权限,然后自SSDT表中查取得NtQuerySystemInformation的地址,并调用其指向的实际代码,而NtQuerySystemInformation的作用则是自系统的数据结构中取相应的数据,再顺原路返回去。
       在中间任何一个环节进行拦截都可以实现隐藏进程的目的,这种拦截有一个名字叫做“HOOK”,在切入内核进入R0权限前进行HOOK,称为应用层HOOK,而在之后进行HOOK则是内核HOOK,后者需要用驱动才能实现了。
      什么是HOOK?什么是SSDT?我们来举例说明:
      Windows操作系统就像一个为我们管理电脑的服务公司,而他的工作机制是逐级上报,各负其责的,他派了一个服务人员时刻的跟着我们,看我们都有什么要求。
      当我们想查看系统中都有什么进程时,我们会告诉服务员,我们想了解当前都有哪些进程,那么服务员就会把我们的要求报上去,报给谁呢?他要先知道哪个部门负责哪个工作才行,SSDT表就是做这个的,SSDT表就像是一个路标,指明了什么样的工作应该由哪一个部门负责处理。通过查表得知负责的部门后,工作就被移交到了那个部门,工作完成后,部门会把工作结果交回给服务员,服务员再交给我们,而我们也就得到我们想要的结果了。
      应用层HOOK呢,就像是服务员被木马偷偷的替换了,当我们提出要求时呢,他会检查是否对他有害,或将对他有害的信息去掉,比如我们想查看进程,那他在将结果交给我们时,却把木马的进程自结果中抹去了,这样,我们自然是看不到木马进程了。
      而最常见的内核HOOK,则是HOOK-SSDT,上面说了SSDT就是一张表,标明了什么工作应该由什么部门负责。而SSDT HOOK也就是木马将表上的内容给改了,本来交给A部门负责的工作被改成了交给由木马负责,这样,服务员在上报我们的请求时,一查表发现查看进程的工作是由木马负责的,他就把这请求交给木马了,而木马呢?他可是知道表中原来的内容是什么的呀,他只是对请求进行一下过滤,发现没有对自己有害的,就直接转交给原部门了,对自己有害的,自然也就视情况滤掉或涂改了。
      需要特别注意一下子“HOOK类型”,上面的显示是“HOOK”,还有一种是“Inline-HOOK”,什么是Inline-HOOK呢?
      上面说过了,SSDT就像是一个标明了什么工作由哪个部门来做的表,SSDT-HOOK就是更改了这个表的指向。而Inline-HOOK呢?他并没有更改表的指向,查找进程的工作在表中仍然指向了负责查找进程的部门。但是呢,木马却把那个部门中的人员替换了,这样仍然能达到它的目的。
      Inline-HOOK更加的复杂、更加的邪恶、也更加的不稳定,而应用范围却是更加的广泛,查找起来更加的困难。要知道,对比SSDT表中的指向是否正确,是否指向了正确的部门,要简单一些,不就是一张表么,拿原来的表对比一下就知道了。但Inine-HOOK却是替换的公司人员,Windows就像一个大公司,有成千上百的人,天知道他替换了哪一个。
      简单的总结一下:程序就像是为了实现某一目的而定的计划书;进程呢?就是组织工人分配资源开始执行这份计划;而Windows操作系统呢?就是一个为我们管理电脑也是管理这些执行计划的工人的服务管理公司;我们有什么要求呢?就交给服务员将我们的要求提要给Windows,由Windows来组织工人执行我们的要求,并将结果返回给我们。如果木马替换了服务员、更改了SSDT表、或替换了Windows服务公司某职能部门的人员,我们得到的可能就是一个错的结果,或我们的要求得不到执行,就像结束进程一样。
      如果不替换任何人员,也不更改SSDT表,还有没有办法隐藏进程呢?有的,那就是更改系统的数据结构。
      举例来说,我们查询进程其实就是向Windows发出“查询当前正在有哪几组工人正在工作”的请求,而Windows在内部又是如何查询的呢?他当然会去人力部,因为人力部有工人的档案啊,在职的离职的都有,只要将档案一翻,就明白当前有多少工人了,再把结果给我们,它的工作就完成了。
      更改数据结构,也就是更改档案了,虽然人员都没问题,但档案已经被修改了,木马会偷偷的潜入人力部把它自己的档案从人力部的档案柜中偷偷的销毁,这样,当系统去查询的时候,就查不到他的档案了,系统会认为没有这组工人,虽然查询过程与查询的人员都没有问题,但结果仍然是错误的。当然了,进入人力部是需要有一定权限的,不是谁都可以进去销毁东西的,注意到与Hide.exe在一起还有一个Sys.sys文件吗?这个文件也是一个驱动程序,它的工作就是获取R0权限,以便顺利的进入内核更改数据。而Hide.exe之所以可以隐藏,就是因为它把系统活动进程链中(即人力部)的进程数据更改了。
      那为什么Windows查不到它,专业工具却可以查到呢?这个道理很简单,因为Windows是正规公司,它的工作流程是固定的,查询工人的事情,他就是去人力部,人力部没有相关工人的信息,他就认为没有这工人,他并不会偿试去其它地方看一看。
      其实,工人们是不可能只在一个地方登记的,进入公司要在人力部登记、领工具却还要在仓库登记、发工资要在财务部登记、吃饭要在食堂登记……。如果木马只是抹去了活动进程链中的数据,那么还可以从窗口、线程、句柄、对像、Csrss.exe中等许多地方找到它的信息。当然了,木马也会尽力的把自己的痕迹全部抹去,并且已经有马儿这么做了。
      于是,基于线程调度链的进程枚举技术就出现了,什么叫线程调度链呢?在系统中CPU的时间分配是以线程为单位的,一个程序要想得到执行,必须要有线程存在于这个线程调度链中,不然,他得不到时间的分配,也就得不到执行的机会。
      还以我们上面的例子来说明,木马可以抹去人力部的资料,反正已经进来了,那里有没有也无所谓了;也可以抹去仓库中的资料,工具已经到手了,抹就抹去吧;也可以抹掉财务的资料,豁出去了,为了完成木马大业就不要钱了;但是他不能抹去食堂的资料,不是么?食堂可是按人员档案备饭的,抹掉了,没他的资料也就意味着没他们的饭吃,还不得给饿死啊?而这关键的他无法抹去的资料也就是系统中的“线程调度链”,抹去了,他自己活不下去。
      但不要小瞧了木马的智慧,它们也有自己的法子,什么办法呢?他们准备了一份假资料,在有人查询时呢,就用假资料替换掉真资料,而在食堂做饭时呢,再用真资料替换掉假资料,也就是自己构造了一个进程调度链。
      开始时还真是没人发现,不过,没有不透风的墙,出来混总是要还的,这技术最后还是让人知道了,即然知道了他们会随时替换,那查询时当然也就知道注意了,于是它又开始想其它办法,斗争就这么持继了下去.

评分

参与人数 1人气 +1 收起 理由
ioton + 1 加分鼓励

查看全部评分

mama821126
发表于 2011-6-28 10:52:09 | 显示全部楼层
学习贴,收藏先。。。。
majimalei
发表于 2011-6-28 18:25:29 | 显示全部楼层
这个帖子不错,举得例子也很让人容易明白,看后,对隐藏系统进程了解了80%,把抽象的东西具体化了。
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2025-11-2 18:44 , Processed in 0.110333 second(s), 17 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表