avatar

目录
第3章 动态分析基础技术

第3章 动态分析基础技术

3x1 沙箱:简便但粗糙的方法

沙箱是一种在安全环境里运行不信任程序的安全机制,不用担心伤害到 “真正的” 系统。沙箱包含一个虚拟环境,通过某种方式模拟网络服务,以确保被测试的软件或恶意代码能正常执行。

1. 使用恶意代码沙箱

在计算机安全专业人士眼中, Norman沙箱、GFI沙箱(也就是以前的CWSandbox)是最受欢迎的。

2. 沙箱的缺点

沙箱只能简单地运行可执行程序,不能带有命令行选项。如果恶意代码需要一 些命令选项才能执行,在不提供选项的条件下,任何代码都不会被执行。另外,如果你分析的恶意程序样本是一 个后门程序,需要等待一条控制指令,才会启动特定行为,那么在沙箱中这个后门程序将无法被启动和分析。

沙箱也不能记录所有事件,因为不管是你或是沙箱,都不会等待足够长的时间让所有事件发生。

潜在的缺点

恶意代码经常检测它是否运行在一 个虚拟机里,并且如果检测到了虚拟机,恶意代码将会停止运行,或者表现异常。不是所有沙箱都能完善地考虑这一问题。

一些恶意代码需要系统上拥有特定的注册表项或者文件才会执行,而这些在沙箱内是找不到的。这些就可能需要包含一 些合法数据,比如控制命令或者加密钥。

如果恶意代码是一个DLL,一些导出函数可能不会被恰当地调用,因为一个DLL文件不像可执行文件那样容易运行。

沙箱环境的操作系统对恶意代码来说可能不正确。例如,恶意代码在Windows XP上正常运行,而在Windows 7上跑不通。

沙箱不能告诉你恶意代码做了什么。它能报告基本功能,但是它不能告诉你恶意代码是一个定制的SAM密文记录器,或是一个加密的键盘记录后门程序。这些结论需要你自己总结。

3x2 运行恶意代码

如何成功启动DLL文件,来进行动态分析。

在所有的Windows 版本中都包含rundll32.exe程序,它提供了一 个运行DLL的平台,用下面的语法格式:
C:\>rundll32.exe DLLname, Export arguments

Export值必须是一个DLL文件导出函数表中的函数名或者序号。可以用PEview或者PE Explorer工具查看导出函数表。

因为恶意的DLL文件通常在DLLMain (称作DLL函数入口点)执行它们的代码,因为无论DLL什么时候被加载,DLLMain函数总会被执行,这样你就总能通过使用rundll32.exe1J口载D LL,而动态地获取信息。除此之外,你甚至可以通过修改PE头部,并改变它的扩展名,使得Windows以一 种可执行文件的方式来加载DLL。

我们可以使用如下方法来修改PE头部,就是从IMAGE_FILE_HEADER的特征域里擦除IMAGE_FILE_DLL (0x2000)标记。尽管这样的改变不会执行任何输入函数,但它会调用DLLMain方法,而且有可能造成恶意代码意想不到的崩溃或者终止。然而,只要你的修改能使恶意代码执行它的恶意部分,你就能为你的分析收集到信息,余下的就不重要了。

DLL形态的恶意代码也可能需要被安装成一个服务,SerνiceName参数必须提供给恶意代码,让它能被安装并运行起来。而在Windows系统中启动指定的服务,可以使用net start命令。

当你看见一个ServiceMain函数,没有像Install或InstallSer、vice这样方便地导出函数,你需妥手动地安装服务。你可以使用Windows系统下的SC命令,或者修改注册表为一个未使用服务进行手动安装,然后使用net start启动服务。Windows服务的注册表项位于HKLM\SYSTEM\CurrentControlSet\Serviceso

3x3 进程监视器

进程监视器(Process Monitor)是Windows系统下的高级监视工具,它提供一 种方式来监控注册表、文件系统、网络、进程和线程行为。它结合并增强了两种工具的功能:文件监视器FileMon和注册表监视器RegMon。

由于进程监视器使用内存来记录事件,直到告知它停止捕获,这就可能因耗尽所有可用内存而使虚拟机崩溃。为了避免这样,运行进程监视器就需要限定一 个比较短的时间。为停止进程监视器捕获事件,选择File→Capture Events。在使用进程监视器进行分析之前,首先要清空当前所有截获的事件,通过选择Edit→Clear Display清除掉不相关数据,接下来再执行分析对象,开启监视器捕旗。几分钟之后,就可以终止事件捕获。

1. 进程监视器的显示

进程监视器展示了一个可配置栏,包含了每个事件的不同信息,如事件序列号、时间戳、引发事件的进程名、事件操作、事件使用的路径、事件结果等。这些详细的信息可能太长而不适合屏幕显示,或者可能难以清晰地阅读。如果你发现这种情况,可以通过双击该行,来查看这个事件的全部细节。

2. 进程监视器中的过滤

为了设置一 个过滤器,我们选择Filter→Filter打开过滤菜单。当设置一个过滤器时,首先通过左上角的下拉菜单(Reset按钮上面〉选择一栏。对恶意代码分析最重要的过滤栏是进程名、操作和细节。然后,选择一 个比较器,从is、contains、less than中选一项。最后,选择在过滤器里是包含还是排除。因为在默认情况下,过滤器要呈现所有系统调用,所以减少呈现结果的数量十分重要。

进程监视器在工具栏里提供有用的自动过滤功能,它们通过以下四个分类进行过滤:注册表、文件系统、网络和进程行为。

注册表:通过检查注册表操作,你能辨别一个恶意程序是怎样把自己添加到注册表中去的。

文件系统:检查文件系统能显示恶意程序创建的所有文件,或它使用的配置文件。

进程行为:检查进程行为能告诉你恶意程序是否启动了其他的进程。

网络:识别网络连接能向你展示恶意程序监听的任意端口。

所有的这四个过滤器都是默认选择的。如果要关闭过滤器,只需简单地单击工具栏上相应的图标即可。

3x4 使用进程浏览器( Process Explorer )来查看进程

进程浏览器(Process Explorer)是微软的免费产品,它是一 款非常强大的任务管理器,是进行动态分析时必备的工具。它能对当前系统上运行的进程提供非常有价值的洞察能力。

你可以用进程浏览器来列出所有活跃的进程、被进程载入的DLL、、各种进程属性和整体系统信息。你也能用它杀死一 个进程、退出用户登录、启动与激活进程。

1. 进程浏览器的显示

进程浏览器监视系统上执行的进程,以树状结构进行显示。

进程浏览器显示了五栏:Process (进程名)、PID (进程号)、CPU (CPU使用率)、Description(进程描述〉、Company Name (软件公司名〉。视图每一 秒更新一次。默认情况下,服务以粉色高亮显示,进程显示为蓝色,新进程为绿色,被终止进程则为红色。绿色和红色的高亮显示是临时的,当进程被完全启动或终止后颜色就会改变。当分析恶意代码时,需要实时观察进程浏览器窗口中进程的改变或新建进程,保证能够完全地调查它们。

2. 使用验证选项

进程浏览器一个特别有用的功能就是镜像标签里的验证 (Verify)按钮。单击此按钮,可以验证磁盘上的镜像文件是否具有微软的签名认证。因为微软为大部分核心的可执行文件使用了数字签名。通过进程浏览器验证签名是否有效,你就能确定该文件是否确实是微软发布的可执行文件。这一功能对验证磁盘上Windows文件没有被破坏时尤其有用,因为恶意代码经常替换Windows认证文件,并且试图隐藏。

验证按钮验证的是磁盘上的镜像文件,而不是内存中的,因此它可能会失效,如果一个攻击者使用进程替换技术process replacement,包括在系统上执行进程并用恶意代码重写内存空间,这时候这个功能就不再有用武之地了。进程替换技术为恶意代码提供了和其他进程同样的特权,恶意代码看起来就像一个合法执行的进程一样,但是它在内存中的镜像会和磁盘上的不一样。

3. 比较字符串

一种识别进程替换的方法就是使用进程属性窗口的字符串 (Strings)标签,通过比较包含在磁盘上可执行文件的字符串与内存中同一个可执行文件的字符串,来看两者是否相同。可以用左下角的单选按钮在这两个字符串视图间切换。如果这两个字符串列表有很大不同,那么可能就发生了进程替换。

4. 使用依赖遍历器( Dependency Walker )

进程浏览器允许你在运行进程上启动depends.exe (Dependency Walker),通过右击进程名并选择Launch→Depends。它也能让你通过选择Find→ Find Handle or DLL找到一个句柄或D LL。

Find DLL选项在有些时候特别有用,比如当你在磁盘上尝试发现一 个恶意的DLL,并且想知道是否有运行进程使用了这个DLL时。验证按钮验证磁盘上的EXE文件,但不会对所有动态时刻装载的DLL文件进行验证。为了判断一 个DLL是否被加载到进程,你可以比较进程浏览器中的DLL列表与在Dependency Walker工具中显示的导入DLL列表。

5. 分析恶意文档

还可以使用进程浏览器来分析恶意文挡,比如PDF和Word文档。一种快速确定一个文档是否恶意的方法,就是打开进程浏览器,然后再打开文档。若文档启动了任意进程,你都能在进程浏览器中看到,并能通过属性窗口中的镜像Clmage)标签来定位恶意代码在磁盘上的位置。

3x5 使用Regshot来比较注册表快照

Regshot是一个开源的注册表比较工具,它可以让你比较两个注册表的快照,发现差异。

使用Regshot工具分析恶意代码,只要简单地单击1st Shot按钮进行第一次快照,然后运行恶意代码,等待它对系统做出改变,然后单击2nd Shot按钮进行第二次快照,最后单击Compare按钮比较这两次快照。

3x6 模拟网络

恶意代码经常会连接到命令与控制服务器。你需要采用一些模拟网络的基本步骤,用来快速获得网络资源,而不需要实际地连接互联网。这些资源可以包括DNS域名系统、IP地址和数据包记录器。

为了能够成功模拟网络,你必须防止恶意代码探测到自己正运行在一个虚拟环境中

1. 使用ApateDNS

ApateDNS是一款来自Mandiant公司的免费软件(www.mandiant.com/products/research/mandiant_apatedns/download),是用来查看 恶意代码发出DNS请求最快速的方式。ApateDNS在本机上通过监听UDP的53端口,对用户指定的IP地址给出虚假的DNS响应。它用你指定的IP地址去响应DNS查询请求。ApateDNS可以使用十六进制和ASCII码来显示所有接收到的请求。

为了使用ApateDNS,需要设置你想在DNS响应包中发出的IP地址,并选择接口。接下来,单击Start Server按钮,这将自动启动DNS服务,并修改DNS设置到localhost上。然后,运行你要分析的恶意代码,就可以在ApateDNS的窗口观察出现的DNS请求。

2. 使用Netcat进行监视

Netcat被称作 “TCP/IP协议枝瑞士军刀” ,可以被用在支持端口扫描、隧道、代理、端口转发等的对内对外连接上。在监听模式下,Netcat充当一个服务器,而在连接模式下作为一 个客户端。Netcat从标准输入得到数据进行网络传输,而它得到的数据,又可以通过标准输出显示到屏幕上。

3x7 使用Wireshark进行数据包监听

Wireshark是一 个开源的嗅探器,是一个截获并记录网络数据包的工具。 Wireshark提供可视化、包一流分析和单个数据包的深入分析。

Wireshark的界面显示有四部分

过滤栏。用来过滤显示的数据包。
数据包列表显示了所有满足过滤条件的数据包。
数据包细节窗口显示了当前选中包的详细内容。
十六进制窗口。显示了当前数据包的十六进制内容,十六进制窗口和数据包细节窗口紧密关联,会高亮显示你所选择的任何域。

3x8 使用INetSim

INetSim是一款基于Linux模拟常见网络服务的免费软件。

INetSim是一 款提供 模 拟服 务最 好 的免 费工 具 ,它通 过 模拟 服 务 〈如Http、HTTPS、FTP、IRC、DNS、SMTP等),允许你分析未知恶意代码的网络行为。

INetSim努力伪装得像一 台真正的服务器,有许多容易配置的特性来保证其成功。例如,若被扫描到,它会返回Microsoft IIS网络服务器的旗标。

INetSim一 些最好的特性被融进了HTTP和HTTPS服务模拟中。例如,IN etSim 几乎能提供所有的文件请求服务:如果一 个恶意程序从一 个站点请求JPEG 以继续它的操作,IN etSim 就会回应一 个适当的JPEG。虽然这个图片可能不是恶意代码要找的,但服务器不至于给出404或者其他错误。这个响应即使不正确,仍能保证恶意代码继续运行。

INetSim也可以记录所有的连入请求与连接,你会发现这个功能特别有用,比如可以判断一 个恶意代码是否连接到一 个标准服务,或是查看它所发出的请求。IN etSim 也非常容易配置,例如,你可以设置请求后返回一 个页面或者一 个项 目,因此如果你发现你分析的恶意代码在查找一 个特别的网页,然后才能继续执行,你就可以提供这个网页:你也能修改不同服务监听的端口号,这对恶意代码使用非标准端口时非常有用。

INetSim专为恶意代码分析而创建,所以它也提供了许多独特的优点,比如它的Dummy服务就记录了所有从客户端口收到的数据。Dummy服务在捕获所有从客户端向端口发出的数据时最有用,而不受制于其他服务模块。你可以使用它记录恶意代码连接的所有端口和发送数据。至少TCP握手会完整地进行,一些进一 步传输的额外数据也可以收集到。

文章作者: kabeor
文章链接: https://kabeor.github.io/%E7%AC%AC3%E7%AB%A0%20%E5%8A%A8%E6%80%81%E5%88%86%E6%9E%90%E5%9F%BA%E7%A1%80%E6%8A%80%E6%9C%AF/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 K's House

评论