第三章 动态分析基础技术

 

动态分析是分析的第二步

一个程序不是所有的代码都会被执行到,比如有些需要命令行参数才会运行

3.1 沙箱:简便但粗糙的方法

沙箱是一种在安全环境里运行不信任程序的机制,不用担心伤害到“真正的”系统。

沙箱包含一个虚拟环境,通过某种方式模拟网络服务,以确保被测试的软件或恶意代码能正常执行

3.1.1 使用恶意代码沙箱

Norman,GFI是最受欢迎的沙箱

这些沙箱用来做初始诊断很有用

沙箱生成的恶意代码分析报告包含了网络行为,创建文件,VirusTotal的扫描结果等

3.1.2 沙箱的缺点

只能简单的运行可执行程序,不能带有命令行选项,如果恶意代码选哟命令选项,那么沙箱中任何代码都不会被执行

如果分析的是一个后门程序,需要等待一条控制指令才能启动特定行为,那么这个沙箱中这个后门程序也不会被启动并执行分析

沙箱也不能记录所有事件,比如设置了sleep,虽然沙箱会对sleep进行hook,使得时间变得很短,但是休眠的方式有很多种,沙箱也不能考虑到所有的情况

还有一些潜在的缺点:

恶意代码会对虚拟机进行检测

一些恶意代码需要一些特定的注册表项或文件才能启动,这些在沙箱中是没有的

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

沙箱的操作系统对恶意代码来说可能不正确,比如需要在xp上运行,在win7上跑不通

沙箱不会告诉你恶意代码做了什么。它能报告基本功能,但是具体功能还需要自己去总结

 

3.2 运行恶意代码

首先来看如何启动dll文件,来进行动态分析

所有的windows版本中都包含rundll32.exe,它提供了一个运行dll的平台

C:\>rundll32.exe DllName,Export arguments

Export的值必须是一个dll文件导出函数表中的函数名或者序号,比如一个dll中有一个导出函数叫做Install

C:\>rundll32.exe xxx.dll Install

也可以用序号导出,在序号前面加#就可以了

C:\>rundll32.exe xxx.dll #1

恶意的dll文件通常在DLLMain执行他们的代码,因为无论dll什么时候被加载,DLLMain总是会被执行

还可以通过修改PE头部,并改变它的扩展名,是的windows以一种可执行文件的方式来加载dll

从IMAGE_FILE_HEADER的特征域里擦除IMAGE_FILE_DLL(0x2000)标记,尽管这样改变不会执行任何输入函数,但是会调用DLLMain方法,也有可能导致恶意代码崩溃或终止。然而只要修改能够使得恶意代码执行它的恶意部分,能够分析收集到信息,其他的就不重要了

DLL形态的恶意代码可能需要被安装成一个服务,下面的这个例子中导出了InstallService函数

C:\>rundll32.dll ipr32.dll,InstallService ServiceName
C:\>net start ServiceName

ServiceName参数必须提供给恶意代码,让它能够被安装并运行起来,而在windows系统中启动指定的服务,可以使用net start命令

 

3.3 进程监视器

Process Monitor是windows系统下的高级监视工具,可以监控注册表,文件系统,网络,进程和线程行为,它结合了文件监视器FileMon和注册表监视器RegMon

但并不是能捕获所有数据,例如一个用户态组件通过设备IO控制与内核套件进行通信的设备驱动行为,或者一些特定的图形界面调用,如SetWindowsHookEx等

不应该用来记录网络行为,因为它在微软不同windows版本中的兼容性存在一些问题

监视器一旦运行起来,就会监控所有能捕获的系统调用,不能检查所有的系统调用。监视器使用内存来记录事件,直到他被告知停止,这可能耗尽所有的可用内存而使虚拟机崩溃。所以需要设定一个比较短的时间,可以File-->Captrue Events。在新的分析前,清空当前捕获的事件,可以通过Edit-->Clear Display

3.3.1 进程监视器的显示

可以通过双击某一行,来查看事件的全部细节

3.3.2 进程监视器中的过滤

File-->Filter打开过滤菜单,通过下拉框选择条件

注册表,文件系统,进程行为,网络四个选项可以通过工具栏上的按钮来选择是否开启

如果分析的程序是一个开机启动的,需要使用进程监视器的启动选项,将其安装为一个自启动程序,从而捕获恶意代码的启动事件

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

可以用来列出所有活跃的进程、被进程载入的DLL、各种进程属性和整体系统信息

也可以用来结束一个进程、退出用户登录、启动与激活进程

3.4.1 进程浏览器的显示

树状结构,每秒更新一次

默认情况下,服务以粉色高亮显示,进程显示为蓝色,新进程为绿色,被终止的进程显示为红色。绿色和红色的高亮显示是临时的,当进程被完全启动或终止后颜色就会改变

当DLL信息显示窗口被激活时,可以单击一个进程去看它所有载入到内存里的DLL文件,可以切换DLL显示窗口到句柄窗口,它显示了进程所持有的句柄,包括文件句柄,互斥量,事件等等

双击一个进程名,可以打开属性窗口

Theads标签显示所有活动的线程,TCP\IP标签显示活跃的连接和进程监听的端口

3.4.2 使用验证选项

Verify标签

单击按钮,可以验证磁盘上的镜像文件是否有微软的签名验证,因为微软的大部分可执行文件使用了数字签名,可以看恶意代码是否替换了windows的认证文件

如果一个攻击者使用进程替换技术process replacement,包括在系统上执行进程并用恶意代码重写内存空间,那么这个功能就没有用武之地了

3.4.3 比较字符串

一种识别进程替换的方法为使用进程属性窗口的字符串标签,通过比较包含在磁盘上可执行文件的字符串与内存中同一个可执行文件的字符串,来看两者是否相同。如果两者有很大不同,那么可能就发生了进程替换。

3.4.4 使用依赖遍历器(Dependency Walker)

进程浏览器允许你在运行进程上启动depends.exe,通过右键进程名选择Launch-->Depends,能让你通过选择Find--<Find Handle or DLL 找到一个DLL或者句柄

Find DLL有时候特别有用,比如当在磁盘上发现一个恶意的DLL,并且想知道是否有运行程序使用了这个DLL。

验证按钮不会对所有动态时刻装载的DLL文件进行验证,为了判断一个DLL是否被加载到进程,可以比较进程浏览器中的DLL列表与在Dependency Walker中显示的导入DLL列表

3.4.5 分析恶意文档

比如PDF和Word

若文档打开的时候启动了任意进程,都可以在进程浏览器中看到,并能通过属性窗口中的镜像(Image)标签来定位恶意代码在磁盘上的位置

打开恶意文档的同时启动进程监视工具是一种快速确定文档是否恶意的好方法

3.5 使用Regshot来比较注册表快照

是一个开源的注册表比较工具,可以比较两个注册表的快照

先进行第一次快照,再运行恶意代码,然后单击2nd Shot进行第二次快照,最后单击Compare进行比较

3.6 模拟网络

恶意代码有时候需要连接到命令与控制服务器,需要采用一些模拟网络的基本步骤,用来快速获取网络资源,而不需要连接互联网,这些资源包括DNS域名系统,IP地址和数据包记录器

 

3.6.1 使用ApateDNS

是用来查看恶意代码发出的DNS请求最快速的方式。通过在本机上监听UDP的53端口,对用户指定的IP地址给出虚假的DNS相应。它用你指定的IP地址去响应DNS查询请求,软件可以使用十六进制和ASCII码来显示所有的接受到的请求

设置想在DNS响应包中发出的IP地址,并选择接口,接下来单击Start Server按钮,自动开启DNS服务,并修改DNS设置到localhost上。之后运行恶意代码,就可以在窗口上观察出现的DNS请求

将DNS请求重定向到本机,也可以指定到其他地方,默认情况下,软件将会使用目前的网关或当前的DNS配置来插入到DNS响应中

还可以通过不存在的域名(NXDOMAIN)选项,来捕获恶意代码样本使用的其他域名,恶意代码经常会在连接第一个或者第二个域名不成功时尝试其他域名。使用NXDOMAIN选项可以欺骗恶意代码为你提供配置中保存的其他域名信息

 

 

搜索关注公众号[逆向小生],不定期更新逆向工程师需要掌握的技能,包括Windows和Android方面的逆向,还有作为一个逆向工程师的思维模式。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值