HIPS与现代木马- 成祎的日志- 网易博客

HIPS与现代木马

2010-05-19 19:25:07 阅读10 评论0 字号:

HIPS

{dy},什么是HIPS~!版区里面有关于HIPS的概念的详细表述,相信大家也都看到了。不过相对于“主机入侵防御系统”这样的专业称呼,我更喜欢把HIPS称为“行为拦截工具”。试想一下,一个病毒样本,如果杀软的病毒库有对应的特征码,则无论这个样本有没有运行,杀软都会马上报警,然后隔离这个文件;而对于HIPS来说,如果你不运行,则HIPS永远不会有提示。可见,HIPS是拦截了用户在操作计算机过程中程序产生的行为,并提交给用户进行判断的工具。所以,叫它“行为拦截工具”虽然有点局限,却也还算恰当。

第二,对象。学过编程的人应该对这个定义有所了解。现实生活中的“对象”就是人们常说的“东西”。对于系统来说,进程,程序,文件这些都是一个个的“东西”,也就是对象~!

第三,事件。这也是编程中会涉及到的一个概念。对于不熟悉编程的人,其实也不难理解。这跟我们生活中的事情没什么不同,是一种加在对象上的“作用”。比如,用鼠标指针指向某个程序,并且双击,这个双击就是一个事件。

第四,规则。规则与现实中的法律类似,法律是人必须遵守的行为规范,而HIPS的规则则是程序必须遵守的规范。而且一旦设定了,只有可能被绕过,而不可能违反。

清楚了这几个概念,我们就可以来理解HIPS的工作方式了。

既然HIPS可以被叫做“行为拦截工具”,那么任何一个程序试图进行某种操作都相当于产生了一个事件。在这个事件中,有两个对象,一个源对象,一个目标对象,如果没有HIPS,我们当然不会知道这个事件是什么,而HIPS会拦截这个事件,并且提交给用户进行判断。

请看下面这张图

看,在这个提示窗口里面,HIPS给出了明确的信息,源对象是explorer.exe,目标对象是FlashFXP.exe,而事件就是:程序explorer.exe试图启动一个未注册(没有匹配规则的)程序(FlashFXP.exe)

(上面这个提示框,在HIPS上手初期最为常见,当用户双击桌面的图标试图运行一个程序的时候,HIPS就会提示explorer.exe试图运行XXX.exe进程。事实上,这就是我们双击的那个操作!)

根据上面的简单分析不难看出,在任何HIPS事件中,源对象都是正在运行的进程,而根据目标对象的不同,HIPS就分为了AD,RD,FD这3D。AD是源对象对Application(程序)或者源对象本身(源对象本身也是Application)产生的行为,FD是源对象对Files(文件)产生的行为,RD是源对象对REG(注册表文件)产生的行为。

HIPS拦截了一个事件,并且进行规则的匹配,如果有规则能够匹配,那么就按照规则进行相应的操作(放行这个事件或者阻止),如果没有对应的规则,则弹出对话框,提交给用户做出判断。这就是HIPS的工作方式了。

好了,有了这样的认知,就可以迈出{dy}步了。读懂提示是使用HIPS的{dy}步。让我们结合下面的几个截图来说明一下,如何读懂HIPS的提示。

这是一个AD的提示


这个提示窗口明确的告诉了我们,在这次拦截的事件中——

源对象是:KMplayer.exe
目的对象是:所有运行的程序(实际上是安装了一个全局钩子)
事件是:将操作对象DINPUT.dll注入到所有的进程中。

这是个FD的提示


这个提示窗口的信息是:

源对象是:Explorer.exe
目标对象是:C:\windows\foobar2000_0.9.5.1.exe
事件是:Explorer.exe试图对C:\windows文件夹下的foobar2000_0.9.5.1.exe进行操作(此处是个用户将foobar2000_0.9.5.1复制到受保护的C:\windows下面的操作)

下面这个是RD的提示窗口


这个提示窗口的信息是:

源对象是:regedit.exe
目标对象是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run这个下面的键值
事件是:regedit.exe试图在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run下面创建一个suchost的键值。也就是我们常说的添加一个自启动项了。

从上面的分析可以看到,按照对象和事件的方法,我们就可以从提示框中获得足够的信息,起码我们知道了,提示框中提交给用户判断的到底是什么进程在试图进行什么操作。这也就是HIPS的本质:拦截事件,并提交给用户进行判断。

了解了HIPS的工作方式,能够清晰的读懂HIPS的提示信息了,那么接下来我们就要步入HIPS这座花园,来看看面对各种各样的提示,究竟我们该做些什么!
AD部分
AD部分是整个HIPS最重要的组成部分,也是最复杂的部分!
下面这张图里面就显示出了HIPS的AD能够拦截的事件。



说实话,这些事件里面,很多我也不知道具体含义。不过从字面意思应该大概知道它代表着什么。

那么在看到这些纷繁复杂的事件的时候,我们该如何选择呢?毕竟,HIPS拦截了一个事件,并且弹了个对话框出来,就是要我们在“允许”和“阻止”之中选择一个做为回答。对于不同的事件,我们要区别对待。虽然做为菜鸟,我可以不是很明白这些事件背后到底隐藏了哪些秘密,但是,我仍然可以按照一种简单的方式来进行选择。

让我们先来给这些事件分一分等级吧。

最危险的事件:

直接操作内核
加载驱动
访问物理内存
底层磁盘操作

毫无疑问,这几个事件是最危险的。很多教程里面,在给一般的应用程序创建规则的时候,这几项都是会被直接阻止的。那是因为,这几个事件意味着,用户将有可能丧失对系统的控制,因为,这几个事件一旦被允许,相应的程序就会获得极高的系统权限,如果是病毒或者木马,后果就不堪设想。

一般危险事件:

创建远程线程
修改其它进程内存
安装服务或驱动
加载全局钩子
加载库文件
结束,挂起进/线程

这个级别的事件,危害性虽然没有前面几个大,但是仍然不能小瞧,一旦选择错误,后果一样会很严重。而且,由于很多正常的程序也会有这样的动作,因此,这个级别的判断难度是{zd0}的。

其它事件:

关闭,重启系统
修改时间
键盘记录
模拟键盘鼠标

这个级别的事件,对系统本身的危害性比较小,不过可能会造成丢失帐号等个人损失。而且,修改时间和模拟键盘鼠标会被某些木马用来关闭杀软和逃避杀软的查杀。

将事件按照危险程度分类以后,判断起来就容易多了,对于危险性较小的事件,可以不用太过紧张,即使误操作,还可以补救,对于危险性较大的事件,就要谨慎对待了。

FD和RD



FD和RD的事件很简单,除了FD多出一个读取外,主要就是创建,修改和删除。那么FD和RD的危险等级实际上取决于FD和RD所指向的区域的危险等级。关于FD和RD究竟应该保护那些部分,有相关的帖子,大家可以自己看看。

讲完了事件的分类,我们来看看出现事件的情况有哪些。

事件的出现主要有两种形式:
1、有用户参与的情况:双击桌面图标打开一个程序,在浏览器里面点击一个下载链接,安装软件,复制文件……这些都是我们平时的操作,都是由用户发起的。在没有创建对应规则的情况下,HIPS都会有对应的提示框弹出来。这种情况比较容易判断,只要对系统的操作稍有了解,就应该知道,HIPS拦截了哪些自己的操作,那么只要按照提示框的指示,一步一步进行选择,创建对应规则就可以了。注意,这里不一定都要选择允许(比如你刚刚好想阻止某个程序调用IE的弹出广告……)

2、没有用户参与的情况:这种情况也很好理解。还记得06年流氓软件大流行的时候吗,经常有人会问:为什么我开机什么都不干,桌面上就弹出十几个IE的页面,有时候上着网也会突然弹出来。这就是典型的没有用户的参与的情况。杀毒软件的自动更新也属于这种类型。这种情况是用户最应该防备的,也是最能体现纯手动HIPS特点的。还记得我说过的,纯手动HIPS可以做到对系统的xx控制吗?在有完备规则的情况下,纯手动HIPSxx可以做到,用户不让电脑做的事,电脑就没法做……扯的远了,回到主题上来。在没有用户参与的情况下,一旦有事件被HIPS拦截,那么用户就应该更加仔细的判断,这个事件的发起者(源对象)是谁,目标对象是什么,它最终想完成什么操作……一旦发现可疑,就应该立刻阻止。

那么究竟什么样的事件算是可疑呢?!

其实,病毒、木马,本身也是一种程序,跟普通的程序相比,只不过是要完成的目标不同而已。只要是程序,都需要首先进入用户的电脑(FD),途径可以是网络(网页挂马,与其它软件捆绑,利用虚假信息诱骗用户主动下载等),可移动设备(U盘,移动硬盘,光盘……)等。病毒程序进入本地后,仍然需要运行(AD),只有运行起来的病毒,才真正有破坏性。病毒运行后,一般都会释放几个病毒文件到硬盘(FD)的某个路径下(一般是系统路径)并且运行(AD)。病毒不仅要当时能够运行,也要做到以后每次开机都能够运行,这样才能长时间发挥作用。于是,病毒需要添加自启动项(RD)或者添加服务或者加载驱动(AD)。病毒当时也许逃过了杀毒软件的查杀,但是现在的杀软每天都会自动更新,病毒入库很快,为了长期逃避查杀,病毒会想方设法关闭已安装的杀软(AD),破坏杀软的文件(FD),并且阻止用户安装其它杀软(AD)。有些病毒为了能够保证自己重复运行,会感染系统里面的原有文件(FD)。有些病毒为了防止自身被有经验的用户手工查杀,还会破坏安全模式,注入dll文件进系统关键进程(AD)并且守护病毒的本体…………

说了这么多的病毒行为,大家可以看到在病毒整个从下载到运行并破坏系统的过程中,HIPS有多少机会可以阻止病毒的破坏。这也是手动HIPS安全性高的原因。因为一个程序(无论是正常还是非正常)的运行过程被HIPSxx分割开来,想要运行起来并产生破坏,就要经过多次的询问,这中间任何一个环节,用户选择了阻止,都能够有效的起到防护的作用。同时,xxx一的一个提示仍然无法得出准确结论的话(比如iexplorer.exe从temp文件夹启动了一个1.exe),那么后续的一系列高危险动作(释放病毒文件到系统目录,注入dll到系统关键进程,添加自启动项……)就应该能够让用户可以很清楚的意识到,这是个病毒!!

对于HIPS提示做出正确的判断,是需要用户掌握一定的系统知识的,经验越丰富,判断起来得心应手。基本上,熟悉了HIPS的工作原理,能够读懂提示框的信息,并且能够根据经验和系统知识来对提示信息进行分析和判断,就已经算是迈进了HIPS这座花园了。随着经验的积累,越来越多的情况能够被正确的判断,HIPS的提示也会越来越少,用户对HIPS和系统的了解也会越来越深入。

不过,这仅仅是步入了HIPS的花园,想要欣赏HIPS花园中的美妙风景,就要更进一步的深入HIPS的核心。那么纯手动HIPS为什么能够在高手的手中做到xx控制自己的电脑呢,就是因为HIPS最核心也是最重要的部分——规则!
三、触摸HIPS的核心——规则

HIPS之所以能够发挥作用,规则可以说是它的核心。用过Vista的人,应该知道UAC,每次运行一个程序,即使是以前运行过的,甚至是刚刚关闭的同一个程序,UAC也会弹出提示,让用户来选择。没有规则的HIPS就是这样一种效果,用户就会陷入无限的烦恼之中,每一次都对相同的事件进行相同的选择。很多{dy}次接触HIPS的新人也是因为这一点而感到无所适从,甚至很快就感到厌烦而放弃继续尝试HIPS。



这里的“创建此操作的{yj}性规则”和“以后按照此操作运行”就是创建一个对应程序的规则。这个规则将进入HIPS的规则列表。以后再有这个事件发生的时候,HIPS将会根据规则的设定,自动选择应答,而不会再次弹出对话框询问用户。

其实,HIPS在拦截事件后,弹出对话框提交给用户判断之前,都会先在规则列表里面进行匹配,如果有合适的匹配规则,则HIPS就会根据规则的设定来进行合适的操作,放行或者阻止。

纯手动HIPS初期繁琐的弹窗,正是因为,用户的所有程序,在HIPS列表里面都没有规则,那么每个程序触发的任何事件都会被提交给用户。因此学会创建规则,就会大大减少弹窗的负担,让用户从繁琐的判断中解脱出来。

如果来编写规则呢?让我们先来熟悉一下规则吧!

HIPS的规则可以分为两种类型:

{dy}类,主动规则,或者叫源对象规则。这类规则一般是AD部分的规则。它所匹配的是源对象的行为。规则所面对的目标对象一般为任意。

这张图里面就是一个应用程序的对应规则。

这个规则规定了在这个应用程序发生任何行为的时候,HIPS该做出什么样反映。它所面对的目标对象是任意的(当然,这里可以在规则里面对特定的目标对象添加例外规则)。比如,根据规则,一旦Maxthon.exe有加载驱动的行为,无论这个驱动在哪个路径下,是无害的驱动还是恶意的病毒,HIPS都会阻止这个事件的发生,但是如果规则里面编写了一个例外,允许Mathon.exe加载HTTP.sys这个驱动,那么当所加载的驱动是HTTP.sys的时候,HIPS会自动允许这个加载事件。其它的sys依然会被HIPS无情的拒之于Maxthon的“门外”!可见有了这个规则,在我们运行Maxthon的过程中发生了任何对应的事件,HIPS都会按照规则进行匹配,自动做出判断,没有弹窗,HIPS就能忠实的保护着我们的系统。

第二类,被动规则,或者叫目标对象规则。这类规则一般是FD和RD部分的规则。这类规则,限制的是针对目标对象的事件。规则所面对的源对象一般是任意的。就是说任何一个进程在试图对规则指定的目标对象进行操作的时候,都会触发规则。

这就是一个被动规则。它是一条FD规则,目标对象是:C:\WINDOWS\system32\*.exe,C:\WINDOWS\system32\路径下的任意可执行文件。(*.exe是通配符的写法,请参考有关帖子)。规则的源对象是任意的。根据规则,任何进程试图在C:\WINDOWS\system32\下面创建一个exe文件,都会被规则所阻止。(这里,也可以编写例外规则来对可信任的进程进行排除。)

这两种规则类型可以是独立的,也可以组合在一起,形成一种更为精细规则。比如:阻止某个源对象对某个或某些特定目标对象的某些操作。只要用户愿意,当然可以对每个进程都xx到,它可以加载哪些dll文件,可以对哪些文件夹进行读写操作等等等等…………一旦规则编写到这种程度,对系统的xx控制也就可以实现了。不过,这里又有一个问题了,前面说过,HIPS在拦截到一个事件以后,提交给用户判断之前,要先对这个事件进行规则匹配,那么如果规则过多过细,必然会影响HIPS的工作效率。尽管现在的计算机运算速度很高,10条规则和100条规则也许几个时钟周期的差别,根本感觉不出来,但是,要是1000条呢,更多呢??何况,规则越多,编写起来难度越大,众多的规则也许还会存在彼此冲突的问题。

这就涉及到编写规则的方法了,很多帖子都讲过。基本的原则当然是尽量合并同类型的规则,规则越精简,执行效率就越高,冲突的可能性就越小,编写和维护的难度就越低。因此,在FD,RD部分,大部分的规则,都是用通配符来实现的。

其实,HIPS所涉及的规则基本上都可以称之为“例外”规则!所谓“例外”,就是在普适法则之外的一些特例!从HIPS的工作方式上就不难理解。HIPS的工作方式就是拦截一个事件并且提交给用户判断,其实,这里就涉及到了一个HIPS软件里面的{zg}规则——“拦截全部事件”,而当用户对一个事件做出了一个判断,并且选择了“记住我的回答”,那么这个事件就会被添加成一个例外。也就是我们说的规则。也就是说,事实上所有的规则都是“拦截全部事件并提交给用户判断”这条规则的例外规则。

由此可见,编写HIPS规则是离不开例外规则的。

编写例外规则的原则基本上也可以分为两类:

{dy}类:大部分放行,阻止少部分事件的黑名单规则。

所谓“黑名单”,原意是指列有一些行为不端的,不守信用的,甚至是犯有罪行的人的名单。在HIPS的世界里,我们可以理解为一系列被阻止的事件。比如,我们可以创建一个规则,允许任意程序向%WinDir%\system32\文件夹下写入任何文件,但是禁止写入spoclsv.exe(熊猫烧香的一个典型文件名)。这样,写入其它文件都不会有问题,而当病毒试图释放spoclsv.exe到system32目录的时候,规则就会阻止这个事件,从而保护了系统的安全。

第二类:大部分阻止,放行少部分事件的白名单规则。

“白名单”跟黑名单相对,意思就是规则允许的事件。白名单规则就是在全局阻止的情况下,放行用户需要的事件。比如,我们可以编写一个规则,阻止explorer.exe运行任何exe文件,但是允许explorer.exe运行QQ.exe,这样,用户在任何exe文件上双击,都会弹出无法运行的提示,而唯独QQ可以正常启动。

从上面的分析不难看出,黑名单规则相对比较宽松,而白名单规则则比较严格。因此白名单一般用来创建AD规则,允许运行的进程毕竟有限。而黑名单规则一般用来创建FD和RD规则,大部分分区和注册表区都允许读写,对于比较敏感的区域,则创建规则予以保护。这样的搭配,既可以保证易用性,又能{zd0}限度的发挥HIPS的作用!

规则,是HIPS的核心和灵魂。规则的强弱,好坏,直接影响着HIPS的工作效率和效果。关于创建HIPS规则的帖子有很多,技巧也有很多,这里我就没办法一一的讲了。建议刚刚接触HIPS的新人,找一个别人写好的规则,学习一下。学习高手的规则是每一个新人的必经之路,通过学习规则,新人能够更快的掌握自己所用的HIPS。个人认为,关于AD部分,主要应该学习哪些事件是应该阻止的,哪些事件应该选择“询问用户”,哪些一般可以放行……关于FD和RD,主要应该学习如何利用通配符来写保护规则,保护一组目标对象;系统里的哪些部分是应该利用规则来做防护,具体的防护规则应该如何决策等等~~~

学习规则的目的是更好的编写适合自己的规则。所以,对于新人,我给出一个建议就是,你可以先拿高手的规则使用,看看效果,并且熟悉你所用的HIPS,一旦掌握了编写规则的技巧和方法,就应该借鉴着高手的规则,按照自己的习惯来重新编写,这样才能够进步和提高,单纯的拿来主义是不能用好HIPS的!

 

很多年前,安全软件不像现在这样复杂。
那时的天是蓝的,水是清的,木马是跑在R3的,杀软是全靠特征码的。当时打开任务管理器看两眼就可以知道有没有木马运行。
然而,好景不长,随着NT内核的大范围普及(2000 / XP ......),一种新兴的木马——Rootkit型木马诞生了。(Rootkit的本义并不指木马,其意义与其本义相比有所引申,但是大量的木马使用了Rootkit技术)
当时{zj1}代表性的,在国外来说,是Hacker Defender(hxdef100),在国内来说,则是大名鼎鼎的灰鸽子。
这类木马的普遍特点是,能够良好地隐藏自身,躲过常规分析手段和杀软的检测,包括注册表关键位置隐藏,文件隐藏等等,这些木马一度让当时的杀软束手无策,用户更是摸不着头脑,因为常规检测方法已经无法发现它们了。
于是,一类叫作ARK的工具被发明了,ARK——Anti-Rookit,反Rootkit工具,当时在国内的代表是Icesword、DarkSpy等,在国外则是 Rootkit Detector等。这些ARK工具同样使用了Rootkit技术,于是能够发现Rootkit木马的踪迹。而一些杀软为了遏制Rootkit木马,也在xxxx软中应用了Rootkit技术。同时,越来越复杂的文件加壳技术使传统特征码杀毒引擎捉襟见肘,许多杀软一方面大力改进启发式引擎,一方面融入了最初的HIPS的雏形,即简单的注册表控制等功能。同时一些早期的HIPS工具也开始逐渐应用Rootkit技术,如WinPatrol、SSM等等。
时至今日,Rootkit技术已经广泛应用于木马、安全软件、流氓软件中。现代木马几乎全部是Rootkit木马,而安全软件也几乎都应用了Rootkit技术,臭名昭著的某"XX上网"中也大量应用了Rootkit技术。
以下的"现代木马"均指Rootkit木马.
----------------------------------------------------------------------
正文

现代木马如何隐藏自身?HIPS如何监视系统动作?
为了解释这个问题,首先简介一个概念:接口
简单介绍如下:
以家用电器为例,我们要用影碟机看电视的时候,只需要把影碟机的接口插到电视上去就行了,我们没有必要知道接口接进电视里面以后是怎么走线的,因此任何一个人都会使用影碟机。
如果没有接口,那么用影碟机的人还得知道影碟机的线具体要插到哪块电路板上,要不要滤波,要不要做其他处理,这样的话,会用影碟机的人就没有几个了。

另一个例子,一个班主任带领一个班。他想知道谁没有交作业,并不需要一本一本的去翻。他只需要找学习委员这个“接口”告诉他:“我要查作业”。然后,学习委员也不必自己亲自一本本去翻,他只要告诉各科课代表这些“接口”,告诉他们:“你们去统计一下各科作业。”,各科课代表再去告诉下一层接口——小组长们:“去检查一下你们组的作业。”,小组长检查完作业以后,把情况报告课代表,课代表报告学习委员,学习委员报告班主任。
这样,班主任不费力气的就统计完了作业,整个过程,每个人都只负责解释上一层的命令给下一层,直到{zd2}层去执行命令。


那么现在开始简介NT内核:
拿我们常用的下载工具迅雷来说.如果没有接口,当迅雷储存文件的时候,就要先把文件转成2进制,然后计算当前可用的空间开始于磁盘的第几柱面...第几扇区之类的详细信息,然后检查分区的文件系统是什么,检查完以后,针对相应的文件系统采用不同的记录方式,甚至需要检查硬盘的品牌,然后使用对应的控制电流来让硬盘将指定区域的小磁块磁化成"1"或者"0"

现在来看一幅Windows NT内核的示意图:
(细节部分并没有详细画出,这幅图画出了Windows NT内核操作系统中,应用程序执行某些操作时的基本流程图)。


当有了接口,迅雷只需要调用相应的Win32 API,告诉系统,文件的位置和内容,然后Win32 API会被Windows系统继续解释成Native API,经过内核调用KiSystemService处理程序,在SSDT里找到NtWriteFile函数的位置,然后继续调用,进一步被解释成驱动程序指令,传递给文件系统驱动(FSD),在这之前,如果有过滤驱动,那么先通过过滤驱动,由过滤驱动一层层解释给下一层,{zh1}达到FSD层,之后被进一步解释,直至解释成控制硬盘读写的电流.每个接口要做的都只是把上一层命令解释给下一层接口,最终难以直接使用的电流控制可以用一条简单易记的接口调用来实现.因而编写软件才显得如此容易.

再介绍一个概念:运行级别(ring).在x86的处理器上(主要是Intel\AMD的主流处理器),可以存在四个运行级别ring0-3,Windows NT系列系统(XP/2003......)使用其中的两个,就是ring3和ring0两个级别,用户程序运行于ring3级别,而ring3级别的程序不被允许直接访问硬件,这样一方面也是为了防止程序错误的操作导致系统崩溃或者硬件故障.对应的,系统内核运行于ring0级别,拥有对全部内存区域的访问特权,也可以直接访问硬件.
现在加入运行级别的概念,再重新看一下这幅图:



可能有些乱,我们来整理一下.(以下的"函数",通通替换为"功能",以方便理解.)
1.首先,应用程序产生一个请求,比如他要修改注册表,那么他调用Win32 API接口中的注册表操作相关功能.(RegOpenKey等等),实质是调用advapi32.dll中的相应功能.
(Win32 API的功能主要位于kernel32.dll advapi32.dll user32.dll gdi32.dll等库中)

2.advapi32.dll中的功能受到调用,于是他继续解释而调用ntdll.dll中的功能(Native API接口).
(Native API的所有功能封装于ntdll.dll,但是ntdll.dll并不是真正的执行者,他的任务只是将调用传到内核.)

3.ntdll.dll中的功能受到调用(NtCreateKey等等),于是他把对应的功能编号存入eax寄存器,然后使用SYSENTER指令,导致"自陷"(早期使用触发Int 2e中断的方式,不过他们的效果是一样的),KiSystemService处理程序将运行.
(这个就像你在银行里取钱,你把存单放到玻璃下面的凹槽里去,然后叫柜员,他会把存单取走,然后给你钱,看起来是你取出了钱,但事实上是银行内部提出的钱.ntdll.dll就是取钱人,他把功能代号(存单)放到eax寄存器里(玻璃下方的凹槽),然后引发自陷以触发KiSystemService(叫柜员),柜员就会去实际处理交易(执行对应功能).)

4.KiSystemService从eax寄存器里取出功能代号,在一种叫做SDT的结构中查找对应的Native API函数,这种结构在系统中一共有4个,其中一个叫做SSDT,位于ntoskrnl.exe(或者ntkrnlpa.exe)中,记录了系统关键功能的位置,涉及文件操作,注册表操作,进程操作等.还有一个叫做Shadow SSDT,位于win32k.sys中,记录了和用户与图形界面有关的功能,虽然都不是非常关键的功能,但也包括设置系统钩子等比较"特殊"的功能,另外两个SDT的位置则预留,也就是说,有人工创造SDT的可能.(不过这基本上是没有意义的)

5.找到位置后调用该功能,也就是内核中关于该功能的实际操作被执行,当然,之后还是一层又一层的接口,但通常情况下,这里已经是易于控制的{zh1}一层接口.(某些高级木马使用了Object Hook,也就是说存在更底层的接口被控制的可能)对于注册表操作,他们会被解释成Cm****系列功能,当然{zh1}还是要变成文件操作.

6.{zh1}对一类特殊的调用进行解释,那就是调用驱动程序对象,很多功能{zh1}会涉及到硬件操作,比如写文件.写文件的时候,系统会调用文件系统驱动(FSD),如果之前有文件系统过滤驱动(FSD Filter Driver),那么会先通过文件系统过滤驱动,并经由他们层层解释后,{zh1}传给底层文件系统驱动(FSD),FSD是易于控制文件操作的{zd1}一层接口.前面那个例子中,注册表修改的操作最终被解释为写文件的操作(因为修改注册表的本质是修改Hive文件),也要经过FSD,并经由FSD进一步解释,继续传递给下一层接口.

这样就明白了,在这些调用的传递过程中,任何一个环节遭到了阻断都有可能导致失败.而通过"挂钩"这些关键功能,就可以实现对这些功能的控制.
挂钩有很多方式,但是目的只有一个,就是---比原功能更早获得通知,然后自行决定要不要继续把他传递下去,或者自行决定要不要把包含不利信息的结果传递回去.
(就相当于你冒充学习委员,班主任让你查作业,你让真正的学习委员去查作业,真正的学习委员给你报了一串名单,里面有你,你把自己的名字去掉,再交给班主任.这样就可以躲过检查.)


比如现代木马隐藏自身,他们可以修改SSDT中的文件操作功能的位置(Nt****File系列功能),让他们指向自己,然后自己再调用真正的文件操作功能,返回信息时,他们只要把其中包含自身的信息抹掉即可.如图,当这样调用结果返回给应用程序时,其中并不包含自己(灰鸽子),应用程序自然也就不知道灰鸽子的存在了.

[

设置"钩子"的位置很多,可以选择Win32 API下钩,可以选择挂钩ntdll.dll中的函数,但这是不保险的,因为他们都处于ring3级别(想起来我们的图了么?),也就是说,你设置的钩子可以被一个普通程序轻易绕过,或者xx.
所以大多数人选择在SSDT/Shadow SSDT下挂钩,或者安装文件过滤驱动等等,这些动作受到ring0保护,普通程序无法查知,也无法修改.(更高级的还有Object Hook)
同理,HIPS类软件使用和现代木马一样的手段,实现对于关键动作的监控.

图:SSM监控关机事件的方法是挂钩Native API:NtShutdownSystem.



{zh1}还有一个疑问,一个程序怎么才能获得ring0的运行级别?方法有很多,可以通过安装驱动(动态加载或者静态写注册表服务键),操作[url=file://\\Device\PhysicalMemory]\Device\PhysicalMemory[/url]以设置调用门,修改win32k.sys,以及NtVdmControl,ZwSetSystemInformation等等等等,方法层出不穷.

当现代木马和HIPS都具有ring0级别时,他们之间是公平的,现代木马也可以轻易绕过HIPS的监控,或者彻底破坏HIPS.所以,无论是现代木马还是HIPS,一旦获得ring0级别,就会全力封堵通往ring0的道路,比如SSM安装好之后就会阻止加载驱动,阻止写注册表服务键等等.现代木马也一样,运行后大多会阻止加载驱动,防止HIPS或者ARK进入ring0,这样也就是说,谁先抢到了ring0,就会阻止别人进来,如果现代木马已经运行了,差不多就只能通过另一个操作系统来删除他了.

{zh1},不得不提到的是内核操作的危险性.多种HIPS或者木马并存时,都会下钩,有可能重复,有可能正好碰在一起.由于在内核的操作已经没有人保证其正确性了,所以一旦因为设计缺陷出错,就会导致BSOD(蓝屏),这就是为什么"XX上网"会导致莫名其妙的蓝屏,也是安装多种HIPS会出现冲突的原因.

如果看到这句话,那么感谢你耐着性子看完这篇文章,由于初衷是写一篇普及文,所以还有一些复杂的细节没有介绍,但是对于一般使用者,这些已经足够了,文章不妥之处还请各位大大多多指正,未来会考虑讲解ARK类工具的使用.

<#--{zx1}日志--> <#--推荐日志--> <#--引用记录--> <#--相关日志--> <#--推荐日志--> <#--推荐阅读--> <#--相关文章 2010.04.29="" by="" yangfan--=""> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构-->
郑重声明:资讯 【HIPS与现代木马- 成祎的日志- 网易博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——