Ay's Blog@CNSSUESTC

[导入]Paper导读系列之HookFinder: Identifying and Understanding Malware Hooking Behaviors

最近要看各种paper  但是看的断断续续的,后面看前面的就忘光了(主要就是太忙……各种私人以及学习的是,不过还好申请弄完了 闲下来可以看看书了 哈哈),所以开个帖子把读过的paper总结下,写个心得吧。标红的是我的问题~哈哈

 

原文:HookFinder: Identifying and Understanding Malware Hooking Behaviors

source2download:点这里

 

引言:

这篇文章讲述的内容小有趣的说,主要介绍了一个系统,把样本的恶意程序放进去能够自动分析出它的hook操作,包括hook了哪里,如何hook的。它结合一个特定的“虚拟机”(这么说不算太贴切 它文章里面用的是system-emulator这个词,文章里面说这个和虚拟机不用,我估计是原理相同用途不同而已吧,后面就虚拟机这么叫吧),在物理层面它能够获取到程序执行时的所有寄存器状态,在系统层面它能够获得系统信息,比如进程模块地址之类的东西,就跟windbg类似。然后通过跟踪寄存器读写操作以及结合系统信息来检测出程序的hook行为,它里面测试的样例可都是kernel级别的rootkit哟,还是相当强大的一个东东。

 

下面就开始吧,通过监测寄存器(system-emulator提供的接口),那么我们便可以掌握内存的读写情况,更犀利的是我们如此便可以监控所有对内存读写的操作。然后通过一个叫Semantics Extrator(SE)的模块来提取出操作系统层次的信息,打个比方,我捕获到0x743292BC这个要被写入东西,那么通过SE模块我可以查出这个地址是系统内核函数ObReferencebyPointors的函数空间,然而我又可以通过SE模块知道我现在运行的代码段是在X驱动模块中的,那么显然X驱动就有可能是在修改系统代码,正在进行Data Hook。

 

听起来很犀利哇?不过深入分析下去,还是有很多问题要解决的。多个模块代码都进行了同样的hook你又如何记录存储这些HOOK信息咧?如何实现自动检测HOOK?

 

那么文章中提出了设计了3个模块(其实不止3个 我把工作相似的模块合并了):Impact Engine,SE,Hook Detector

Impact Engine

何为impact在文中的意思就是改动,整体翻译就是改动检测引擎(个人YY过来的)。这个引擎用来监控标记程序运行时,对系统内存读写的动作,以便下一步的分析。

这个引擎分2部分,Impact Marker和Impact Tracker

Impact Marker

监控恶意代码中的内存读写分几种情况,一种是在代码中直接进行内存读写,另一种就是恶意代码通过调用外部函数比如memcpy之类的来进行内存操作,文中主要讨论了记录外部调用的内存操作的策略。

首先监控内存读写以及寄存器读写,但这2个操作是分开来处理的。对于外部函数调用读写内存,我们只监控外部变量的读写,至于外部变量如何判断很简单,查看写入地址如否在线程堆栈的范围内,若在则是局部变量,若不在,嘿嘿~外部变量。


那么对于寄存器读写的操作就显得容易多了,因为在windows系统下,返回值是通过eax传递的,文中说的是在函数开始时记录eax的值,然后等函数结束后在比对eax的值是否与原来的一样,如果不一样,那么函数包含返回值则标记之,如果不一样,那么函数返回值是无效的。


当然这里涉及到一个问题就是恶意代码会动态产生可执行代码丫,但是由于我们标记了它内存分配情况,那么只要在执行时判断下执行的指令是否取自标记的内存段,若是,就认为是恶意代码自产生的可执行代码,然后对于这段代码也采取同样的监控标记方式来跟踪它的输入输出。


Impact Tracker(IT)

这个模块主要用来关联这些标记的内存操作和内存改动的。如果在Impact Marker的标记中,操作数的地址或数据是被标记了的,则标记上目的操作数的地址或数据。并且IT模块对目的操作数每个标记分配一个ID号,并记录每个ID号之间的关联,如此一来我们便可以捕获恶意代码对系统生成的改动,比如恶意代码是如何改动重要数据结构的,当然这些监控对恶意代码的磁盘读写,设备挂载,系统例程注册同样有效。因为这些操作的最终原理也不过是生成或改动数据结构而已。


Semantics Extractor


该模块很简单,就是从虚拟的系统中提取出需要的信息,比如说进程的所有信息,线程的所有信息,驱动模块的所有信息等等,然后获得这些需要的信息一般有2种方式,其一就是通过解析一些重要的数据结构来获得,比如EPROCESS,另一种方式就是向虚拟系统中插入一个模块,在系统运行时动态收集系统信息,主要通过设置回调函数的方式工作。比如收集进程信息,在进程创建销毁的时候调用该模块的处理例程等等。


此外SE模块还负责解析函数符号名,确定是否是恶意代码进行的外部函数调用。主要是通过解析PE头文件来实现,这个就不累述了,一来我只是略懂,二来看雪上关于PE的资料我觉得已经很透彻了~

 

HOOK Detector

这个模块的判断依据还比较简单,判断EIP寄存器载入的数据是否是被标记了的,如果EIP载入了被标记的数据(也就是说程序当时运行在非恶意代码模块的上下文,若不考虑这个,则恶意代码代码执行的内部调用也会被误判为HOOK)并且立即跳转到了恶意代码的模块空间或者是恶意代码分配的内存空间内,则将其定义为一个HOOK。当然这个办法仅仅能用于数据HOOK,代码HOOK的话还需另加讨论,我们定义说如果在非恶意代码上下文是运行了被标记为恶意代码模块的篡改数据,并且EIP载入数据也被标记并且跳转到了恶意代码空间,那么这就是一个代码HOOK,然而这里又有一个问题,代码HOOK和恶意代码自产生的代码性质是一样的,那么如何判断这些被标记的代码是自产生代码还是HOOK的数据咧?很简单,自产生代码存在的空间要么是恶意代码模块分配的,要么是占用了不属于任何模块的数据空间,而HOOK的数据肯定是覆盖了系统调用的空间的,所以简单的通过SE模块查一下这段代码是否在系统调用空间就OK了,如果是,则判断为HOOK数据,如果不是,在验证下是否满足自产生代码的条件。

 


类别:Host Security 查看评论
文章来源:http://hi.baidu.com/uestc%5Fay/blog/item/f9bae97af15009e60ad187f9.html

posted on 2011-01-04 00:06 __ay 阅读(184) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理