恶意样本分析手册——工具篇(上)

近几年来,随着互联网的普及,网络安全市场份额迅速增长,其开放性、应用市场的多元化等特点,都使得智能应用的开发领域极度繁荣。道高一尺魔高一丈,恶意软件也同样有了爆炸式的增长,直接威胁到个人隐私、支付安全等方面,无疑成为网络安全防护工作的重要目标。但海量恶意样本文件,给恶意软件研判分析工作带来了巨大的压力,如何进行恶意样本分析,如何提高效率,都成为实际的问题。

绿盟科技安全能力中心(SAC)

第一章:文件检测

file命令

file为linux下的一个命令,可以用来查看文件的类型。直接在file命令后跟样本所在的绝对路径即可查看,若样本在当前工作目录,直接跟样本名称即可。

如下所示为测试的三个样本,分别为RTF文档,PE文件,JAR文件和ELF文件。

PEiD

PEiD的界面如下,是一款强大的查壳脱壳工具,使用方法简单实用。

直接将要查壳的样本拖入上图的界面即可,也可以实用“浏览”按钮来选择要查壳的样本。下图为检测一个样本的例子。

从上图的检测结果可以看出,此样本使用了FSG壳,此软件也集成了很多的插件,可以点击“插件按钮”来查看,其中有一些是脱壳的插件,不过只是一些简单的压缩壳,比如UPX壳。一般情况下很少使用PEiD进行脱壳。

既然PEiD已经检测到了使用的壳的类型,那么我们可以在网上搜索对应的脱壳机进行脱壳或者自己进行手工脱壳。

不过如果PEiD显示的结果也不一定正确,如果遇到一些比较新的壳,那么PEiD也检测不出来,这时就需要我们进行手动脱壳了。

Detect It Easy

查壳工具大同小异,只是在数据块大小和功能多少方面有差异。这一节介绍的DIE也是一款不错的查壳工具,打开软件的界面如下:

使用方法和PEiD差不多,直接将要查壳的样本拖入界面中,如下为一个检测实例:

从上图中可以看出,此软件检测到了UPX壳。

比PEiD功能强大的地方在于此软件还可以检测出不同文件的类型。而PEiD仅仅是针对Windows平台下的PE文件,对于非PE的文件它就检测不出来了。而DIE在这方面做的比较好。除了使用上面介绍的在linux的info命令外还可以使用这个工具来查看样本的文件类型。

第二章:二进制文件编辑

010Edit

010Edit是一款非常强大的文本/十六进制编辑器,除了文本/十六进制编辑外,还包括文件解析器,计算器,文件比较等功能。但它的真正的强大的地方在于文件的解析功能。我们可以使用010Edit官方网站提供的解析脚本对avi、bmp、png、exe等简单格式的文件进行解析。当然我们也可以根据需要来自己编写文件解析脚本。

下面以BMP文件的格式解析为例进行讲解。首先从其官方网站的文件解析脚本下载页面中下载BMPTemplate.bt,然后使用010Edit打开BMP文件,通过Templates->Open Template菜单打开下载的BMPTemplate.bt,接着按F5运行脚本,然后就可以在Template Results窗口中看到该BMP文件的解析结果。

010Edit具有其他二进制编辑软件中没有的功能,例如我们需要对如下的数据进行修改。

我们只需要删除其中的0x。那么需要按住Ctrl键,然后使用鼠标选中0x所在的列然后删除即可。

010Edit可以计算文件的校验值,通过Tools->Check Sum或者使用快捷键ctrl+k可以打开如下窗口。

从打开的窗口中选出我们希望计算的校验值。

Binwalk

Binwalk是一个固件的分析工具,用来协助研究人员对固件进行分析,提取及逆向。简单易用,完全自动化脚本,并通过自定义签名提取规则和插件模块,并且可以轻松地进行扩展。

使用时直接提供固件的路径和名称即可。

使用Binwalk的不同功能是通过输入不同的参数来进行的,下面介绍几个比较重要的参数命令:

-y:包含过滤器。此选项仅包含指定的搜索文本匹配的结果。搜索字符串应该使用小写,包括正则表达式,并且可以指定多个-y选项。下面的命令搜索结果只包含文本“filesystem”中搜索出来的结果。binwalk –y filesystem sample.bin

-x:排除过滤器。排除搜索结果中的指定符合规则的文本或字符串。下面的命令表示搜索时排除“jffs2”字符串:binwalk –x jffs2 sample.bin

-e:自动提取已知文件类型

-Me:递归提取。很多时候,提取出来的数据需要进一步使用binwalk分析,为了方便,binwalk使用-M和-e选项一起使用来达到递归提取的目的:binwalk –Me sample.bin.

-A:扫描文件中常用的可执行操作码。binwalk –A sample.bin

-C:用来完成多个不同文件类型转换。通常使用-l选项来限制扫描的长度:binwalk –l 32 –C sample.bin。

-W:用来比较文件之间的差别。在文件中相同字节用绿色显示,不同字节用红色显示,蓝色表示只是有些文件当中的不同部分。

-S:对目标文件进行一个智能的字符串分析,可以通过这个功能,应用一些非常简单的验证规则筛选出最“垃圾”的字符串和忽略一些无顺序的数据块。binwalk –S sample.bin。

启用插件功能:一些插件默认情况下是禁用的。这些插件可以启用时用该选项 –enable-plugin选项,binwalk –enable-plugin=foo sample.bin。其中foo表示插件的名称。

禁用插件功能:使用命令—disable-plugin可以禁用一些插件。binwalk –desable-plugin=foo sample.bin.如果禁用所有的插件,使用如下命令:binwalk –disable-plugins sample.bin。

-f:指定日志的输出地址。Binwalk日志输出通常是很大的,所以它往往以文件的方式保存记录。-f选项用来指定一个日志文件。如果没有指定-Q选项的话,结果会打印到stdout和日志文件中。binwalk –f binwalk.log sample.bin。如果需要以CSV格式保存,可以使用下面的命令:binwalk –f binwalk.log –scv sample.bin。

第三章:行为监控

ProcessMonitor

Process Monitor 是一款非常著名的系统进程监视软件,用户可以利用 Process Monitor 对系统中的文件系统,网络行为,进程线程行为以及注册表操作等方面同时进行监视和记录。 通过监控系统中相应位置的变化, 对于帮助诊断系统故障或是发现恶意软件、病毒或木马来说,非常有用。

工具栏介绍

注册表(Registry)

Process Monitor 能够记录所有的注册表操作并且将注册表根键以常用的缩写形式来表示,以显示注册表路径( 比如将 HKEY_LOCAL_MACHINE 表示为 HKLM)。

如果想去除注册表监控的显示, 可以取消选择在 Process Monitor 工具栏上的注册表按键,而如果想将注册表操作监控重新加回,则只需再次按下该按钮即可。

文件系统(File System)

Process Monitor 会显示 Windows 文件系统的所有活动信息,包括本地的存储文件以及远程文件系统。 Process Monitor 能够自动侦测到新加入的文件系统设备并且对其进行监控。当一个文件系统开始运行后,与用户会话相关的所有文件系统路径都会被显示出来。

如果想去除文件系统监控的显示, 可以取消选择在 Process Monitor 工具栏上的文件系统按键, 而如果想将文件系统的操作监控重新加回,则只需再次按下该按钮即可。

进程(Process)

在它的进程/线程监控子系统中, Process Monitor 能够追踪所有的进程与线程的创建和退出操作,也可以追踪动态链接库( DLL) 文件和设备驱动程序的加载操作。

如果想去除进程操作监控的显示, 可以取消选择在 Process Monitor 工具栏上的进程按键,而如果想将进程操作监控重新加回,则只需再次按下该按钮即可。

进程树

“工具( Tools)”菜单中的“进程树( Process Tree)”菜单条目能够打开进程树对话框,它能够分层次地显示由加载的追踪事件所引用的所有进程,从而反映他们的父子关系。拥有相同父进程的进程会依据它们开始时间进行排序。 在窗口左侧的进程的父进程,没有在追踪中留下任何事件。

当我们在进程树中选择了一项进程后, Process Monitor 就获得了关于该进程数据的子集,比如它的映像地址, 用户账户与开始时间,这些会在对话框的底部显示出来。如果您想查看更多关于进程的信息,可以点击“转到事件( Go To Event)”按钮,它可以使得 Process Monitor在运行进程的追踪中定位并选择第一条可见项。需要注意的是, 通过使用筛选器从视图中排除指定进程的所有事件,可以阻止指定操作的完成。

网络(Netword)

Process Monitor 使用 Windows 的事件追踪机制( ETW) 来追踪并记录 TCP 和 UDP 的活动。 每一项网络操作,包括源头与终点的地址,连同大量的发出与接收到的数据,但是不包括实际的数据内容。

如果想去除网络操作监控的显示, 可以取消选择在 Process Monitor 工具栏上的网络按键,而如果想将网络操作监控重新加回,则只需再次按下该按钮即可。

分析(Profiling)

这个事件类型能够在“ 选项( Option)” 菜单中激活。 当它被激活之后, Process Monitor能够检测到系统中的所有活动线程, 并且生成一个非常详尽的分析报告, 包括系统内核与用户 CPU 的时间消耗,以及上下文切换执行的数量,这都可以通过上次分析事件以来的线程实现。 注意: 系统进程不会包含在分析报告中。

捕获(Capture)

使用“文件( File)”菜单中的“ 捕获事件( Capture Events)”菜单选项,或者点击工具栏上的捕获按钮,也可以使用快捷键“ Ctrl+E”,实现对 Process Monitor 监控的捕获进行切换操作。取消捕获后ProcessMonitor将不会捕获事件。

自动滚屏(Autoscroll)

在“编辑( Edit)” 菜单中选择“ 自动滚屏( Autoscroll)” 项,或者点击工具栏上的自动滚屏按钮,也可以使用快捷键“ Ctrl+A”,就能够切换 Process Monitor的自动滚屏特性,这能够使得它保证在显示列表中显示最新的操作。

清屏(Clear)

如果想要清除所有项目的显示,可以在“ 编辑( Edit)” 菜单中选择“ 清除显示( Clear Display)”,或者使用快捷键“ Ctrl+X”。

列目选择

我们可以通过拖动列目来重新排列他们的顺序实现列目定制显示的效果,通过“选项( Option)”菜单中的“选择列目( Select Columns)”菜单项就能够打开列目选择对话框。可供选择的列目包括如下:

下面简单介绍一下这些细节:

应用程序细节(Application Details)

  • 进程名称( Process Name):当一个事件出现时的进程名称。
  • 映像路径( Image Path): 运行于一个进程中的映像的完整路径。
  • 命令行( Command Line): 开启一个进程的命令行。
  • 公司名称( Company Name):嵌入一个进程映像文件中的文本信息,它是用于记录公

司名称的版本信息字符串。这个文本可由应用开发者选择定义。

  • 描述( Description):嵌入一个进程映像文件中的文本信息,它是用于记录产品描述信息的字符串。这个文本可由应用开发者选择定义。
  • 版本( Version): 嵌入一个进程映像文件中的文本信息, 它是用于记录产品版本的数字。这个信息可由应用开发者选择指定。

事件细节( Event Details)

  • 序列号( Sequence Number): 在所有事件中的某一操作的相对位置,包括当前的筛选
    器。
  • 事件类( Event Class):事件(文件、注册表、进程)的类型。
  • 操作( Operation): 指定事件的操作(比如读取、获取指定的注册表项值等)。
  • 日期和时间( Date & Time): 操作发生的日期和时间。
  • 时间( Time of Day):仅显示操作发生的时间。
  • 路径( Path):事件所引用的资源的路径。
  • 细节( Detail):某一具体事件的附加信息。
  • 结果( Result):一项已完成操作的状态码。
  • 相对时间( Relative Time):操作的相对时间,自 Process Monitor 启动开始计算,或者自从 Process Monitor 的最近一次清屏操作开始计算。
  • 持续时间( Duration): 已完成操作的持续时间。

进程管理( Process Management)

  • 用户名( User Name): 执行操作的进程运行时的用户账户的名称。
  • 会话 ID( Session ID): 执行操作的进程运行时所附属的 Windows 会话。
  • 认证 ID( Authentication ID): 执行操作的进程运行时所附属的登录会话。
  • 进程 ID( Process ID):执行操作的进程 ID( PID)。
  • 线程 ID( Thread ID):执行操作的线程 ID( TID)。
  • 完整性级别( Integrity Level):正在运行的操作所执行进程的完整性级别(仅在Windows Vista 下有效)。
  • 虚拟化 ( Virtualized): 正在运行的操作所附属进程的虚拟化状态。(仅在 Windows Vista下有效)

事件属性

我们可以双击某项事件来查看一项独立事件的属性,或者通过在“事件( Event)”菜单中选择“属性( Properties)”菜单项,也可以通过右键点击一项事件,在弹出的快捷菜单中进行选择。事件属性对话框由事件、进程以及堆栈页所组成。

事件(Event)

事件( Event)页显示特定的某一项事件的信息,包括它的序列号、事件线程、事件类别与操作、结果、时间戳,以及如果可用的话, 则显示资源路径。 只有文件系统以及注册表事件才定义有资源路径这一项。事件页的下半部分列出了一项事件所依赖的事件操作的细节集合。 这些细节信息与主界面中的细节列表所显示的内容是一致的,不同的是每一项细节都是分行进行显示的。

进程(Process)

一项事件的进程页显示了已经执行的事件的进程信息。连同与进程镜像相关的数据,比如路径与版本字符串,进程页显示了进程执行的属性,比如进程ID,执行进程的用户账户,以及该事项是否由64位的Windows操作系统所生成,该进程是32位还是64位。

进程页的底部区域显示了当事件执行时,由该进程读取的映像列表,以及读取的地址。双击列表中的一个映像可以查看关于映像的更多信息,包括它的版本信息等。

栈(Stack)

栈页显示了当事件被记录时线程的线程栈。这个栈对于决定事件发生的原因以及导致该事件发生的组件有很大的帮助。内核模式的栈帧是由其左边的字母“ K” 作为标记的,而用户模式栈则以字母“ U” 作为标记。

高亮与筛选

我们可以在筛选器中指定事件的属性,这样就可以令ProcessMonitor仅显示或排除与指定的属性值相匹配的事件。所有的筛选器都是无损检测,也就是说这仅会对 ProcessMonitor 显示事件的方式产生影响,而不会影响潜在的事件数据。

当选取了一项事件后, 在 “事件( Event)”菜单的 “ 包含 ( Include)”与 “ 排除 ( Exclude)”子菜单中就可以很容易地添加事件的其中一项属性到筛选器的包含与排除配置中。比如说,我们在筛选器中指定进程的名称为notepad.exe和cmd.exe,并且在筛选器中包含了一个名为 C:\Windows 的路径,那么 Process Monitor 仅仅只会显示源自指定路径即 C:\Windows 目录中的 Notepad.exe 或 Cmd.exe 的事件。

在筛选器对话框中也有更多复杂的可使用的筛选选项,可以通过选择 “ 筛选器( Filter)”菜单中的“筛选器( Filter)”菜单项或者点击工具栏上的筛选器按钮来打开筛选器对话框。筛选器条目由一个属性域(如认证 ID,进程名称等)、一个比较操作符、一项属性值以及筛选类别(包含或排除) 所组成。 为了方便起见, 在当前加载的跟踪数据中, Process Monitor会自动在下拉列表中列出在已加载的追踪数据中出现的属性值。

上下文菜单筛选

我们也可以在ProcessMonitor中用鼠标右键点击一个条目,则会显示一个上下文菜单,我们能够查看该条目的属性或配置一个基于该条目属性的筛选器。更进一步的是,快速筛选项能够依据我们点击的列的值添加到菜单中。

筛选器的存储与读取

一旦我们配置完成了一个筛选器,就可以选择“筛选器( Filter)”菜单中的“保存筛选器( Save Filters)”菜单项进行保存。 Process Monitor 为了便于我们下次的使用,它会将我们保存的筛选配置保存到“读取筛选器( Load Filter)”菜单, 并且我们还可以选择“筛选器( Filter)”菜单中的“管理筛选器( Organize Filter)”来打开管理筛选器对话框, 从而改变筛选器在菜单中的显示顺序。可以使用管理筛选器对话框来重命名已经保存的筛选器,还能够很方便地以一定的格式来输出筛选器,这样以后我们就可以在其它系统上利用管理筛选器对话框进行筛选器的导入了。

管理筛选器对话框

存储筛选器对话框

高亮显示

Process Monitor 的高亮显示筛选器能够使我们指定事件的属性,从而令一个事件以高亮的颜色进行显示。“事件( Event)”菜单中的“高亮显示( Highlight)”子菜单能够使我们快速定义高亮显示的筛选器条目。

并且“Filter”菜单中的“高亮显示( Highlight)” 菜单条目也能够打开高亮显示筛选对话框,其操作与包含/排除筛选对话框相似。

我们可以通过点击高亮显示筛选对话框中的“添加筛选器( Add Filter)”按钮,从而将高亮显示筛选器转化为包含筛选器

Wireshark

捕获数据

当我们打开Wires hark进行数据包抓取时,会显示下图所示的页面,供我们选择捕获哪个网络适配器中的数据包。具体的适配器名称以自己的计算机中的名称为准。双击选择的适配器名称即可开始进行数据包捕获。

在打开Wireshark时,也会显示以前打开过的数据包,如果没有显示想要的数据包,可以通过文件->打开,或者使用快捷键Ctrl+O来打开特定的数据包。

过滤报文

一般我们捕获的数据包都比较大,难以对其进行详细分析,这时就需要用到Wireshark的过滤特性。

最基本的方式就是在窗口顶端的过滤栏中输入过滤规则。例如输入http,就只会看到Http报文。

同时也可以通过菜单分析->显示过滤器来创建新的过滤规则。

如果要看某一个报文中的数据,可以右键目标报文,选择追踪流,再选择不同的流,可以看到TCP流,UDP流,SSL流和HTTP流。这样就可以看到服务端和客户端之间传输的数据内容。

常用的一些过滤方式如下所示

  • 过滤源IP、目的IP:如查找目的地址为168.1.100的包—ip.dst==192.168.1.100.查找源地址为192.168.1.100的包—ip.src==192.168.1.100。
  • 过滤某个IP:addr==192.168.1.100。显示源IP或目标IP为192.168.1.100的数据包。
  • 过滤端口:比如过滤80端口—tcp.port==80。这条规则是把源端口和目的端口为80的数据包都过滤出来。使用dstport==80只过滤目的端口为80的包,tcp.srcport==80只过滤源端口为80的包。
  • 协议过滤:直接在过滤框中输入要过滤的协议即可,如HTTP,TCP,UDP等。
  • HTTP模式过滤:如过滤get包—http.request.method==“GET”。过滤post包,http.request.method==”POST”。

过滤器应用

掌握过滤器的应用对于数据分析来说是一项必备技能,可以说是一项大海捞针的技巧。学会构建,编辑,保存关键的显示过滤器能够大量的节省时间。

协议过滤器
  • arp:显示所有包括ARP请求和回复在内的所有ARP数据流。
  • ip:显示内含IPv4头在内的(如ICMP目的地址不可达报文,在ICMP报文头之后返回到来方向的IPv4头)IP数据流。
  • ipv6:显示所有IPv6数据流,包括内含IPv6报文头的IPv4报文,如6to4,Teredo,以及ISATAP数据流。
  • tcp:显示所有基于TCP的数据流。
应用过滤器
  • bootp:显示所有DHCP数据流(基于BOOTP)。
  • dns:显示包括TCP区域传输以及基于标准UDP的DNS请求和回复在内的所有DNS数据流。
  • tftp:显示所有TFTP(Trivial File Transfer Protocol)数据流。
  • http:显示所有HTTP命令,回复以及数据传输报文,但不显示TCP握手报文,TCP ACK报文以及TCP结束报文。
  • icmp:显示所有ICMP报文。
自动完成功能

当我们在过滤区域中输入http.request.method的时候,Wireshark会打开一个窗口来显示一些供我们选择的选项。我们可以使用这个特性查看所有可用的过滤条件。

比较运算符

通过使用运算符可以增添过滤条件,Wireshark针对此功能支持数字比较运算符

  • ==或eq:例如src==192.168.1.100,显示素有源地址为192.168.1.100的数据流
  • !=或ne:例如srcport!=80,显示源端口除了80以外的所有TCP数据流
  • >或gt:例如time_relative>1,显示距前一个报文到达时间相差1秒的报文
  • <或lt:例如windows_size<1460,显示当TCP接收窗口小于1460字节时的报文
  • >=或ge:例如:count.answers >= 10显示包含10个以上answer的DNS响应报文
  • <=或le:例如ttl<=10,显示IP报文中Time to Live字段小于等于10的报文
  • contains:例如http contains “GET”显示所有HTTP客户端发送给HTTP服务器的GET请求

相关链接:

恶意样本分析手册——工具篇(下):https://blog.nsfocus.net/malicious-sample-analysis-manual-tool-2/

恶意样本分析手册——理论篇:https://blog.nsfocus.net/sample-analysis-manual-theory/

如果您需要了解更多内容,可以
加入QQ群:570982169
直接询问:010-68438880

Spread the word. Share this post!

Meet The Author

Leave Comment