西户网|西户社区网|官网|户县网站新闻!

西户网/西户社区网(官网)
户县本土 便民 公益 互助  XHUME.CC

 找回密码
 注册会员

扫描二维码登录本站

搜索
查看: 5069|回复: 1

[转]疱丁解马 ---" 高级木马的自我保护技术与查杀之策"作者Muse

[复制链接]
发表于 2008-1-25 13:27:36 | 显示全部楼层 |阅读模式

欢迎访问西户网/西户社区网 XHUME.CC

您需要 登录 才可以下载或查看,没有账号?注册会员

x
  [转]疱丁解马 ---" 高级木马的自我保护技术与查杀之策"作者MuseHero之作

  木马查杀深度剖析(申请加精)3 h; J6 g% a' H7 f! g8 ], I' e

  一、前言 - S: l2 P v/ H4 Y8 X+ k/ h

  在进入正文之前呢,容我先说几句废话。

  3 |4 Y3 T7 ~: _2 Q在写此文之前,我曾写过一篇“高级木马的自我保护技术与查杀之策”,承蒙各位朋友的厚爱,被各网站所转载,亦曾有许多朋友来信求助。! {& @0 J* p' @1 ]1 Z

  由于该文是心血来潮后的随笔所写,所以并没有经过深思熟虑,也并没有脉络可循,至使有的朋友能看懂,有的却看不懂。而看得懂的呢,亦有很大一部分并不能真正的应用文中所提的查杀技巧。

  * K( Q- [/ Y( T故一直有心再写一篇文章,帮助深受木马毒害的朋友们了解木马是什么,又如何查杀。 o5 W3 \! O4 f; S3 M

  本文适于下列人员阅读:9 z, Y9 l3 q/ H7 o0 N7 w5 z

  l    能熟练使用计算机的人/ c% I1 e7 H( v! c; }1 z

  l    想自己动手解决问题的人

  & [! W+ M! n" }5 s9 Yl    钱没有多到电脑一出问题就扔到电脑修理公司的人

  - R X) D' r0 F/ l# p7 e0 k4 [3 z适于下列人员参考:8 Y' E } x/ q4 L* I, d( i

  l    电脑维修人员

  ( u9 @' W( t' J- G+ w5 n' dl    微机管理人员

  9 x; r% z+ b8 [: M1 }! Q0 T: Ol    安全相关的程序开发人员8 r7 _# c/ x. w$ H, m. m

  本文所要达到的目的是:

  K X- l/ T! f, yl    让菜鸟也可以了解系统安全自己来动手查毒杀马,由求助者变为帮助它人者。

  M2 y t* L; f) O& _6 C4 {6 s$ }l    在杀毒软件无能为力的情况下,借助本文的知识让你仍然能借助工具完成清理查杀的任务。

  / p2 }+ n. Q8 X* ?: Z, m5 cl    让您真正的明白一些看似神秘的、高深莫测的专用术语与技术的内幕。

  : k1 y9 N+ R/ S. y1 Q8 Ul    让您了解Windows系统的底层知识。2 b9 H, U8 ~4 z( H( w$ }- O" v

  本文以手动查杀为主,辅以必要的工具,文中用到的工具与测试用的仿木马小程序都提供了下载地址,供朋友们下载试用。$ a8 T+ h1 |9 ~' V5 v3 `

  1 y6 a) }! ]# b

  & R) e a& Y* \( z二、木马知识扫盲篇  `3 E, e1 `: m, J' {

  什么是木马呢?木马只是一类程序的名字,为实现特殊目的而制作并偷偷植入目的计算机中的程序的统称。

  Z9 N9 @& Q2 D F/ s其名字源于古希腊神话《木马屠城记》,全名为“特洛伊木马”有兴趣的可以翻看相关资料,很不错的一篇故事。

  % N' c/ z6 K( u% b+ ]3 I4 w那什么又是程序呢?呵,即然是扫盲篇,我们就不能回避这些让人头都大的问题,先从最基本的开始,熟悉计算机的朋友们可以直接跳到第三章去。

  ' m; g. l* y4 r6 |- ^0 T我们先了解一些基本的概念:

  . w- P* y3 p! d8 w概念一:计算机。就是我们的电脑了,指的就是一堆硬件,显示器、主机、键盘、鼠标等等,当然了,拆开主机还有一堆零碎。我们只需要了解其中几个后面会提到的就行了。

  ( ?' @: H/ l' M; s- x' KCPU:计算机的指令处理单元。所有的工作都是由它来做的,同一个CPU同一时间只能处理一条指令,就是说一旦CPU被某一程序占用,那在同一时刻内其它程序就肯定是空闲等待状态(双核的可以同时执行两条,以此类推)。( T7 K% x0 y+ d* @2 F

  内存:内部存储器。CPU执行的指令都是由内存中读取的,所以,一个程序要运行首先要装入到内存中。- f) X g B, M# ^. n$ i. B3 _3 U

  磁盘:外部存储器。存放文件数据的地方。计算机中所有的数据平时都是存在这里的,只有在需要执行或查看时,才读取到内存中。

  : `: u+ B& ~9 H5 @. }但只有硬件,是不能使用的,还需要软件的配合,我们买电脑时电脑中大都安装了某一操作系统,主流的就是MS Windows系统了(还有其它的操作系统如Linux等,这里不做讨论)。这就是我们需要了解的也是以后要频繁出现的第二个概念了“系统”。

  % Q# R; \8 V {6 ^7 g, O3 j1 @概念二:系统。系统其实在大多数情况下都指的是操作系统,也就是帮我们使用与管理硬件的软件系统,当我们按下机箱电源后,即由主板上的BIOS检测硬件、再交由硬盘中的引导程序启动操作系统,然后就出现了我们所熟悉的Windows主窗口(计算机在启动时做了些什么,我们会在后面详细的讲解),而以后我们的所有工作,看电影、听歌曲、玩游戏、上网浏览等等都是在这个窗口中进行。操作系统维持这个窗口的显示及一些常用功能的完成,而这些功能是由一系列的程序来实现的,这又引出了我们的第三个概念“程序”" p1 ?2 y1 O# a! c1 ^5 d& {; u' {

  ) M# c, ]/ @2 @+ J- Y概念三:程序。程序是什么呢?程序就是一组指令执行序列。呵,有点专业了是不?什么又叫指令执行序列呢?; W# V& L* B# J3 r8 J

  举例来说:我管理着一个工厂,正常情况下我让工人们按这样来工作“先去原料仓库取原料---à 进行初步加工---à 进行精细加工--à 进行零配件组装---à 验收---à 合格则送入成品库--à 不合格则销毁”。这就是一个指令执行序列,当情况为正常时,工人们执行的是这个序列也就是这个“程序”。而在旺销的季节呢,我还有第二个程序“取原料----à 进行初步加工----à 组装 ----à 进成品库”。当情况为供不应求时,我就执行第二个程序。还有第三个、第四个……等等,在不同的情况下,我让工人们执行不同的程序。

  ) c# V1 Q, P# y1 S0 q7 l! b3 C2 k计算机程序也是一样的,跟据用户要求的不同,执行不同的指令序列,比如您要画图,你可能会这么操作“点击开始菜单--à 选择所有程序--à在所有的程序中选择附件--à再在附件中选择画图”,这就是你向操作系统下达的指令。操作系统得到您的指令后,则会执行画图程序,也就是实现画图目的的一系列指令,而这些画图的指令储存在“mspaint.exe”文件中。操作系统会将mspaint.exe中的指令装入到内存中交由CPU开始一条条的执行。

  ' u6 x2 X2 Q# ^7 k' ]2 ^1 B总结一下:程序是什么呢?说白了就是一个计划书,里面记载了先做什么后做什么。好的程序是好的计划,坏的程序就是坏的计划,比如:“收集炸药--à 买雷管--à制成炸弹-à放到张三的床下面-à引爆”,这就是一个坏计划,相对于计算机来说就是一个坏程序。坏程序有破坏作用吗?也就是说你写了个爆了张三的计划书就可以炸了张三吗?当然不可以,只有计划是不行的,还要去执行才能真正起到作用。所以,一个木马程序仅仅是存在于您的计算机中时并不可怕,可怕的是它执行起来。程序执行起来是什么呢?那就是我们要说的第四个概念“进程”--à 执行中的程序。7 m( r* S- V& j$ I M+ V

  概念四:进程。程序一旦进入内存中开始执行,就叫做进程(进程其实就是容纳指令与资源的容器)。也就是说,他已经开始工作了,开始买炸药、制炸弹了,等执行到引爆那一条指令时,张三也就完蛋了。所以,检查可疑进程,就是查杀木马的关键环节,也是重要的手段与方法。找到木马的进程,并结束它,在它执行到引爆这条指令之前,就停止它的执行,并将它的程序自计算机中删除掉,就是我们所要达到的目的。 L2 k6 k. W0 J% W& {. g

  说到这里,细心的读者们可能想到了一个问题,画图程序的执行,是因为我们向操作系统下达了画图的指令,所以操作系统才调入画图程序开始执行画图的指令序列。但是木马程序又是谁给操作系统下达的指令让木马的工作计划得到执行的呢?这就是我们下面要说的第五个概念“自启动程序”- X% h u2 A7 T. M+ Y# V

  ! J& n' v2 Z) z! L概念五:自启动程序。顾名思义,自启动程序,也就是不用您自己动手它自己就可以启动起来开始执行的程序。这是些什么程序呢?为什么要允许程序这样做呢?难道是专为木马准备的?呵,当然不是。自启动程序有二大类,一是系统需要的;二是用户需要的。: C/ F* E; m! O7 X, i# v' v

  系统需要的,是因为有些工作是无须经过用户同意,必须去做的。比如,鼠标驱动。为了能让用户使用鼠标,系统要自动加载鼠标驱动程序并执行。2 z7 ^/ \8 J P8 e7 i& Y m

  用户需要的,一些重复性工作可能用户想让系统自动去做,而不是每天每时的重复这份工作。比如:用户可以设定多长时间无操作,就自动运行屏幕保护程序以便保护屏幕不被烧坏。这显然必须要屏幕保护程序能自动的运行,用户是不可能每次手动去执行这个程序的。

  % ?8 | P! U( E2 M$ V3 o! d3 i. m而木马就是利用了这些本来是为系统或用户提供方便的手段,来实现自动运行它们自己的目的。如:木马用自己来取代屏幕保护程序,这样,长时间无操作时,运行的就不再是屏幕保护程序而是木马了。

  4 x8 |7 Z: u6 j, ^) r7 w9 ^2 V在系统中有很多地方或方法是可以让程序自动运行起来的,这个我们在后面将一一讲述。而清掉自启动项,让木马程序得不到执行,显然也就成为了我们查杀木马的重要手段之一。

  ; x+ w/ {1 f% G- N' V$ e. _而系统又是如何知道,哪一个程序应该在开机后就自动运行,无须等用户来操作呢?朋友们应该能猜到,系统肯定是把这些需要自动运行的程序都记录到了某一个地方,记录到哪里了呢?这就是我们要讲的第六个概念“注册表”- s# D! P8 c. I$ }! i

  概念六:注册表。注册表是什么呢?是系统记录信息用的一个数据库,举例来说它就像公司档案柜一样,发工资时,财务人员要查阅档案,以确定哪个员工应该发多少钱。就像系统启动时查阅注册表,确定哪个程序应该自动启动起来一样。

  , Y8 @$ }7 V( E) s' a! z这是一个非常宠大的数据中心,系统的关键信息都记录到那里,与现实中我们的档案柜一样,都很重要,一旦损坏将造成无可挽回的后果,所以微软公司不建议直接对注册表进行操作。当然了,木马的作者通常是不会理会微软的建议的。所以,木马通常都会将自己写入到注册表的某个自启动项中,以便开机时自动运行,而无须经过用户的同意。- ~ c6 i. V/ Z( X; t

  讲到这里,又有一个不容回避的问题出现了,上面我们说了,木马程序其实就是一个计划书,而为了执行这份计划书,木马需要把自己写到注册表中的自启动程序序列中去。而问题就是,这份计划书是如何来的呢?如果得不到执行,它又如何将自己写到注册表的自启动程序中去呢?不放到自启动程序中它就得不到执行,而得不到执行,它也就无法起到作用也包括无法将自己写到注册表中去……晕了,这成了先有鸡还是先有蛋的问题了。那么木马是如何进入我们的计算机并获得首次执行的呢?. t" h4 Z1 B! C( n* S b2 q1 b

  这就是我们要讲的第七个概念了“侵入”

  , K6 D. j! N% Z6 \2 X概念七:侵入。侵入是什么呢?也就是侵略进入喽,侵略需要被侵略者同意吗?当然不需要。将木马程序放入您的计算机,并让它得到首次执行的过程就是侵入。

  3 V v( c& n1 l8 n9 x侵入的方法有很多种,我们将在后面主动防御一章中详细讲解。因为,相信现在朋友们最关心的并不是如何不让他进来,而是……我的电脑中现在是不是正在执行着木马程序呢?已经执行到了哪一步呢?是否马上就要引爆了呢?我关机后下次还能打开不?$ F+ k, z7 o$ S3 p* O; h6 Y/ W* ?

  好,接下来,就让我们进入下一章,一起来看看,电脑中正在执行的木马程序“木马进程”。

  $ q7 _4 v! {! Y1 @: C' c  g: l4 h) M* N0 T: W

  , Q9 s M$ j/ C# b% k9 D1 M0 c三、木马的查杀之进程篇 3 i) }, K! ?. a

  1、进程的查看 7 ]6 l8 {7 C1 Z, d+ T9 o

  进程,我们上面说过了,狭义上讲就是正在执行中的程序。那如何来查看系统中都有哪些程序正在执行呢?(先看下图03-1:)( Q5 A# u" d$ s# B

  5 `9 i& D8 j5 X/ s1 k" o1 s

  系统自带了一个“任务管理器”可以使我们看到系统中当前的进程,在桌面下方的任务栏按右键,选择“任务管理器”或同时按下“Ctrl Alt Del”三个键、或同时按下“Ctrl Shift ESC”三个键,都可以打开任务管理器程序,看到上面的窗口。9 H/ d/ G' e. }9 o

  看到上面的图时,会不会有点发昏?20个进程,哪个是好的哪个是坏的呢?上面的信息又都是些什么意思呢?

  $ C% v& W$ ]' w% M   不要着急,让我来教教你怎么来看这些信息。

  * a2 O5 [0 ~- s8 d) x   首先,显示哪些信息,是可以自由选择的,看到最上面的菜单没?就是“文件、选项、查看、关机、帮助”。依次选择“查看”---à“选择列”并勾选里面的相应项就可以显示相应的信息。& \5 K+ Z2 F6 ?$ T. t8 { G

  5 {" h1 J0 J8 n) n j0 m

  我们关心的是前五个,即:映像名称、PID、CPU、CPU时间、内存使用,下面依次进行介绍。' f( N' e- Z6 j: _* k

  l    映像名称:即进程所对应的同名程序名字。其中有两个是例外,“System”代表的是系统,并没有对应的同名程序;“System Idle Process”代表的是空闲进程,同样没有对应的同名程序,它占据了CPU的空闲时间。- {& j4 M" K2 _! r# h3 A- I& \

  我们可以依据此栏,来找到进程对应的程序文件。& S6 c& j# s, w1 G+ `5 k

  l    PID:英文件缩写,即进程的ID,是一个唯一的数字,唯一的代表一个进程。

  ; m; r. T# E5 @3 ~. \! @7 O+ |6 v% k% j3 \0 ~9 M

  要在这些进程中区分哪些是系统进程,哪些不是,用任务管理器显然很难做到,最好的办法是借助专业工具。(看下图:03-2)

  $ @7 S! N! L E6 U j- e% F" _! U( j" @. u1 }; O% }9 a. ?

  上图是用反黑工具狙剑查看进程时的样子,狙剑程序的下载地址: 下载后解压缩,运行里面的SnipeSword.exe

  6 K/ u* c* J, d& A8 r, J启动狙剑,并选择“进程管理”2 T( A9 `1 D! M) e3 ~

  就可以打开进程管理页面,与任务管理器相比,首先映像文件带了路径,使您可以直接定位到程序文件。

  , i8 ]' @# B+ Z; w4 K. S5 _+ Q3 f其次,多了父ID一栏,这个标明了该进程是由谁启动的,比如:smss.exe的进程ID是540,父ID是4 那么,我们就可以知道,smss.exe是由进程ID为4的system进程启动的,而smss.exe又启动了csrss.exe 与 winlogon.exe ,接着由winlogon.exe启动了lsass.exe 与 services.exe 。注意,有的进程并没有看到父进程,比如:Explorer.exe 它的父ID是:1216 但进程中并没有进程ID为1216的进程,这是因为系统在初始化时还有一个程序会自动运行,那就是Userinit.exe这个程序负责用户初始化工作,并负责启动Explorer.exe,而工作完成后,它就退出运行了,所以进程中并没有它。最近有个木马是通过感染Userinit.exe来启动的,由于Userinit.exe启动后就退出了,所以通过查看进程很难发现问题,这问题我们将在“自启动项”一篇中详细讲解。3 D3 s- y. ]: ^5 P( j

  以上就是系统启动的顺序,从System开始,依次启动了几个进程,正常情况下,上面这几个进程都是系统关键进程,结束它们的运行将导至系统出现问题。, _3 w. F, }" B2 K. O; T) l8 H; G

  有很多朋友对开机以后系统都做了些什么比较感兴趣,而这对系统不能启动时的故障查明也有帮助,可以通过判断系统停在了哪个环节来断定是哪个部分出了问题,在这里,我就对系统的启动过程进行一下简单的说明:

  1 P+ ~ n; g4 O+ E系统的启动过程:5 F9 R! B4 k. A+ r+ u

  1、       当你按下开机键时,最早是由主板BIOS蕊片中的BIOS程序来执行硬件检测任务的,如果检查过程中发现关键硬件的故障,就会发出特定的响声通知用户,并停止启动。而BIOS程序是哪里来的呢?这是在主板出厂时固化在芯片中的一段程序。4 f4 N: j1 r6 k/ a0 r

  2、       当硬件没有问题时,BIOS程序就会读入硬盘的主引导记录,将下面的任务交给主引导记录代码去完成。而主引导记录又是哪里来的呢?这是在安装操作系统时对磁盘进行分区格式化操作时,写到硬盘中的。如果找不到主引导记录,会出错停止,告诉你这是非法的系统启动盘。

  5 d B4 t2 m" h6 l3、       主引导记录代码的工作是读入磁盘主分区的根目录,在里面读出Ntldr文件,并装入内存,然后将控制权交给它。注意看一下,你的硬盘根目录下是不是有个Ntldr文件?这个文件的属性是隐藏、系统,所以查看时要选择查看所有,且不隐藏被保护的系统文件才可看到。这个文件是哪里来的?呵,当然是安装操作系统时拷贝到硬盘上的,下面提到的文件都是在安装操作系统时拷上去的。如果没能找到Ntldr文件,则会停止启动,显示Ntldr 没找到的错误信息。2 l% f4 K( E" ~ h

  4、       Ntldr又做了些什么呢?它会将系统由原来的16位实模式切换到32位保护模式或64位长模式。它的工作是读取根目录下的Boot.ini文件,显然引导菜单,在多操作系统的计算机中,可以看到这个菜单。接着它会清屏,并在Win2000下显示一个黑白的进度条,在XP下显示XP的标志图同时显示下面不断滚动的蓝色进度条,提示你它正在加载一些重要的文件。它在加载什么呢?它首先会加载Ntoskrnl.exe、Hal.dll,如果这两个文件找不到会出错停机,并显示找不到相应文件的信息。接着它读入注册表的SYSTEM键文件,从中找出自动启动的各类驱动程序,这是很关键的,因为有些内核级的木马就是在这时启动的。每加载一个屏幕上的进度条就滚动一下子。中间如果某个驱动出问题,也可能会导至系统蓝屏崩溃。& }* A$ {& h9 V2 o( {, l7 e, y

  5、       接下来的工作由Ntoskrnl.exe(或Ntkrnlpa.exe)来进行,这是内核程序,它做的工作实在是太多了,这里就不再细说了。它的最后一步工作就是创建会话管理子系统,也就是我们上面说过的,由System进程创建的Smss.exe进程。+ L/ a/ O0 X) M4 z0 T) H' @" ~$ i

  6、       Smss.exe进程负责创建用户模式环境,由用户模式环境向Windows提供可视的窗口界面。+ S4 G9 F1 R# K; Y8 X

  它会运行BootExecute中定义的程序,正常情况下是Autochk,一个检查磁盘的程序。但有些杀毒软件会把自己的程序加到这里,来实现引导时杀毒,如果您的系统安装了江民类的杀毒软件,那么此时就会执行它的引导期杀毒程序,就是进入系统前出现的蓝底蓝字的病毒扫描窗口。; A) k, w n$ V

  Smss.exe还会执行SessionManager中的文件删除、移动操作,也就是调用API:MoveFileEx并选择重启后移除文件的,就是在这个环节执行了。当前有很多号称可以删除一切文件的安全工具都使用了MoveFileEx来实现文件的删除,但是现在我们可以知道了,它的文件删除是在这个阶段执行的,而这时驱动程序已经加载了,所以用它们来清除驱动级的木马显然是不胜任的。

  ! t' s3 m0 _) s创建附加的页面文件。 ?/ R) H3 `: s+ p1 w

  加载Win32k.sys,这个东西又是做什么的呢?这是一个内核模式的系统驱动程序,它负责了窗口的显示、屏幕的输入、鼠标键盘和其它设备的输入及消息的传递等。所以也是由Win32k.sys将显示器的分辩率设置为默认值的,也就是这个时候,咱们的计算机屏幕才真正的细致起来,在此以前都是VGA模式,当然了视频驱动是上面装载驱动程序时就已经加载了的,现在只是起到作用而已。4 l3 W! ^7 e* h0 Q& F9 d c

  再然后呢,就是启动我们上面说过的那两个进程了。就是Csrss.exe与Winlogon.exe进程。# t4 ^% I+ b, y7 Q6 z9 v2 K, e" L

  启动完这两个进程后,Smss.exe就进入了无限的等待,它在等什么呢?它在等它创建的Csrss.exe与Winlogon.exe ,等着看这两个进程什么时候死掉,一旦他们中有死掉的,Smss.exe马上罢工,让系统彻底崩溃。(在XP以后Csrss的死亡是由内核使系统崩溃的,而不是Smss.exe),所以千万不要结束系统进程。+ O4 i% Z' ^* v2 J

  Csrss.exe是做什么的呢?它负责的工作是创建或删除进程、线程,控制台与虚拟DOS机的支持等。它到此就开始工作了,不再参于后面的启动过程。但是Winlogon.exe还有很多工作要做呢,我们接下来看看后面的启动过程。

  ; j+ y1 i7 ~8 @* v& \6 ^$ f7、       Winlogon.exe是做什么的呢?看它的名字应该看出个大概了吧。是的,它是与登录相关的,但现在还不到显示登录窗口的时候,它还要先启动Services.exe及Lsass.exe进程,然后读取注册表GinaDLL中标明的DLL,由这个DLL来显示一个登录对话话,也就是我们在进入系统时输入用户名与口令的窗口。

  8 K) |" o0 p, @为什么要先启动Lsass.exe呢?因为,这是本地安全认证子系统,负责的就是本机系统的安全,用户名与口令的验证工作是由它来进行的。# v8 X8 q! x& }8 O `+ b

  还有一个我们上面提到过的进程也是这个时候由Winlogon.exe来启动的,是哪一个呢?就是那个Userinit.exe,这是在用户登录进系统后,Winlogon.exe启动此进程来进行用户初始化。你也可以自己加一个程序与Userinit.exe放在一起,那么,在这个时候Winlogon.exe会将那一位置的所有程序都启动起来。

  : ?* @5 x' n+ Y' g5 N# G当然了,相信你也想到了,这个还有那个GinaDLL也就成了木马启动的一个可选位置。; P& D$ U- R2 D3 A# C% O0 X$ l

  8、       最后,由Winlogon.exe启动的Services.exe开始加载标明为自启动的各个服务,及标明为手动的却是有必要加载的服务(它所做的工作我们在后面细讲)。: b) e- N7 R6 y/ J' T5 B

  9、       而Userinit.exe呢,它在完成用户初始化后,就启动了Explorer.exe,并功成身退。5 B s5 ]- z2 f' V

  10、     最后,Explorer.exe就成了我们的服务员,等待在那里静候我们的指令,听从我们的吩咐,进行相关程序的启动与功能的处理。8 N$ D% C$ v; y3 h

  $ h, a! F& w3 G( C$ S

  我们可以依据此栏来区分进程,尤其是同名的进程,比如:SVCHOST.EXE进程。3 a/ R8 s: t# y1 q5 y8 I/ y

  l    CPU:即该进程当前消耗CPU的百分比,如果某个进程正在工作,那么CPU一列的数值就会是非零,工作量越大,其数值越高。例外的是“System Idle Process”进程,它的数值越高,说明当前的系统越是空闲,所有进程的CPU一栏的数值相加等于100%CPU占用。

  ' D1 ?# l4 R Y6 [我们可以依据此栏来查看,哪些进程正在工作,哪些进程是空闲的。上面我们说过,同一CPU在同一时间只能处理一个工作,所以如果某一进程长时间大量占用CPU,那么将会导致其它进程得不到或得到很少的CPU时间来处理,使系统反应速度严重迟缓。这种情况的出现,通常是程序出现了问题,我们就要考虑结束掉霸占CPU不放的进程,并尽量查明原因。

  1 X- H- M! o" w9 Q# sl    CPU时间:自运行以来,该进程占用的全部CPU时间,此数值越大,代表该进程工作时间越长,注意,不是运行时间而是工作时间,如果运行后,进程只是等待,并没有工作,那么此时间也会很小。例外的仍然是“System Idle Process”进程,它占据了CPU全部的空闲时间。

  6 J$ k& P7 G: |) m8 L我们可以据此来判断,哪些进程在一直的工作,而这一直工作的进程是不是应该工作的正常进程。比如我们一直在画图,那画图程序mspaint.exe的进程CPU时间很长,那就是很正常的;而如果我们在听音乐,从来没画过图,但这里却显示画图程序用了大量的CPU时间,那很可能就是某个黑客或木马或其它进程正在偷偷的使用画图程序呢。

  , a) r; g, }- F9 g+ {- r- Fl    内存使用:标明了该进程使用的内存数量,要知道,系统中的内存数量是有限的,当某一个进程大量占用内存时,就会导至系统或其它进程可用内存量减少,而至使系统运行速度减慢。

  , k6 g+ ]- [ {2 t2 I' |2 q在某些情况下,可以依此来找出系统变慢的原因,并尽量使用占用内存小的程序来提高系统的性能。虽然现在机器的配置都高了,内存也都大了,但在同等条件下,优先考虑使用占用资源少的程序也是有必要的。

  ) a$ z6 [9 L- R- N0 Z/ X& n `看完系统的启动过程后,我们再回过头去看那个进程图,是不是明白了很多呢?除掉系统启动环节中启动的进程外,我们再看其它的进程,注意看一下儿,剩余的进程是不是都是由Services.exe 或 Explorer.exe中的一个启动的。3 ~9 x8 ^9 g' @+ `1 u' m( _2 j$ _

  Explorer.exe是系统的Shell程序,响应用户的请求,并执行对应的程序的工作就是由它来完成的,比如上面我们说过的,您想画图时,将画图程序启动起来的就是这个程序。你想上网时,将浏览器启动起来的也是它。当然了,一些用户的自动任务也是由它来完成启动过程的。(这些我们将在下面的自启动程序一章中详细讲解)4 u3 I. d; t; s8 j

  Services.exe是系统的服务控制管理器,由它启动的进程称为“服务”,是一组特殊的进程。此类进程是开机自动运行的,不依赖于用户的交互,说白了就是不用您管,它自己就会运行并且开始自己的工作,工作过程也无须您的干预。

  - h1 h" O! P9 N8 Z- Y说到这里,您可能会想,这不就是木马所需要的么?不错,有很多木马是以服务进程的形式存在的。那我们可以管理这些服务吗?答案是肯定的,我们的计算机,我们当然有权力管理了。看下面的图03-3:5 T H4 c$ }: ?: ?1 ?: c: n

  * s6 J" H8 q. x

  在桌面上“我的电脑”上面按右键,选择“管理”就可以打开如上图所示的窗口。依次选择:服务与应用程序----à服务 就可以看到上图右侧的服务列表。% B: I& l9 a0 L7 B5 J7 C

  最左侧的一列是服务的名称,需要注意的是这里列出的并非是对应的程序文件的名称,而仅仅是服务本身的名称。那我们又怎么知道这个服务对应的是哪个程序文件呢?如果我们想停止这个服务,并删除对应的程序文件,我们应该怎么做呢?! C* h ~7 p. r. ?, y5 \

  ; q. {1 l3 j" {

  再看下图03-4:

  9 |' {% g. M: S0 K/ c; |在某一个服务上面按鼠标右键,选择“属性”,就可以打开此服务对应的属性页面,如上图所示。在这里,我们可以看到一些有用的信息,并对此服务进行启动、停止、禁用等操作。- o8 e! S( Y. N# Z

  最上面的是服务名称,第二列是显示名称,第三列是关于服务的描述,也就是这个服务是做什么用的。当然了,我们不能迷信这里的描述,因为木马可以自行设定这个描述。再下面就是可执行文件的路径,也就是对应的进程与程序文件。这时我们再返回头去看03-2那个图,看一看进程PID为968的进程是不是就是这个“svchost.exe –k netsvcs” 进程呢?& R q i$ ~' P& U' R- x- O" k

  这时再注意一下,又会发现问题,首先,在03-2图中,Services.exe启动的服务一共是7个,而在图03-03中,已经启动的服务却有很多,远不止7个,再挨个儿的查看每个服务的属性,又会发现,有很多服务名称虽然不同,但对应的可执行文件路径(进程)都是一样的,都是“svchost.exe –k netsvcs”进程,这又是咋回事呢?这里我们要解释一下Svchost.exe这个进程了,这是一个特殊的进程。

  1 N( F: j" ^* X- E   从图03-1中我们可以看到名字为“SVCHOST.EXE”进程一共是五个,我们没办法区分它们有什么不同。而在图03-2中,我们再查看这五个Svchost.exe进程,却可以从参数上来区分它们了,虽然进程名字相同,但它们的参数却各不相同。对了,这就是区分他们的方法了,Svchost.exe是一个服务的宿主程序或者叫容器程序,它的里面是一组服务,而参数就标明了这一组服务的类型。如果英文不是太差,那么从它的参数上就可以看明白这一组服务是做什么用的了。

  3 J/ l- m9 T, _/ {6 }8 Y/ y4 P/ h; p4 M: |( l- w6 ^/ r& p

  当然了,我们是来查杀木马的,当然不会满足于仅仅知道这是一组服务,这一组中是不是会藏着一个木马呢?所以,我们还要知道这一组服务都分别是哪一个,怎么来查看呢?再来看下图:03-5

  7 y# h0 F0 ?- p6 e. U( i% ]上面的是什么呢?上面的就是我们在第一章中所提到的“注册表”。依次选择--à开始---à运行---à输入“Regedit.exe”----à确定。7 J/ t! p( r. F: Y

  就可以调用系统自带的注册表编辑器来打开注册表,再依次展开:HKEY_LOCAL_MACHINE---àSYSTEM---àCurrentControlSet---àServices,还记得上面03-4图中的服务名称么?对了就是那个“wuauserv”,在Services键下打开如上图所示的“wuauserv”再展开,选中其下面的“Parmeters”,看右边的窗口中,是不是找到了此服务所对应的程序文件了?就是那个C:\WINDOWS\system32\wuauserv.dll喽。

  4 i& K( s, A& }: ?   每一个Svchost.exe中的服务都可以通过这种方式找到其对应的程序文件。; p/ g1 K( _5 d7 i3 p% h* g

  看到这里,朋友们是不是头都大了?这么麻烦啊?查个进程居然这么麻烦,而且就算找到了,又怎么能知道C:\WINDOWS\system32\wuauserv.dll是正常的程序还是木马呢?

  ( [5 t, i, D1 @& W: L: h   呵,不要着急,也不要怕。上面不是在教给你知识么,而且在当年,没有专业工具之前,我们可都是这么一个个来找的。当然了,现在有了各种专业工具,的确是没必要非手动去找了。

  7 b: h/ S: m* I ~+ Y* c: a6 ~5 i. X. }* i/ |# L r

  再看下图03-6:, w0 n+ u |) L* X

  在狙剑的进程管理列表中(图03-2),选中Svchost.exe,然后按鼠标右键---à选择“查看模块”,就可以得到上图中的列表,注意被蓝条选中的那个是不是就是费半天劲所找到的那个:C:\WINDOWS\system32\wuauserv.dll呢?

  3 n1 P: q) }: T+ ` p   找是找到了,可如何判断这是不是系统的服务模块呢?这一点微软为我们想的很周到,他将大多数的系统文件都进行了数字签名,我们只需要检查一下这个文件有没有系统文件的数字签名,就可以准确的判断,这是不是一个系统文件。# c6 V( k1 a8 C' c. d/ }

  如何检查呢?在列表中按右键,选择“隐蒇微软签名项”就可以将所有系统文件隐藏起来,剩下的就是非系统的文件啦,简单不?" b1 m% \* P6 q7 `; S+ ?

  数字签名验证还可以应用在对进程的判断中,在图03-2中,列表**有19个进程,这些个进程中哪些是系统的哪些又不是呢?我们仍然可以利用数字签名来判断,在列表中按右键,选择“隐蒇微软签名项”就可以将所有系统进程藏起来,剩下的就是非系统的进程。* Z5 [# c0 F8 j/ ~2 U0 _3 k

  * u- {' U: e8 S/ O& Z

  上面也说过了,一共有5个SVCHOST.exe进程,那我们是不是需要在每个SVCHOST.exe进程上都重复一遍,查看模块----à隐藏微软签名项 的过程呢?答案是不需要,在图03-2的进程列表中,按右键,里面的一个“扫描无微软签名模块”的选项,点击它一下,就可以列出所有进程中所有没有签名的模块了。

  J* S9 A) I& S/ D( R+ Y" ?   还有一个问题是,如果手头没有工具怎么办呢?就没有办法查看这些进程中的模块了吗?有的,仍然有办法,看下图03-7:$ w9 _4 j1 r$ `

  依次选择“开始”---à“所有程序”---à“附件”---à“系统工具”---à“系统信息”就可以打开上面的窗口。在窗口中选择“加载的模块”就可以看到左边窗口中的信息,看到没?我们找的那个wuauserv 就在里面。这里面列出了所有进程加载的所有模块,可以参考,但也仅仅是参考,更多的情况仍然尽量的使用专业工具来检查,会更方便更准确一些。$ ?( s1 Q; l& G8 d6 O9 f5 i

  另外,有很多木马是可以隐藏的,对于这一类木马,用系统自带的工具是检查不出的。注意看上面的几张图,发现没有,图03-2比图03-1中的进程多出来了一个Hide.exe 这就是下面我们要讲的“进程的隐藏了”。也许有朋友会说,是不是取图时这个进程已经关掉了呢?呵,没关系,我这里提供了Hide.exe程序的样本,您可以下载后运行一下试试,看是否可以在任务管理器的进程列表中看到它。) I3 T* A: d/ b; @0 o2 K; h

  下载地址:: E3 O6 L& a+ I% L s& [9 G

  里面还附了隐藏进程的源代码,懂编程的朋友们可以参考一下,看一看隐藏进程是如何的简单。

  + `" ?; d: E4 T/ K6 S8 G' L

  + T* v+ w3 m. n0 U2、进程的隐藏与自我保护

  1 H6 a! u, V1 R+ q1 G0 i1 Q% |7 y$ q0 B. q

  我们通过上面的讲解已经知道,进程是一个程序运行所必须的,因此检查进程也就成了查杀木马的关键环节,我们知道这一点,木马的作者们当然更知道,所以,如何隐藏自己的进程,就成了养马人处心积虑要实现的。

  6 U+ H) W& ?/ J% N& t8 R3 U- Z" z   说到这里,有懂的朋友们可能要笑了,心里更可能在说“连无进程木马都不知道,还好意思在这里显摆呢”。

  ' i) L2 [- F+ N5 T2 N% ^   一个程序可以无进程么?可以吗?真的可以吗?我可以很负责任的告诉您,在Windows系统下一个程序一定、确定以及肯定的会有一个进程,没有进程是不可能的。

  ) R7 W7 x% d3 i   那所谓的“无进程木马”又是怎么回事儿呢?' {& ^* A; m9 G

  第一种无进程木马是DLL注入型木马:

  9 N- @3 ]' g; `* D2 D# X   什么是DLL呢?DLL是动态链接库,当某一进程需要实现某一功能时,此功能可能是放在某一动态链接库文件中的,所以,当进程需要使用时就要将动态库文件加载到自己的进程中。举例来说,如果进程就是一个工厂,那么,调用DLL就是将工厂的某一部分工作外包给了DLL去做,而工作地点就在自己的工厂内。明白了吗?进程就是工作的厂地,即使外包出去了,也是需要地方干活的。“加载到自己的进程中”这一句是关键啊,并不是没有进程,而是用了其它程序的进程。像我们上面找了半天的那个服务:C:\WINDOWS\system32\wuauserv.dll,注意一下文件的扩展名,不就是DLL么,这就是一个典型的DLL文件,如果这是一个木马文件,那么,这就是一个典型的无进程木马,因为他没有自己的进程,我们在进程列表中看到的是Svchost.exe的进程。这个DLL是利用服务来加载的,在注册表中还有很多位置可以让一个DLL加载到其它进程中,这在后面自启动程序一节中我们要讲解。

  " _0 w5 v# r o! ]5 |   但是,通过注册表来加载是可以的,但却不是唯一的,还可以通过另一个进程,来打开现有的进程,来将DLL注入到被打开的正常进程中,然后,执行注入的进程退出,这样,在进程列表中仍然看不到木马的进程。. M( d3 l; n" a: d# C- I

  7 P! P4 c# o6 h" ^2 R

  第二种无进程木马是线程注入型的木马。4 t5 M! ~' i6 W5 A% V

  什么是线程呢?上面说了程序就像一个工厂工人工作的流程表,而进程就是将流程真正的运行起来,正式的开始动手取原料--à加工---à组装---à验收等等工作。但是,我们需要明白的一点是,工人们是可以分成小组后同时进行几个环节的,第一组工人负责取原料、第二组工厂人负责加工、而第三组工人负责组装、第四组……这样,可以分工合作同时进行形成流水线。而这工厂里的一组一组工人,相对于进程与线程而言,就是一个进程中的一个个线程。线程注入又是咋回事呢?线程注入,就是木马程序将一个恶意线程放到了正常进程的线程序列中去执行,就像在工厂中多增加了一组自己的工人负责制造炸弹,这一组工人与其它的正常的几组工人没有什么关系,但却借用了人家的工厂去从事着非法的勾档。

  3 P9 k% A3 m2 J% K( Q ~& R) x' [   线程注入与DLL注入的区别是,线程注入只是增加了一组工人,这组工人是在以工厂的名义在工作,对外的名义也是工厂的名字,出了问题是由工厂负责的。而DLL注入呢,是外包,可能会增加一组工人也可能会增加多组,是以DLL自己的名义在工厂内工作的,出了问题是由DLL来负责的。当然了,如果问题大了,工厂也会受牵连的。看下面的图03-8:

  `/ {$ k$ O) K6 W7 p8 z4 o$ v# T# |* }( T- o% P* g

  8 S) e8 H7 J6 V! S2 y( ~# O+ C在狙剑的进程列表中,选中一个进程按鼠标右键,选择“查看线程”就可以查看此进程中的每一个线程,也就是查看每组工人的情况,还可以对某个线程执行暂停运行、结束运行等操作。0 L9 [) W' w ~* {+ k5 `3 C

  我们注意看上面的线程列表,最后一列,显示了一些DLL的名字,还有一个是EXPLORER.EXE,EXPLORER.EXE就是进程名字,我查看的就是EXPLORER.EXE进程的线程列表。/ y: f7 N* k1 f* U

  明白我上面说的区别了么?ntdll有三组线程在工作,那是ntdll在完成外包业务所需要的自己的三组工人;EXPLORER.EXE有一组,那是工厂自己的工人,如果存在线程注入,那么就会多出一个EXPLORER.EXE线程。但是需要注意的是,有多个EXPLORER.EXE并不代表就一定有线程注入,因为一个工厂也可以同时存在多条流水线。但只有一个EXPLORER.EXE那么通常情况下就是没有线程注入,因为一个进程肯定会有至少一个线程的存在,也就是说,一个工厂必定至少要有一组工人,皮包公司在Windows世界是不允许的。

  * |8 ^7 {3 \# z% n$ \ W- A了解了什么是DLL注入型木马、什么是线程注入型木马后,查杀他们显然就很容易了。4 i; M9 M: T; T5 V9 [

  DLL注入型的,查起来很简单,用上面说的方法“查看某一进程的模块列表---à再隐藏无微软签名的项”,就可以查出单个进程中被注入的模块;如果在全系统范围内查找,则使用“搜索无微软签名的模块”就可以将注入到其它进程中的模块找出来,而大多数工具都提供了“卸载模块”的功能,卸载后就可以删除了,或直接用“卸载后删除”的功能,但有一点是需要注意的,如果该木马使用了防卸载的技术,那么卸载此模块时就会发生异常,对此也不必担心,我们还有其它方法清掉它,比如:清除其自启动项,不让他有注入的机会;或直接删除其磁盘文件等。

  + M3 s, p* i, ?4 @5 G% Y9 y' d相比较起来,查杀线程注入型的木马,就比较困难了,我们上面说了,线程注入的没有自己的文件,只是一段注入的代码。也就是说他只是混入工厂内的一组工人,并没有自己的工厂也没有自己招牌,想把他与正常的工人区分开,是很困难的。这里提供了一个线程注入的测试程序:

  ; k3 F3 c. m) M! W! e先试一试看看效果,运行后,会打开一个窗口,但你却在进程列表中找不到有新增加的进程,那窗口是如何来的呢?这就是由注入到Explorer.exe中的线程创建的。这时你再查看Explorer.exe的线程列表,会发现多出来了一个线程,而线程的“模块”那一列(图03-8)标的名字就是Explorer.exe,这时线程列表中已经有两个名字为Explorer.exe的线程了,但哪一个是好的,哪一个是后来注入的呢?通常情况下看“基址”那一列(图03-8),基址数值较大的那一个一般是起动起来较晚的,就是后来加入的了,选中那一个线程选择“结束线程”,发生了什么?是不是那个窗口被关闭了?(注意:如果是用狙剑查看的,那么在线程注入后,查看新线程时,要重新刷新进程列表,不然会发现不了新注入的线程)# L4 S% H2 I% o$ D

  当然了,上面只是做个试验,让朋友们亲身体会一下线程注入是怎么一回事儿。真正查杀起线程注入型的木马来,用上面的方法显然是不行的,首先,我们不知道他注入到了哪一个进程中。其次,即使一个进程中有多个以进程名为名字的线程我们也无法确定那多出来的线程就是木马线程。所以,我们仍然要从自启动项入手来禁止线程注入。

  , m! n$ h+ C# ?1 }7 I. `1 C. }5 v. g0 c3 Y B7 s; |

  第三种无进程木马是纯驱动型木马 & J" @ ]" d$ S* F' I+ O. o

  什么是驱动型木马呢?就是全部功能放到了驱动程序中去完成(当然了,纯驱动型的并不多见,大多驱动型木马都是配了一个程序。), s3 \$ e4 J, w1 s: O! c

  什么又叫驱动程序呢?驱动程序顾名思义就是驱使设备动起来的程序。^-^ 呵,可能不准确,但却很容易理解。其作用是让特殊的硬件和Windows操作系统可以交换数据,比如我们按下了键盘的A键,那键盘驱动就要告诉Windows系统“这家伙按下了A键,你看咋办吧”,它只是告诉一声,后面的工作就由系统来处理了,系统会根据不同的情况进行不同的处理,如果你是在打字,那就把A这个字符显示在你的输入页面中,如果你用的是五笔,显然直接显示个A是不行的,Windows系统就会把你输入A的这个信息转给了输入法程序……最终实现你按A的目的。

  ' |3 @7 J8 ~' T% X$ k" K1 G但驱动又怎么会与木马有了关系呢?这就要从头说起了,话说当年木马与驱动本来是分处于两个天地,互不相干的。但随着杀毒软件、安全工具等木马杀手对木马的围追堵截越来越是凶狠,木马终于感到有点穷途未路了,在最后关头,它盯上了驱动程序!为什么盯上了驱动呢?因为驱动程序由于其特殊性,使得它在系统中有着超越一切的权力,而且有着优先加载执行的优势,它是做为操作系统的一部分来运行的。详细情况涉及到系统权限的划分与优先级设定,有兴趣的可以查阅相关资料,这里只要明白一点就行“系统的权限分为两种R0与R3,一般的程序全部为R3权限,其行为受到了很多限制;而操作系统与驱动则为R0权限,拥有对整个计算机的全部权力,可以为所欲为”。# A/ C# d1 a0 A8 Y6 l9 J9 B8 F" w

  举例来说,杀毒软件就像一个公司的人力部,对员工的行为进行考核,发现不好的就给予惩罚或辞退。如果木马总是隐藏在员工群里,那么就会受到严格的检查与监管,一旦被查出有问题就会被立即辞退。而操作系统就是公司的董事会或股东大会,驱动程序是董事或股东,有着超出人力部门监管的权力。

  / K9 D4 m4 y: u- X为了逃脱追杀,开始有木马以驱动程序的身份出现,当然了,木马这个驱动是没有硬件设备的,呵,如果中一个木马它就附带一个设备,那么,哪怕它只是给一支鼠标,我也会冲天大喊“木马们,都到我这里来吧”。所以它们有一个好听且很容易听明白的名字“虚拟设备驱动程序”。. o p8 M8 m) J# q5 O9 y

  当木马成为公司的董事的时候,身为人力部门的安防程序开始感到郁闷,明明发现那家伙就有问题,但偏偏没权力辞退它。于是,杀毒软件开始谋求同样的身份,于是杀毒软件也开始挂驱动,使其有了董事的身份来兼人力监管,于是,新一轮的斗争开始了。而这一轮的斗争更是残酷,本来在员工层的斗争转到了高层,本来斗争的结果也就是员工被辞退,还不至于伤筋动骨涉及公司根本,但现在却是一不小心就让公司整个解体了。对应于我们这些可怜的用户来说,杀软与木马的斗争,一个不好惹来的就是蓝屏死机、系统崩溃。& c5 Z+ J( D; W0 g( q& d* f

  OK,了解了驱动程序后,我们就要回到正题来了,我们如何知道系统加载了哪些驱动呢?又如何知道哪些驱动是正常的系统驱动,哪些是木马的驱动呢?看下图03-9:

  s. ?& ?2 Q2 u- b9 ^5 V; z8 d* t( V! |" a6 W! D

  ; {& Y o0 F" k/ ~. p- r) z* k

  在桌面我的电脑图标上按右键,依次选择“属性---à硬件---à设备管理器”就可以打开上面的窗口了,再勾选上“查看----à显示隐藏的设备”就可以看到“非即插即用驱动程序”。

  $ [' O; c9 U3 r# `除了非即插即用外,其它的同级项目都是您机器上的硬件及它们的信息、资源、驱动等,他们是根正苗红的正经设备。由于这些都与硬件有关,所以,木马动它们的可能性很小,必竟木马也不想你的机器崩溃啊。因此,大多数木马驱动都隐藏在“非即插即用驱动程序”下面,而这里面的则是那些虚拟设备了(注:非即插即用驱动程序并非就是虚拟设备驱动程序,这涉及到以前老版系统中的一些个问题,这里不再细说,您只需要明白,在当前的情况下,这里面大多都是虚拟设备驱动程序就可以了。)

  6 w+ q# K, I) z8 n& M   选中某一个项点鼠标右键,再选属性,得到下图03-10:9 _1 y1 Q7 s+ M

  8 p/ D5 Q y% s* w4 N$ A; t* r* Z% g. v

  一看到这张图,你最感兴趣的一定是“停止”这个按钮,但我不得不很遗憾的告诉您“是否能停止驱动程序的运行,还要看这个驱动程序是否愿意停止运行”,是不是失望了?呵,应该是意料中的,如果木马可以这么轻易的停掉,它们还混什么呐?从这里不要奢望得到额外收获,我们只需要了解一点就够了,这个驱动的状态是“已经启动”。) Y( s/ ~$ i2 ?

  2 q, W- p J5 H. q$ h" z# a

  接下来要看的是“驱动程序详细信息”这一栏。点一下,得到下面的这张图03-11:! h0 \' }+ z# @) J

  看到没?这里面的就是驱动程序对应的文件了,至于下面的提供商、版权什么的,参考一下也就得了,如果木马愿意,它可以说它是“天宫”出品,版权属于“玉皇大帝”,那这里会丝毫不打折扣的给它显示出来,你说能信吗?

  1 y+ Z$ @. }- k8 K按上面说的方法,你可以查看所有系统中加载的驱动程序,但很显然,这么做的确是很麻烦,那有没有省事点的方法呢?有,我们看下图03-12:- l$ w4 J# U9 @' {

  看到上面这张图是不是有点眼熟?对了,就是上面我们查找模块时用到的图,打开方式同上,向上翻就可以看到了。蓝条选中的那个,不就是与图03-11中显示的是一个么。这里面列出了所有的驱动程序,不用一个一个找了。

  % B8 z& H" r4 _- d, Z8 J到这里是不是有朋友有点火大了?明明有简单的法子,却带着我们绕了这么大一个圈子。呵,上图中的系统信息,其实也就是系统自带的一个工具,属于专业工具范围内的,且并不是太好使,木马想在这里隐藏信息很容易,而且禁止这个的运行也很简单。我们需要多了解几个法了,以备不时之需,另外,我们需要的是尽量多的学一些知识,这才是根本,了解了原理、懂得了知识,才能真正的成为高手,高手绝非只会使用工具。

  ! _% C/ ]$ f' _! L# B! V

  & t& W1 n; W( d: }说到工具,那我们再看看专业工具对驱动程序的显示:5 i8 ]1 o* C/ \0 R( H- i9 Z

  打开狙剑--à选择基本功能中的“内核模块”,看到没?dmload.sys不就在这里么。这么多,又如何来区分哪个是正常的哪个是可疑的呢?很简单,方法与我们筛选进程是一样的,按右键---à选择“隐藏微软签名项”,剩下的,就是非系统的驱动了。2 R4 l, e& k0 ^' y8 }

  这里同样提供了“停止运行”、“卸载模块”等功能,但我还得遗憾的告诉大家,卸载它也得它自己愿意才行,但想来木马是不会愿意被卸载吧,那我们就没办法了么?有,方法仍然与上面的相同,从自启动程序入手,禁止它的加载;或强制删除它的文件。

  1 b* p/ L. \( ?5 O; J) Q那驱动级木马是不是就是真正的无进程呢?进程列表中找不到任何一个驱动程序的进程,而它也不像模块与线程一样,在其它进程内能够找到,是不是真的可以无进程运行呢?当然不是,我前面已经说了,一个程序的运行,一定、确定以及肯定的会依托一个进程,那这些驱动在哪个进程里呢?那就是System进程,它们是做为系统的一部分来运行的。

  * C) ^: k) J7 v' ?4 F! H0 X 7 a6 J! x4 e. x* n

  * I% Y; \( s0 W( Z$ U第四种无进程木马就是利用技术手段隐藏进程的木马 1 X9 N( H1 P* b/ c

  这显然就不属于无进程了,上面说的三种,的确是没有自己的进程,只是利用了其它的进程。而利用技术手段隐藏进程的木马,则是有自己的进程,但是如果你破解不了他的隐藏技术,那你就看不到它的进程。就像上面我们拿出来的那个HIDE.exe一样,在任务管理器中看不到它的进程,而在狙剑中却能看到,这就是隐藏与破解隐藏后的结果了。

  8 j* ?% w" f0 g) H进程是如何隐藏的呢?这无可避免的会涉及到一些技术问题,下面我们尽量简单明了的说一说,详细的实现细节,请参阅相关资料。在这里,我所想达到的目的,并非是让您也同样写出一个能隐藏自身的木马,而是让您明白,什么样的手段可以隐藏木马的进程,木马又为什么会隐藏,而想破解这种解藏将它揪出来,又需要什么样的技术,好有针对性的选择一些专业工具。4 \) M" r9 e$ c

  同时,需要注意的是,隐藏进程的技术同样适用于隐藏DLL模块程序、隐藏驱动程序,下面为了描述方便,统一说为进程。

  ) { T: [2 J3 V- g) c5 ?1 xWindows系统给我们的开发人员提供了几种列出系统中所有的进程、模块、与驱动程序的方法,最常见的也是最常用的方法就是调用系统API:CreateToolHelp32Snapshot、EnumProcess、EnumProcessModules等,如果您不是开发人员,您不用关心这几个是什么东西,只需要明白,他们是获取进程列表的第一层手段,我们调用这几个其实就是在告诉系统,我们需要进程列表,然后系统就会将列表返回给我们。

  * E0 T0 j; D* ~0 J/ h! _而这几个API在接到请求后又做了什么呢?他们会调用ZwQuerySystemInformation,ZwQuerySystemInformation会调用KiSystemService切入内核进入R0权限,然后自SSDT表中查取得NtQuerySystemInformation的地址,并调用其指向的实际代码,而NtQuerySystemInformation的作用则是自系统的数据结构中取相应的数据,再顺原路返回去。

  ' c1 l& ]+ ~8 N3 `* n) k在中间任何一个环节进行拦截都可以实现隐藏进程的目的,这种拦截有一个名字叫做“HOOK”,在切入内核进入R0权限前进行HOOK,称为应用层HOOK,而在之后进行HOOK则是内核HOOK,后者需要用驱动才能实现了。

  ; W- f& }" w9 ^/ Q9 ^# B. C4 x4 d什么是HOOK?什么是SSDT?我们来举例说明:

  ) Q; V5 [$ \+ _Windows操作系统就像一个为我们管理电脑的服务公司,而他的工作机制是逐级上报,各负其责的,他派了一个服务人员时刻的跟着我们,看我们都有什么要求。7 s0 b, j) t: U% ?1 n, V

  当我们想查看系统中都有什么进程时,我们会告诉服务员,我们想了解当前都有哪些进程,那么服务员就会把我们的要求报上去,报给谁呢?他要先知道哪个部门负责哪个工作才行,SSDT表就是做这个的,SSDT表就像是一个路标,指明了什么样的工作应该由哪一个部门负责处理。通过查表得知负责的部门后,工作就被移交到了那个部门,工作完成后,部门会把工作结果交回给服务员,服务员再交给我们,而我们也就得到我们想要的结果了。# L5 \7 C0 n9 U$ c0 S: B& N

  应用层HOOK呢,就像是服务员被木马偷偷的替换了,当我们提出要求时呢,他会检查是否对他有害,或将对他有害的信息去掉,比如我们想查看进程,那他在将结果交给我们时,却把木马的进程自结果中抹去了,这样,我们自然是看不到木马进程了。

  4 W8 r( \) S( {1 j6 P而最常见的内核HOOK,则是HOOK-SSDT,上面说了SSDT就是一张表,标明了什么工作应该由什么部门负责。而SSDT HOOK也就是木马将表上的内容给改了,本来交给A部门负责的工作被改成了交给由木马负责,这样,服务员在上报我们的请求时,一查表发现查看进程的工作是由木马负责的,他就把这请求交给木马了,而木马呢?他可是知道表中原来的内容是什么的呀,他只是对请求进行一下过滤,发现没有对自己有害的,就直接转交给原部门了,对自己有害的,自然也就视情况滤掉或涂改了。# f+ |( R7 q' s$ a) B. k

  我们先看看SSDT到底是什么样子的,看下图(04-14):$ t, ?7 C) Z. h9 h; w

  ( |: f( V& n0 A7 [$ _! h, I( l

  ' y* S! @/ h0 i) P: C

  依次选择狙剑---à扩展功能---àSSDT检查---à筛选可疑项,就可以看到上图,那就是一个SSDT表,从左到右依次是序号、当前地址、所在模块、HOOK类型、原地址、函数名。. V3 {, q- G4 m

  上面都是狙剑自己对SSDT的HOOK,当前安全软件很多也用到了SSDT-HOOK技术来实现对系统的安全防护。

  6 i A/ ~+ a1 m3 D4 p' }$ H例如上面的第11号函数,所在模块是“D:\workspace\狙剑\SnipeSword.sys”,HOOK类型是“HOOK”,函数是“NtAdjustPrivilegesToken”。这是狙剑本身对SSDT的一个HOOK,用的技术就是HOOK,HOOK的函数是用于增加进程权限的。HOOK这个的目的是“在木马进程为自己增加权限的时候进行拦截,提醒用户注意”这在主动防御一章中会详细讲解。1 G& ^+ v6 Q3 _/ m6 a

  每一个函数都实现了某一种功能,比如:结束进程是由NtTerminateProcess来完成的(上图中最后的那个257号函数),如果HOOK了这个,那么在进程结束前,就有机会更改结果了,可以拒绝被结束。看下图(03-15)

  ; {% _, k' Y, O* U+ x' a# S- b: T

  4 A& P! f5 C9 r" M# y9 k5 c' J" `+ \

  当你试图在任务管理器中结束狙剑的进程时,系统会拒绝你的操作,其实这并不是系统拒绝的,而是狙剑自己,由于狙剑HOOK了SSDT,所以,结束进程的工作服务员都交给他去做了,他一旦发现结束的就是他自己,那他直接告诉服务员这个进程不能结束,然后服务员就把这个结果给我们了,其实我们的这个请求并没有真的到达应该送交的部门。

  ) V: u# G( c. y. ?3 G5 J3 {而上面提到的查看进程用的NtQuerySystemInformation也在这里面,注意找一找就会发现了,如果想隐藏进程就可以把这个给HOOK了。

  2 x8 {# z- R+ \3 L7 J需要特别注意一下子“HOOK类型”,上面的显示是“HOOK”,还有一种是“Inline-HOOK”,什么是Inline-HOOK呢?. u2 [5 N7 Y+ g4 p

  上面说过了,SSDT就像是一个标明了什么工作由哪个部门来做的表,SSDT-HOOK就是更改了这个表的指向。而Inline-HOOK呢?他并没有更改表的指向,查找进程的工作在表中仍然指向了负责查找进程的部门。但是呢,木马却把那个部门中的人员替换了,这样仍然能达到它的目的。2 O$ E# ^% O1 D7 g0 m

  Inline-HOOK更加的复杂、更加的邪恶、也更加的不稳定,而应用范围却是更加的广泛,查找起来更加的困难。要知道,对比SSDT表中的指向是否正确,是否指向了正确的部门,要简单一些,不就是一张表么,拿原来的表对比一下就知道了。但Inine-HOOK却是替换的公司人员,Windows就像一个大公司,有成千上百的人,天知道他替换了哪一个,我们先看看下面的图(03-16):

  9 n# b& _3 q. ]2 [* v

  ' l5 v0 _- H! m9 l6 d当试图结束IceSword.exe时,会出来上面的图,IceSword.exe是另一款知名的安全程序“冰刃”的主程序,当您试图在任务管理器中结束IceSword.exe的进程时,就会出来“无法中止进程”的对话框。

  ; y! E4 }& z/ X但是,当你检查SSDT表时,却发现,它并没有对SSDT进行HOOK,那它是如何实现进程不被结束的呢?6 E0 s3 j% x7 U/ Z4 o

  5 V" d1 K2 u$ C$ X, j/ U

  看下图03-17:

  5 e' P2 G n+ e/ T Z$ V- }% f( ?0 ~& p选择狙剑---à扩展功能---à内核代码扫描 就可以得到上图。3 o7 l* q9 n2 B2 ]- n) l

  当然了,正常情况下,列表应该是空的,但当我运行起IceSword.exe(冰刃)后,再检查,就会出来上图中的7个Inline-HOOK项了。

  8 P/ U5 J; o. _# D1 }; e5 v# p内核代码扫描,是对内核代码中的Inline-HOOK进行检查,并列出被InlineHOOK的项。

  1 A. I* f- [& b1 U0 @上图中,IceSword.exe的驱动IsDrv122.sys,HOOK了7个函数,前六个的功能分别是“结束线程、结束进程、创建进程、创建线程、打开线程、打开进程”后面的那个与进程无关我们不去理它。但从上面6个Inline-HOOK来看,你应该知道为什么他不会被结束了吧?

  * _3 L+ K3 J/ z   还不能确定吗?那么,选中这些Inline-HOOK项,然后再在Inilne-HOOK的列表中按右键,选则“恢复选中的Inline-HOOK”,然后,你再打开任务管理器,试试结束IceSword.exe的进程,是不是可以结束了?

  1 F* u( j# z- g) K1 p/ b! ?6 F7 g" C; w% `& f% s

  讲到这里,不知朋友是否发现了一问题?我上面说了,NtQuerySystemInformation是负责查询进程的,但是那个隐藏进程的测试程序Hide.exe运行起来后,无论在“SSDT检查”中还是在“内核代码扫描”中,都没有任何有关这个函数的任何HOOK或Inline-HOOK的痕迹,这又是怎么回事呢?

  + [( N! n$ E! a) L不要着急,我们接着讲更深层次的进程隐藏技术。

  # y5 O2 c2 U1 j) ~7 D& M% Q" J* `, r简单的总结一下:程序就像是为了实现某一目的而定的计划书;进程呢?就是组织工人分配资源开始执行这份计划;而Windows操作系统呢?就是一个为我们管理电脑也是管理这些执行计划的工人的服务管理公司;我们有什么要求呢?就交给服务员将我们的要求提要给Windows,由Windows来组织工人执行我们的要求,并将结果返回给我们。如果木马替换了服务员、更改了SSDT表、或替换了Windows服务公司某职能部门的人员,我们得到的可能就是一个错的结果,或我们的要求得不到执行,就像结束进程一样。

  ! P, d2 ]5 o" X% C9 y4 g如果不替换任何人员,也不更改SSDT表,还有没有办法隐藏进程呢?有的,那就是更改系统的数据结构。' ^! |% m+ K+ Y" Y- H4 v4 o( L; t! A

  举例来说,我们查询进程其实就是向Windows发出“查询当前正在有哪几组工人正在工作”的请求,而Windows在内部又是如何查询的呢?他当然会去人力部,因为人力部有工人的档案啊,在职的离职的都有,只要将档案一翻,就明白当前有多少工人了,再把结果给我们,它的工作就完成了。+ q+ y( n8 e2 q; o' K$ B

  更改数据结构,也就是更改档案了,虽然人员都没问题,但档案已经被修改了,木马会偷偷的潜入人力部把它自己的档案从人力部的档案柜中偷偷的销毁,这样,当系统去查询的时候,就查不到他的档案了,系统会认为没有这组工人,虽然查询过程与查询的人员都没有问题,但结果仍然是错误的。当然了,进入人力部是需要有一定权限的,不是谁都可以进去销毁东西的,注意到与Hide.exe在一起还有一个Sys.sys文件吗?这个文件也是一个驱动程序,它的工作就是获取R0权限,以便顺利的进入内核更改数据。

  1 @, J% R$ H* h4 n而Hide.exe之所以可以隐藏,就是因为它把系统活动进程链中(即人力部)的进程数据更改了。

  6 r% d& S) Q" v7 ]/ J: I那为什么Windows查不到它,专业工具却可以查到呢?这个道理很简单,因为Windows是正规公司,它的工作流程是固定的,查询工人的事情,他就是去人力部,人力部没有相关工人的信息,他就认为没有这工人,他并不会偿试去其它地方看一看。' D( T: J8 o; c& E& ?

  其实,工人们是不可能只在一个地方登记的,进入公司要在人力部登记、领工具却还要在仓库登记、发工资要在财务部登记、吃饭要在食堂登记……。

  % B( P1 ]& u" {) ?如果木马只是抹去了活动进程链中的数据,那么还可以从窗口、线程、句柄、对像、Csrss.exe中等许多地方找到它的信息。

  6 ]7 R/ b5 Y4 C3 w0 v3 ~当然了,木马也会尽力的把自己的痕迹全部抹去,并且已经有马儿这么做了。1 Y7 z$ Q3 i) l

  于是,基于线程调度链的进程枚举技术就出现了,什么叫线程调度链呢?在系统中CPU的时间分配是以线程为单位的,一个程序要想得到执行,必须要有线程存在于这个线程调度链中,不然,他得不到时间的分配,也就得不到执行的机会。1 ^8 g- _1 I8 P% n6 p8 {

  还以我们上面的例子来说明,木马可以抹去人力部的资料,反正已经进来了,那里有没有也无所谓了;也可以抹去仓库中的资料,工具已经到手了,抹就抹去吧;也可以抹掉财务的资料,豁出去了,为了完成木马大业就不要钱了;但是他不能抹去食堂的资料,不是么?食堂可是按人员档案备饭的,抹掉了,没他的资料也就意味着没他们的饭吃,还不得给饿死啊?而这关键的他无法抹去的资料也就是系统中的“线程调度链”,抹去了,他自己活不下去。

  5 q9 Z7 r8 F: }5 {但不要小瞧了木马的智慧,它们也有自己的法子,什么办法呢?他们准备了一份假资料,在有人查询时呢,就用假资料替换掉真资料,而在食堂做饭时呢,再用真资料替换掉假资料,也就是自己构造了一个进程调度链。+ E- |/ `, t* p$ P/ E

  开始时还真是没人发现,不过,没有不透风的墙,出来混总是要还的,这技术最后还是让人知道了,即然知道了他们会随时替换,那查询时当然也就知道注意了,于是它又开始想其它办法,斗争就这么持继了下去。- v6 j! r# _) }% z/ v9 O. V( z

  总之,安全与木马的斗争还远远没有结束,胜负还仍然没有分出(好像也很难分出),剿杀木马的工作仍然任重而道远,还我清净河山的愿景,还需我们大家齐心合力的来实现。

  - e' |5 R `- p' i' {. G2 F上面对“进程”从外到里由浅到深的都讲了讲,当然了,讲的绝不对不全,因为实在太多了,就以隐藏来说,各路高人的各种奇思妙想多不胜数,多到根本无法尽述,比如欺骗眼睛的技术,就是你查时不管你,但你看时却自列表中抹掉,让你看不到,就像明明真实的资料放到了你面前,但偏偏有一个阴影档住了某处。; [5 S$ }! u/ Q- h: s

  但不管如何,邪恶永不能战胜正义,只要我们都关注,总有它们无处藏身的一天。- k$ c& u+ i! b

  另外,不得不说的是,查看进程只是检查手段的一种,结束进程也绝不意味着就清除了木马。所以,我们还要继续下去。看看还有什么地方可以抓到它,清除它。

  + L$ v# q2 @& e; n) c0 q7 b而下一章,就是另一个关键点,自启动项的检查、隐藏与清除。! o$ h4 t& L/ ] ]- z1 [

  进程篇到这里就讲完了,接下来是下面的这些:1 f. k4 Y7 H# x f' M

  ; o; Y" C m% O5 E( z7 m% h四、木马的查杀之自启动项篇

  . K, ~0 [" G; @+ w; v5 `# j自启动项的检查与清除,毫无疑问是查杀木马的关键手段与方法。而且,清掉木马的自启动项,让其自然而亡,是最优雅的杀马方法,不那么暴力也就轻易不会遇到反击。对驱动级的或注入型的木马,这种手段更显其优越性。

  : U) c) R( i. k+ F3 s+ h而自启动项的选择与设置,更是一种创意的体现,一些非技术型的木马通常可在此看到其作者非同一般的创造性思维。

  , E7 m- A' }& g( P& m% X+ d自启动,顾名思义,就是无须用户干预而自行启动的程序,按启动方式又分为两种,一种是开机自运行的程序;一种是触发式启动的程序。. E; H! p: a# c# O

  下面我们将分别来解剖之,但在此之前,我们先要学习一些基础的知识:

  8 L. o! f, Z& R7 b2 `1、注册表基础 8 k* c: w9 `9 d: x

  由于大多数的自启动位置都在注册表中,所以,首先,我们需要了解“注册表”是什么。

  ) i! W/ v% e: m注册表从功能上说,它是一个存储各种设置信息的数据仓库,系统的全部设置几乎都存在那里,比如:你用的是什么墙纸、什么屏保、IE的首页、IE窗口的大小等等。当然了,开机时需要加载的驱动、开启的服务、运行的程序等等也都存储在这里。

  / r( j. |, \: C3 Z5 \# z' F而从实质上来说呢,注册表其实是由一些记录配置信息的文件组成的,这些文件中的大部分存在“\Windows\System32\Config\”目录下,还有一部分存在用户配置文件夹中,也就是下面将要讲到的03-24图中的用户文件夹中。

  / D7 f& v* p8 o4 r3 I这些文件有一个很难听的名字叫做储巢,也就是朋友可能听过的HIVE文件。

  6 p! E+ v3 m$ C+ y" N3 w由于注册表对系统实在是太重要的了,任何损坏都有可能造成系统彻底的崩溃,所以,系统对注册表的保护也是很严密的,正常情况下,你无法对注册表HIVE文件进行任何的直接操作,看下图03-18:8 p. n. }, q f; l

  7 X3 H. V* u1 D$ w0 T# h$ I$ y0 f8 ]" g2 t: F

  你不仅无法打开、修改,你甚至无法进行拷贝操作。而系统保护注册表的手段,就是由系统以独占的方式打开注册表文件,这样你的任何针对此文件的操作,都将被拒绝。下面,我们来验证一下,看下图03-19: 5 u# M8 [1 ?6 a3 L

  打开狙剑,选择“进程管理”,在进程列表中选中“system”进程,再选择“查看打开的文件”,就可以看到系统打开的所有文件,看上图中蓝条选中的那一项,是不是就是我们无法进行操作的“\Windows\System32\Config\system”文件呢?3 M3 M1 U6 ~. @

  注意:狙剑提供了关闭其它进程打开的文件的功能,关闭后,本来无法操作的文件就可以进行正常的操作了。但是,那是对付木马的,而不是对付系统的,因为木马也同样可以利用独占打开的方式来禁止我们对其文件的访问。关闭系统打开的关键文件将发生无可预料的结果,切勿偿试!(关于文件相关的内容,我们在以后的章节中会有详细的讲解。)# L3 [' ^4 h4 K E" a/ x3 T

  那我们是否就无法操作注册表了呢?当然不是,系统在保护注册表文件的同时,也提供了操作注册表的工具-“注册表编辑器”。1 ~4 ~* F" d) `4 v! M

  ' W6 w/ F+ D% f' x( ^

  在“开始”菜单中,选择“运行”,输入“regedit.exe”就可以打开注册表编辑器,打开后的情况是这样的,看下图03-20:

  0 X( n3 _. R8 j- ~ [* p[/url]

  $ G8 g- X' p9 K- X上面的各项称为“键”,最上层的是“根键”下面的叫做“子键”,其与上面我们说的注册表文件一一对应,对应关系如下:! Q3 o& j8 v2 s9 p6 S: u

  l    HKEY_LOCAL_MACHINE\SAM à Windows\System32\config\sam

  K1 m, O' I% `) s+ jl    HKEY_LOCAL_MACHINE\SECURITY à Windows\System32\config\security% \! v+ y: Z1 v) P; ~( _9 F% d

  l    HKEY_LOCAL_MACHINE\SOFTWARE à Windows\System32\config\software9 a- u: D4 k2 H) {

  l    HKEY_LOCAL_MACHINE\SYSTEM à Windows\System32\config\system' T! |9 _\" C3 L9 R8 I

  l    HKEY_USERS\.DEFAULT à Windows\System32\config\Default

  & |! q# a* y2 q6 Y) g Yl    HKEY_USERS\S-1-5-XX_XXX à \Documents and Settings\用户名>\Ntuser.dat

  * m- ^5 a) c/ Z6 v. xl    HKEY_USERS\S-1-5-XX_XXX_Classes à\Documents and Settings\用户名>\Local Settings\Application Data\Microsoft\Windows\Usrclass.dat

  ) X8 o3 R, |( r* w: g& Z7 Z9 l0 P: ^! Q还有其它的键呢?又对应哪些文件呢?呵,这要从注册表的数据类型说起了,除了上面的键外,其它的几个键是属于REG_LINK类型,直翻过来就是“注册表链接”了,这种类型的键是透明的指向另一个键的一个链接,也可以理解成这些键只是另外的某个子键的快速入口或某类相似键的汇总而已,本身并没有文件,其链接的键对应如下:

  ! E5 C0 n; `( J! _# z% |l    HKEY_CLASS_ROOT 中的内容来自于下面的两个注册键: HKEY_LOCAL_MACHINE\SOFTWARE\Classes

  \" p. }8 H2 M1 W$ B. T* W# }HKEY_CURRENT_USER\SoftWare\Classes

  / Q\" |' }, L, ]( pl    HKEY_CURRENT_USER中的内容是当前用户的信息,来自于HKEY_USERS\S-1-5-XX-XXXX à \Documents and Settings\用户名>\Ntuser.dat

  0 J6 W R- ~( Q$ `' F5 K gl    HKEY_CURRENT_CONFIG中的内容来自于HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\Current- G5 E. R' i3 ^* W T

  当你修改有链接关系的任一键中的数据时,对应的链接键也会体现出来,比如:你修改了HKEY_CLASS_ROOT中的内容,那么你的修改也同时体现在了HKEY_LOCAL_MACHINE\SOFTWARE\Classes中,因为这本就是同一个文件中的同一部分数据。

  4 a( Z' e( M- q. J+ b

  ( ?\" i2 Q+ \; }下面我们再简单的说一说SID(安全标识符)也就是上面的“S-1-5-XX-XXX”,其后面部分我用“XXX”取代了,后面是不定值。6 v( L: t& E8 b2 E

  SID前面的定义是固定的,比如:S-1-5-18是本地系统账户(Local System)S-1-5-19是本地服务账户、S-1-5-20是网络服务账户等(更多信息,请参考专业资料); P: u: v\" m+ _9 t. b; M2 X/ N; f

  而SID后面的部分是全球唯一的,就是:329068152-606747145-682003330-1003那部分,在注册表中这个是保存了当前用户的配置信息,也就是HKEY_CURRENT_USER指向的部分。(关于用户的概念请参考后面的相关章节)# ]) a+ \$ s! t+ m* [ z$ m8 x' O

  接下来,我们再看看每个键中都存储了哪些信息:* b9 P+ O5 A/ V, X. F X

  l    HKEY_CURRENT_USER中存储了一些与当前登录用户有关联的数据,也就是你个人的一些设定都存在了这里。

  1 I, u2 {2 ?( `- r2 s+ s) Ql    HKEY_CLASSES_ROOT中存储的是文件关联和COM对像的注册信息,什么样的文件由什么程序来打开就是存在了这里。- ? m- p% @* k% L8 g: p$ U) V

  l    HKEY_LOCAL_MACHINE中存储的是系统相关的信息,比如:驱动、服务等。* X1 V# Q/ S, _. \7 l& @

  l    HKEY_USERS存储的是所有账户的信息。

  $ X. G/ u# k. n* v* X% t2 cl    HKEY_CURRENT_CONFIG中存储的是当前硬件配置信息。

  $ I5 m\" x0 U, `9 {; B呵,上面都是一些基本的知识,看起来有些枯燥,能理解就理解,理解不了就算了,并不影响后面对木马的查杀。这里之所以讲这些,是提供给想深入了解系统知识的朋友的,要想成为高手就不能不了解这些。1 I0 m3 B0 B# Q- T3 j$ _3 P

  下面我们再来点动手的,提一提精神。那些禁止我们打开、修改甚至不让我们复制的注册表文件我们难道真的就没办法看看里面是什么吗?嘿,不知道有没有好奇心跟我一样重的朋友。想当年,我可是想尽办法也想看看怎么把那些文件给打开的,呵,没办法,好奇心就是重。我们下面就动手来看看,那里面都是些什么神秘的东西,系统居然看都不让我们看。

  ; i1 a! U, f0 _! C. @先看下图03-21:

  3 Y) a+ k/ H3 X, V0 I3 [2 V0 }, y% A# J8 t

  ' T+ o5 W3 E! q* R; y0 q

  打开狙剑,选择“磁盘文件管理”,在打开的选择框中选择系统盘,然后找到Windows\System32\config\目录下的注册表文件,按右键,选择“复制文件”。在弹出的保存框中,给新文件起个名字。OK了,我们成功的复制出了系统本来不想让我们看到的注册表文件。(怎么复制这些不能复制的文件、怎么删除不能删除的文件等我们会在后面的“木马的查杀之文件篇”中统一讲解”)* }4 I) H& ^# N+ M$ T' X

  文件复制出来了,我们怎么来看里面都是什么呢?两种方法,一种是用十六进制编辑器查看,当然了,这种文件是特殊格式的文件,用十六进制编辑器看,看得一定是有些晕的,要做好心理准备哦。第二个方法就是利用Regedit.exe(注册表编辑器)的“加载配置单元”的功能。

  \" @! B8 t* p; @, _; J1 `( G   这里,我们讲一讲第二种方法,打开注册表编辑器,先选中HKEY_LOCAL_MACHINE键(注意:这一步不要省略,不然加载配置单元项是灰的,也可以选中USER键),然后依次选择“文件”à“加载配置单元”。如下图03-22:

  - o$ o. r2 y c! X

  : B2 Y+ O b, X% S7 Y3 C$ [! e

  7 i b, x d0 m在弹出的选择框中选择我们刚才复制出来的注册表文件,在项名字中随便输入一个名字,这里我输入的是“Test”,然后,就加载成功了,看下图03-23,是不是多出了一个Test键呢?这个键跟System键的内容是一样的,因为我们复制的就是System注册表文件:

  ) Y) C- y/ @- X& g' n注意一下儿,Test里面少了这个键“CurrentControlSet”,为什么会少一个呢?不用我说朋友们也应该知道为什么吧?什么,不知道?那再看看他的名字“Current-Control-Set”这回知道了吧?对了,这个键也是个链接键,是从ControlSet001与ControlSet002中链接的内容,是“当前的”设置。所以,文件中是没有的。而注册表编辑器是从内存中读取的注册表内容,因此是有的。4 o' H! G! S& U% x

  选中“Test”键,在文件菜单中选择“卸载配置单元”就可以卸掉这个键了。, C% \8 t: | k4 m7 E# \

  好了,基础知识讲到这里,应该是够用了,我们接下来就分别讲解一下子,开机自动运行的程序与触发式启动的程序。

  ) e4 k. U\" J7 S2、开机自运行的程序 * R; n/ T0 `8 x# ~

  “开机自动运行程序”是操作系统为方便用户的使用而提供的一个方法,让每次开机都须频繁操作的一些工作得到自动的执行。而木马只是利用了这一方法,来完成自己的非法启动目的罢了。

  ( I- A, j( J& l\" w' H最经典的启动位置,也是操作系统特别提供给用户的位置就是“启动文件夹”,在开始菜单中选择“所有程序”,里面的“启动”就是了。放在此文件夹中的所有程序,都将在下次启动时用户登录后,自动启动起来。这里面涉及到“用户”这个概念,先看下图03-24:

  2 `0 C- ^; p S& D1 I\" z% p7 z* p% o) r3 L* U) `

  红框中的就是当前系统中的用户,由上到下分别是“所有用户”、“默认用户”、“本地服务账户”、“网络服务账户”、“SnipeSword用户(当前用户)”。前面四个是系统创建的,后面的那个是我们自己创建的用户(名字是我们自己取的)。在“所有用户”、“默认用户”与“当前用户”中都有一套大致相同的配置文件,也就是说都有一个“启动文件夹”。

  $ T# M# D% }0 V5 w启动文件夹是系统提供给我们使用的,但不知道从什么时候开始,就已经很少有人再用这个位置来启动程序了,包括一些正常的需要自启动的第三方程序,也都不再利用这里来启动,而是直接操作注册表来实现程序的自启动。9 \# D: w7 Y* s+ f; G3 o. `, e

  与启动文件夹相比,注册表操作对用户来说,是更神秘而不易查看与操作,我不知道没有技术原因放弃启动文件夹而利用注册表来启动的那些正常软件是出于什么考虑或出于什么目的,但这种形为,却有必要BS一下儿。

  4 S6 b5 S1 i- b

  9 q) [ e' o1 x! l- q下面我们就接着讲注册表中的自启动项,将那些正常的、或非正常的自启动程序,从我们的机器中揪出来,我们的机器我们作主,即使是正常的程序,大量的开机自运行也会造成系统资源的不必要的浪费与消耗,使系统的运行速度减慢。所以,清理自启动项,并不仅仅是查杀木马,这同时也是优化系统时很重要的一步。

  x0 S- F0 z\" h, h我一直对那些为了商业竞争而漠视用户权力与自由的所谓正当软件深恶痛绝,我绝不想因为一年中仅用了一次某一软件的某一功能,而就任由这软件在365天中每天都自动运行起来,消耗掉我宝贵的系统资源。而菜鸟的机器在同样硬件配置的情况下,通常要比高手的机器慢上很多、难用上很多,这些垃圾软件对资源的无谓占用就是很大的一个原因。* A9 y5 w' J' O2 P. J4 P

  OK,闲话少说,我们下面步入正题。

  \" K8 I* r* P+ Q4 a w, x1 q8 j   最早加载启动的是驱动程序,这是可以理解的,因为硬件设备与底层功能是由它们来实现的,不先加载它们哪行呢?比如:在加载文件系统驱动之前,所有对文件的读写都是无法实现的,你想能不先加载这些驱动吗?

  : o- N% f0 d0 U8 F0 E   系统启动时,由引导程序Ntldr来读入system注册表文件,加载里面列出的驱动程序。细心的朋友这时可能会有个疑问,文件系统驱动是在这时加载的吗?回答是肯定的“是的”,那按上面的说法,文件系统加载前,对文件的读取是无法实现的,那么Ntldr又如何读取system注册表文件的呢?呵,能看到这个问题的,我不得不赞一句真是细心啊。答案是:因为Ntldr中内置了只读的NTFS与FAT文件系统代码,虽然很简单但足够用了。再追问下去,Ntldr也是以文件形式存在的,那Ntldr这个文件又是如何读取的呢?Ntldr是引导扇区中的引导代码加载的,而引导扇区中有更加简单的文件系统读取代码,区别是越向上越简单,一直到文件系统驱动接手后,才是完整的文件系统代码。引导代码中的文件系统代码简单到只能读取根目录中的文件,所以Ntldr只能放在根目录;而Ntldr中文件系统代码已经能读取子目录中的文件了,所以驱动是可以放到任意目录的。, i% s. F\" J6 H% T9 g

  我们接着来讲驱动的加载,驱动肯定不是一个,那先加载哪个后加载哪个呢?我们先来看一个图03-25:9 E6 x# A' m/ m& |\" l& J! ^- Z

  2 h0 S, I; f7 T6 z上图中是一个典型的驱动在注册表中的注册内容,系统加载时,就是依照这里的内容进行驱动加载的,这个驱动在注册表中的:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\sr键下,也就是在System注册表文件中。这是XP-系统还原所需要的一个文件过滤系统驱动。

  ( v4 |! V% B& L3 j7 z2 c注册内容中的各项含义如下:; q/ n; ~! n* e2 c7 N' P8 _

  l    DisplayName :这是服务名称,在前面一章中我们讲到服务管理器时讲过,这个名字就是在服务管理器中显示的名称,没什么要紧的,随便起一个就行。

  - l* G( i' g6 l- y: dl    ErrorControl :错误控制码,可以取值为,0 à 忽略任何错误;1 à 如果出错,显示一个警告;2 à 如果出错,且有最后一次正确配置则启动最后一次正确配置,否则继续引导过程;3 à 如果出错,且有最后一次正确配置,则使用最后一次正确配置,否则显示蓝屏崩溃。这里的“最后一次正确配置”是指在启动过程中按F8键进入高级菜单后的其中的一个选项,利用这个选项通常可以正常进入系统。% j# C5 F) _# O

  l    Group :组的名称,这个根加载顺序就有关系了,我们放到后面详细讲。4 b$ _0 B8 B5 E

  l    ImagePath :驱动或服务的执行文件路径。需要注意的是,如果一个驱动有这一项,那么系统会根据这一项中标明的文件进行加载,如果驱动中没有这一项,系统会自动在Windows\System32\Drivers\目录下寻找与注册键同名的驱动加载。2 X) b5 G ?* N6 c

  l    Start : 驱动或服务的加载启动顺序。可取值为,0 à Ntldr预先加载此值为零的驱动,在引导过程中这类驱动一直待在内存中;1 à 在标明为0的驱动初始化之后,值为1的驱动开始被加载到内存中并初始化,其是在内核初始化的过程中加载的(参见进程篇的系统启动过程)。2 à 在Services.exe启动后,由该进程来加载启动值为2的驱动或服务(Service.exe的情况请参阅进程篇);3 à Services.exe根据需要加载这类的驱动或服务,也就是在服务管理器的启动一项中标明为“手动”的。呵,这里有个概念性的误区,标明为手动并不是指一定要由用户来手动启动,而是由系统识情况启动,当系统需要相应的驱动或服务提供的功能时,系统就将自动启动此服务,而无须用户手动操作;4 à 驱动或服务并不加载到内存,当然也不启动了。也就是服务管理器中标为“禁用”的服务,这一类的服务,即使系统需要用到其提供的功能,也不会自动加载。' |; ~( j$ K8 y

  l    Tag :在组中的顺序,这也是根加载顺序有关系的,我们同样放到后面讲。

  1 o4 T& }# f\" w! ^/ u6 ?l    Type :服务的类型,可取值为,1à 设备驱动程序;2 à 内核模式的文件系统驱动程序;4 à 已废弃;8 à 文件系统识别器驱动程序;16 à 该服务运行在一个只能容纳一个服务的进程中;32 à 该服务运行在一个可容纳多个服务的进程中;256 à 允许该服务在控制台显示窗口,并接收用户输入。! f: d) u, Y+ p+ L5 s- A

  . m# d; D. f/ ]- ~+ V除了上面的Start决定了加载顺序外,还有Group与Tag来共同作用决定驱动的加载顺序,下面我们来讲一讲这两个,先来看图03-26:8 Z4 Q2 T+ z* E% T/ @: u& h

  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder键如上图所示,表明了一个组的概念,驱动是分组并按组来分别按顺序加载的,Group决定了驱动是在哪一个组中,而Tag却决定了在同一个组的哪一个位置上。注意一下儿就会发现,Start值为0的驱动基本上都是分到了*前的几个组中。

  + M( k7 c. G8 H\" M   了解了上面的知识后,只要你有足够的耐心,那么你就可以将系统中的驱动加载顺序搞出来了。. `% Y% M& \# G$ T& S7 `

  驱动加载后,还有一些系统启动过程中需要的程序会得到加载执行的机会,可以参考进程篇中的系统引导过程来看,这里就不多说了,而且应用程序的启动顺序永远无法超越高启动级别的驱动,所以讲他们启动顺序也没多大意义。

  2 O* {0 r& C/ D+ g* D在注册表中可以启动程序的地方很多,不可能一个个的都讲一讲,也没那个必要。同样的,我们也不可能手动来从注册表中查找每一个启动项,启动项的查找只有依*专业工具来进行,才是最佳的选择。

  3 C6 F; }1 p* W4 y0 `* C3 N/ f) \' k; d# W% p, j. U- _

  启动项管理软件中最出名的无疑是Sysinternals出品的AutoRuns.exe这是国外的一个专业启动项管理工具,很出名。但是如果用于清除木马,这个工具很显然是远远不够的,就像它的名字一样,这是一个“启动项管理”工具,它虽然列出了很全的自启动项,但却缺少反黑工具所特有的查找被隐藏的启动项、清除被保护的启动项的能力,我相信我这个评价还是很客观的。在后面的“自启动项的保护与清除”一单中我会再详细讲解。' J- h6 j4 _! i$ @. q3 U6 i9 {

  现在我们再看看狙剑的自启动项管理,狙剑毫无疑问是借签了AutoRuns.exe的启动项,另外加入了一些AutoRuns.exe并没有列出的启动项,从全面上来说应该是更胜一筹了,呵,说来也惭愧,站在巨人的肩上总会比巨人高一头的。当然了,最关键的还是狙剑做为一个专业的安全工具来对自启动项进行管理,充分考虑到了木马病毒对自启动项的隐藏与保护,加入了隐藏HOOK的恢复,所以,更适合安全相关的自启动项管理,我们看看下图03-27:2 j$ q( N6 Q, S' a\" x8 ~: s

  \" P' S) v8 _0 H2 X% J注意,下面标明了自启动项的数量是810,只是这个数包括了分类条目,所以实际的会少一些,但怎么也应该在790+,这种数量的启动项,用手工来找,很显然是不现实的。另外需要注意的是,在驱动与服务的枚举中,狙剑将启动值为4也就是标为禁用的驱动与服务同样列了出来,这是为了防止有些恶意驱动,在加载完成后,就将自己改为禁用,等关机时再改回0值优先启动而考虑的。# p7 O. A; X3 z) g1 Q

  对于这大量自启动项的判断上,我们也将用进程判断的方法来进行判断,也就是数字签名验证,在启动列表中按右键选择“隐藏微软签名项”后,就会将全部有微软签名的启动项隐藏,剩下的也就没多少了。6 V; A. S0 B3 [6 d! v

  在正常情况下,清除掉所有的非微软签名启动项,是不会影响系统正常使用的。但有些情况是需要注意的,比如:Tcpip.sys是网络驱动,正常情况下是可以通过微软数字签名验证的。但有些下载软件比如迅雷会修改此驱动以达到最大的连接数,而由于Tcpip.sys被改动后,将不再能够通过微软的数字签名验证,所以,在不特别注意下,清除所有非微软认证的自启动项时,就会将这个驱动清掉,导致无法上网。

  ) \$ W# E J3 t; {7 F. P   另外,向进程篇中提到的Userinit.exe的情况也是类似的,Userinit.exe同样为系统必须的程序,但如果这种程序被感染了,那么,直接清掉就会存在问题,当然了,安全程序在清这类启动必须的程序时是不会删掉启动项的,但作为我们用户来说一定要搞清除哪些是木马的启动项,那些是被修改或感染的系统启动项,对这种被修改或感染的系统文件的处理,最佳方式无疑就是利用“系统文件修复”功能了。而千万不要直接手动清除相应的启动项,清掉后,将导致系统功能出现问题甚至不能进入系统。

  0 h9 [1 T: a( t: v% c+ d6 y   所以,对启动项进行清理时,在隐藏微软验证的文件后,仍然要对剩余的进行判断,有针对性的清理,当然,判断的过程是需要经验的,但是,想成为一个高手,这份经验的积累是必须的,世界上没有白吃的午餐,不想做一个使用傻瓜式软件的傻瓜,那么一些必要的学习与充电也就是必须的。第一次清理时不知道,上网查询或求助,第二次就知道了。相信,不长时间就可以完成经验的积累。

  ' V; {# ? c9 d% c$ j7 P h% _6 k   最后需要说明的是,新的启动位置仍然在不断的挖掘中,没有哪个软件敢说全,只能是比较全而已,仍然需要不断的补充与完善。

  % s. Z. {2 }/ S( ]1 t6 i木马查杀深度剖析(申请加精)

  ; N% C0 e0 n' H\" g, i2 A一、前言
2 E1 e6 | T2 O

  在进入正文之前呢,容我先说几句废话。 e4 m( c/ H8 X9 a3 U& `( p; A

  在写此文之前,我曾写过一篇“高级木马的自我保护技术与查杀之策”,承蒙各位朋友的厚爱,被各网站所转载,亦曾有许多朋友来信求助。* s' O- J/ O3 |2 R) H2 H3 C

  由于该文是心血来潮后的随笔所写,所以并没有经过深思熟虑,也并没有脉络可循,至使有的朋友能看懂,有的却看不懂。而看得懂的呢,亦有很大一部分并不能真正的应用文中所提的查杀技巧。3 k% \- g$ |$ M! _9 Y* `

  故一直有心再写一篇文章,帮助深受木马毒害的朋友们了解木马是什么,又如何查杀。

  + ~& L) i) p9 h本文适于下列人员阅读:

  0 D ~$ i5 i% L1 ?2 I/ F, Ll    能熟练使用计算机的人; H( T; P5 S* N9 H

  l    想自己动手解决问题的人

  3 |; p ]2 t' T* w* `l    钱没有多到电脑一出问题就扔到电脑修理公司的人0 A# y% y7 b/ Z( l5 B3 X/ Y1 c

  适于下列人员参考:

  & A/ v\" v\" Q) j8 n\" e7 m1 rl    电脑维修人员( f! o q7 [, a9 X2 P. K% K, K8 u

  l    微机管理人员

  / j- _/ G8 f3 Ll    安全相关的程序开发人员

  6 ?) b8 c3 O- Q本文所要达到的目的是:

  0 m7 E$ I) @/ nl    让菜鸟也可以了解系统安全自己来动手查毒杀马,由求助者变为帮助它人者。

  ) ^; y! m3 w, W6 x% d* w# W* R4 z/ Cl    在杀毒软件无能为力的情况下,借助本文的知识让你仍然能借助工具完成清理查杀的任务。

  + D% ~$ P9 u+ y. Pl    让您真正的明白一些看似神秘的、高深莫测的专用术语与技术的内幕。

  ; @ E9 K\" g/ R$ r9 E' l: L0 ~l    让您了解Windows系统的底层知识。) c0 a- R2 l; [4 U

  本文以手动查杀为主,辅以必要的工具,文中用到的工具与测试用的仿木马小程序都提供了下载地址,供朋友们下载试用。$ U1 }4 Q* x3 l& B, N

  二、木马知识扫盲篇 / E6 X: a& @+ R\" d1 G6 I

  什么是木马呢?木马只是一类程序的名字,为实现特殊目的而制作并偷偷植入目的计算机中的程序的统称。

  2 w7 w, S2 M- t7 f- `其名字源于古希腊神话《木马屠城记》,全名为“特洛伊木马”有兴趣的可以翻看相关资料,很不错的一篇故事。

  3 o; T* {: \\" x, j# c那什么又是程序呢?呵,即然是扫盲篇,我们就不能回避这些让人头都大的问题,先从最基本的开始,熟悉计算机的朋友们可以直接跳到第三章去。

  ) s+ [7 _7 ~) H: [5 I& r: d我们先了解一些基本的概念:+ \2 g9 V k7 W0 e1 K, }1 p

  概念一:计算机。就是我们的电脑了,指的就是一堆硬件,显示器、主机、键盘、鼠标等等,当然了,拆开主机还有一堆零碎。我们只需要了解其中几个后面会提到的就行了。/ H- I4 m7 b% ^ A* p

  CPU:计算机的指令处理单元。所有的工作都是由它来做的,同一个CPU同一时间只能处理一条指令,就是说一旦CPU被某一程序占用,那在同一时刻内其它程序就肯定是空闲等待状态(双核的可以同时执行两条,以此类推)。$ d' f+ t* D# o; e) _

  内存:内部存储器。CPU执行的指令都是由内存中读取的,所以,一个程序要运行首先要装入到内存中。

  ( _/ Y8 Z, T. W; @3 f2 J磁盘:外部存储器。存放文件数据的地方。计算机中所有的数据平时都是存在这里的,只有在需要执行或查看时,才读取到内存中。9 @9 C; Z% @\" r

  但只有硬件,是不能使用的,还需要软件的配合,我们买电脑时电脑中大都安装了某一操作系统,主流的就是MS Windows系统了(还有其它的操作系统如Linux等,这里不做讨论)。这就是我们需要了解的也是以后要频繁出现的第二个概念了“系统”。

  * ^: @9 s8 P+ K/ U0 j概念二:系统。系统其实在大多数情况下都指的是操作系统,也就是帮我们使用与管理硬件的软件系统,当我们按下机箱电源后,即由主板上的BIOS检测硬件、再交由硬盘中的引导程序启动操作系统,然后就出现了我们所熟悉的Windows主窗口(计算机在启动时做了些什么,我们会在后面详细的讲解),而以后我们的所有工作,看电影、听歌曲、玩游戏、上网浏览等等都是在这个窗口中进行。操作系统维持这个窗口的显示及一些常用功能的完成,而这些功能是由一系列的程序来实现的,这又引出了我们的第三个概念“程序”2 Y1 D) T4 \( \: p# }

  概念三:程序。程序是什么呢?程序就是一组指令执行序列。呵,有点专业了是不?什么又叫指令执行序列呢?

  , s2 E6 M& U' s4 F) ?5 S6 Z; K S举例来说:我管理着一个工厂,正常情况下我让工人们按这样来工作“先去原料仓库取原料---à 进行初步加工---à 进行精细加工--à 进行零配件组装---à 验收---à 合格则送入成品库--à 不合格则销毁”。这就是一个指令执行序列,当情况为正常时,工人们执行的是这个序列也就是这个“程序”。而在旺销的季节呢,我还有第二个程序“取原料----à 进行初步加工----à 组装 ----à 进成品库”。当情况为供不应求时,我就执行第二个程序。还有第三个、第四个……等等,在不同的情况下,我让工人们执行不同的程序。

  + ?\" \( d; _0 b计算机程序也是一样的,跟据用户要求的不同,执行不同的指令序列,比如您要画图,你可能会这么操作“点击开始菜单--à 选择所有程序--à在所有的程序中选择附件--à再在附件中选择画图”,这就是你向操作系统下达的指令。操作系统得到您的指令后,则会执行画图程序,也就是实现画图目的的一系列指令,而这些画图的指令储存在“mspaint.exe”文件中。操作系统会将mspaint.exe中的指令装入到内存中交由CPU开始一条条的执行。\" J+ D3 I$ q0 c

  总结一下:程序是什么呢?说白了就是一个计划书,里面记载了先做什么后做什么。好的程序是好的计划,坏的程序就是坏的计划,比如:“收集炸药--à 买雷管--à制成炸弹-à放到张三的床下面-à引爆”,这就是一个坏计划,相对于计算机来说就是一个坏程序。坏程序有破坏作用吗?也就是说你写了个爆了张三的计划书就可以炸了张三吗?当然不可以,只有计划是不行的,还要去执行才能真正起到作用。所以,一个木马程序仅仅是存在于您的计算机中时并不可怕,可怕的是它执行起来。程序执行起来是什么呢?那就是我们要说的第四个概念“进程”--à 执行中的程序。

  \" t/ s- h% o/ Z概念四:进程。程序一旦进入内存中开始执行,就叫做进程(进程其实就是容纳指令与资源的容器)。也就是说,他已经开始工作了,开始买炸药、制炸弹了,等执行到引爆那一条指令时,张三也就完蛋了。所以,检查可疑进程,就是查杀木马的关键环节,也是重要的手段与方法。找到木马的进程,并结束它,在它执行到引爆这条指令之前,就停止它的执行,并将它的程序自计算机中删除掉,就是我们所要达到的目的。

  ! ]5 h3 a! w3 K; {, I说到这里,细心的读者们可能想到了一个问题,画图程序的执行,是因为我们向操作系统下达了画图的指令,所以操作系统才调入画图程序开始执行画图的指令序列。但是木马程序又是谁给操作系统下达的指令让木马的工作计划得到执行的呢?这就是我们下面要说的第五个概念“自启动程序”( T i! }4 Q, K- B& X

  概念五:自启动程序。顾名思义,自启动程序,也就是不用您自己动手它自己就可以启动起来开始执行的程序。这是些什么程序呢?为什么要允许程序这样做呢?难道是专为木马准备的?呵,当然不是。自启动程序有二大类,一是系统需要的;二是用户需要的。

  * \ Q( r: x6 M3 F系统需要的,是因为有些工作是无须经过用户同意,必须去做的。比如,鼠标驱动。为了能让用户使用鼠标,系统要自动加载鼠标驱动程序并执行。2 X$ ?# }: E9 I5 h+ ?+ b1 c

  用户需要的,一些重复性工作可能用户想让系统自动去做,而不是每天每时的重复这份工作。比如:用户可以设定多长时间无操作,就自动运行屏幕保护程序以便保护屏幕不被烧坏。这显然必须要屏幕保护程序能自动的运行,用户是不可能每次手动去执行这个程序的。

  7 L/ B1 }8 w/ w b: H# k而木马就是利用了这些本来是为系统或用户提供方便的手段,来实现自动运行它们自己的目的。如:木马用自己来取代屏幕保护程序,这样,长时间无操作时,运行的就不再是屏幕保护程序而是木马了。8 h9 h0 T$ S- O7 p) t! Q3 i

  在系统中有很多地方或方法是可以让程序自动运行起来的,这个我们在后面将一一讲述。而清掉自启动项,让木马程序得不到执行,显然也就成为了我们查杀木马的重要手段之一。( y) C/ R( ?/ ]- ^; {0 r

  而系统又是如何知道,哪一个程序应该在开机后就自动运行,无须等用户来操作呢?朋友们应该能猜到,系统肯定是把这些需要自动运行的程序都记录到了某一个地方,记录到哪里了呢?这就是我们要讲的第六个概念“注册表”

  , h! W5 w& a4 a2 u. c$ X# S, {概念六:注册表。注册表是什么呢?是系统记录信息用的一个数据库,举例来说它就像公司档案柜一样,发工资时,财务人员要查阅档案,以确定哪个员工应该发多少钱。就像系统启动时查阅注册表,确定哪个程序应该自动启动起来一样。

  9 T1 C- k+ T: Z\" j W这是一个非常宠大的数据中心,系统的关键信息都记录到那里,与现实中我们的档案柜一样,都很重要,一旦损坏将造成无可挽回的后果,所以微软公司不建议直接对注册表进行操作。当然了,木马的作者通常是不会理会微软的建议的。所以,木马通常都会将自己写入到注册表的某个自启动项中,以便开机时自动运行,而无须经过用户的同意。

  x/ `% |; V6 m8 C讲到这里,又有一个不容回避的问题出现了,上面我们说了,木马程序其实就是一个计划书,而为了执行这份计划书,木马需要把自己写到注册表中的自启动程序序列中去。而问题就是,这份计划书是如何来的呢?如果得不到执行,它又如何将自己写到注册表的自启动程序中去呢?不放到自启动程序中它就得不到执行,而得不到执行,它也就无法起到作用也包括无法将自己写到注册表中去……晕了,这成了先有鸡还是先有蛋的问题了。那么木马是如何进入我们的计算机并获得首次执行的呢?

  ; N: m2 H7 I5 \! I+ Y/ N这就是我们要讲的第七个概念了“侵入”

  : B, A7 j p3 ]% i9 T; l概念七:侵入。侵入是什么呢?也就是侵略进入喽,侵略需要被侵略者同意吗?当然不需要。将木马程序放入您的计算机,并让它得到首次执行的过程就是侵入。7 m( i1 r. o/ h. ~) Z/ ?: b

  侵入的方法有很多种,我们将在后面主动防御一章中详细讲解。因为,相信现在朋友们最关心的并不是如何不让他进来,而是……我的电脑中现在是不是正在执行着木马程序呢?已经执行到了哪一步呢?是否马上就要引爆了呢?我关机后下次还能打开不?

  0 Y6 ^( D: k+ y( b& j0 r好,接下来,就让我们进入下一章,一起来看看,电脑中正在执行的木马程序“木马进程”。

  ( n3 x d- b0 Y! D4 J4 ], A * S1 n5 e* F+ H8 X8 e$ E. x3 c8 B

  & b' ^) \) V7 ^9 a0 f/ m# E2 ^& s三、木马的查杀之进程篇

  % A2 C G4 o* \\" q, R3 h   1、进程的查看 ( X* H) ~2 o2 B1 a: O

  进程,我们上面说过了,狭义上讲就是正在执行中的程序。那如何来查看系统中都有哪些程序正在执行呢?(先看下图03-1:)3 v+ q* o' o3 ~) Q4 X, d* n

  

  \" ?( r v+ X' @1 I3 f系统自带了一个“任务管理器”可以使我们看到系统中当前的进程,在桌面下方的任务栏按右键,选择“任务管理器”或同时按下“Ctrl Alt Del”三个键、或同时按下“Ctrl Shift ESC”三个键,都可以打开任务管理器程序,看到上面的窗口。

  / `5 p' k8 v+ J- J   看到上面的图时,会不会有点发昏?20个进程,哪个是好的哪个是坏的呢?上面的信息又都是些什么意思呢?# x- t9 G9 M6 P3 v& c1 }6 L1 _; [5 Q

  不要着急,让我来教教你怎么来看这些信息。0 l2 E; G& |3 V\" N. y

  首先,显示哪些信息,是可以自由选择的,看到最上面的菜单没?就是“文件、选项、查看、关机、帮助”。依次选择“查看”---à“选择列”并勾选里面的相应项就可以显示相应的信息。

  # T8 C3 X\" U\" {+ p: `我们关心的是前五个,即:映像名称、PID、CPU、CPU时间、内存使用,下面依次进行介绍。

  ! }! [( n$ T+ jl    映像名称:即进程所对应的同名程序名字。其中有两个是例外,“System”代表的是系统,并没有对应的同名程序;“System Idle Process”代表的是空闲进程,同样没有对应的同名程序,它占据了CPU的空闲时间。7 ?% c8 a7 T+ V- _. p; T

  我们可以依据此栏,来找到进程对应的程序文件。

  3 J/ z& v\" l5 m fl    PID:英文件缩写,即进程的ID,是一个唯一的数字,唯一的代表一个进程。

  / S/ L, w u6 {2 N5 Y3 C7 x3 c8 Q要在这些进程中区分哪些是系统进程,哪些不是,用任务管理器显然很难做到,最好的办法是借助专业工具。(看下图:03-2)0 o7 B9 P7 j C N

  

  & u& ?) P, B+ l9 G v上图是用反黑工具狙剑查看进程时的样子,狙剑程序的下载地址:http://www.zhulinfeng.com/Download/SnipeSword.rar 下载后解压缩,运行里面的SnipeSword.exe0 ]$ n" w" k$ V! ^. S( s

  启动狙剑,并选择“进程管理”$ f' Z4 o; E& B6 l8 w$ N

  就可以打开进程管理页面,与任务管理器相比,首先映像文件带了路径,使您可以直接定位到程序文件。

  + s, A& r$ g2 S/ a: _% S- R: v$ {其次,多了父ID一栏,这个标明了该进程是由谁启动的,比如:smss.exe的进程ID是540,父ID是4 那么,我们就可以知道,smss.exe是由进程ID为4的system进程启动的,而smss.exe又启动了csrss.exe 与 winlogon.exe ,接着由winlogon.exe启动了lsass.exe 与 services.exe 。注意,有的进程并没有看到父进程,比如:Explorer.exe 它的父ID是:1216 但进程中并没有进程ID为1216的进程,这是因为系统在初始化时还有一个程序会自动运行,那就是Userinit.exe这个程序负责用户初始化工作,并负责启动Explorer.exe,而工作完成后,它就退出运行了,所以进程中并没有它。最近有个木马是通过感染Userinit.exe来启动的,由于Userinit.exe启动后就退出了,所以通过查看进程很难发现问题,这问题我们将在“自启动项”一篇中详细讲解。

  3 L9 {1 G+ g5 [ b2 c* ^0 Y以上就是系统启动的顺序,从System开始,依次启动了几个进程,正常情况下,上面这几个进程都是系统关键进程,结束它们的运行将导至系统出现问题。

  y' C. i- l$ z$ n* C有很多朋友对开机以后系统都做了些什么比较感兴趣,而这对系统不能启动时的故障查明也有帮助,可以通过判断系统停在了哪个环节来断定是哪个部分出了问题,在这里,我就对系统的启动过程进行一下简单的说明:; E7 n' j1 n# s+ ^; M8 n$ P1 t9 A

  系统的启动过程:

  $ k7 D; y* e; F' A2 Q. U* ?1、       当你按下开机键时,最早是由主板BIOS蕊片中的BIOS程序来执行硬件检测任务的,如果检查过程中发现关键硬件的故障,就会发出特定的响声通知用户,并停止启动。而BIOS程序是哪里来的呢?这是在主板出厂时固化在芯片中的一段程序。4 Y; l, ^, G8 U- Q+ H) V

  2、       当硬件没有问题时,BIOS程序就会读入硬盘的主引导记录,将下面的任务交给主引导记录代码去完成。而主引导记录又是哪里来的呢?这是在安装操作系统时对磁盘进行分区格式化操作时,写到硬盘中的。如果找不到主引导记录,会出错停止,告诉你这是非法的系统启动盘。" Y0 [: n# ~7 W6 H7 c7 f: l) B

  3、       主引导记录代码的工作是读入磁盘主分区的根目录,在里面读出Ntldr文件,并装入内存,然后将控制权交给它。注意看一下,你的硬盘根目录下是不是有个Ntldr文件?这个文件的属性是隐藏、系统,所以查看时要选择查看所有,且不隐藏被保护的系统文件才可看到。这个文件是哪里来的?呵,当然是安装操作系统时拷贝到硬盘上的,下面提到的文件都是在安装操作系统时拷上去的。如果没能找到Ntldr文件,则会停止启动,显示Ntldr 没找到的错误信息。5 h, S$ [) m% F1 n# F

  4、       Ntldr又做了些什么呢?它会将系统由原来的16位实模式切换到32位保护模式或64位长模式。它的工作是读取根目录下的Boot.ini文件,显然引导菜单,在多操作系统的计算机中,可以看到这个菜单。接着它会清屏,并在Win2000下显示一个黑白的进度条,在XP下显示XP的标志图同时显示下面不断滚动的蓝色进度条,提示你它正在加载一些重要的文件。它在加载什么呢?它首先会加载Ntoskrnl.exe、Hal.dll,如果这两个文件找不到会出错停机,并显示找不到相应文件的信息。接着它读入注册表的SYSTEM键文件,从中找出自动启动的各类驱动程序,这是很关键的,因为有些内核级的木马就是在这时启动的。每加载一个屏幕上的进度条就滚动一下子。中间如果某个驱动出问题,也可能会导至系统蓝屏崩溃。

  + c3 w1 I" G$ e1 T9 |; c; Y! i5、       接下来的工作由Ntoskrnl.exe(或Ntkrnlpa.exe)来进行,这是内核程序,它做的工作实在是太多了,这里就不再细说了。它的最后一步工作就是创建会话管理子系统,也就是我们上面说过的,由System进程创建的Smss.exe进程。 a- Q/ Q3 Z2 Q) @ }3 | J9 H

  6、       Smss.exe进程负责创建用户模式环境,由用户模式环境向Windows提供可视的窗口界面。; W0 ]! i p& _* d4 z

  它会运行BootExecute中定义的程序,正常情况下是Autochk,一个检查磁盘的程序。但有些杀毒软件会把自己的程序加到这里,来实现引导时杀毒,如果您的系统安装了江民类的杀毒软件,那么此时就会执行它的引导期杀毒程序,就是进入系统前出现的蓝底蓝字的病毒扫描窗口。

  . f& ~" ?0 n8 c0 h0 ^1 jSmss.exe还会执行SessionManager中的文件删除、移动操作,也就是调用API:MoveFileEx并选择重启后移除文件的,就是在这个环节执行了。当前有很多号称可以删除一切文件的安全工具都使用了MoveFileEx来实现文件的删除,但是现在我们可以知道了,它的文件删除是在这个阶段执行的,而这时驱动程序已经加载了,所以用它们来清除驱动级的木马显然是不胜任的。% I8 `6 _* e E8 c4 E

  创建附加的页面文件。

  k. x ]4 ? s加载Win32k.sys,这个东西又是做什么的呢?这是一个内核模式的系统驱动程序,它负责了窗口的显示、屏幕的输入、鼠标键盘和其它设备的输入及消息的传递等。所以也是由Win32k.sys将显示器的分辩率设置为默认值的,也就是这个时候,咱们的计算机屏幕才真正的细致起来,在此以前都是VGA模式,当然了视频驱动是上面装载驱动程序时就已经加载了的,现在只是起到作用而已。% }3 L6 {+ n; M

  再然后呢,就是启动我们上面说过的那两个进程了。就是Csrss.exe与Winlogon.exe进程。: H: ]0 h' K2 Q' \% m

  启动完这两个进程后,Smss.exe就进入了无限的等待,它在等什么呢?它在等它创建的Csrss.exe与Winlogon.exe ,等着看这两个进程什么时候死掉,一旦他们中有死掉的,Smss.exe马上罢工,让系统彻底崩溃。(在XP以后Csrss的死亡是由内核使系统崩溃的,而不是Smss.exe),所以千万不要结束系统进程。1 K6 t5 ~9 G) q7 q% g# _/ M

  Csrss.exe是做什么的呢?它负责的工作是创建或删除进程、线程,控制台与虚拟DOS机的支持等。它到此就开始工作了,不再参于后面的启动过程。但是Winlogon.exe还有很多工作要做呢,我们接下来看看后面的启动过程。( [6 p0 M) A" R

  7、       Winlogon.exe是做什么的呢?看它的名字应该看出个大概了吧。是的,它是与登录相关的,但现在还不到显示登录窗口的时候,它还要先启动Services.exe及Lsass.exe进程,然后读取注册表GinaDLL中标明的DLL,由这个DLL来显示一个登录对话话,也就是我们在进入系统时输入用户名与口令的窗口。

  ( M5 x2 s! w6 e/ E# T4 [3 z为什么要先启动Lsass.exe呢?因为,这是本地安全认证子系统,负责的就是本机系统的安全,用户名与口令的验证工作是由它来进行的。

  6 y* u! y& p4 w# F6 k" e还有一个我们上面提到过的进程也是这个时候由Winlogon.exe来启动的,是哪一个呢?就是那个Userinit.exe,这是在用户登录进系统后,Winlogon.exe启动此进程来进行用户初始化。你也可以自己加一个程序与Userinit.exe放在一起,那么,在这个时候Winlogon.exe会将那一位置的所有程序都启动起来。* V* `- a) O, k' F8 |5 {3 G) B

  当然了,相信你也想到了,这个还有那个GinaDLL也就成了木马启动的一个可选位置。- J. I, ^9 e7 N9 |, U1 H

  8、       最后,由Winlogon.exe启动的Services.exe开始加载标明为自启动的各个服务,及标明为手动的却是有必要加载的服务(它所做的工作我们在后面细讲)。

  ' D' F9 l- [% d* w9、       而Userinit.exe呢,它在完成用户初始化后,就启动了Explorer.exe,并功成身退。

  5 k( R) h. n+ G$ B' ?& d% q5 k$ k10、     最后,Explorer.exe就成了我们的服务员,等待在那里静候我们的指令,听从我们的吩咐,进行相关程序的启动与功能的处理。" x, \/ D: h+ j" i& H; E# J- b

  我们可以依据此栏来区分进程,尤其是同名的进程,比如:SVCHOST.EXE进程。

  0 \3 `4 A I- y" w D9 ?5 L9 ]l    CPU:即该进程当前消耗CPU的百分比,如果某个进程正在工作,那么CPU一列的数值就会是非零,工作量越大,其数值越高。例外的是“System Idle Process”进程,它的数值越高,说明当前的系统越是空闲,所有进程的CPU一栏的数值相加等于100%CPU占用。/ h: U; {4 M" y" n- W

  我们可以依据此栏来查看,哪些进程正在工作,哪些进程是空闲的。上面我们说过,同一CPU在同一时间只能处理一个工作,所以如果某一进程长时间大量占用CPU,那么将会导致其它进程得不到或得到很少的CPU时间来处理,使系统反应速度严重迟缓。这种情况的出现,通常是程序出现了问题,我们就要考虑结束掉霸占CPU不放的进程,并尽量查明原因。

  2 h) [; ^% S( @$ k/ `4 fl    CPU时间:自运行以来,该进程占用的全部CPU时间,此数值越大,代表该进程工作时间越长,注意,不是运行时间而是工作时间,如果运行后,进程只是等待,并没有工作,那么此时间也会很小。例外的仍然是“System Idle Process”进程,它占据了CPU全部的空闲时间。; m+ h1 o; Q# e1 f9 ?" \

  我们可以据此来判断,哪些进程在一直的工作,而这一直工作的进程是不是应该工作的正常进程。比如我们一直在画图,那画图程序mspaint.exe的进程CPU时间很长,那就是很正常的;而如果我们在听音乐,从来没画过图,但这里却显示画图程序用了大量的CPU时间,那很可能就是某个黑客或木马或其它进程正在偷偷的使用画图程序呢。

  2 E3 M" M) `9 @7 Tl    内存使用:标明了该进程使用的内存数量,要知道,系统中的内存数量是有限的,当某一个进程大量占用内存时,就会导至系统或其它进程可用内存量减少,而至使系统运行速度减慢。/ s1 W& L( _, g3 r/ n- i5 o" U; _

  在某些情况下,可以依此来找出系统变慢的原因,并尽量使用占用内存小的程序来提高系统的性能。虽然现在机器的配置都高了,内存也都大了,但在同等条件下,优先考虑使用占用资源少的程序也是有必要的。

  * j3 n8 y+ }* P3 j8 d8 U看完系统的启动过程后,我们再回过头去看那个进程图,是不是明白了很多呢?除掉系统启动环节中启动的进程外,我们再看其它的进程,注意看一下儿,剩余的进程是不是都是由Services.exe 或 Explorer.exe中的一个启动的。) \* x' e3 z& X- s$ {0 E+ R

  Explorer.exe是系统的Shell程序,响应用户的请求,并执行对应的程序的工作就是由它来完成的,比如上面我们说过的,您想画图时,将画图程序启动起来的就是这个程序。你想上网时,将浏览器启动起来的也是它。当然了,一些用户的自动任务也是由它来完成启动过程的。(这些我们将在下面的自启动程序一章中详细讲解)

  ' p0 r+ T1 K p1 `' v6 K: }+ iServices.exe是系统的服务控制管理器,由它启动的进程称为“服务”,是一组特殊的进程。此类进程是开机自动运行的,不依赖于用户的交互,说白了就是不用您管,它自己就会运行并且开始自己的工作,工作过程也无须您的干预。+ K9 `2 g& M) ?+ h3 g% x* X

  说到这里,您可能会想,这不就是木马所需要的么?不错,有很多木马是以服务进程的形式存在的。那我们可以管理这些服务吗?答案是肯定的,我们的计算机,我们当然有权力管理了。看下面的图03-3:) N+ M* t4 p0 @. z

  

  - @/ }- Q8 m+ u5 i% C/ Y4 A

  在桌面上“我的电脑”上面按右键,选择“管理”就可以打开如上图所示的窗口。依次选择:服务与应用程序----à服务 就可以看到上图右侧的服务列表。

  ! O- g. ~, r. A# u! G% y( L6 _最左侧的一列是服务的名称,需要注意的是这里列出的并非是对应的程序文件的名称,而仅仅是服务本身的名称。那我们又怎么知道这个服务对应的是哪个程序文件呢?如果我们想停止这个服务,并删除对应的程序文件,我们应该怎么做呢?

  ! c3 Q1 O. J U9 ~( Y" C5 f再看下图03-4:+ r& M9 c3 L4 V% F! Q- P

  

  s# N& W) B) V2 W在某一个服务上面按鼠标右键,选择“属性”,就可以打开此服务对应的属性页面,如上图所示。在这里,我们可以看到一些有用的信息,并对此服务进行启动、停止、禁用等操作。5 Y4 K3 A5 D& k5 y$ K$ }

  最上面的是服务名称,第二列是显示名称,第三列是关于服务的描述,也就是这个服务是做什么用的。当然了,我们不能迷信这里的描述,因为木马可以自行设定这个描述。再下面就是可执行文件的路径,也就是对应的进程与程序文件。这时我们再返回头去看03-2那个图,看一看进程PID为968的进程是不是就是这个“svchost.exe –k netsvcs” 进程呢?

  ; H4 v; i5 v$ E2 C   这时再注意一下,又会发现问题,首先,在03-2图中,Services.exe启动的服务一共是7个,而在图03-03中,已经启动的服务却有很多,远不止7个,再挨个儿的查看每个服务的属性,又会发现,有很多服务名称虽然不同,但对应的可执行文件路径(进程)都是一样的,都是“svchost.exe –k netsvcs”进程,这又是咋回事呢?这里我们要解释一下Svchost.exe这个进程了,这是一个特殊的进程。. H; n! V% }/ P. c5 Z: G- X- v

  从图03-1中我们可以看到名字为“SVCHOST.EXE”进程一共是五个,我们没办法区分它们有什么不同。而在图03-2中,我们再查看这五个Svchost.exe进程,却可以从参数上来区分它们了,虽然进程名字相同,但它们的参数却各不相同。对了,这就是区分他们的方法了,Svchost.exe是一个服务的宿主程序或者叫容器程序,它的里面是一组服务,而参数就标明了这一组服务的类型。如果英文不是太差,那么从它的参数上就可以看明白这一组服务是做什么用的了。

  " a$ @! t u8 W% K G; ]" G当然了,我们是来查杀木马的,当然不会满足于仅仅知道这是一组服务,这一组中是不是会藏着一个木马呢?所以,我们还要知道这一组服务都分别是哪一个,怎么来查看呢?再来看下图:03-5

  ( _/ Q+ w t# m4 U: d, |% ]

  + O. }' h$ `2 C% I) X0 s上面的是什么呢?上面的就是我们在第一章中所提到的“注册表”。依次选择--à开始---à运行---à输入“Regedit.exe”----à确定。7 o h) K) j0 \; ~2 q$ r+ b4 G

  就可以调用系统自带的注册表编辑器来打开注册表,再依次展开:HKEY_LOCAL_MACHINE---àSYSTEM---àCurrentControlSet---àServices,还记得上面03-4图中的服务名称么?对了就是那个“wuauserv”,在Services键下打开如上图所示的“wuauserv”再展开,选中其下面的“Parmeters”,看右边的窗口中,是不是找到了此服务所对应的程序文件了?就是那个C:\WINDOWS\system32\wuauserv.dll喽。

  ( b' F; z& ~; c) ^. f1 X9 u% G$ h   每一个Svchost.exe中的服务都可以通过这种方式找到其对应的程序文件。4 i! ]- ~4 u+ Z9 {( l+ |

  看到这里,朋友们是不是头都大了?这么麻烦啊?查个进程居然这么麻烦,而且就算找到了,又怎么能知道C:\WINDOWS\system32\wuauserv.dll是正常的程序还是木马呢?. P% P4 j; h& Y

  呵,不要着急,也不要怕。上面不是在教给你知识么,而且在当年,没有专业工具之前,我们可都是这么一个个来找的。当然了,现在有了各种专业工具,的确是没必要非手动去找了。

  4 s6 t9 h, L9 e! p2 `7 j再看下图03-6:$ i" g% v6 E4 ]0 ?$ s4 B. V

  

  ) u; [* z* T" _4 k在狙剑的进程管理列表中(图03-2),选中Svchost.exe,然后按鼠标右键---à选择“查看模块”,就可以得到上图中的列表,注意被蓝条选中的那个是不是就是费半天劲所找到的那个:C:\WINDOWS\system32\wuauserv.dll呢?' B( |9 a7 @- [/ C* r' ^$ G

  找是找到了,可如何判断这是不是系统的服务模块呢?这一点微软为我们想的很周到,他将大多数的系统文件都进行了数字签名,我们只需要检查一下这个文件有没有系统文件的数字签名,就可以准确的判断,这是不是一个系统文件。

  : k+ P3 J, A/ P' T7 |   如何检查呢?在列表中按右键,选择“隐蒇微软签名项”就可以将所有系统文件隐藏起来,剩下的就是非系统的文件啦,简单不?

  ! f/ b/ H x a3 e' O   数字签名验证还可以应用在对进程的判断中,在图03-2中,列表**有19个进程,这些个进程中哪些是系统的哪些又不是呢?我们仍然可以利用数字签名来判断,在列表中按右键,选择“隐蒇微软签名项”就可以将所有系统进程藏起来,剩下的就是非系统的进程。

  ' G+ d" k4 Q: s0 S, j- S5 D上面也说过了,一共有5个SVCHOST.exe进程,那我们是不是需要在每个SVCHOST.exe进程上都重复一遍,查看模块----à隐藏微软签名项 的过程呢?答案是不需要,在图03-2的进程列表中,按右键,里面的一个“扫描无微软签名模块”的选项,点击它一下,就可以列出所有进程中所有没有签名的模块了。

  4 ~! l; P1 w1 }   还有一个问题是,如果手头没有工具怎么办呢?就没有办法查看这些进程中的模块了吗?有的,仍然有办法,看下图03-7:

  4 e* y7 \* H4 _* ^

  $ b8 y2 B9 l1 L8 R! K依次选择“开始”---à“所有程序”---à“附件”---à“系统工具”---à“系统信息”就可以打开上面的窗口。在窗口中选择“加载的模块”就可以看到左边窗口中的信息,看到没?我们找的那个wuauserv 就在里面。这里面列出了所有进程加载的所有模块,可以参考,但也仅仅是参考,更多的情况仍然尽量的使用专业工具来检查,会更方便更准确一些。

  : b) ^/ U( n/ e% _另外,有很多木马是可以隐藏的,对于这一类木马,用系统自带的工具是检查不出的。注意看上面的几张图,发现没有,图03-2比图03-1中的进程多出来了一个Hide.exe 这就是下面我们要讲的“进程的隐藏了”。也许有朋友会说,是不是取图时这个进程已经关掉了呢?呵,没关系,我这里提供了Hide.exe程序的样本,您可以下载后运行一下试试,看是否可以在任务管理器的进程列表中看到它。& y4 F8 e& N( S7 A5 g

  下载地址:http://www.zhulinfeng.com/bbs/dispbbs.asp?BoardID=3&ID=78&replyID=&skin=1+ F6 `2 i- b, _7 ?, L! o

  里面还附了隐藏进程的源代码,懂编程的朋友们可以参考一下,看一看隐藏进程是如何的简单。) D1 h2 {; i% a @0 s6 X

  ) X7 f4 d8 | Q2、进程的隐藏与自我保护- U1 ^" Y; l$ t5 U0 l

  我们通过上面的讲解已经知道,进程是一个程序运行所必须的,因此检查进程也就成了查杀木马的关键环节,我们知道这一点,木马的作者们当然更知道,所以,如何隐藏自己的进程,就成了养马人处心积虑要实现的。

  ' [, m; z6 o9 I   说到这里,有懂的朋友们可能要笑了,心里更可能在说“连无进程木马都不知道,还好意思在这里显摆呢”。9 v& e* p2 B8 I/ `" p7 \

  一个程序可以无进程么?可以吗?真的可以吗?我可以很负责任的告诉您,在Windows系统下一个程序一定、确定以及肯定的会有一个进程,没有进程是不可能的。

  , ?' R/ ]- h$ P N   那所谓的“无进程木马”又是怎么回事儿呢?# ^9 }6 f+ E5 q9 l1 O. g

  第一种无进程木马是DLL注入型木马:! ]+ L0 u) ?7 W

  什么是DLL呢?DLL是动态链接库,当某一进程需要实现某一功能时,此功能可能是放在某一动态链接库文件中的,所以,当进程需要使用时就要将动态库文件加载到自己的进程中。举例来说,如果进程就是一个工厂,那么,调用DLL就是将工厂的某一部分工作外包给了DLL去做,而工作地点就在自己的工厂内。明白了吗?进程就是工作的厂地,即使外包出去了,也是需要地方干活的。“加载到自己的进程中”这一句是关键啊,并不是没有进程,而是用了其它程序的进程。像我们上面找了半天的那个服务:C:\WINDOWS\system32\wuauserv.dll,注意一下文件的扩展名,不就是DLL么,这就是一个典型的DLL文件,如果这是一个木马文件,那么,这就是一个典型的无进程木马,因为他没有自己的进程,我们在进程列表中看到的是Svchost.exe的进程。这个DLL是利用服务来加载的,在注册表中还有很多位置可以让一个DLL加载到其它进程中,这在后面自启动程序一节中我们要讲解。

  $ m( R% N* b$ m: U   但是,通过注册表来加载是可以的,但却不是唯一的,还可以通过另一个进程,来打开现有的进程,来将DLL注入到被打开的正常进程中,然后,执行注入的进程退出,这样,在进程列表中仍然看不到木马的进程。( @4 N" a6 m( B1 h" s: B) I

  第二种无进程木马是线程注入型的木马。0 b/ Z4 u$ y/ A: ~& D9 h* D

  什么是线程呢?上面说了程序就像一个工厂工人工作的流程表,而进程就是将流程真正的运行起来,正式的开始动手取原料--à加工---à组装---à验收等等工作。但是,我们需要明白的一点是,工人们是可以分成小组后同时进行几个环节的,第一组工人负责取原料、第二组工厂人负责加工、而第三组工人负责组装、第四组……这样,可以分工合作同时进行形成流水线。而这工厂里的一组一组工人,相对于进程与线程而言,就是一个进程中的一个个线程。线程注入又是咋回事呢?线程注入,就是木马程序将一个恶意线程放到了正常进程的线程序列中去执行,就像在工厂中多增加了一组自己的工人负责制造炸弹,这一组工人与其它的正常的几组工人没有什么关系,但却借用了人家的工厂去从事着非法的勾档。

  9 v, e2 p; o. t8 e1 S* K   线程注入与DLL注入的区别是,线程注入只是增加了一组工人,这组工人是在以工厂的名义在工作,对外的名义也是工厂的名字,出了问题是由工厂负责的。而DLL注入呢,是外包,可能会增加一组工人也可能会增加多组,是以DLL自己的名义在工厂内工作的,出了问题是由DLL来负责的。当然了,如果问题大了,工厂也会受牵连的。看下面的图03-8:

  , L; m' K& _6 W+ L5 f8 ?; Z! G/ C- e

  1 t, G" w, v0 G% H在狙剑的进程列表中,选中一个进程按鼠标右键,选择“查看线程”就可以查看此进程中的每一个线程,也就是查看每组工人的情况,还可以对某个线程执行暂停运行、结束运行等操作。, H9 ~* _$ r' t% G6 ]# F5 ^

  我们注意看上面的线程列表,最后一列,显示了一些DLL的名字,还有一个是EXPLORER.EXE,EXPLORER.EXE就是进程名字,我查看的就是EXPLORER.EXE进程的线程列表。

  5 y8 ^ s8 P( N( x3 V明白我上面说的区别了么?ntdll有三组线程在工作,那是ntdll在完成外包业务所需要的自己的三组工人;EXPLORER.EXE有一组,那是工厂自己的工人,如果存在线程注入,那么就会多出一个EXPLORER.EXE线程。但是需要注意的是,有多个EXPLORER.EXE并不代表就一定有线程注入,因为一个工厂也可以同时存在多条流水线。但只有一个EXPLORER.EXE那么通常情况下就是没有线程注入,因为一个进程肯定会有至少一个线程的存在,也就是说,一个工厂必定至少要有一组工人,皮包公司在Windows世界是不允许的。3 D D7 W5 e2 n7 q! [' W6 k! r i

  了解了什么是DLL注入型木马、什么是线程注入型木马后,查杀他们显然就很容易了。

  $ [1 o0 v6 P( g; u& w1 G- Y8 H; bDLL注入型的,查起来很简单,用上面说的方法“查看某一进程的模块列表---à再隐藏无微软签名的项”,就可以查出单个进程中被注入的模块;如果在全系统范围内查找,则使用“搜索无微软签名的模块”就可以将注入到其它进程中的模块找出来,而大多数工具都提供了“卸载模块”的功能,卸载后就可以删除了,或直接用“卸载后删除”的功能,但有一点是需要注意的,如果该木马使用了防卸载的技术,那么卸载此模块时就会发生异常,对此也不必担心,我们还有其它方法清掉它,比如:清除其自启动项,不让他有注入的机会;或直接删除其磁盘文件等。

  g* w% | H* W相比较起来,查杀线程注入型的木马,就比较困难了,我们上面说了,线程注入的没有自己的文件,只是一段注入的代码。也就是说他只是混入工厂内的一组工人,并没有自己的工厂也没有自己招牌,想把他与正常的工人区分开,是很困难的。这里提供了一个线程注入的测试程序:http://www.zhulinfeng.com/bbs/dispbbs.asp?BoardID=3&ID=78&replyID=&skin=1

  : v8 |+ `& f5 [先试一试看看效果,运行后,会打开一个窗口,但你却在进程列表中找不到有新增加的进程,那窗口是如何来的呢?这就是由注入到Explorer.exe中的线程创建的。这时你再查看Explorer.exe的线程列表,会发现多出来了一个线程,而线程的“模块”那一列(图03-8)标的名字就是Explorer.exe,这时线程列表中已经有两个名字为Explorer.exe的线程了,但哪一个是好的,哪一个是后来注入的呢?通常情况下看“基址”那一列(图03-8),基址数值较大的那一个一般是起动起来较晚的,就是后来加入的了,选中那一个线程选择“结束线程”,发生了什么?是不是那个窗口被关闭了?(注意:如果是用狙剑查看的,那么在线程注入后,查看新线程时,要重新刷新进程列表,不然会发现不了新注入的线程): `0 i7 t, k) B2 o2 R) N8 r& @1 A

  当然了,上面只是做个试验,让朋友们亲身体会一下线程注入是怎么一回事儿。真正查杀起线程注入型的木马来,用上面的方法显然是不行的,首先,我们不知道他注入到了哪一个进程中。其次,即使一个进程中有多个以进程名为名字的线程我们也无法确定那多出来的线程就是木马线程。所以,我们仍然要从自启动项入手来禁止线程注入。% G- a0 h* P6 w$ i6 b! k

  第三种无进程木马是纯驱动型木马

  ) Z# k: h# S" m% d什么是驱动型木马呢?就是全部功能放到了驱动程序中去完成(当然了,纯驱动型的并不多见,大多驱动型木马都是配了一个程序。)

  # U. ?% M) q$ S9 F2 C" x什么又叫驱动程序呢?驱动程序顾名思义就是驱使设备动起来的程序。^-^ 呵,可能不准确,但却很容易理解。其作用是让特殊的硬件和Windows操作系统可以交换数据,比如我们按下了键盘的A键,那键盘驱动就要告诉Windows系统“这家伙按下了A键,你看咋办吧”,它只是告诉一声,后面的工作就由系统来处理了,系统会根据不同的情况进行不同的处理,如果你是在打字,那就把A这个字符显示在你的输入页面中,如果你用的是五笔,显然直接显示个A是不行的,Windows系统就会把你输入A的这个信息转给了输入法程序……最终实现你按A的目的。' I7 b! C5 @/ o7 w1 N/ ~

  但驱动又怎么会与木马有了关系呢?这就要从头说起了,话说当年木马与驱动本来是分处于两个天地,互不相干的。但随着杀毒软件、安全工具等木马杀手对木马的围追堵截越来越是凶狠,木马终于感到有点穷途未路了,在最后关头,它盯上了驱动程序!为什么盯上了驱动呢?因为驱动程序由于其特殊性,使得它在系统中有着超越一切的权力,而且有着优先加载执行的优势,它是做为操作系统的一部分来运行的。详细情况涉及到系统权限的划分与优先级设定,有兴趣的可以查阅相关资料,这里只要明白一点就行“系统的权限分为两种R0与R3,一般的程序全部为R3权限,其行为受到了很多限制;而操作系统与驱动则为R0权限,拥有对整个计算机的全部权力,可以为所欲为”。

  ( Y# s1 g3 V: K6 M7 q% c3 W' S举例来说,杀毒软件就像一个公司的人力部,对员工的行为进行考核,发现不好的就给予惩罚或辞退。如果木马总是隐藏在员工群里,那么就会受到严格的检查与监管,一旦被查出有问题就会被立即辞退。而操作系统就是公司的董事会或股东大会,驱动程序是董事或股东,有着超出人力部门监管的权力。

  3 Y7 E7 K# ]- ^3 ], s7 l" {为了逃脱追杀,开始有木马以驱动程序的身份出现,当然了,木马这个驱动是没有硬件设备的,呵,如果中一个木马它就附带一个设备,那么,哪怕它只是给一支鼠标,我也会冲天大喊“木马们,都到我这里来吧”。所以它们有一个好听且很容易听明白的名字“虚拟设备驱动程序”。; V1 V9 L ~" \0 x1 E

  当木马成为公司的董事的时候,身为人力部门的安防程序开始感到郁闷,明明发现那家伙就有问题,但偏偏没权力辞退它。于是,杀毒软件开始谋求同样的身份,于是杀毒软件也开始挂驱动,使其有了董事的身份来兼人力监管,于是,新一轮的斗争开始了。而这一轮的斗争更是残酷,本来在员工层的斗争转到了高层,本来斗争的结果也就是员工被辞退,还不至于伤筋动骨涉及公司根本,但现在却是一不小心就让公司整个解体了。对应于我们这些可怜的用户来说,杀软与木马的斗争,一个不好惹来的就是蓝屏死机、系统崩溃。' m6 q& ^: _8 d; U

  OK,了解了驱动程序后,我们就要回到正题来了,我们如何知道系统加载了哪些驱动呢?又如何知道哪些驱动是正常的系统驱动,哪些是木马的驱动呢?看下图03-9:

  . o" {( D- ~( T0 p! S0 J

  + f# h. t3 | ~+ K* S4 T

  在桌面我的电脑图标上按右键,依次选择“属性---à硬件---à设备管理器”就可以打开上面的窗口了,再勾选上“查看----à显示隐藏的设备”就可以看到“非即插即用驱动程序”。

  2 |" E9 f% y3 R: F, g9 o# M除了非即插即用外,其它的同级项目都是您机器上的硬件及它们的信息、资源、驱动等,他们是根正苗红的正经设备。由于这些都与硬件有关,所以,木马动它们的可能性很小,必竟木马也不想你的机器崩溃啊。因此,大多数木马驱动都隐藏在“非即插即用驱动程序”下面,而这里面的则是那些虚拟设备了(注:非即插即用驱动程序并非就是虚拟设备驱动程序,这涉及到以前老版系统中的一些个问题,这里不再细说,您只需要明白,在当前的情况下,这里面大多都是虚拟设备驱动程序就可以了。)9 w& X j$ x) W9 u

  选中某一个项点鼠标右键,再选属性,得到下图03-10:

  ( I" p/ k9 K+ g4 J3 J

  " B0 q6 H& B$ R* Q

  一看到这张图,你最感兴趣的一定是“停止”这个按钮,但我不得不很遗憾的告诉您“是否能停止驱动程序的运行,还要看这个驱动程序是否愿意停止运行”,是不是失望了?呵,应该是意料中的,如果木马可以这么轻易的停掉,它们还混什么呐?从这里不要奢望得到额外收获,我们只需要了解一点就够了,这个驱动的状态是“已经启动”。9 I# Z2 C$ P+ Z( H

  接下来要看的是“驱动程序详细信息”这一栏。点一下,得到下面的这张图03-11:

  7 _' {# V0 V9 d% |4 h

  ! V( V# T r! U P1 C3 W* f

  看到没?这里面的就是驱动程序对应的文件了,至于下面的提供商、版权什么的,参考一下也就得了,如果木马愿意,它可以说它是“天宫”出品,版权属于“玉皇大帝”,那这里会丝毫不打折扣的给它显示出来,你说能信吗?6 a3 M% P) ^5 q6 w' c9 s( F

  按上面说的方法,你可以查看所有系统中加载的驱动程序,但很显然,这么做的确是很麻烦,那有没有省事点的方法呢?有,我们看下图03-12:

  & j3 c$ o; f1 M

  & E0 ?0 a y6 F看到上面这张图是不是有点眼熟?对了,就是上面我们查找模块时用到的图,打开方式同上,向上翻就可以看到了。蓝条选中的那个,不就是与图03-11中显示的是一个么。这里面列出了所有的驱动程序,不用一个一个找了。/ `8 r7 c+ [/ Q! v9 R; z: D9 Y

  到这里是不是有朋友有点火大了?明明有简单的法子,却带着我们绕了这么大一个圈子。呵,上图中的系统信息,其实也就是系统自带的一个工具,属于专业工具范围内的,且并不是太好使,木马想在这里隐藏信息很容易,而且禁止这个的运行也很简单。我们需要多了解几个法了,以备不时之需,另外,我们需要的是尽量多的学一些知识,这才是根本,了解了原理、懂得了知识,才能真正的成为高手,高手绝非只会使用工具。

  # d- S# _& E; a5 g& @说到工具,那我们再看看专业工具对驱动程序的显示:% m# ^1 {; q7 U$ w+ j; e+ I

  

  1 G7 h- H, |# l打开狙剑--à选择基本功能中的“内核模块”,看到没?dmload.sys不就在这里么。这么多,又如何来区分哪个是正常的哪个是可疑的呢?很简单,方法与我们筛选进程是一样的,按右键---à选择“隐藏微软签名项”,剩下的,就是非系统的驱动了。

  8 }0 ]# ` H* s" D这里同样提供了“停止运行”、“卸载模块”等功能,但我还得遗憾的告诉大家,卸载它也得它自己愿意才行,但想来木马是不会愿意被卸载吧,那我们就没办法了么?有,方法仍然与上面的相同,从自启动程序入手,禁止它的加载;或强制删除它的文件。" u" y: Y9 D3 [8 R7 u& X4 q6 W/ s

  那驱动级木马是不是就是真正的无进程呢?进程列表中找不到任何一个驱动程序的进程,而它也不像模块与线程一样,在其它进程内能够找到,是不是真的可以无进程运行呢?当然不是,我前面已经说了,一个程序的运行,一定、确定以及肯定的会依托一个进程,那这些驱动在哪个进程里呢?那就是System进程,它们是做为系统的一部分来运行的。2 I0 g2 T3 |9 O! s0 g& a

  3 I$ {3 z8 m0 H' A5 M# V S * t7 u- h: u3 x% p. @# Y

  第四种无进程木马就是利用技术手段隐藏进程的木马

  6 V& ?2 }4 L: I; ^这显然就不属于无进程了,上面说的三种,的确是没有自己的进程,只是利用了其它的进程。而利用技术手段隐藏进程的木马,则是有自己的进程,但是如果你破解不了他的隐藏技术,那你就看不到它的进程。就像上面我们拿出来的那个HIDE.exe一样,在任务管理器中看不到它的进程,而在狙剑中却能看到,这就是隐藏与破解隐藏后的结果了。# [1 ?$ I) V* v* _0 k# e2 U0 k {

  进程是如何隐藏的呢?这无可避免的会涉及到一些技术问题,下面我们尽量简单明了的说一说,详细的实现细节,请参阅相关资料。在这里,我所想达到的目的,并非是让您也同样写出一个能隐藏自身的木马,而是让您明白,什么样的手段可以隐藏木马的进程,木马又为什么会隐藏,而想破解这种解藏将它揪出来,又需要什么样的技术,好有针对性的选择一些专业工具。. i; ^+ B$ u+ i- p0 ?" @/ H

  同时,需要注意的是,隐藏进程的技术同样适用于隐藏DLL模块程序、隐藏驱动程序,下面为了描述方便,统一说为进程。

  3 N2 ~, D6 Y2 W& q& t4 E* \Windows系统给我们的开发人员提供了几种列出系统中所有的进程、模块、与驱动程序的方法,最常见的也是最常用的方法就是调用系统API:CreateToolHelp32Snapshot、EnumProcess、EnumProcessModules等,如果您不是开发人员,您不用关心这几个是什么东西,只需要明白,他们是获取进程列表的第一层手段,我们调用这几个其实就是在告诉系统,我们需要进程列表,然后系统就会将列表返回给我们。

  ) {& A$ ?7 C5 a5 ~' S而这几个API在接到请求后又做了什么呢?他们会调用ZwQuerySystemInformation,ZwQuerySystemInformation会调用KiSystemService切入内核进入R0权限,然后自SSDT表中查取得NtQuerySystemInformation的地址,并调用其指向的实际代码,而NtQuerySystemInformation的作用则是自系统的数据结构中取相应的数据,再顺原路返回去。0 s( M8 u+ x1 P0 q7 [

  在中间任何一个环节进行拦截都可以实现隐藏进程的目的,这种拦截有一个名字叫做“HOOK”,在切入内核进入R0权限前进行HOOK,称为应用层HOOK,而在之后进行HOOK则是内核HOOK,后者需要用驱动才能实现了。/ l) z z* a2 `7 S

  什么是HOOK?什么是SSDT?我们来举例说明:+ J7 a5 t+ M8 o

  Windows操作系统就像一个为我们管理电脑的服务公司,而他的工作机制是逐级上报,各负其责的,他派了一个服务人员时刻的跟着我们,看我们都有什么要求。6 X |- O$ p; K9 E

  当我们想查看系统中都有什么进程时,我们会告诉服务员,我们想了解当前都有哪些进程,那么服务员就会把我们的要求报上去,报给谁呢?他要先知道哪个部门负责哪个工作才行,SSDT表就是做这个的,SSDT表就像是一个路标,指明了什么样的工作应该由哪一个部门负责处理。通过查表得知负责的部门后,工作就被移交到了那个部门,工作完成后,部门会把工作结果交回给服务员,服务员再交给我们,而我们也就得到我们想要的结果了。

  / ^% n9 u$ O+ B3 S应用层HOOK呢,就像是服务员被木马偷偷的替换了,当我们提出要求时呢,他会检查是否对他有害,或将对他有害的信息去掉,比如我们想查看进程,那他在将结果交给我们时,却把木马的进程自结果中抹去了,这样,我们自然是看不到木马进程了。

  & d! o5 ?$ `9 ~3 g1 h0 s8 _而最常见的内核HOOK,则是HOOK-SSDT,上面说了SSDT就是一张表,标明了什么工作应该由什么部门负责。而SSDT HOOK也就是木马将表上的内容给改了,本来交给A部门负责的工作被改成了交给由木马负责,这样,服务员在上报我们的请求时,一查表发现查看进程的工作是由木马负责的,他就把这请求交给木马了,而木马呢?他可是知道表中原来的内容是什么的呀,他只是对请求进行一下过滤,发现没有对自己有害的,就直接转交给原部门了,对自己有害的,自然也就视情况滤掉或涂改了。

  4 `" E7 {# R/ A$ R0 }4 l我们先看看SSDT到底是什么样子的,看下图(04-14):8 |* V( W( c' n4 n! ~1 U

  

  ! P) v7 a! j/ H/ m依次选择狙剑---à扩展功能---àSSDT检查---à筛选可疑项,就可以看到上图,那就是一个SSDT表,从左到右依次是序号、当前地址、所在模块、HOOK类型、原地址、函数名。0 ?& w4 O1 `4 c

  上面都是狙剑自己对SSDT的HOOK,当前安全软件很多也用到了SSDT-HOOK技术来实现对系统的安全防护。" P' a% ^5 H: G

  例如上面的第11号函数,所在模块是“D:\workspace\狙剑\SnipeSword.sys”,HOOK类型是“HOOK”,函数是“NtAdjustPrivilegesToken”。这是狙剑本身对SSDT的一个HOOK,用的技术就是HOOK,HOOK的函数是用于增加进程权限的。HOOK这个的目的是“在木马进程为自己增加权限的时候进行拦截,提醒用户注意”这在主动防御一章中会详细讲解。, }% t% o) N- ~! Q3 A

  每一个函数都实现了某一种功能,比如:结束进程是由NtTerminateProcess来完成的(上图中最后的那个257号函数),如果HOOK了这个,那么在进程结束前,就有机会更改结果了,可以拒绝被结束。看下图(03-15)9 z% N, Z8 l4 X$ ]2 ~9 c! J6 P

  

  : V: p) e! U% H, c) d4 {3 [9 P

  7 n4 U, s( q' L# r; D当你试图在任务管理器中结束狙剑的进程时,系统会拒绝你的操作,其实这并不是系统拒绝的,而是狙剑自己,由于狙剑HOOK了SSDT,所以,结束进程的工作服务员都交给他去做了,他一旦发现结束的就是他自己,那他直接告诉服务员这个进程不能结束,然后服务员就把这个结果给我们了,其实我们的这个请求并没有真的到达应该送交的部门。

  . P2 i; k& h }* f- g而上面提到的查看进程用的NtQuerySystemInformation也在这里面,注意找一找就会发现了,如果想隐藏进程就可以把这个给HOOK了。

  $ D& h# A* ] B' k' G8 C- N) t需要特别注意一下子“HOOK类型”,上面的显示是“HOOK”,还有一种是“Inline-HOOK”,什么是Inline-HOOK呢?. o+ ^- W& H" E/ V! j8 |0 `- ?9 b% _

  上面说过了,SSDT就像是一个标明了什么工作由哪个部门来做的表,SSDT-HOOK就是更改了这个表的指向。而Inline-HOOK呢?他并没有更改表的指向,查找进程的工作在表中仍然指向了负责查找进程的部门。但是呢,木马却把那个部门中的人员替换了,这样仍然能达到它的目的。4 j# s7 |; _$ h1 z' K; n/ } Y5 ^

  Inline-HOOK更加的复杂、更加的邪恶、也更加的不稳定,而应用范围却是更加的广泛,查找起来更加的困难。要知道,对比SSDT表中的指向是否正确,是否指向了正确的部门,要简单一些,不就是一张表么,拿原来的表对比一下就知道了。但Inine-HOOK却是替换的公司人员,Windows就像一个大公司,有成千上百的人,天知道他替换了哪一个,我们先看看下面的图(03-16):

  1 L+ [% i0 o" a, J

  $ B, o. p' i' @8 Z) T+ ~# p

  当试图结束IceSword.exe时,会出来上面的图,IceSword.exe是另一款知名的安全程序“冰刃”的主程序,当您试图在任务管理器中结束IceSword.exe的进程时,就会出来“无法中止进程”的对话框。6 w5 M% }, x1 u/ A# G

  但是,当你检查SSDT表时,却发现,它并没有对SSDT进行HOOK,那它是如何实现进程不被结束的呢?2 y" v; c0 o, y/ J {4 Q3 l$ M' o/ l

  看下图03-17:

  G1 L$ x, m7 O1 t8 t. ?! s

  : o) H4 ?3 e& B选择狙剑---à扩展功能---à内核代码扫描 就可以得到上图。! p6 a" v& b9 w1 ^4 a+ s, m

  当然了,正常情况下,列表应该是空的,但当我运行起IceSword.exe(冰刃)后,再检查,就会出来上图中的7个Inline-HOOK项了。8 X- S9 j# H9 u" K4 Z% x, b

  内核代码扫描,是对内核代码中的Inline-HOOK进行检查,并列出被InlineHOOK的项。

  . u, D- i, G" p% F5 L+ L上图中,IceSword.exe的驱动IsDrv122.sys,HOOK了7个函数,前六个的功能分别是“结束线程、结束进程、创建进程、创建线程、打开线程、打开进程”后面的那个与进程无关我们不去理它。但从上面6个Inline-HOOK来看,你应该知道为什么他不会被结束了吧?

  % l* R8 Q- h6 M( F   还不能确定吗?那么,选中这些Inline-HOOK项,然后再在Inilne-HOOK的列表中按右键,选则“恢复选中的Inline-HOOK”,然后,你再打开任务管理器,试试结束IceSword.exe的进程,是不是可以结束了?

  $ Q/ t( B5 q+ f) c. C# N$ r讲到这里,不知朋友是否发现了一问题?我上面说了,NtQuerySystemInformation是负责查询进程的,但是那个隐藏进程的测试程序Hide.exe运行起来后,无论在“SSDT检查”中还是在“内核代码扫描”中,都没有任何有关这个函数的任何HOOK或Inline-HOOK的痕迹,这又是怎么回事呢?# \5 r4 S t8 {# ?8 u- D, Y

  不要着急,我们接着讲更深层次的进程隐藏技术。: g' k: k7 u8 l+ t

  简单的总结一下:程序就像是为了实现某一目的而定的计划书;进程呢?就是组织工人分配资源开始执行这份计划;而Windows操作系统呢?就是一个为我们管理电脑也是管理这些执行计划的工人的服务管理公司;我们有什么要求呢?就交给服务员将我们的要求提要给Windows,由Windows来组织工人执行我们的要求,并将结果返回给我们。如果木马替换了服务员、更改了SSDT表、或替换了Windows服务公司某职能部门的人员,我们得到的可能就是一个错的结果,或我们的要求得不到执行,就像结束进程一样。

  ' w0 h" l7 D' R Y, @如果不替换任何人员,也不更改SSDT表,还有没有办法隐藏进程呢?有的,那就是更改系统的数据结构。! |) l! G; V6 ]8 K, @9 T5 L

  举例来说,我们查询进程其实就是向Windows发出“查询当前正在有哪几组工人正在工作”的请求,而Windows在内部又是如何查询的呢?他当然会去人力部,因为人力部有工人的档案啊,在职的离职的都有,只要将档案一翻,就明白当前有多少工人了,再把结果给我们,它的工作就完成了。

  ! _% e# C- r- |1 m# X$ x. v更改数据结构,也就是更改档案了,虽然人员都没问题,但档案已经被修改了,木马会偷偷的潜入人力部把它自己的档案从人力部的档案柜中偷偷的销毁,这样,当系统去查询的时候,就查不到他的档案了,系统会认为没有这组工人,虽然查询过程与查询的人员都没有问题,但结果仍然是错误的。当然了,进入人力部是需要有一定权限的,不是谁都可以进去销毁东西的,注意到与Hide.exe在一起还有一个Sys.sys文件吗?这个文件也是一个驱动程序,它的工作就是获取R0权限,以便顺利的进入内核更改数据。

  ' T7 Z" _8 b" t5 a: @" \而Hide.exe之所以可以隐藏,就是因为它把系统活动进程链中(即人力部)的进程数据更改了。 O8 b0 ~' }& g: k

  那为什么Windows查不到它,专业工具却可以查到呢?这个道理很简单,因为Windows是正规公司,它的工作流程是固定的,查询工人的事情,他就是去人力部,人力部没有相关工人的信息,他就认为没有这工人,他并不会偿试去其它地方看一看。

  : R1 Z( n0 }8 Q) P2 T1 h9 D其实,工人们是不可能只在一个地方登记的,进入公司要在人力部登记、领工具却还要在仓库登记、发工资要在财务部登记、吃饭要在食堂登记……。) f) a" |. @. W; e2 L- Z5 R

  如果木马只是抹去了活动进程链中的数据,那么还可以从窗口、线程、句柄、对像、Csrss.exe中等许多地方找到它的信息。! P% e" B2 S; z. j9 l5 v; T6 }

  当然了,木马也会尽力的把自己的痕迹全部抹去,并且已经有马儿这么做了。( [0 g# P5 j& e# H1 o* k$ c6 e/ j: n* A

  于是,基于线程调度链的进程枚举技术就出现了,什么叫线程调度链呢?在系统中CPU的时间分配是以线程为单位的,一个程序要想得到执行,必须要有线程存在于这个线程调度链中,不然,他得不到时间的分配,也就得不到执行的机会。

  2 ?, z2 Z5 @% |3 X* w' t还以我们上面的例子来说明,木马可以抹去人力部的资料,反正已经进来了,那里有没有也无所谓了;也可以抹去仓库中的资料,工具已经到手了,抹就抹去吧;也可以抹掉财务的资料,豁出去了,为了完成木马大业就不要钱了;但是他不能抹去食堂的资料,不是么?食堂可是按人员档案备饭的,抹掉了,没他的资料也就意味着没他们的饭吃,还不得给饿死啊?而这关键的他无法抹去的资料也就是系统中的“线程调度链”,抹去了,他自己活不下去。8 a4 r" a n% l

  但不要小瞧了木马的智慧,它们也有自己的法子,什么办法呢?他们准备了一份假资料,在有人查询时呢,就用假资料替换掉真资料,而在食堂做饭时呢,再用真资料替换掉假资料,也就是自己构造了一个进程调度链。

  % w$ Q2 U' c: C% w& N1 ~$ I: g& k开始时还真是没人发现,不过,没有不透风的墙,出来混总是要还的,这技术最后还是让人知道了,即然知道了他们会随时替换,那查询时当然也就知道注意了,于是它又开始想其它办法,斗争就这么持继了下去。

  0 p! Q8 r6 L' k总之,安全与木马的斗争还远远没有结束,胜负还仍然没有分出(好像也很难分出),剿杀木马的工作仍然任重而道远,还我清净河山的愿景,还需我们大家齐心合力的来实现。

  ; k+ F* S. K6 Q# a上面对“进程”从外到里由浅到深的都讲了讲,当然了,讲的绝不对不全,因为实在太多了,就以隐藏来说,各路高人的各种奇思妙想多不胜数,多到根本无法尽述,比如欺骗眼睛的技术,就是你查时不管你,但你看时却自列表中抹掉,让你看不到,就像明明真实的资料放到了你面前,但偏偏有一个阴影档住了某处。5 [, _1 s L2 B2 ~* @! d

  但不管如何,邪恶永不能战胜正义,只要我们都关注,总有它们无处藏身的一天。( @0 G6 r" a( P+ ^/ S5 G& L1 v

  另外,不得不说的是,查看进程只是检查手段的一种,结束进程也绝不意味着就清除了木马。所以,我们还要继续下去。看看还有什么地方可以抓到它,清除它。

  + b8 q9 m& i" u6 l G而下一章,就是另一个关键点,自启动项的检查、隐藏与清除。: m ~; k+ J. b. w

  进程篇到这里就讲完了,接下来是下面的这些:

  : h7 J$ J j6 F1 v, j2 L# K

  % Q# G" W: l3 i9 {' W5 `8 g四、木马的查杀之自启动项篇 5 Y, K" d: x; ]5 e1 k! t

  自启动项的检查与清除,毫无疑问是查杀木马的关键手段与方法。而且,清掉木马的自启动项,让其自然而亡,是最优雅的杀马方法,不那么暴力也就轻易不会遇到反击。对驱动级的或注入型的木马,这种手段更显其优越性。" b( o% ~$ `1 L ?" q- U

  而自启动项的选择与设置,更是一种创意的体现,一些非技术型的木马通常可在此看到其作者非同一般的创造性思维。6 {, ~1 g/ X6 B: f

  自启动,顾名思义,就是无须用户干预而自行启动的程序,按启动方式又分为两种,一种是开机自运行的程序;一种是触发式启动的程序。

  5 ?* l z" ~/ A' `1 S8 |下面我们将分别来解剖之,但在此之前,我们先要学习一些基础的知识:

  0 M0 q8 A0 w. b1、注册表基础

  ' i5 s+ f, b6 F. L" H4 s. g2 y由于大多数的自启动位置都在注册表中,所以,首先,我们需要了解“注册表”是什么。' E* z1 L) A' a( F6 u- a" ]

  注册表从功能上说,它是一个存储各种设置信息的数据仓库,系统的全部设置几乎都存在那里,比如:你用的是什么墙纸、什么屏保、IE的首页、IE窗口的大小等等。当然了,开机时需要加载的驱动、开启的服务、运行的程序等等也都存储在这里。

  / n4 N& Y$ W( c: _0 ? O% c而从实质上来说呢,注册表其实是由一些记录配置信息的文件组成的,这些文件中的大部分存在“\Windows\System32\Config\”目录下,还有一部分存在用户配置文件夹中,也就是下面将要讲到的03-24图中的用户文件夹中。

  0 R. f# M0 z( m, I& V这些文件有一个很难听的名字叫做储巢,也就是朋友可能听过的HIVE文件。( A% A1 t8 @ Z& d

  由于注册表对系统实在是太重要的了,任何损坏都有可能造成系统彻底的崩溃,所以,系统对注册表的保护也是很严密的,正常情况下,你无法对注册表HIVE文件进行任何的直接操作,看下图03-18:

  9 _' y: A' [* N- c+ T4 c

  ! R O* f$ Q) N) C: R" }& a. N

  你不仅无法打开、修改,你甚至无法进行拷贝操作。而系统保护注册表的手段,就是由系统以独占的方式打开注册表文件,这样你的任何针对此文件的操作,都将被拒绝。下面,我们来验证一下,看下图03-19: 6 Z2 Y# n0 ?- Z) x1 \# Q% o( W/ ]1 X

  

  6 X- {( X- W* L打开狙剑,选择“进程管理”,在进程列表中选中“system”进程,再选择“查看打开的文件”,就可以看到系统打开的所有文件,看上图中蓝条选中的那一项,是不是就是我们无法进行操作的“\Windows\System32\Config\system”文件呢?

  ; U$ [8 r1 [- x1 R, H e8 _* j3 j   注意:狙剑提供了关闭其它进程打开的文件的功能,关闭后,本来无法操作的文件就可以进行正常的操作了。但是,那是对付木马的,而不是对付系统的,因为木马也同样可以利用独占打开的方式来禁止我们对其文件的访问。关闭系统打开的关键文件将发生无可预料的结果,切勿偿试!(关于文件相关的内容,我们在以后的章节中会有详细的讲解。)

  ! Y- z0 K2 I+ }. F# F/ a4 D- W   那我们是否就无法操作注册表了呢?当然不是,系统在保护注册表文件的同时,也提供了操作注册表的工具-“注册表编辑器”。

  8 H0 q/ O, `. T! K在“开始”菜单中,选择“运行”,输入“regedit.exe”就可以打开注册表编辑器,打开后的情况是这样的,看下图03-20:

  6 ~# X. Y) L) p. t4 L/ k[url=http://www.zhulinfeng.com/Xuan/071119/image002.jpg]


  ! M; J4 C6 u* ?

  0 n; ~- j0 p; B) c7 V3 _上面的各项称为“键”,最上层的是“根键”下面的叫做“子键”,其与上面我们说的注册表文件一一对应,对应关系如下:3 |! G# g: O4 D$ f+ O3 n% p

  l    HKEY_LOCAL_MACHINE\SAM à Windows\System32\config\sam

  % a+ P0 y8 U6 S& I6 @5 al    HKEY_LOCAL_MACHINE\SECURITY à Windows\System32\config\security$ V1 F- Q0 i6 |: p: [$ M% V

  l    HKEY_LOCAL_MACHINE\SOFTWARE à Windows\System32\config\software

  3 F$ O2 C0 z$ r+ I' X: |$ Wl    HKEY_LOCAL_MACHINE\SYSTEM à Windows\System32\config\system

  9 d. B8 W2 k6 r f) }% ^( el    HKEY_USERS\.DEFAULT à Windows\System32\config\Default

  3 F& A$ ^2 o$ M) q" jl    HKEY_USERS\S-1-5-XX_XXX à \Documents and Settings\用户名>\Ntuser.dat) ~- L: {+ A& U5 m0 b/ {* e

  l    HKEY_USERS\S-1-5-XX_XXX_Classes à\Documents and Settings\用户名>\Local Settings\Application Data\Microsoft\Windows\Usrclass.dat0 M" r5 r% T8 J

  还有其它的键呢?又对应哪些文件呢?呵,这要从注册表的数据类型说起了,除了上面的键外,其它的几个键是属于REG_LINK类型,直翻过来就是“注册表链接”了,这种类型的键是透明的指向另一个键的一个链接,也可以理解成这些键只是另外的某个子键的快速入口或某类相似键的汇总而已,本身并没有文件,其链接的键对应如下:; x n( d4 c4 ?4 j$ l' E

  l    HKEY_CLASS_ROOT 中的内容来自于下面的两个注册键: HKEY_LOCAL_MACHINE\SOFTWARE\Classes

  8 v) F1 R: q) ^ w9 ?HKEY_CURRENT_USER\SoftWare\Classes

  8 R( j" _+ ?* rl    HKEY_CURRENT_USER中的内容是当前用户的信息,来自于HKEY_USERS\S-1-5-XX-XXXX à \Documents and Settings\用户名>\Ntuser.dat

  $ C" o( O* L6 L1 t! J4 T4 }( ul    HKEY_CURRENT_CONFIG中的内容来自于HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\Current, }3 o* \. _# ]0 }3 X9 j& N

  当你修改有链接关系的任一键中的数据时,对应的链接键也会体现出来,比如:你修改了HKEY_CLASS_ROOT中的内容,那么你的修改也同时体现在了HKEY_LOCAL_MACHINE\SOFTWARE\Classes中,因为这本就是同一个文件中的同一部分数据。( x: Z: [ L6 R: j* O0 }" l7 z

  下面我们再简单的说一说SID(安全标识符)也就是上面的“S-1-5-XX-XXX”,其后面部分我用“XXX”取代了,后面是不定值。

  8 U( [) ?" M5 ?* S2 j   SID前面的定义是固定的,比如:S-1-5-18是本地系统账户(Local System)S-1-5-19是本地服务账户、S-1-5-20是网络服务账户等(更多信息,请参考专业资料)5 E6 f% \" [7 x+ A: P# A, q2 x

  而SID后面的部分是全球唯一的,就是:329068152-606747145-682003330-1003那部分,在注册表中这个是保存了当前用户的配置信息,也就是HKEY_CURRENT_USER指向的部分。(关于用户的概念请参考后面的相关章节); j- g+ G. B ^# {

  接下来,我们再看看每个键中都存储了哪些信息:

  6 R& V3 A# l3 F7 |# m" ~- K/ pl    HKEY_CURRENT_USER中存储了一些与当前登录用户有关联的数据,也就是你个人的一些设定都存在了这里。

  0 ^/ }" d: o- |5 w1 Ul    HKEY_CLASSES_ROOT中存储的是文件关联和COM对像的注册信息,什么样的文件由什么程序来打开就是存在了这里。! R0 F! B# n9 k6 U) Y9 @8 k0 o

  l    HKEY_LOCAL_MACHINE中存储的是系统相关的信息,比如:驱动、服务等。

  6 F; `6 n; S1 M# h% ]5 Z Ql    HKEY_USERS存储的是所有账户的信息。

  6 K9 J5 j: o, [7 ^$ Wl    HKEY_CURRENT_CONFIG中存储的是当前硬件配置信息。% O8 o+ }) z* @$ \3 p

  呵,上面都是一些基本的知识,看起来有些枯燥,能理解就理解,理解不了就算了,并不影响后面对木马的查杀。这里之所以讲这些,是提供给想深入了解系统知识的朋友的,要想成为高手就不能不了解这些。

  ! k1 I9 X: {: `+ Y9 P. [, q下面我们再来点动手的,提一提精神。那些禁止我们打开、修改甚至不让我们复制的注册表文件我们难道真的就没办法看看里面是什么吗?嘿,不知道有没有好奇心跟我一样重的朋友。想当年,我可是想尽办法也想看看怎么把那些文件给打开的,呵,没办法,好奇心就是重。我们下面就动手来看看,那里面都是些什么神秘的东西,系统居然看都不让我们看。3 @, r3 b$ i% Z7 U; K7 l9 R

  先看下图03-21:

  ; j0 e3 F' w J Z

  . X$ G2 K" X9 P, I! U) B4 r1 H

  打开狙剑,选择“磁盘文件管理”,在打开的选择框中选择系统盘,然后找到Windows\System32\config\目录下的注册表文件,按右键,选择“复制文件”。在弹出的保存框中,给新文件起个名字。OK了,我们成功的复制出了系统本来不想让我们看到的注册表文件。(怎么复制这些不能复制的文件、怎么删除不能删除的文件等我们会在后面的“木马的查杀之文件篇”中统一讲解”)

  2 p7 P+ ]) S4 h" U1 g- @   文件复制出来了,我们怎么来看里面都是什么呢?两种方法,一种是用十六进制编辑器查看,当然了,这种文件是特殊格式的文件,用十六进制编辑器看,看得一定是有些晕的,要做好心理准备哦。第二个方法就是利用Regedit.exe(注册表编辑器)的“加载配置单元”的功能。9 @$ q u( y$ q, D

  这里,我们讲一讲第二种方法,打开注册表编辑器,先选中HKEY_LOCAL_MACHINE键(注意:这一步不要省略,不然加载配置单元项是灰的,也可以选中USER键),然后依次选择“文件”à“加载配置单元”。如下图03-22:

  ' H& A7 B2 S4 n" {/ i

  * V3 V/ e P3 v1 k& b! ~& e

  在弹出的选择框中选择我们刚才复制出来的注册表文件,在项名字中随便输入一个名字,这里我输入的是“Test”,然后,就加载成功了,看下图03-23,是不是多出了一个Test键呢?这个键跟System键的内容是一样的,因为我们复制的就是System注册表文件:

  6 A0 u3 y' u0 Q' J

  ( |5 F9 m2 B( N注意一下儿,Test里面少了这个键“CurrentControlSet”,为什么会少一个呢?不用我说朋友们也应该知道为什么吧?什么,不知道?那再看看他的名字“Current-Control-Set”这回知道了吧?对了,这个键也是个链接键,是从ControlSet001与ControlSet002中链接的内容,是“当前的”设置。所以,文件中是没有的。而注册表编辑器是从内存中读取的注册表内容,因此是有的。

  3 @8 t: i j0 G选中“Test”键,在文件菜单中选择“卸载配置单元”就可以卸掉这个键了。7 Y0 L3 w. \# X% q

  好了,基础知识讲到这里,应该是够用了,我们接下来就分别讲解一下子,开机自动运行的程序与触发式启动的程序。

  ; U' L7 `2 x3 x0 K3 _* Z2、开机自运行的程序 ) M o6 X* A1 d: Y4 I# V0 ]/ O

  “开机自动运行程序”是操作系统为方便用户的使用而提供的一个方法,让每次开机都须频繁操作的一些工作得到自动的执行。而木马只是利用了这一方法,来完成自己的非法启动目的罢了。

  , y8 M# d4 K }. O+ x最经典的启动位置,也是操作系统特别提供给用户的位置就是“启动文件夹”,在开始菜单中选择“所有程序”,里面的“启动”就是了。放在此文件夹中的所有程序,都将在下次启动时用户登录后,自动启动起来。这里面涉及到“用户”这个概念,先看下图03-24:

  2 [% E( d( \6 j7 w

  * A# G! ?! ^4 p红框中的就是当前系统中的用户,由上到下分别是“所有用户”、“默认用户”、“本地服务账户”、“网络服务账户”、“SnipeSword用户(当前用户)”。前面四个是系统创建的,后面的那个是我们自己创建的用户(名字是我们自己取的)。在“所有用户”、“默认用户”与“当前用户”中都有一套大致相同的配置文件,也就是说都有一个“启动文件夹”。

  7 [6 ^4 @% ^ b4 Z% E0 V启动文件夹是系统提供给我们使用的,但不知道从什么时候开始,就已经很少有人再用这个位置来启动程序了,包括一些正常的需要自启动的第三方程序,也都不再利用这里来启动,而是直接操作注册表来实现程序的自启动。

  : z6 n* q: r/ g% D! |与启动文件夹相比,注册表操作对用户来说,是更神秘而不易查看与操作,我不知道没有技术原因放弃启动文件夹而利用注册表来启动的那些正常软件是出于什么考虑或出于什么目的,但这种形为,却有必要BS一下儿。

  0 ^$ R3 [5 _% H/ X0 w下面我们就接着讲注册表中的自启动项,将那些正常的、或非正常的自启动程序,从我们的机器中揪出来,我们的机器我们作主,即使是正常的程序,大量的开机自运行也会造成系统资源的不必要的浪费与消耗,使系统的运行速度减慢。所以,清理自启动项,并不仅仅是查杀木马,这同时也是优化系统时很重要的一步。

  3 L$ ?# p# z8 Z$ H" F2 H我一直对那些为了商业竞争而漠视用户权力与自由的所谓正当软件深恶痛绝,我绝不想因为一年中仅用了一次某一软件的某一功能,而就任由这软件在365天中每天都自动运行起来,消耗掉我宝贵的系统资源。而菜鸟的机器在同样硬件配置的情况下,通常要比高手的机器慢上很多、难用上很多,这些垃圾软件对资源的无谓占用就是很大的一个原因。

  ! [: _+ I5 D* cOK,闲话少说,我们下面步入正题。

  7 T& m. M4 |* D: j7 @4 J9 S   最早加载启动的是驱动程序,这是可以理解的,因为硬件设备与底层功能是由它们来实现的,不先加载它们哪行呢?比如:在加载文件系统驱动之前,所有对文件的读写都是无法实现的,你想能不先加载这些驱动吗?

  & A$ Y; Z' z/ j0 ]$ Q   系统启动时,由引导程序Ntldr来读入system注册表文件,加载里面列出的驱动程序。细心的朋友这时可能会有个疑问,文件系统驱动是在这时加载的吗?回答是肯定的“是的”,那按上面的说法,文件系统加载前,对文件的读取是无法实现的,那么Ntldr又如何读取system注册表文件的呢?呵,能看到这个问题的,我不得不赞一句真是细心啊。答案是:因为Ntldr中内置了只读的NTFS与FAT文件系统代码,虽然很简单但足够用了。再追问下去,Ntldr也是以文件形式存在的,那Ntldr这个文件又是如何读取的呢?Ntldr是引导扇区中的引导代码加载的,而引导扇区中有更加简单的文件系统读取代码,区别是越向上越简单,一直到文件系统驱动接手后,才是完整的文件系统代码。引导代码中的文件系统代码简单到只能读取根目录中的文件,所以Ntldr只能放在根目录;而Ntldr中文件系统代码已经能读取子目录中的文件了,所以驱动是可以放到任意目录的。

  & i# Y9 o9 V J5 I! A% K& l+ h   我们接着来讲驱动的加载,驱动肯定不是一个,那先加载哪个后加载哪个呢?我们先来看一个图03-25:

  6 x5 [0 P6 x9 l4 I, w& Y

  1 ~: @ p i% Q7 h上图中是一个典型的驱动在注册表中的注册内容,系统加载时,就是依照这里的内容进行驱动加载的,这个驱动在注册表中的:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\sr键下,也就是在System注册表文件中。这是XP-系统还原所需要的一个文件过滤系统驱动。

  $ L0 G% p* X9 c! H2 ^9 ]注册内容中的各项含义如下:

  1 ?$ I' ]+ ^, U9 m& fl    DisplayName :这是服务名称,在前面一章中我们讲到服务管理器时讲过,这个名字就是在服务管理器中显示的名称,没什么要紧的,随便起一个就行。

  + a2 w( o8 \ M7 w) t( t& H5 T+ Sl    ErrorControl :错误控制码,可以取值为,0 à 忽略任何错误;1 à 如果出错,显示一个警告;2 à 如果出错,且有最后一次正确配置则启动最后一次正确配置,否则继续引导过程;3 à 如果出错,且有最后一次正确配置,则使用最后一次正确配置,否则显示蓝屏崩溃。这里的“最后一次正确配置”是指在启动过程中按F8键进入高级菜单后的其中的一个选项,利用这个选项通常可以正常进入系统。

  ' ?3 T: Z1 Q9 V+ Cl    Group :组的名称,这个根加载顺序就有关系了,我们放到后面详细讲。

  / s: @- T/ l9 S6 _8 ~. L Ul    ImagePath :驱动或服务的执行文件路径。需要注意的是,如果一个驱动有这一项,那么系统会根据这一项中标明的文件进行加载,如果驱动中没有这一项,系统会自动在Windows\System32\Drivers\目录下寻找与注册键同名的驱动加载。1 w2 \* @/ _4 v+ `) k7 g

  l    Start : 驱动或服务的加载启动顺序。可取值为,0 à Ntldr预先加载此值为零的驱动,在引导过程中这类驱动一直待在内存中;1 à 在标明为0的驱动初始化之后,值为1的驱动开始被加载到内存中并初始化,其是在内核初始化的过程中加载的(参见进程篇的系统启动过程)。2 à 在Services.exe启动后,由该进程来加载启动值为2的驱动或服务(Service.exe的情况请参阅进程篇);3 à Services.exe根据需要加载这类的驱动或服务,也就是在服务管理器的启动一项中标明为“手动”的。呵,这里有个概念性的误区,标明为手动并不是指一定要由用户来手动启动,而是由系统识情况启动,当系统需要相应的驱动或服务提供的功能时,系统就将自动启动此服务,而无须用户手动操作;4 à 驱动或服务并不加载到内存,当然也不启动了。也就是服务管理器中标为“禁用”的服务,这一类的服务,即使系统需要用到其提供的功能,也不会自动加载。. d$ c& p- f7 \2 H, N

  l    Tag :在组中的顺序,这也是根加载顺序有关系的,我们同样放到后面讲。( {8 P& z! }' j* Q

  l    Type :服务的类型,可取值为,1à 设备驱动程序;2 à 内核模式的文件系统驱动程序;4 à 已废弃;8 à 文件系统识别器驱动程序;16 à 该服务运行在一个只能容纳一个服务的进程中;32 à 该服务运行在一个可容纳多个服务的进程中;256 à 允许该服务在控制台显示窗口,并接收用户输入。$ A8 [) Y+ G/ y6 S" K& p4 ^

  除了上面的Start决定了加载顺序外,还有Group与Tag来共同作用决定驱动的加载顺序,下面我们来讲一讲这两个,先来看图03-26:, C) p% x+ Y2 m4 r

  

  / }- S; [, U+ }; V nHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder键如上图所示,表明了一个组的概念,驱动是分组并按组来分别按顺序加载的,Group决定了驱动是在哪一个组中,而Tag却决定了在同一个组的哪一个位置上。注意一下儿就会发现,Start值为0的驱动基本上都是分到了*前的几个组中。- U( [1 `% {9 W+ V6 F% n6 d6 ?1 E

  了解了上面的知识后,只要你有足够的耐心,那么你就可以将系统中的驱动加载顺序搞出来了。

  5 G! w8 q' T! u1 z# ^) o/ a y   驱动加载后,还有一些系统启动过程中需要的程序会得到加载执行的机会,可以参考进程篇中的系统引导过程来看,这里就不多说了,而且应用程序的启动顺序永远无法超越高启动级别的驱动,所以讲他们启动顺序也没多大意义。) f8 U9 g7 I: h( a+ b; B

  在注册表中可以启动程序的地方很多,不可能一个个的都讲一讲,也没那个必要。同样的,我们也不可能手动来从注册表中查找每一个启动项,启动项的查找只有依*专业工具来进行,才是最佳的选择。

  , h* D! L, k/ [$ t6 S7 F) d; M启动项管理软件中最出名的无疑是Sysinternals出品的AutoRuns.exe这是国外的一个专业启动项管理工具,很出名。但是如果用于清除木马,这个工具很显然是远远不够的,就像它的名字一样,这是一个“启动项管理”工具,它虽然列出了很全的自启动项,但却缺少反黑工具所特有的查找被隐藏的启动项、清除被保护的启动项的能力,我相信我这个评价还是很客观的。在后面的“自启动项的保护与清除”一单中我会再详细讲解。+ ~9 I& z; |6 [

  现在我们再看看狙剑的自启动项管理,狙剑毫无疑问是借签了AutoRuns.exe的启动项,另外加入了一些AutoRuns.exe并没有列出的启动项,从全面上来说应该是更胜一筹了,呵,说来也惭愧,站在巨人的肩上总会比巨人高一头的。当然了,最关键的还是狙剑做为一个专业的安全工具来对自启动项进行管理,充分考虑到了木马病毒对自启动项的隐藏与保护,加入了隐藏HOOK的恢复,所以,更适合安全相关的自启动项管理,我们看看下图03-27:- O: n( `1 A/ D8 O2 h( f9 h8 c

  

  & J [/ @0 j" \& R; m+ q! J" a# ~注意,下面标明了自启动项的数量是810,只是这个数包括了分类条目,所以实际的会少一些,但怎么也应该在790+,这种数量的启动项,用手工来找,很显然是不现实的。另外需要注意的是,在驱动与服务的枚举中,狙剑将启动值为4也就是标为禁用的驱动与服务同样列了出来,这是为了防止有些恶意驱动,在加载完成后,就将自己改为禁用,等关机时再改回0值优先启动而考虑的。7 D3 i m! Z# u& l- [2 ~2 t& h

  对于这大量自启动项的判断上,我们也将用进程判断的方法来进行判断,也就是数字签名验证,在启动列表中按右键选择“隐藏微软签名项”后,就会将全部有微软签名的启动项隐藏,剩下的也就没多少了。

  $ y$ O7 n1 T. m' k, C9 A4 H   在正常情况下,清除掉所有的非微软签名启动项,是不会影响系统正常使用的。但有些情况是需要注意的,比如:Tcpip.sys是网络驱动,正常情况下是可以通过微软数字签名验证的。但有些下载软件比如迅雷会修改此驱动以达到最大的连接数,而由于Tcpip.sys被改动后,将不再能够通过微软的数字签名验证,所以,在不特别注意下,清除所有非微软认证的自启动项时,就会将这个驱动清掉,导致无法上网。

  3 s( V3 d$ ]2 u, S. R   另外,向进程篇中提到的Userinit.exe的情况也是类似的,Userinit.exe同样为系统必须的程序,但如果这种程序被感染了,那么,直接清掉就会存在问题,当然了,安全程序在清这类启动必须的程序时是不会删掉启动项的,但作为我们用户来说一定要搞清除哪些是木马的启动项,那些是被修改或感染的系统启动项,对这种被修改或感染的系统文件的处理,最佳方式无疑就是利用“系统文件修复”功能了。而千万不要直接手动清除相应的启动项,清掉后,将导致系统功能出现问题甚至不能进入系统。, E+ ]9 O9 [! g1 \! y! A

  所以,对启动项进行清理时,在隐藏微软验证的文件后,仍然要对剩余的进行判断,有针对性的清理,当然,判断的过程是需要经验的,但是,想成为一个高手,这份经验的积累是必须的,世界上没有白吃的午餐,不想做一个使用傻瓜式软件的傻瓜,那么一些必要的学习与充电也就是必须的。第一次清理时不知道,上网查询或求助,第二次就知道了。相信,不长时间就可以完成经验的积累。

  ( Q5 F0 s1 v; [   最后需要说明的是,新的启动位置仍然在不断的挖掘中,没有哪个软件敢说全,只能是比较全而已,仍然需要不断的补充与完善。

发表于 2008-1-25 15:27:20 | 显示全部楼层
建议楼主重新编辑一下
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

西户网/西户社区网 XHUME.CC 版权所有  陕ICP备11003684号  

本站信息均由会员发表,不代表西户立场,如侵犯了您的权利请发帖投诉【网站营业执照公示】

平平安安

本站信息均由会员发表,不代表西户网/西户社区网 XHUME.CC 立场,如侵犯了您的权利请===>>>发帖投诉

陕公网安备 61012502000141号

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