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 操作系统并断开网络适配器,以 实现对客户机操作系统的网络隔离: ![断开客户机操作系统的网络适配器](https://raw.githubusercontent.com/Malgan1s/malware-dynamic-analysis/main/images/image1.png) 接下来,创建虚拟机的状态快照: ![创建虚拟机状态快照](https://static.pigsec.cn/wp-content/uploads/repos/cas/d7/d73ed081097c8c8e2223f972e5006a826118d7685161f3c013fcb4d0fdba61eb.png) 首先配置调试器,在“选项” > “事件” 窗口中勾选“系统 DLL 加载”。这将允许跟踪 新库加载到被调试进程的过程。 ![配置系统 DLL 加载事件参数](https://static.pigsec.cn/wp-content/uploads/repos/cas/e1/e158661f2b178d8501cebea20f56665beff9fd49ddde3ec3866b13eea826323b.png) ## 2.2 分析 VirtualAlloc 调用 首先,我们在程序入口点设置断点: ![在程序入口点处中断](https://raw.githubusercontent.com/Malgan1s/malware-dynamic-analysis/main/images/image4.png) 然后我们在 API 符号 kernel32.dll:VirtualAlloc 上设置断点: ![在 VirtualAlloc 上下断点](https://static.pigsec.cn/wp-content/uploads/repos/cas/a0/a0fb1e2e1b7aae7cda61e0b55b7c54b1bd79d166894f4e151dd70453fa002dca.png) 添加断点后,可以按 F9 键,程序将中断在 VirtualAlloc API 调用处,此时栈中的值为 0x40。该值 对应于调用 VirtualAlloc 时的参数(参数 flProtect), 即 PAGE_EXECUTE_READWRITE: ![VirtualAlloc API 调用](https://static.pigsec.cn/wp-content/uploads/repos/cas/9d/9dc776864ea08a9ee2f2d3f42343286f8280acb0d6e7554aac2c2b37a4f83a94.png) ESI 寄存器的值中存储了内存区域 (0x0041653B) 的地址, 该区域存有一组加密数据。这组数据是 位置无关代码(shellcode),稍后它将以明文形式 出现在内存中。 接下来,如果执行到函数返回点(按组合键 Ctrl + F9), 可以在 EAX 中看到 API 函数的返回值——这是 分配的内存区域的起始地址。在本例中,该值为 0x001E0000。右键单击“转到 Dump”后:在 dump 视图中 可以选择任意一个字节,并在那里针对 写入操作创建一个硬件断点——如果发生 写入操作,调试就会中断: ![添加针对内存区域写入操作的硬件断点](https://static.pigsec.cn/wp-content/uploads/repos/cas/59/5959ca2d47cbf7655a95a80d1da1fb759619254e6614fc9c512657dd356281a1.png) 最有可能的是,shellcode 或该恶意软件所需的 数据可能会被写入这里。 然后可以打开内存映射表,看到带有 PAGE_EXECUTE_READWRITE 属性的已分配内存区域: ![内存映射表](https://static.pigsec.cn/wp-content/uploads/repos/cas/d2/d28f76ca94b9ccd7a28fd0e84e34e1755e1144055e65b8efed86b5615c65ae68.png) 如图所示,具有相同属性的 已分配内存区域并不多。因此,带有 PAGE_EXECUTE_READWRITE 属性的内存分配 属于异常情况。Shellcode 通常会被写入此类 区域。然而 在我们的例子中,虽然 shellcode 会被写入,但并不是写入该区域。因此, 最初基于在 VirtualAlloc API 调用上下断点来寻找 该恶意软件中 shellcode 写入操作的假设失败了。 ## 2.3 在 InternetOpenA 和 InternetConnectA 上下断点 接下来,系统 DLL 库将被加载到 进程内存中。当 wininet.dll 库加载完毕后 (见下文第一张图),必须在以下 API 符号上设置断点: InternetOpenA(下文第二张图)和 InternetConnectA(下文第三张图)。 ![加载 wininet.dll 库](https://static.pigsec.cn/wp-content/uploads/repos/cas/54/54acba125d120cf76d4727569fbe280dbd496df4861be8fd9ce26150ba081fd7.png) ![在 InternetOpenA 上下断点](https://static.pigsec.cn/wp-content/uploads/repos/cas/d2/d205689e4c0bb34b553a2455b44dcde9ca1ee5f3ef3d81bdd59347ce458e2c21.png) ![在 InternetConnectA 上下断点](https://static.pigsec.cn/wp-content/uploads/repos/cas/d9/d9adc0ad1292da3a75e0b52e894ec4ba1ac14a61cc55a4bf78aeb1611e628d9a.png) 添加断点后,建议按 F9 键继续执行 程序,并中断在 InternetOpenA 函数调用处: ![InternetOpenA API 函数调用](https://static.pigsec.cn/wp-content/uploads/repos/cas/b1/b16457c4aa510bafbeead5cebed1d391bd81c33b7a3a7ea0991a5d998b7a46df.png) 接下来我们通过按 F9 键继续执行程序。如下方的 图所示,EAX 寄存器获取了内存区域 (0x02B1FD14) 的地址, 该区域记录了用于解析恶意域名 bestguesspass\[.\]info 的域名。 ![InternetConnectA API 函数调用](https://static.pigsec.cn/wp-content/uploads/repos/cas/50/5023dec0bafe6569ebe0e81321930680de8e163a967263512d04fee91d468f84.png) ## 2.4 篡改恶意域名及修改 hosts 文件 然后转到存储恶意域名的 内存 dump,将域名的前几个字节替换为 GeorgySazonov(替换的 字符数量需准确把握,以免越界)。在 dump 中的字符串将 逐个字符进行修改,将每个字节替换为所需的 ASCII 字符代码。 ![将域名替换为 GeorgySazonov](https://static.pigsec.cn/wp-content/uploads/repos/cas/d6/d646194f0ba089d8e3541e49e4a6600abc75c0f04da457cc5692d52ebd159c32.png) 替换所需字符后,提取得到的字符串并将其添加到 hosts 文件中,对应地址 127.0.0.1: ![将生成的字符串添加到 hosts 文件中](https://static.pigsec.cn/wp-content/uploads/repos/cas/8a/8a25d16b4612d4c1246a4db7295954ce8e7e27587c5ba4494df6a0a2a908e519.png) ## 2.5 Shellcode 的 dump 与分析 接下来,我们转到栈顶分配的地址 (0x00C6016B) 所对应的 反汇编代码处: ![转到反汇编代码](https://static.pigsec.cn/wp-content/uploads/repos/cas/ff/ff1c06be99b2677124f62e4b221c6c1db287a0d34a133e3b6723fbf919baf89f.png) 该地址是调用 InternetConnectA 库函数后的 函数返回地址。如果仔细查看,从页面起始地址 0x00C60000 开始展示的是 shellcode 清单。其中包含地址为 EB03D2 和 EB03AB 的几个过程调用: ![Shellcode 的总体清单](https://static.pigsec.cn/wp-content/uploads/repos/cas/69/6908f6732eab75b4545695ed7079c1fb5f3e8fc2e89b03b1e8b590e8d415d344.png) 下文将更详细地介绍这些函数。 转到内存映射表,确认内存页同样具有 PAGE_EXECUTE_READWRITE 属性,并将 shellcode 内存 dump 导出 到文件中: ![将 shellcode 内存 dump 导出到文件](https://static.pigsec.cn/wp-content/uploads/repos/cas/77/77a339894a3b24bca47d1032718be050cea3d704d997ea400911b890f620f8e1.png) ## 2.6 通过 Sysmon 和 Process Monitor 日志进行核查 继续执行程序(按 F9 键)。由于不再有断点, 恶意程序将被完整执行。这可以在 Sysmon 日志中通过筛选 EventID = 22 的事件找到。在本例中, 该操作是在 Telerik Fiddler 中执行的: ![解析修改后的恶意域名](https://static.pigsec.cn/wp-content/uploads/repos/cas/a9/a97495ca5ec5a3aebf0954fccab413a8f701262d7eb5ea4f6496937ab615003f.png) 此事件也可以在 Process Monitor 日志中找到: ![Process Monitor 日志中的事件](https://static.pigsec.cn/wp-content/uploads/repos/cas/c1/c1ad986f1f733b2ffb87f9371dfca12b13a346208641ef508ae866f65793194c.png) # 3 结论 本次实验包含对所研究文件的高级动态和 静态分析:完成了调试器配置 并设置了监控点(包括跟踪系统 DLL 加载以及在 VirtualAlloc、InternetOpenA、 InternetConnectA 上下断点),研究了已分配的内存区域并对找到的 shellcode 执行了 dump,完成了恶意域名替换 并在 hosts 文件中添加了相应条目以拦截解析, 此外还通过日志(Sysmon、Process Monitor / Telerik Fiddler)确认了结果,随后在 IDA Pro 中对导出的代码进行了分析。在 本次实验中,我们掌握了在 Windows 操作系统中进行恶意软件分析的 基础知识。通过本次实验,我们培养了恶意软件逆向工程以及 通过日志进行威胁搜寻的技能。
标签:DAST, DNS 反向解析, Windows, 云资产清单, 动态分析, 威胁狩猎, 安全实验, 恶意软件分析, 网络信息收集, 逆向工程