恶意代码分析实验
课后作业没有什么阅读价值
一、实验目的
(1)完成教材上lab1-01至Lab1-04的题目;
(2)根据理论课要求提交所有样本在VIrusTotal和MicroSoft Defender AntiVirus上的的分析结果
(3)编写yara规则对样本进行检测
二、实验原理
1.PE文件结构
PE(Portable Executable)文件是Windows操作系统下可执行文件、DLL、驱动程序等文件的通用格式。PE文件包括多个部分,其中最关键的部分包括:
- DOS Header: PE文件最开始的一部分,包含DOS可执行程序的头部,主要用于兼容老旧的DOS系统。
- PE Header: 包含文件的元数据信息,包括机器类型、时间戳、入口点等。
- Section Table: 列出了PE文件的各个部分,包括代码段(.text)、数据段(.data)、资源段(.rsrc)等,每个段都有相应的权限和属性。
- Import Table(导入表): 列出了该文件运行时依赖的外部库和函数,如kernel32.dll中的CreateFileA函数。
- Export Table(导出表): 若该PE文件是DLL文件,该表记录了其对外导出的函数。
- Relocation Table: 用于在内存地址重定位时调整代码中的地址。
2.加壳脱壳
加壳是一种常见的对可执行文件进行压缩和加密的技术,通常用于减少文件大小或增加文件的保护性,防止反向工程。常见的加壳工具包括UPX、Themida等。
- 加壳原理:加壳工具会对PE文件的代码段和数据段进行压缩或加密,并在文件头部插入解压或解密代码,以在文件运行时恢复原始代码。加壳后的文件结构通常会丢失原始的段结构,呈现出较高的信息熵值。
- 脱壳原理:脱壳是逆向分析中常用的技术,目的是通过静态或动态手段恢复加壳前的文件。动态脱壳通常通过调试器在程序运行时的OEP(Original Entry Point,原始入口点)处下断点,程序解密并恢复代码后手动导出PE文件。
- 判断文件是否加壳:通常可以通过分析PE文件的Section表,查看段的数量、大小以及熵值(entropy)。加壳文件通常段数较少,且熵值接近7-8,表明内容被压缩或加密。
- 脱壳流程:
- 通过调试器(如OllyDbg)或自动化脱壳工具(如UPX脱壳工具)对目标程序进行动态调试,定位到OEP。
- 导出内存中的PE结构,保存为未加壳的文件。
- 重新调整导入表等内容,确保程序在不加壳的情况下正常运行。
3.yara规则制定
Yara是一种基于规则的恶意软件检测工具,通过编写规则来匹配文件中的特定模式,从而识别恶意文件或特定的文件特征。Yara规则通常用于恶意软件分析中批量检测具有相同特征的文件。
- Yara规则结构:
- 规则头部:包括规则的名称、作者、描述等元数据。
- 字符串部分:列出要匹配的字符串模式,支持文本、字节、正则表达式等多种形式。
- 条件部分:设定匹配的条件,可以是字符串是否存在、某些数值范围等复杂的逻辑。
三、实验过程
lab 1-1
这个实验使用Lab01-01.exe和Lab01-01.dll文件,的信息。
Q1.将文件上传至http://www.VirusTotal.com/进行分析并查看报告。文件匹配到了已有的反病毒软件特征吗?
成功识别出恶意文件,exe和dll最初识别结果如下:
exe
dll
结果显示超过半数的安全供应商将其识别成恶意软件,基本已经可以判断其为恶意软件了。
VT也识别出了其hash值,string等相关特征,exe和dll分别的结果如下:
exe:
dll:
VT也识别出了其pe文件的相关特征,exe和dll分别的结果如下:
exe:
dll:
以上信息均可对其做出是否为恶意文件的初步判断。
Q2.这些文件是什么时候编译的?
可通过查看
pe
文件中的struct IMAGE_NT_HEADERS NtHeader
中的IMAGE_FILE_HEADER FileHeader
得到答案。exe和dll分别如下图所示(010editor):exe:时间戳值为:0x4d0e2fd3(小端法)
网上在线工具转换:可以看出和010相差8h,010转换的是UTC时间,因此010加上8h则可以得到东八区时间(北京时间)。
dll:时间戳值为:0x4d0e2fe6(小端法)
转换规则同上。
Q3.这两个文件中是否存在迹象说明它们是否被加壳或混淆了?如果是,这些迹象在哪里?
没有被加壳,两个文件的pe中都能正确显示section信息,若被加壳的话section是不会被正确现实的,需要通过解码程序来找到
OEP
。exe
dll
文件也没有被混淆,可以通过die查看文件的信息熵,可以观察到都是比较低的,如果文件经过加密、压缩或混淆,其熵值会接近 7 或 8,而该文件的各节熵值大致在 4 到 4.5 之间,dll则更低了。
exe
dll
Q4.是否有导入函数显示出了这个恶意代码是做什么的?如果是,是哪些导入函数?
两个程序导入函数都有正确的符号,符号没有被strip,因此可以通过导入函数来初步判断程序功能,具体的查看方式可以通过010editor查看可执行文件的导入名称表(INT)
exe
只导入了两个库。
kernel32.dll导入描述目录以及导入表中的导入名称表项如下:这些函数与进程控制、线程同步和资源管理密切相关。通常用于创建进程、管理互斥锁、同步线程,以及控制程序执行时间。
这个是msvc的运行时库,也就是编程开发人员常用库,提供一些最基本的函数调用接口,如内存动态分配,字符串操作等等。
dll
可以观察到其导入了三个库,接下来可以分别查看三个库的导入信息表。
同exe文件分析。
ws2_32.dll如下:其中有个值得注意的事情,那就是其导入名称表是空的,OriginalFirstThunk原来指向导入名称表,但是现在指向的是ordinal,可以用die查看比较直观,ws2_32.dll的导出描述符有相应的索引,因此这样可以加速文件查找,否则就需要拿字符串对比。此库中的功能和网络通信相关。
同exe文件分析
Q5.是否有任何其他文件或基于主机的迹象,让你可以在受感染系统上查找?
可观察到.exe文件在程序开始做了如下操作:
文件 (磁盘)
|
v
CreateFileMappingA –> 创建文件映射对象(虚拟地址空间准备)
|
v
MapViewOfFile –> 将文件的一部分或全部映射到进程的虚拟内存空间
|
v
访问映射的内存区域 (通过指针操作内存) –> 按需加载文件内容到内存,或者将修改同步回文件。分别打开kernel.dll和Lab01-01.dll,故猜测此程序会对kernel.dll做一些替换更改操作,使其感染Lab01-01.dll。
在中间经过一系列的变换过程,已经对kernel.dll做了一些列操作之后,会执行:
CopyFileA(ExistingFileName, NewFileName, 0)
将字符串改变.data:0040307C ExistingFileName db 'Lab01-01.dll',0
,NewFileName db 'C:\windows\system32\kerne132.dll',0
仅仅是单纯的字符串copy操作,没有实际意义,反倒提醒了感染者kernel.dll已经被替换为了kerne132.dll。最后会执行
sub_4011E0(aC, 0)
函数,aC db 'C:\*',0
ac是c目录,追进去分析一下。可以观察到其正在遍历目录下的文件,并做了一些列的复杂操作。第一个分支是对非目录进行操作,第二个分支则是对目录进行递归调用操作。其通过FindFirstFileA
和FindNextFileA
实现了所有文件的遍历。对文件进行操作,会定位文件的扩展名,进行和.exe比较,来判断是否为可执行文件,若是,则会进一步操作。
综上所述可以发现很多文件的感染迹象,主要是动态链接库
kernel.dll
和c目录下的exe
文件,但是感染的逻辑需要进一步分析。Q6.是否有基于网络的迹象,可以用来发现受感染机器上的这个恶意代码?
在分析exe文件时并没有找到和网络库相关的导入函数的操作,因此猜测替换的dll中会存在和网络相关的操作。在上面Q4的分析中,在dll中找到了ws2_32.dll导入库,此库函数则是和网路通信相关,因此其可以作为基于网络的迹象的追寻的入口点。但是这些导入函数是按照序号进行导入的,无法知道导入的到底是哪些函数。(应该可以通过查找ws2_32.dll导出表的ordinal表项来得到导入的是什么函数),其在C:\Windows\System32目录下可以找到。通过如下工具可以快速找到ordinal对应的function。
结合Q4中的ordinal值,可以得到如下几个导出函数:都可用来研究程序的行为。ida也可以查看导入了那个函数,会更加方便,和下述分析相一致。
ordinal hint RVA name
23 C3 0000A060 socket
115 59 0000EE40 WSAStartup
4 A4 00013330 connect
11 B4 00014110 inet_addr
19 BF 000028C0 send
22 C2 00012F20 shutdown
16 BC 00012280 recv
3 A3 0000B740 closesocket
9 B3 00013AA0 htons
116 1F 00011390 WSACleanup接着查找字符串表,很容易找到ip:
.data:10026028 cp db '127.26.152.13',0 ; DATA XREF: DllMain(x,x,x)+93↑o
,亦可以作为分析的入口点。最后书上还有一个额外迹象(没有想到,主要是不了解msvc):我们也看到了从kernel32.dll导入了两个有趣的函数:CreateProcess和Sleep。这两个函数普遍在后门程序中使用。这些函数在与exec与sleep字符串结合使用时,需要特别的关注。exec字符串可能是通过网络来给后门程序传送命令,让它通过CreateProcess函数运行一个程序的。
Q7.你猜这些文件的目的是什么?
dll提供网络通信可以远程操纵主机,而exe用来安装dll,并感染c目录,为dll的运行做充足准备,至于如何感染,需要分析exe的主要逻辑。
lab 1-2
分析Lab01-02.exe
Q1.将 Lab01-02.exe 文件上传至http://www.VirusTotal.com/进行分析并查看报告。文件匹配到了已有的反病毒软件特征吗?
结果显示超过半数的安全供应商将其识别成恶意软件,基本已经可以判断其为恶意软件了。
VT也识别出了其hash值,string等相关特征
可执行文件特征
sandbox测试
Q2.是否有这个文件被加壳或混淆的任何迹象?如果是这样,这些迹象是什么?如果该文件被加壳,请进行脱壳,如果可能的话。
可以看出被加壳upx壳,放入ida和die或者010都可看出,upx是压缩壳主要用来减少文件体积,不太适合用来文件保护,因此脱壳很容易。
容易脱壳
信息熵很低,没有混淆。
Q3.有没有任何导入函数能够暗示出这个程序的功能?如果是,是哪些导入函数,它们会告诉你什么?
**
CreateThread
、CreateMutexA
、OpenMutexA
**:这些函数表明程序使用多线程来执行不同任务,并通过互斥锁进行同步控制。**
CreateServiceA
、StartServiceCtrlDispatcherA
、OpenSCManagerA
**:这些函数显示程序可以创建和控制系统服务,表明它可能通过创建一个服务来确保自己在系统启动时自动运行。这是恶意软件经常使用的持久化技术,能够保证在重启后仍然驻留系统中。**
InternetOpenA
、InternetOpenUrlA
**:这些函数表明程序可能会通过网络进行远程通信,连接到恶意服务器**
CreateWaitableTimerA
、SetWaitableTimer
**:这类函数显示程序可能会设置定时任务,进行定期的恶意操作或延迟执行。这可以用于规避检测,或在特定时间激活恶意活动。**
ExitProcess
、_exit
**:这些函数表明恶意程序可能会在完成任务后自行结束,或者在执行特定恶意操作后强制退出以规避安全监控。**
_XcptFilter
、except_handler3
**:这些异常处理函数可能用于应对运行时错误,避免程序崩溃。同时,恶意软件也经常通过这些机制来检测调试环境,防止分析人员调试或逆向其代码。**
_getmainargs
**:这个函数用于获取命令行参数,意味着这个恶意软件可能支持命令行参数执行不同的任务,允许攻击者在不同场景下传递特定的参数来控制其行为。Q4.哪些基于主机或基于网络的迹象可以被用来确定被这个恶意代码所感染的机器?
检查字符啊串表可以发现服务器域名,也许这个服务器是一个恶意服务器,可以检测其网络活动来进一步探究
lab 1-3
分析Lab01-03.exe
Q1.将Lab01-03.exe 文件上传至http://www.VirusTotal.com/进行分析并查看报告。文件匹配到了已有的反病毒软件特征吗?
90%报告,可以判断为恶意软件
VT也识别出了其hash值,string等相关特征
可执行文件特征,可以初步判断其加了壳(很少section)
sandbox测试,可初步判断软件行文,如网络等。
Q2.是否有这个文件被加壳或混淆的任何迹象?如果是这样,这些迹象是什么?如果该文件被加壳,请进行脱壳,如果可能的话。
可以识别出来加壳,但没有表明壳的类型
切换peid可以识别壳的类型
多脱几次壳则可以脱壳成功
Q3.有没有任何导入函数能够暗示出这个程序的功能?如果是,是哪些导入函数,它们会告诉你什么?
查看ida导入表
通过导入函数初步分析程序功能:
标准 C 运行时库 (MSVCRT) 函数:
- _main、_start:这些是标准的程序入口函数,表明该程序遵循传统的C/C++程序的执行流程。
- _XcptFilter、_except_handler3:异常处理相关函数,表明该程序可能处理运行时异常或错误。
- _initterm:用于初始化全局或静态对象,这也是标准C/C++程序的一部分。
- _controlfp:用于控制浮点处理器的状态,这可能是为了进行精确的数值计算或避免浮点异常。
- _setdefaultprecision:设置默认浮点精度,进一步表明该程序可能涉及复杂的数学运算。
- _exit、exit:退出函数,用于正常终止程序。
其他库函数:
- VariantInit、SysAllocString、SysFreeString(OLEAUT32 库):这些函数与 OLE 自动化有关,可能涉及到COM对象的创建和管理,表明该程序可能与 Windows 的自动化技术或脚本编写语言有交互。
- OleInitialize、CoCreateInstance、OleUninitialize(ole32 库):这些函数用于初始化和管理 COM 对象,表明该程序可能使用了 COM 进行进程间通信或调用外部组件。
Q4.有哪些基于主机或基于网络的迹象,可以被用来确定被这个恶意代码所感染的机器?
hex可以看到服务器地址,可以作为一个迹象
lab 1-4
分析Lab01-04.exe
Q1.将Lab01-04.exe 文件上传至http://www.VirusTotal.com/进行分析并查看报告。文件匹配到了已有的反病毒软件特征吗?
90%都判定为恶意软件,基本已经可以判定为恶意软件了
文件特征
pe特征
沙箱行为检测:
Q2.是否有这个文件被加壳或混淆的任何迹象?如果是这样,这些迹象是什么?如果该文件被加壳,请进行脱壳,如果可能的话。
未加壳
未混淆
Q3.这个文件是什么时候被编译的?
utc时间2019年8/30 22:26:59,在vt分析的时候可以看出时间显然伪造,因此无法确定啥时候编译
Q4.有没有任何导入函数能够暗示出这个程序的功能?如果是,是哪些导入函数,它们会告诉你什么?
1. KERNEL32 库函数:
- GetProcAddress、LoadLibraryA:这两个函数通常用于动态加载DLL并获取函数的地址,表明该程序可能通过动态加载来规避静态分析,或根据需求加载特定的模块执行恶意行为。
- WinExec:用于执行外部程序,表明该恶意程序可能会启动其他进程,执行恶意命令或启动外部程序以进一步实施攻击。
- CreateFileA、WriteFile:这两个函数用于创建或打开文件,并向文件中写入数据,表明该程序可能涉及文件操作,如记录信息或修改系统文件。
- SizeofResource、FindResourceA、LoadResource:这些函数用于加载和管理资源,可能与提取或注入资源相关,如恶意载荷的注入。
- CreateRemoteThread:该函数常用于进程注入,将线程注入到其他进程中执行代码,表明该程序可能具有进程注入功能。
- OpenProcess、GetCurrentProcess、GetModuleHandleA:这些函数与进程操作相关,可能用于操纵当前进程或目标进程,表明程序可能会修改或监控进程行为。
- MoveFileA、GetTempPathA:这些函数与文件操作有关,可能用于移动文件或在临时目录中创建文件,暗示该程序可能会自我复制或进行文件覆盖。
2. ADVAPI32 库函数:
- OpenProcessToken、LookupPrivilegeValueA、AdjustTokenPrivileges:这些函数用于调整权限令牌,表明该程序可能尝试获取更高的系统权限(如提升权限),以执行更高级别的操作,可能会规避权限限制。
3. MSVCRT 库函数:
- _snprintf、_exit、exit:这些是标准的C库函数,与字符串操作和程序退出相关,表明该程序可能有格式化数据并在特定条件下终止自身的功能。
- _XcptFilter、_except_handler3:与异常处理相关,表明程序可能具备处理运行时异常的机制,这可以用于防止程序崩溃或捕获异常以执行特定行为。
- 其他常见初始化和处理函数(如**_initterm、__p__fmode**等)用于处理程序的运行环境。
表明该程序可能具备以下特性:
- 动态加载模块和函数,规避静态分析。
- 对文件和进程进行操作,可能进行进程注入或启动外部程序。
- 提升自身权限,执行更高级别的操作。
- 文件操作(如创建、移动文件),可能用于数据泄露、覆盖或恶意文件的部署。
Q5.有哪些基于主机或基于网络的迹象,可以被用来确定被这个恶意代码所感染的机器?
字符串\system32\wupdmgr.exe 表示,这个程序会在这个位置创建或者修改文件。字符串
www.malwareanalysisbook.com/updater.exe可能表示额外恶意代码的网路存储位置,用于
下载。Q6.这个文件在资源段中包含一个资源。使用Resource Hacker工具来检查资源,然后抽取资源。从资源中你能发现什么吗?
可以从其中看到一段网址,可能是用来下载病毒
MicroSoft Defender AntiVirus检测结果
可以看出可以有效检测出病毒特征
lab1-1
Trojan:Win32/Aenjaris.CT!bit
是木马家族Aenjaris
lab 1-2
Trojan:Win32/Graftor.GPA!MTB
木马家族GPA
lab1-3
Trojan:Win32/Graftor.GPA!MTB
木马家族GPA
lab1-4
TrojanDownloader:Win32/Small!MSR
木马下载器
编写Yara规则
因为加壳的原因,因此主要基于hex来进行恶意文件扫描
import "pe" |
结果
四、实验结论及心得体会
通过本次实验,我对恶意软件分析的基础步骤有了更加深入的理解,包括静态分析和动态分析的基本流程和技术细节。在实验中,我分别使用了VirusTotal、PE分析工具和反汇编工具(如IDA Pro)对样本进行了深入的分析,并且通过资源提取工具(如Resource Hacker)对样本内嵌的资源进行了剖析。
1. PE 文件结构分析
在分析样本的过程中,通过学习PE文件结构,我能够识别出每个部分的作用。例如,导入表显示了样本依赖的库和函数,这有助于初步判断恶意代码的潜在功能。而通过对各节的熵值进行分析,可以判断文件是否被加壳或混淆。
2. 加壳与脱壳
在实验中,遇到部分样本使用了UPX壳,通过自动化工具和手动方式脱壳成功。学习了加壳与脱壳的基本概念,并了解了不同加壳工具对样本保护和体积压缩的效果。加壳是恶意软件常见的隐藏技术,脱壳后分析才能获取更详细的行为信息。
3. Yara 规则编写
通过观察不同样本的特征,我学习了如何提取关键的字符串、函数调用、文件结构信息等,并编写了简单的Yara规则来检测类似恶意样本。在实际分析中,这些规则帮助我们自动化检测和分类恶意软件。
4. 病毒传播机制的理解
部分样本通过修改系统的动态链接库(如kernel32.dll)或感染系统文件来实现持久化,这加深了我对恶意软件持久化技术的认识。此外,分析到的网络行为(如通过特定域名进行通信)也展现了恶意软件的远程控制和命令执行能力。
5. 网络通信与远程操作
在分析中,部分样本使用了网络相关的库(如ws2_32.dll),通过对这些函数的深入理解,可以分析出恶意软件与远程服务器的通信机制。这也引导了我对恶意软件行为的进一步分析,如远程命令执行、文件下载等。
6. 实验中的收获与不足
- 通过实验,我掌握了多种分析恶意软件的方法和工具,如VirusTotal、IDA、010Editor等,也增强了对PE文件结构、加壳脱壳、动态分析、Yara规则等的实际应用能力。
- 在分析过程中,我认识到恶意软件往往使用复杂的技术手段,如混淆、加壳、API调用混淆等来对抗分析人员。这要求分析人员具备扎实的逆向工程能力,并且需要持续学习新的恶意软件技术。
- 但在实际的恶意软件分析中,部分复杂的样本可能涉及更多高级技术,如代码混淆和反调试,需要进一步学习高级的反混淆和反调试技术。
通过这次实验,我对恶意软件分析的核心流程有了更系统的认识,同时也对Yara规则的编写和使用有了更深入的理解。这为我后续的恶意软件研究和安全分析奠定了良好的基础。