Malgan1s/malware-dynamic-analysis
GitHub: Malgan1s/malware-dynamic-analysis
一份专注于 Windows 恶意软件动态分析与逆向实战的实验指南,解决如何在真实场景中通过调试与日志关联识别与验证威胁的问题。
Stars: 0 | Forks: 0
# 操作系统安全. 恶意软件分析
**本实验的目的**是获得在 Windows 操作系统中进行高级恶意软件动态分析、shellcode 逆向工程,以及通过 Sysmon 和 Process Monitor 日志进行威胁搜寻的实践技能。
## 目录
- [1 引言](#1-введение)
- [2 主体部分](#2-основная-часть)
- [2.1 环境准备与调试器配置](#21-подготовка-среды-и-настройка-отладчика)
- [2.2 分析 VirtualAlloc 调用](#22-анализ-вызова-virtualalloc)
- [2.3 在 InternetOpenA 和 InternetConnectA 上下断点](#23-точки-останова-на-internetopena-и-internetconnecta)
- [2.4 篡改恶意域名及修改 hosts 文件](#24-подмена-вредоносного-домена-и-правка-hosts)
- [2.5 Shellcode 的 dump 与分析](#25-дамп-и-анализ-шелл-кода)
- [2.6 通过 Sysmon 和 Process Monitor 日志进行核查](#26-проверка-по-журналам-sysmon-и-process-monitor)
- [3 结论](#3-заключение)
# 1 引言
本次实验进行了高级恶意软件分析,旨在揭示其
行为、伪装机制以及与系统交互的方式。主要
侧重于对可执行文件的动态研究:配置
调试器、跟踪系统库的加载、分析分配的
内存区域、在关键的 API 调用上设置断点,并寻找包含
shellcode 的代码段。
在分析过程中,我们在内存中进行了恶意域名替换,
将修改后的数据记录在 hosts 文件中,并通过诊断
工具确认了网络活动。此外,我们提取并
研究了 shellcode,这有助于发现解密和
隐式解析 API 符号的迹象。获得的结果展示了
完整的恶意软件分析生命周期——从加载到检测出
网络工件——并培养了在操作系统中识别和
消除恶意活动的实践技能。
# 2 主体部分
## 2.1 环境准备与调试器配置
首先,我们安装 Windows 操作系统并断开网络适配器,以
实现对客户机操作系统的网络隔离:

接下来,创建虚拟机的状态快照:

首先配置调试器,在“选项” > “事件”
窗口中勾选“系统 DLL 加载”。这将允许跟踪
新库加载到被调试进程的过程。

## 2.2 分析 VirtualAlloc 调用
首先,我们在程序入口点设置断点:

然后我们在 API 符号
kernel32.dll:VirtualAlloc 上设置断点:

添加断点后,可以按 F9 键,程序将中断在
VirtualAlloc API 调用处,此时栈中的值为 0x40。该值
对应于调用 VirtualAlloc 时的参数(参数 flProtect),
即 PAGE_EXECUTE_READWRITE:

ESI 寄存器的值中存储了内存区域 (0x0041653B) 的地址,
该区域存有一组加密数据。这组数据是
位置无关代码(shellcode),稍后它将以明文形式
出现在内存中。
接下来,如果执行到函数返回点(按组合键 Ctrl + F9),
可以在 EAX 中看到 API 函数的返回值——这是
分配的内存区域的起始地址。在本例中,该值为
0x001E0000。右键单击“转到 Dump”后:在 dump 视图中
可以选择任意一个字节,并在那里针对
写入操作创建一个硬件断点——如果发生
写入操作,调试就会中断:

最有可能的是,shellcode 或该恶意软件所需的
数据可能会被写入这里。
然后可以打开内存映射表,看到带有
PAGE_EXECUTE_READWRITE 属性的已分配内存区域:

如图所示,具有相同属性的
已分配内存区域并不多。因此,带有 PAGE_EXECUTE_READWRITE 属性的内存分配
属于异常情况。Shellcode 通常会被写入此类
区域。然而
在我们的例子中,虽然 shellcode 会被写入,但并不是写入该区域。因此,
最初基于在 VirtualAlloc API 调用上下断点来寻找
该恶意软件中 shellcode 写入操作的假设失败了。
## 2.3 在 InternetOpenA 和 InternetConnectA 上下断点
接下来,系统 DLL 库将被加载到
进程内存中。当 wininet.dll 库加载完毕后
(见下文第一张图),必须在以下 API 符号上设置断点:
InternetOpenA(下文第二张图)和 InternetConnectA(下文第三张图)。



添加断点后,建议按 F9 键继续执行
程序,并中断在 InternetOpenA 函数调用处:

接下来我们通过按 F9 键继续执行程序。如下方的
图所示,EAX 寄存器获取了内存区域 (0x02B1FD14) 的地址,
该区域记录了用于解析恶意域名
bestguesspass\[.\]info 的域名。

## 2.4 篡改恶意域名及修改 hosts 文件
然后转到存储恶意域名的
内存 dump,将域名的前几个字节替换为 GeorgySazonov(替换的
字符数量需准确把握,以免越界)。在 dump 中的字符串将
逐个字符进行修改,将每个字节替换为所需的
ASCII 字符代码。

替换所需字符后,提取得到的字符串并将其添加到
hosts 文件中,对应地址 127.0.0.1:

## 2.5 Shellcode 的 dump 与分析
接下来,我们转到栈顶分配的地址 (0x00C6016B) 所对应的
反汇编代码处:

该地址是调用 InternetConnectA 库函数后的
函数返回地址。如果仔细查看,从页面起始地址 0x00C60000 开始展示的是
shellcode 清单。其中包含地址为 EB03D2 和
EB03AB 的几个过程调用:

下文将更详细地介绍这些函数。
转到内存映射表,确认内存页同样具有
PAGE_EXECUTE_READWRITE 属性,并将 shellcode 内存 dump 导出
到文件中:

## 2.6 通过 Sysmon 和 Process Monitor 日志进行核查
继续执行程序(按 F9 键)。由于不再有断点,
恶意程序将被完整执行。这可以在 Sysmon 日志中通过筛选
EventID = 22 的事件找到。在本例中,
该操作是在 Telerik Fiddler 中执行的:

此事件也可以在 Process Monitor 日志中找到:

# 3 结论
本次实验包含对所研究文件的高级动态和
静态分析:完成了调试器配置
并设置了监控点(包括跟踪系统 DLL 加载以及在 VirtualAlloc、InternetOpenA、
InternetConnectA 上下断点),研究了已分配的内存区域并对找到的
shellcode 执行了 dump,完成了恶意域名替换
并在 hosts 文件中添加了相应条目以拦截解析,
此外还通过日志(Sysmon、Process Monitor /
Telerik Fiddler)确认了结果,随后在 IDA Pro 中对导出的代码进行了分析。在
本次实验中,我们掌握了在 Windows 操作系统中进行恶意软件分析的
基础知识。通过本次实验,我们培养了恶意软件逆向工程以及
通过日志进行威胁搜寻的技能。
标签:DAST, DNS 反向解析, Windows, 云资产清单, 动态分析, 威胁狩猎, 安全实验, 恶意软件分析, 网络信息收集, 逆向工程