查询 32 次,耗时 0.2133 秒

从静态筛查到动态取证:在隔离实验室中分析未知 Windows PE 样本

break

New member

break Rep
0
0
0
Rep
0
break Vouches
Vouches
0
1 MONTH
1 1 MONTH OF SERVICE
break 获得
0
0
0
获得
0
break 凭证
0
0
0
凭证
0
主题
4
点赞
0
HakB
1 月
在社区成长 1 月
LEVEL 20 100 XP
 
一、背景与目标

收到来源不明的 EXE 或 DLL 时,防御分析的首要任务不是立即双击运行,也不是急于判断它属于哪个家族,而是建立一条可复现、可回滚、证据完整的分析流程。本文以未知 Windows PE 文件为对象,演示如何结合哈希、PE 结构、字符串、导入表、行为监控、网络模拟和调试器完成初步定性。

本文只讨论本地隔离实验、授权样本和防御取证。不要把样本上传到不受控环境,不要在办公电脑、生产网络或保存有账号凭据的系统中运行未知程序。如果样本涉及真实事件,还应遵循所在组织的证据保全和事件响应制度。

二、分析原理

静态分析是在不执行样本的情况下检查文件格式、编译特征、导入函数、资源和机器码。它安全、快速,但可能受到加壳、混淆、动态解析 API 等技术干扰。

动态分析则在隔离环境中实际运行样本,观察进程、文件、注册表、服务和网络行为。它能揭示运行时行为,但也存在样本检测虚拟机、延迟执行、等待命令行参数或只在特定环境中触发的问题。

较稳妥的顺序是:样本登记与哈希固定→基础静态筛查→判断是否加壳→受控动态观察→针对关键行为调试→整理证据和结论。静态与动态结果应相互印证,不能仅凭一个字符串或一个可疑 API 下结论。

三、前置条件

1. 一台专门用于分析的 Windows 虚拟机,可使用 FLARE-VM,也可自行安装工具。
2. 虚拟机启用快照,关闭共享剪贴板、拖放、共享目录和 USB 自动连接。
3. 网络优先设置为 Host-only 或完全断网。需要观察网络行为时,使用 FakeNet-NG、INetSim 等本地模拟服务,不要桥接到真实网络。
4. 常用工具:7-Zip、Detect It Easy、PE-bear 或 PEStudio、FLOSS、capa、Sysinternals Process Monitor、Process Explorer、TCPView、FakeNet-NG、x64dbg。
5. 分析前准备干净快照,并确认宿主机杀毒软件不会因为共享路径而意外处理样本。样本应放在虚拟机内部的专用目录。

建议目录结构如下:

C:\Lab\Case-001\sample
C:\Lab\Case-001\logs
C:\Lab\Case-001\tools
C:\Lab\Case-001\screenshots

四、步骤一:样本登记与哈希固定

先复制样本,不要直接修改原文件。记录文件名、来源渠道、接收时间、文件大小和分析人员。随后使用 PowerShell 计算哈希:

Get-FileHash .\sample\unknown.exe -Algorithm SHA256
Get-FileHash .\sample\unknown.exe -Algorithm SHA1
Get-Item .\sample\unknown.exe | Format-List Name,Length,CreationTimeUtc,LastWriteTimeUtc

也可以使用系统自带的 certutil:

certutil -hashfile .\sample\unknown.exe SHA256

SHA-256 可作为分析记录中的主要标识。文件名可以被随意修改,哈希更适合用于关联日志和报告。需要注意,哈希只能证明两个文件的字节内容是否一致,不能单独证明文件安全或恶意。

接下来确认文件头:

Format-Hex .\sample\unknown.exe -Count 64

典型 PE 文件通常以 MZ 字节开头,并在后续位置包含 PE 签名。扩展名为 EXE 并不代表它一定是有效 PE,也可能是脚本、自解压文件或被故意伪装的数据。

五、步骤二:检查 PE 结构和异常指标

将样本拖入 Detect It Easy、PE-bear 或 PEStudio,重点检查以下内容:

1. CPU 架构:x86、x64 或其他架构,这决定调试器版本。
2. 入口点所在节区:入口点如果位于权限异常、名称异常或高熵节区,需要进一步关注。
3. 节区属性:同时具有可写和可执行权限的节区并非必然恶意,但常见于壳、JIT 或运行时解密场景。
4. 导入表:查看是否导入进程创建、内存分配、注册表、网络和服务相关 API。
5. 资源:图标、版本信息、嵌入文件、清单和语言资源是否合理。
6. 数字签名:签名存在不代表文件一定可信;签名无效、证书链异常或签名后文件被修改都应记录。
7. 编译时间戳:时间戳可能被伪造,只能作为弱线索,不应作为核心证据。

可重点理解几类 API:

CreateProcessW、ShellExecuteW:启动其他程序。
VirtualAlloc、VirtualProtect:分配内存或修改页权限,正常软件和加壳程序也会使用。
WriteProcessMemory、CreateRemoteThread:可能涉及进程间操作,但调试器、辅助工具同样可能调用。
RegSetValueExW:写注册表。
CreateServiceW:创建服务。
WinHttpOpen、InternetOpenW、connect:可能涉及网络通信。

判断时应结合调用上下文。例如,只看到 VirtualAlloc 并不能证明存在代码注入;还应观察分配权限、写入内容、目标进程和后续控制流。

六、步骤三:提取字符串与识别能力

普通 strings 工具容易漏掉经过简单编码或栈构造的字符串。可以使用 FLOSS:

floss.exe .\sample\unknown.exe > .\logs\floss.txt

筛查时可搜索 URL、域名、文件路径、互斥体名称、注册表路径、命令行参数、用户代理和错误信息:

Select-String -Path .\logs\floss.txt -Pattern "http|https|Software\\|CurrentVersion|AppData|ProgramData|cmd.exe|powershell"

字符串只是线索。样本可能包含未使用的测试地址,也可能把关键内容加密后在运行时生成。因此应记录字符串在文件中的位置,并在反汇编中查看是否存在代码引用。

随后可使用 capa 对程序能力进行规则化识别:

capa.exe .\sample\unknown.exe -v > .\logs\capa.txt

capa 的输出适合辅助定位,例如文件操作、注册表操作、网络通信或加密相关能力,但规则命中不能替代人工验证。对于加壳样本,静态命中可能很少,这时应考虑先观察运行时解包后的内存映像。

七、步骤四:建立动态监控基线

恢复到干净快照后,先启动 Process Monitor,并设置过滤条件:

Process Name is unknown.exe → Include
Operation is Process Create → Include
Operation is CreateFile → Include
Operation is WriteFile → Include
Operation is RegCreateKey → Include
Operation is RegSetValue → Include

不要只保留成功事件。NAME NOT FOUND、ACCESS DENIED 等失败记录也可能暴露样本探测的文件、注册表键或安全产品名称。开始捕获后再运行样本,观察一到数分钟;如果样本无界面,不要立刻认定其无行为,它可能要求参数、等待网络响应或启动了子进程。

同时使用 Process Explorer 查看:

1. 父子进程关系;
2. 实际命令行;
3. 已加载 DLL;
4. 进程完整性级别;
5. 是否出现短命子进程;
6. 是否加载自创建目录中的模块。

结束观察后,将 Procmon 日志保存为原生 PML,同时导出 CSV 便于检索。建议另外保存进程树截图,并记录运行起止时间。

八、步骤五:在本地模拟网络

如需观察网络请求,可在完全隔离的虚拟网络中启动 FakeNet-NG。以管理员身份运行:

fakenet.exe

然后再执行样本,观察 DNS 查询、TCP 连接、HTTP Host、请求路径、User-Agent 和发送内容。分析重点包括:

1. 域名是否硬编码,还是通过配置生成;
2. 是否先进行 DNS 查询;
3. 请求是否使用固定路径和参数;
4. 是否反复重试;
5. 返回不同状态码后,程序控制流是否变化。

不要让模拟环境透明转发到互联网。若样本发出的数据可能含有本机用户名、环境信息或文件内容,应把抓包文件视作敏感证据妥善保存。

九、步骤六:用 x64dbg 定位关键行为

根据架构选择 x32dbg 或 x64dbg。首次调试建议关闭不必要插件,并从干净快照开始。可以在以下 API 上设置断点:

bp kernel32.CreateProcessW
bp kernel32.CreateFileW
bp kernel32.WriteFile
bp advapi32.RegSetValueExW
bp winhttp.WinHttpSendRequest

不同系统版本中,部分 API 可能经过 KernelBase 或转发函数实现。如果断点未命中,可在模块加载后,到符号窗口搜索实际导出位置再下断。

断点命中后,按当前调用约定检查参数。64 位 Windows 的前四个整数或指针参数通常经 RCX、RDX、R8、R9 传递,其余参数位于栈上。例如 CreateFileW 命中时,可跟随 RCX 指向的宽字符串,确认实际访问路径。不要机械地把寄存器值解释为字符串,应先确认 API 原型和程序位数。

若入口点处代码短小、跳转密集,且随后将控制权转移到新分配的可执行内存,可能存在运行时解包。此时可以关注 VirtualAlloc、VirtualProtect、NtProtectVirtualMemory 等调用,并记录:

1. 新内存区域的基址和大小;
2. 权限从可写变为可执行的时间点;
3. 控制流是否跳入该区域;
4. 跳入后的代码是否出现正常函数结构、字符串引用和导入调用。

本文不展开脱壳重建,因为不同壳的导入修复和入口点判断差异较大。对于防御分析,先提取运行时 IOC、行为链和关键内存区域,通常比追求完美还原文件更重要。

十、结果整理示例

一份初步分析记录可采用以下结构:

样本标识:文件名、SHA-256、大小、架构。
静态发现:节区数量、入口点、签名状态、可疑导入、关键字符串、是否疑似加壳。
动态发现:创建的进程、文件、注册表键、服务、计划任务和网络请求。
调试证据:断点位置、参数内容、调用栈、相关地址和截图编号。
结论等级:已确认行为、较强推测、待验证假设。
处置建议:隔离相关主机、按哈希和路径检索、封禁已验证的网络指标、保留内存和日志。

例如,只有在 Procmon 记录到程序写入某个文件,并且调试器中 WriteFile 的缓冲区与落地内容一致时,才可以将其写文件行为列为已确认。若只在字符串中看到某路径,应标为静态线索,而非已发生行为。

十一、风险与注意事项

1. 虚拟机并非绝对安全边界,应及时更新虚拟化软件,不使用共享目录,不在宿主机保存可直接执行的样本。
2. 不要把敏感样本直接提交到公共在线扫描服务。公共服务可能共享样本或元数据,上传前应确认授权和数据处理政策。
3. 不要依赖单一杀毒名称判断家族。不同厂商命名体系不同,且启发式名称可能只描述行为。
4. 动态分析结束后应关机并恢复快照,而不是仅删除样本。样本可能已修改系统配置或留下持久化项。
5. 分析过程中避免使用真实账号登录浏览器、邮箱、代码仓库或企业系统。
6. 对可疑文档、驱动和内核级样本应采用更严格的专用环境。驱动样本可能导致系统崩溃,也可能扩大虚拟化逃逸风险。

十二、常见问题

问:样本运行后没有任何现象,是否可以判定安全?
答:不能。它可能需要命令行参数、配置文件、管理员权限、特定日期、网络响应或互斥体条件,也可能检测到虚拟机。应结合静态入口、资源、字符串和调试结果继续判断。

问:发现高熵节区是否等于加壳?
答:不等于。压缩资源、图片、安装数据和加密配置都会提高熵值。应结合节区权限、入口点、导入数量和运行时内存变化综合判断。

问:为什么 Procmon 中会出现大量失败事件?
答:Windows 程序经常按多个候选路径查找文件和注册表项。失败事件可能是正常探测,也可能体现环境识别逻辑。需要结合调用栈、重复模式和后续分支分析。

问:断点一直不命中怎么办?
答:先确认程序位数和模块是否已加载,再检查 API 是否经过转发、是否动态解析,或样本是否根本未走到该路径。可对 GetProcAddress、LoadLibraryW 等函数设置断点,观察其动态解析了哪些 API。

问:是否应该立即删除发现的可疑文件?
答:事件响应中不宜在证据未固定前贸然删除。先记录哈希、路径、时间戳、父进程和相关日志,再根据处置流程隔离或清理。

十三、总结

未知 PE 样本分析的核心不是堆砌工具,而是建立证据链。先用哈希固定对象,通过 PE 结构、导入表、字符串和能力规则形成假设;再在可回滚的隔离环境中,通过 Procmon、Process Explorer 和本地网络模拟验证行为;最后利用 x64dbg 对关键 API 参数和控制流进行确认。

分析报告应明确区分事实、推测与未验证线索,并保留原始日志、命令、截图和时间信息。只要坚持隔离、可重复和多证据交叉验证,即使暂时无法完整还原所有代码,也能为主机排查、IOC 检索和后续深度逆向提供可靠基础。
 

xiaobinz08

New member

xiaobinz08 Rep
0
0
0
Rep
0
xiaobinz08 Vouches
Vouches
0
1 MONTH
1 1 MONTH OF SERVICE
xiaobinz08 获得
0
0
0
获得
0
xiaobinz08 凭证
0
0
0
凭证
0
主题
3
点赞
0
HakB
1 月
在社区成长 1 月
LEVEL 1 1 XP
 
建议补充“时间线校准”环节:运行前统一虚拟机时区并记录 UTC 时间,同时在 Procmon 中启用独立 backing file,避免短命进程事件因缓存丢失。执行后立即对 PML、PCAP、截图及导出 CSV 分别计算 SHA-256,写入只追加的 manifest。举例:若 FakeNet 在 10:03:12 记录 DNS 请求,可用同秒的 Process Create、TCP Connect 和调试器断点命中记录交叉确认发起进程。这样能区分样本直接通信与子进程代发,但仍应把时间关联标注为证据链,而非仅凭一次同秒事件定性。
 
顶部