恶意程序的快速分析—PE类

恶意程序的快速分析—PE类

简介

本次学习PE类恶意程序的快速分析技巧,包括dll和exe类。一般来说,PE类程序的种类和数量非常之多,免杀和混淆的手段也很多,所以PE类恶意程序的分析比较复杂,需要非常多的分析工具作为辅助,也需要比较多的技巧和经验。因为本次学习主要侧重于快速识别恶意程序的技巧,所以主要分析一些比较有鲜明特点的的PE恶意程序,辅助一些分析技巧,可以达到快速识别恶意程序的目的。

在阅读本文之前,建议先详细学习PE文件的结构,可以参考文章PE文件详解

一.工具介绍

由于样本文件具有破坏性,因此在分析样本时最好在虚拟机中分析,如下是样本分析基础需要用到的工具。

工具

本次实验所需要的工具都放在了我的github仓库

虚拟机 — vmware下的win10虚拟机(为了便于将目标样本及分析软件复制到虚拟机中,最好安装Vmware Tools,安装方法请自行搜索)
文件管理工具 — Total Commander(下文简称TC)
文件查看与分析工具 — hiew

工具使用方法

Total Commander

TC是文件管理工具,可以对文件进行复制、删除及目录创建等工作。

image-20240321153656604

上面的是我仓库里的安装程序,下面的是安装好的TC,

需要先把Hiew导入TC,打开TC,全选默认的选项即可。然后导入hiew:

配置→选项→查看/编辑→使用外部查看程序导入hiew

image-20240321154038259

image-20240321154200041

更改使用外部查看器的命令为F3

image-20240321155441730

在如下主界面中,使用Tab键可以实现左右两个窗口的切换,最下面一栏有更详细的每个操作的说明。

image-20240321154449853

从桌面把样本拖入TC即可看到样本目录

image-20240321154608025

Hiew

hiew默认以文本形式打开,按回车键可以切换模式,识别样本需要切换到16进制模式。

在TC中选中样本,然后按F3即可使用hiew查看样本。

image-20240321155613214

按回车键可以切换模式(文本 16进制 汇编)

image-20240321155626880

二、PE恶意程序的快速识别

PE类程序指的是基于Windows操作系统的可执行程序,最常见的有exe程序、dll程序以及sys程序,不同类的PE程序有着不同的应用范围,从而也就导致了PE类恶意程序的表现形式的多样性,分析不同类型的PE类恶意程序所采取的技巧方式也是有所不同的。

在分析PE类恶意程序之前,有必要先识别出恶意程序类型为PE文件。

PE指纹

首先我们需要清楚的概念是PE指纹,也就是判断一个文件是否是PE文件的依据,首先是根据文件的前两个字节是否为4D 5A,也就是’MZ’,然后看第四排四个字节指向的地址00 00 00 f8是否为50 45,也就是’PE’,满足这两个条件也就满足了PE文件的格式,简称PE指纹,在后面制作解析器的时候会通过它来判断是否为一个有效的PE文件。

当识别出PE指纹特征后,基本可以判定其是一个有效的PE文件。

1.dll恶意程序分析

本次实验分析样本放在了github 天问之路的week33-34中

在分析下类dll样本之前,有必要先对dll(动态链接库)有个了解,建议阅读本文有关动态链接库的知识

提醒:查看文件头要在16进制模式下查看。

1.16d6b0e2c77da2776a88dd88c7cfc672

image-20240328144204571

由开头的MZ及前面我们对PE指纹的介绍,可以确定该程序为PE程序。

按一下回车切换到16进制模式。

image-20240328144106138

以看到它的地址是以0x10000000作为开始的,那么以这种地址作为开始的文件,基本上就是属于DLL文件了。

然后按F8 Header键查看文件头部信息

image-20240328145751461

可以发现查看头部信息表时下面的快捷键再次发生了变化。

再次按F9查看文件的导出表

image-20240328150044625

可以看到该程序有四段导出函数,第四段导出函数的命名比较清晰,可以根据拼音大致猜测译为“酷狗.main”,仅从该段函数的名称来看,其似乎是酷狗的一个组件。然后再看前三段函数,可疑之处在于前三段函数的起始地址都为0x100011E0。对于dll程序来说,其功能基本是保存在导出函数中的,那么为了实现不同的功能,不同的导出函数应为不同的代码,而这里三个导出函数的起始地址均相同,则意味着无论调用三个导出函数中的哪一个,都会到0x100011E0这个地址开始执行,三个函数实现的功能其实是相同的。

通过上面的分析,正常的dll程序是不会有如上奇怪的操作的,可以初步判断该程序是异常的。为了进一步分析,可以进入函数中查看其代码。对第一个函数按下回车键查看代码。

image-20240328152219718

可以看到该函数仅仅是对寄存器清零就返回了,因此该函数没有实际上的功能。而对于酷狗这种大公司来讲,基本是不会写这种无意义的函数的,因此可以判定其是一个无用的dll程序了。

实际上,对于这种将自身伪装成大公司编写的程序组件的恶意程序,我们都可以把它们归类为“DLL劫持”或者“白加黑”类的恶意程序,因此可以把它命名为:Trojan.Win32.Dllhijack.a。命名完成之后,可以在TC的右右侧新建一个’Trojan\Win32.Dllhijack\a’目录,将该样本移至该文件夹中。

2.6717d7e23f9b7078b257d603c633a8dc

image-20240328153308958

PE程序,然后按回车查看一下十六进制。

image-20240328153511738

十六进制界面中,可以发现它的起始地址是0x00000001~80000000,也就是说,这个程序是一个64位的程序,按下F8发现它有导出表,按下F9查看导出表,可以发现它包含有两个导出函数,这里不妨选择第一个导出函数查看一下

image-20240328153545821

选中按下回城

image-20240328153733726

可以看到,这两个导出函数的代码内容基本上都是00,也就是并未执行实际的动作,正常的DLL程序是不可能出现这样的情况,也就是什么都不做的,所以现在就可以将其判定为是恶意程序了,所以这里可以将其命名为Trojan.Win64.Agent.a。

3.6e8735bd92d7a019612be3b50b231512

前面的分析步骤在(1)(2)中介绍的比较详细了,此处直接略过,直接查看该程序的导出表

image-20240328154028284

进入第一个函数查看

image-20240328154231510

最先注意到的就是一段陌生的字符串,不妨搜索一下是什么。

‘KSafeTray.exe’:

image-20240328154347425

是金山安全的一个组件,然而通过前面的介绍,我们知道一个正常软件里面,不应该出现一个杀软厂商的文件名或者进程名。

不妨详细分析一下:

image-20240328155228044

push对’KSafeTray.exe’字符串进行了压栈,作为下面call函数调用的参数,继续对call进行分析。

按下call对应的数字键’2’跳转到call语句的位置:

image-20240328155451704

为了方便阅读和查找,汇编整理后如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
1000A710: 53              push         ebx
1000A711: 55 push ebp
1000A712: 56 push esi
1000A713: 57 push edi
1000A714: 6A00 push 0
1000A716: 6A02 push 2
1000A718: E85F9D0000 call CreateToolhelp32Snapshot
1000A71D: 6828010000 push 000000128 ;
1000A722: 8BD8 mov ebx,eax
1000A724: E85F9D0000 call operator new
1000A729: 83C404 add esp,4
1000A72C: 8BF0 mov esi,eax
1000A72E: 56 push esi
1000A72F: 53 push ebx
1000A730: C70628010000 mov d,[esi],000000128 ;
1000A736: E83B9D0000 call Process32First
1000A73B: 85C0 test eax,eax
1000A73D: 7440 jz .01000A77F
1000A73F: 8B6C2414 mov ebp,[esp][014]
1000A743: 8D7E24 lea edi,[esi][024]
1000A746: 55 push ebp
1000A747: 57 push edi
1000A748: FF15B4520110 call _strcmpi
1000A74E: 83C408 add esp,8
1000A751: 85C0 test eax,eax
1000A753: 7508 jnz .01000A75D
1000A755: 8B4608 mov eax,[esi][8]
1000A746: 55 push ebp
1000A747: 57 push edi
1000A748: FF15B4520110 call _strcmpi
1000A74E: 83C408 add esp,8
1000A751: 85C0 test eax,eax
1000A753: 7508 jnz .01000A75D
1000A755: 8B4608 mov eax,[esi][8]
1000A758: 5F pop edi
1000A759: 5E pop esi
1000A75A: 5D pop ebp
1000A75B: 5B pop ebx

该段汇编的关键在于三个系统调用函数上:

“call CreateToolhelp32Snapshot” :用于创建进程和线程的快照,以便对它们进行监视和操作。

“call operator new” :用于动态分配内存,即在运行时分配内存空间以供程序使用。

“call Process32First” :用于检索系统中的进程信息,例如进程的标识符、优先级和路径等。

对于该段汇编代码更详细的解释由chatgpt给出:

1
2
3
4
5
6
1. 调用 `CreateToolhelp32Snapshot` 函数创建进程快照。
2. 分配内存空间并将快照句柄保存到 `ebx` 中。
3. 调用 `Process32First` 函数获取第一个进程的信息。
4. 检查是否成功获取进程信息,若成功则继续处理。
5. 比较当前进程的进程名与指定的进程名进行大小写不敏感的比较。
6. 如果进程名匹配,则将相应的进程信息存储到 `esi` 中。

结合前面push传入的’KSafeTray.exe’字符串,不难看出该段汇编代码就是遍历系统中进程信息,对名为KSafeTray.exe的进程进行识别。前面通过搜索得知,KSafeTray.exe是金山安全的一个组件,所以可以合理猜测该程序是搜索系统内的安全进程,如果发现了可能会进行自身隐藏或者关闭该安全进程之类的恶意操作。

然后可以返回一下(空格键),回到一开始发现’KSafeTray.exe’字符串的界面按下’1’键,查看该字符串附近有什么。

image-20240328191716147

发现了’QQGAME’等字样,也是正常程序中不会出现的,因此可以判定该程序为恶意程序。

可以将其命名为Backdoor.Win32.Agent.a。

4.bea4098173cac5d2f55b9338b1ef2cd0

该程序只有一个导出函数,直接分析

image-20240328191841876

可以看到,程序中出现了大量的以BASE64加密的内容,这也是一个正常程序中不应该出现的,这种形式类似于我们之前分析过的脚本类以及文档类恶意程序,所以就可以直接将其报毒并进行归类了:Backdoor.Win32.Agent.b。

5.db8199eeb2d75e789df72cd8852a9fbb

image-20240328191951693

该程序的两个导出函数地址相同,直接进入分析,刚进入汇编时并没有发现什么有用的信息,继续向下看:

image-20240328192503239

可以看到该程序是将Main字符串拆分,利用ASCII码的形式,一个一个地放入内存中,而不是我们常见的那样,将一个完整字符串保存在某一个地址中,然后调用该地址,从而获取字符串。综合以上,可以将其分类为:Rootkit.Win32.blackken.a。

这里所提到的将字符逐个放入内存的方式,从而组成完整字符串的方法,实际上在当前的恶意程序或者是一些灰色程序(即not-a-virus类程序,比如广告程序)中是经常会遇到的。其实,对于这种特征鲜明的程序,我们如果再使用传统的特征提取的方法来对抗这类程序,就显得力不从心了。因此有些知名杀毒厂商会采用启发的方式来应对这类威胁

类似的程序还有样本4b323d4320efa67315a76be2d77a0c83,这个程序也是一个dll程序,并且还有很多的导出函数,我们重点看一下位于0x10004258的名为DownloadFile的这个导出函数:

image-20240328192724364

image-20240328192807521

可以看到,这里大量采用了上述提到的方法,因此可以直接给它归类为:Rootkit.Win32.blackken.b。

6.08cd486d7b23bbd61b48563d6bc18613

直接翻到导出函数表

image-20240328192927517

可以看到该函数的名称比较奇怪,正常的程序函数是不会这样取名字的。可能是恶意程序的作者使用了某种自动化生成恶意程序的工具,为了使得每个恶意程序不相同,于是就设置它们的导出函数名称各不相同,从而避免杀软的初步查杀。于是我们可以直接将其归类为:Trojan.Win32.Agent.a。

小结

dll恶意程序的识别与前篇脚本类与文档类的识别类似,核心原则依旧是找到它与正常程序的不同之处。

2.exe恶意程序分析

本次实验分析样本放在了github 天问之路的week33-34中

对于exe类程序而言,在大多数情况下无法仅仅通过hiew对其进行分析识别,很多时候要么依靠更多的分析工具,要么直接在虚拟机中运行。这里直接采用在虚拟机中运行得出结果的分析方式。因为我们快速分析的目标毕竟只是做黑白判断,因此很多时候,只要样本没有反虚拟机手段,采用这种方式还是会很快得出黑白的结果的。

(1).dd66bcf26c50c12f2d1036ada8cc8c14

提醒,进行该部分之前请给虚拟机保存快照!!

经过分析发现,该文件并没有导出表

image-20240328210149442

前面对于dll程序的分析方法在分析这个没有导出函数的exe程序似乎都用不上了,但是该文件是可执行exe程序,不妨在虚拟机中给他加上后缀运行一下看看

image-20240328210723854

此时可以看到它的图标,似乎是一个用于下载或更新的程序,以此来打消大家的戒心,然后双击运行看看:

image-20240328210653131

image-20240328210913776

image-20240328211010353

可以看到,这是一个典型的勒索程序,那么我们就可以直接将其归类为:Trojan-Ransom.Win32.Zerber.a。

(2).4fafbfd2e560778f11beb8f736e80bb1

我们再看一个相对复杂的exe程序。实际上,分析exe程序本身就需要分析师具备一定的分析经验,而在不借助其它分析工具的情况下,只使用Hiew时,其实更加考验分析师的综合能力了,需要分析师深入理解恶意程序,知道常用的混淆手段,更加应该熟悉PE文件的特点,是需要时间与一定的样本量作为积累的,所以病毒分析,特别是快速分析技巧,绝对是一个技术活。

对于该程序,F3通过hiew打开后,先转到16进制,然后F8切到反汇编界面,再按F5找到程序入口点。

image-20240328211354538

需要先找到main函数入口点

通过经验,main函数入口点在Getxxxxx函数后面的第一个call,所以往下翻找第一个call函数

image-20240328211531009

按下1键进入main函数,也就是程序实现主要功能的部分。

image-20240328211656217

根据我们写代码的经验,主要分析该段汇编中的call函数,查看main函数的函数调用:

比如看一下位于0x00613BAD这个位置的call,利用快捷键5跳转过去:

image-20240328212121227

按5跳转:

image-20240328212147288

我们可以看到非常多的将单个字符移入内存的情况,如前所述,这就是非常可疑的地方了。

顺着字符串向下,我们继续分析call函数:

0x006E824A的位置也有一个call,跳转过去看一下:

image-20240328212558242

这次的按键是9

image-20240328212801425

mov 将46B370位置的字符串赋给ecx, 不妨看一下这个地址里面的内容,按6:

image-20240328212914857

可以看到赋值的内容为一堆乱码

接下来则是一系列的运算过程,有add加法运算,有xor异或运算等,其中的这个异或运算实际上是恶意程序经常采用的一种解密手段。从最后的inc自增操作以及cmp比较操作可以得知,ebx保存的是想要解密的二进制代码的个数,这里是0x67D。

image-20240328214111511

分析至此,我们就已经获得了非常充分的证据来证明这是一个恶意程序了。因为一个正常的程序是完全没有必要通过解密自身的方式来获得代码或者数据的,恶意程序之所以这么做,目的就是为了增加分析师的工作量。。那么这里我们就可以把它归类为:Trojan.Win32.Agent.b。

(3).4298F9DDA63C3C1B17FEF433C082107A

下面这个程序是经过加壳(混淆)的,其分析思路大体与(2)相同,同样是寻找一些加密解密的迹象(当分析多了有足够经验之后,对于此类的识别就有一定记忆了,再次遇到就能快速识别)。

同样直接找到反汇编界面

image-20240330165306963

可以看到程序入口开始先是在获取自身句柄之后,将返回值(保存在eax中),复制给了00042208C地址,然后call调用,跟随一下call查看做了什么:

image-20240330165516228

有两个call,先查看第一个call:

image-20240330165619348

可以看到call调用了VirtualAlloc函数,该函数简略意思就是分配一片内存空间。

image-20240330165918299

分析多了之后依据经验可以猜测,解密后的代码是保存在改分配过的空间里。

然后返回上一级(Backspace),查看下一个call的内容:

image-20240330171209989

是利用and、not以及xor等运算符做了一些解密运算,正常程序中不会出现,所以判定为恶意程序,将其命名为Trojan.Win32.Agent.c。

小结

exe类恶意程序的分析比较复杂,同样单纯借助hiew也难以完成分析工作,即便能够完成也是需要在分析大量样本之后,积累了比较多的经验才能完成的。后面将继续学习通过其他工具完成分析及查杀恶意程序的高级技能。

reference

看雪《恶意程序分析与高级对抗》

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2024 Rain's Blog
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信