使用 IDA(Interactive DisAssembler) 对 SimulatedAgent.exe 样本进行静态高级分析,通过反汇编手段在不运行程序的前提下还原其行为逻辑。
从学习通本课程"资料"板块下载「基础动态分析样本.zip」压缩包。
将样本压缩文件拷贝到 FlareVM 虚拟机后解压缩:
| 工具 | 用途 |
|---|---|
| IDA Freeware / IDA Pro | 静态反汇编与伪代码分析 |
| FlareVM | 隔离分析环境(Windows 虚拟机) |
| simulatedagent.exe | 本次实训分析样本 |
静态高级分析是在不运行样本的前提下,通过反汇编等手段分析其代码结构、导入函数、字符串和逻辑流程。与动态分析(让程序跑起来观察行为)互补,可揭示程序执行所有可能路径,包括未触发的隐藏逻辑。
| 功能 | 作用 |
|---|---|
| 导入表分析 | 识别样本可能使用的 API 类别(文件、注册表、网络、进程) |
| 字符串分析 | 定位硬编码的域名、路径、注册表键值、互斥体名称 |
| 函数调用图 | 追踪 WinMain 入口,还原主行为链 |
| 伪代码(F5) | 将汇编代码转换为类 C 代码,降低分析门槛 |
simulatedagent.exe 文件
图:IDA 启动与加载样本界面
IDA 加载完成后默认停留在程序入口点(Entry Point)。
图:IDA 初始分析结果视图
点击菜单栏 View → Open subviews → Imports,打开导入函数表窗口。
按 DLL 文件分类浏览,重点观察以下导入函数:
| DLL | 导入函数 | 可能的行为 |
|---|---|---|
| KERNEL32 | CreateProcessW、CopyFileW、SetFileAttributesW、GetModuleFileNameW、Sleep | 进程创建、文件复制、属性修改 |
| ADVAPI32 | RegOpenKeyExW、RegSetValueExW、RegCloseKey | 注册表操作(持久化) |
| WINHTTP | WinHttpOpen、WinHttpConnect、WinHttpOpenRequest、WinHttpSendRequest | HTTP 网络通信 |
| SHELL32 | SHGetFolderPathW | 获取特殊文件夹路径 |
图:IDA 导入函数表视图
从这些导入函数,你能初步推断出样本有哪些行为?
图:字符串窗口设置(勾选 Unicode C)
在字符串列表中,找到并记录以下关键字符串:
| 字符串 | 含义推断 |
|---|---|
svchost.exe | 伪装系统进程名,用于自我复制 |
Software\Microsoft\Windows\CurrentVersion\Run | 注册表 Run 键,用于持久化自启动 |
WindowsService | 注册表键值名称 |
%s?host=%s&user=%s | HTTP GET 请求参数格式 |
c2-lab.internal | C2 命令与控制服务器域名 |
desktop_info.txt | 临时输出文件名 |
cmd.exe /c "dir "%s\Desktop" > "%s"" | 枚举桌面目录的命令行模板 |
双击每个字符串可查看它在代码中的引用位置,按 Ctrl+X 查看交叉引用列表。
WinMainWinMain 进入该函数的反汇编视图WinMain 是 Windows GUI 程序的入口函数,从这里开始追踪程序的主行为逻辑。
图:在 Functions 窗口中找到 WinMain
图:WinMain 文本视图 — 函数调用序列
图:WinMain 图形视图 — 分支控制流
在 WinMain 函数视图中,按 F5 键将汇编代码反编译为类 C 伪代码。
图:F5 生成的 WinMain 伪代码视图
在 WinMain 伪代码中双击 SelfCopyAndHide 进入该函数,追踪以下调用链:
GetModuleFileNameW → 获取当前程序自身的文件路径SHGetFolderPathW → 获取系统特殊文件夹路径CopyFileW → 将自身复制到目标路径SetFileAttributesW → 设置复制后文件的属性为隐藏目标复制路径:%APPDATA%\Microsoft\svchost.exe
追踪以下调用链:
RegOpenKeyExW → 打开 Software\Microsoft\Windows\CurrentVersion\RunRegSetValueExW → 写入键值名 WindowsService追踪以下调用链:
GetComputerNameW → 获取本机计算机名WinHttpOpen → 初始化 HTTP 会话WinHttpConnect → 连接到 c2-lab.internalWinHttpOpenRequest → 构造 GET 请求(含主机名参数)WinHttpSendRequest → 发送请求追踪以下调用链:
GetTempPathW → 获取临时目录路径GetEnvironmentVariableW("USERPROFILE") → 获取用户目录CreateProcessW → 执行 cmd.exe /c "dir "%USERPROFILE%\Desktop" > "%TEMP%\desktop_info.txt""效果:枚举用户桌面内容并输出到临时文件。
图:在视图上返回之前点击过的代码位置
在 WinMain 函数视图中,点击菜单 View → Graphs → Xrefs from,查看 WinMain 函数的调用关系图。
调用关系图以图形化方式展示 WinMain 调用了哪些子函数,以及它们之间的层次关系,有助于建立程序的整体行为模型。
图:打开WinMain函数调用关系图
图:WinMain函数调用关系图
综合以上各步骤的分析结果,还原 simulatedagent.exe 的完整行为流程:
SimAgent_Mutex(已存在则退出,确保同时只运行一个进程)%APPDATA%\Microsoft\svchost.exe(并设置隐藏属性)WindowsService),实现开机自启动c2-lab.internal,上报本机信息dir 命令输出桌面文件列表到临时文件| 步骤 | 行为类别 | 关键技术 | 分析来源 |
|---|---|---|---|
| 1 | 防多开 | CreateMutexW | 字符串 + 导入表 |
| 2 | 文件操作 | CopyFileW + SetFileAttributesW | 导入表 + 字符串(svchost.exe) |
| 3 | 持久化 | RegOpenKeyExW + RegSetValueExW | 导入表 + 字符串(Run键) |
| 4 | 网络通信 | WinHttp* 系列 API | 导入表 + 字符串(c2-lab.internal) |
| 5 | 进程创建 | CreateProcessW | 导入表 + 字符串(dir命令) |
| 6 | 延时退出 | Sleep | 导入表 |
将本次 IDA 静态分析的结果逐一对齐到之前动态基础分析的观察结果:
| 动态分析 (Procmon) | 静态分析 (IDA) |
|---|---|
| 观察到 CopyFileW 调用 | SelfCopyAndHide 函数 → 复制到 %APPDATA%\Microsoft\svchost.exe |
| 观察到 SetFileAttributesW(FILE_ATTRIBUTE_HIDDEN) | 确认隐藏属性设置逻辑 |
| 动态分析 (Procmon) | 静态分析 (IDA) |
|---|---|
| 观察到 Run 键写入 | SetRegistryPersistence → RegSetValueExW("WindowsService", 隐藏文件路径) |
| 动态分析 (FakeNet) | 静态分析 (IDA) |
|---|---|
| DNS 查询 c2-lab.internal | WinHttpConnect 硬编码该域名 |
| HTTP GET 请求(无响应接收) | 有 WinHttpSendRequest,无 WinHttpReceiveResponse |
| 动态分析 (Procmon) | 静态分析 (IDA) |
|---|---|
| 观察到 cmd.exe 子进程创建 | SpawnChildProcess → CreateProcessW 执行 dir 命令 |