查询 32 次,耗时 1.3634 秒

从哈希到行为链:Windows PE 可疑样本的静态、动态与调试闭环

Likccc

New member

Likccc Rep
0
0
0
Rep
0
Likccc Vouches
Vouches
0
1 MONTH
1 1 MONTH OF SERVICE
Likccc 获得
0
0
0
获得
0
Likccc 凭证
0
0
0
凭证
0
主题
13
点赞
0
HakB
1 月
在社区成长 1 月
LEVEL 1 1 XP
 
一、背景

面对来源不明的 Windows PE 文件,最容易出现两种误区:一是只依赖杀毒软件或在线扫描结果下结论;二是直接双击运行,看到没有弹窗便认为样本无害。前者可能受到规则覆盖率、隐私限制和误报影响,后者则会漏掉静默驻留、子进程注入、延迟执行等行为。

本文给出一套适用于本地实验室、授权样本和企业防御取证的分析流程:先固定证据并完成静态初筛,再在隔离环境中记录文件、注册表、进程和网络行为,最后使用调试器验证关键 API 调用。目标不是“破解”商业软件,也不是帮助样本逃避检测,而是建立可复核的证据链,回答以下问题:文件是什么、可能做什么、实际做了什么、影响范围多大,以及可以如何检测和处置。

二、核心原理

1. 静态分析不运行程序,通过 PE 头、节区、导入表、资源、签名和字符串推测能力。它安全、快速,但对加壳、动态解析 API 和运行时解密的样本效果有限。

2. 动态分析在受控环境中运行样本,观察实际行为。它能发现落地文件、注册表持久化、子进程和网络连接,但行为可能受命令行参数、权限、时间、网络响应及环境检查影响。

3. 调试分析用于验证关键分支和 API 参数。例如在 CreateFileW、RegSetValueExW、CreateProcessW、connect 等位置断下,可以确认样本访问了哪个路径、写入了什么注册表值、启动了什么进程、连接了哪个地址。

4. 单个异常指标不能直接等同于恶意。高熵节区可能来自压缩资源,缺少签名不代表恶意,拥有有效签名也不代表绝对可信。可靠结论应由多个独立证据相互印证。

三、前置条件与实验室配置

建议准备两台虚拟机:Windows 分析机和可选的 REMnux 网络模拟机。Windows 分析机可安装 Sysinternals、Detect It Easy、FLOSS、capa、x64dbg、Wireshark 或 FakeNet-NG。REMnux 可提供抓包、DNS 和模拟互联网服务。

安全配置要求:

1. 使用专用虚拟机并创建干净快照,不在日常办公系统中运行样本。
2. 网卡设置为仅主机网络或完全断网,不使用桥接模式。若需观察网络行为,应连接到本地模拟服务,而非直接放行互联网。
3. 关闭共享文件夹、共享剪贴板、拖放、USB 自动连接和宿主机磁盘映射。
4. 虚拟机内不得保存真实账号、浏览器会话、SSH 密钥、办公文档或生产环境配置。
5. 虚拟化软件和宿主系统保持更新。快照便于恢复,但不能替代隔离措施。
6. 仅处理已获授权的样本。企业内部文件、未公开样本和可能包含客户数据的文件,不应擅自上传到公共扫描平台。

四、分步骤实践

步骤 1:建立案件目录并固定原始证据

先创建独立目录,保留原始样本,只对副本进行分析。PowerShell 示例:

New-Item -ItemType Directory C:/Cases/Case001/{original,work,logs,report}
Copy-Item C:/Incoming/sample.exe C:/Cases/Case001/original/sample.exe
Get-FileHash C:/Cases/Case001/original/sample.exe -Algorithm SHA256
Get-Item C:/Cases/Case001/original/sample.exe | Select-Object Name,Length,CreationTimeUtc,LastWriteTimeUtc
Copy-Item C:/Cases/Case001/original/sample.exe C:/Cases/Case001/work/sample.exe

在记录中至少写明样本来源、获取时间、文件大小、SHA-256、分析人员和实验环境。文件名可能被随意修改,因此后续关联应以哈希为主。时间戳只能作为线索,因为它可能来自复制过程,也可能被人为修改。

步骤 2:确认文件类型、架构和数字签名

使用 Sysinternals Sigcheck:

sigcheck64.exe -accepteula -nobanner -h -i C:/Cases/Case001/work/sample.exe

再使用 Detect It Easy 查看文件格式、编译器特征、入口点、节区和可能的壳。重点记录:

1. 是 PE32 还是 PE32+,对应 x86 或 x64。
2. 数字签名是否存在、证书链是否有效、签名覆盖的文件哈希是否匹配。
3. 节区名称、虚拟大小、原始大小和权限。可写且可执行的节区值得关注,但不能单独定性。
4. 入口点是否落在常规代码节,是否存在异常高熵节区、极小导入表或明显超大的资源。
5. 编译时间是否合理。PE 时间戳可以伪造,不能把它当成确定的生成时间。

有效签名仅能证明文件在签名后未被修改,并能关联到相应证书主体;若证书被盗用、签名主体本身不可信,文件仍可能存在风险。

步骤 3:提取字符串与能力线索

普通 strings 容易漏掉栈字符串、编码字符串和运行时构造内容,建议结合 FLOSS:

floss.exe C:/Cases/Case001/work/sample.exe > C:/Cases/Case001/logs/floss.txt

重点搜索 URL、域名、User-Agent、文件路径、互斥体名称、计划任务、服务名、注册表路径、PowerShell 参数和调试日志。不要把字符串出现等同于行为发生:一个安全软件也可能包含恶意域名特征库,一个程序可能引用某个 API 却从未走到对应分支。

使用 capa 形成能力假设:

capa.exe -vv C:/Cases/Case001/work/sample.exe > C:/Cases/Case001/logs/capa.txt

capa 的结果适合回答“可能具备什么能力”,例如创建进程、修改注册表或执行网络通信,但仍需要动态证据验证。若工具显示样本疑似加壳,应先保留原样本,再针对副本处理。只有确认是合法 UPX 压缩时,才可尝试:

upx.exe -t C:/Cases/Case001/work/sample.exe
upx.exe -d C:/Cases/Case001/work/sample.exe -o C:/Cases/Case001/work/sample_unpacked.exe

解包后的文件应重新计算哈希,并明确标记为分析派生物,不能与原始证据混淆。

步骤 4:建立分析假设表

在运行前列出准备验证的假设。例如:

假设 A:样本通过 Run 键实现当前用户持久化。验证点为 RegSetValue 操作和对应注册表路径。
假设 B:样本会在 AppData 或 Temp 落地副本。验证点为 CreateFile、WriteFile 和最终文件哈希。
假设 C:样本会启动脚本解释器。验证点为父子进程关系、完整命令行和脚本文件来源。
假设 D:样本连接外部服务。验证点为 DNS、目标 IP、端口、协议及网络失败后的分支。

这种做法可以避免只收集大量日志,却没有明确结论。

步骤 5:采集运行前基线

使用 Autoruns 保存启动项基线,使用 Process Explorer 记录初始进程,必要时执行:

Get-Process | Select-Object Id,ProcessName,Path | Export-Csv C:/Cases/Case001/logs/process_before.csv -NoTypeInformation
Get-ChildItem C:/Users/lab/AppData/Local/Temp -Force | Export-Csv C:/Cases/Case001/logs/temp_before.csv -NoTypeInformation

Procmon 中建议先清空事件,再设置过滤条件:Process Name is sample.exe,或者先不按进程过滤,以免遗漏样本创建后立即退出的子进程。重点关注 Process Create、CreateFile、WriteFile、SetRenameInformationFile、RegCreateKey、RegSetValue 和 Load Image。启用落盘日志,避免内存缓冲区被大量事件覆盖。

步骤 6:配置受控网络

如果不需要网络,可直接断开虚拟网卡。如果需要观察网络意图,优先使用 FakeNet-NG 或 REMnux 的 INetSim。使用 Wireshark 或 tshark 抓包前先列出接口:

tshark -D
tshark -i 1 -w C:/Cases/Case001/logs/trace.pcapng

接口编号应按实际环境调整。模拟网络的价值在于让 DNS、HTTP 等请求获得可控响应,同时防止样本接触真实目标。不要为了“看完整行为”临时开启桥接或把虚拟机接入办公网络。

步骤 7:执行并记录行为

从快照启动实验,先开启 Procmon、进程监控和抓包,再运行工作副本。记录准确时间、运行方式、权限级别、命令行以及持续观察时间。不要只盯着主进程:样本可能创建子进程后立即退出,也可能把后续行为交给计划任务、服务或脚本解释器。

运行后重点回答:

1. 新增、修改或删除了哪些文件?对新增可执行文件重新计算 SHA-256。
2. 修改了哪些注册表键值?特别检查 Run、RunOnce、服务、计划任务及文件关联。
3. 创建了哪些进程?父进程、子进程、完整命令行和完整路径是什么?
4. 加载了哪些非常规 DLL?DLL 的来源目录和签名状态如何?
5. 发出了哪些 DNS、TCP、TLS 或 HTTP 请求?失败请求同样是证据。
6. 样本退出后是否仍有进程、服务、任务或文件保持活动?

执行结束后导出 Procmon 的 PML,并保存 CSV 作为便于检索的副本。抓包、截图、工具日志和分析笔记应统一放入案件目录。

步骤 8:使用 x64dbg 验证关键 API

仅对自编测试程序或授权样本调试。根据样本架构选择 x32dbg 或 x64dbg。常用观察点包括 KernelBase!CreateFileW、KernelBase!WriteFile、advapi32!RegSetValueExW、KernelBase!CreateProcessW、ws2_32!connect 和 winhttp!WinHttpSendRequest。

在 Windows x64 调用约定中,前四个整数或指针参数通常位于 RCX、RDX、R8、R9,返回值通常位于 RAX。例如在 CreateFileW 入口断下时,可跟随 RCX 指向的宽字符串,确认实际打开的路径;在 RegSetValueExW 处,可结合寄存器和栈参数确认值名、类型、数据长度及数据内容。

如果 API 断点没有命中,应检查对应模块是否已加载、API 是否被转发到 KernelBase、程序是否使用 Native API,或者目标行为是否发生在子进程。不要为了追求“跑起来”而随意修改安全机制或将样本移出隔离环境。调试阶段的目标是验证证据,而不是帮助程序规避检测。

步骤 9:形成 IOC 与检测规则

IOC 应区分强弱。SHA-256 精确但容易因重新编译而变化;文件路径和注册表键较稳定,但可能误报;域名和证书信息需要结合上下文。推荐同时保留:原始样本哈希、落地文件哈希、文件路径、注册表值、计划任务或服务名、进程树、命令行、域名、IP、端口、User-Agent 和首次观测时间。

以下是用于本地实验样本的 YARA 思路,字符串必须替换为实际观察值并进行误报测试:

import "pe"
rule LAB_Persistence_Demo {
meta:
purpose = "local defensive lab only"
strings:
$run = "Software\\Microsoft\\Windows\\CurrentVersion\\Run" ascii wide
$domain = "lab-beacon.invalid" ascii wide
$name = "LabUpdate" ascii wide
condition:
uint16(0) == 0x5A4D and pe.is_pe and filesize < 5MB and 2 of them
}

其中 .invalid 是保留的无效顶级域,适合文档和实验占位。正式规则不应只因为出现 Run 字符串就告警,至少要加入样本家族特有字符串、代码特征、节区特征或上下文约束,并使用正常软件集合验证误报率。

五、风险与注意事项

1. 不要在宿主机直接解压或预览样本。资源管理器扩展、归档工具和文件解析器本身也可能存在漏洞。
2. 密码压缩包不是安全边界,只是减少邮件网关误处理的常见包装方式。
3. 不要把未知样本上传到公共平台后再考虑保密问题。上传动作可能导致样本被共享给安全厂商或其他合作方。
4. 动态分析没有观察到行为,不等于没有恶意。样本可能需要参数、管理员权限、特定日期、网络响应或特定父进程,也可能仅在重启后触发。
5. 高熵、无签名、可写可执行节区和可疑字符串都是线索,不是最终判定。
6. 恢复快照前先停止抓包并导出日志。快照回滚会清除虚拟机内尚未转移的证据。
7. 处置生产环境时,不要直接照搬实验室中的删除操作。应先隔离主机、保全证据,再依据事件响应流程清除持久化和恢复系统。

六、常见问题

问:样本运行后完全没有事件,是否可以判定无害?
答:不可以。先确认进程是否成功创建、架构是否匹配、是否缺少依赖、是否需要命令行参数,并检查子进程和异常退出码。还要考虑延迟执行和网络响应条件。结论应写成“在当前条件和观察窗口内未发现某行为”,而不是“样本无害”。

问:数字签名有效,为什么仍需分析?
答:签名解决的是完整性和发布者关联问题,不直接保证业务逻辑安全。被盗证书、供应链污染和带风险功能的合法工具都可能拥有有效签名。

问:静态工具认为样本加壳,应该直接脱壳吗?
答:先记录原始文件特征,并判断是安装包压缩、普通保护还是代码壳。动态行为足以回答处置问题时,不必为了脱壳而扩大分析范围。确需处理时只操作副本,并为所有派生文件单独计算哈希。

问:为什么 Procmon 只看到主进程,网络却由其他进程发出?
答:样本可能通过子进程、服务、计划任务或系统组件完成后续操作。过滤器过窄也会漏报,因此应结合进程树、Process Create 事件和抓包时间线关联分析。

问:IOC 越多越好吗?
答:不是。缺少来源、时间和置信度的 IOC 很难运营。应注明每个指标来自静态提取、动态观测还是外部情报,并说明它是精确匹配还是可能产生误报的行为特征。

七、总结

可靠的 Windows 样本分析不是简单地“丢进沙箱看结果”,而是一个可重复的闭环:固定原始证据,完成 PE 与签名初筛,提取字符串和能力线索,提出可验证假设,在隔离环境中采集文件、注册表、进程和网络证据,再通过调试器确认关键参数,最后输出带置信度的 IOC、检测建议和处置结论。

分析报告中应明确区分事实、推断与未知项。事实写明工具、时间和证据位置;推断说明依据;无法验证的内容如实保留。这样的报告即使交给另一名分析人员,也能够按相同步骤复核,而不是只能依赖分析者的主观判断。
 

1371340

New member

1371340 Rep
0
0
0
Rep
0
1371340 Vouches
Vouches
0
1 MONTH
1 1 MONTH OF SERVICE
1371340 获得
0
0
0
获得
0
1371340 凭证
0
0
0
凭证
0
主题
9
点赞
0
HakB
1 月
在社区成长 1 月
LEVEL 1 1 XP
 
建议再补一项“时间线归一化”:分析机、REMnux 与宿主机先校准时钟,所有记录统一使用 UTC,并在执行样本前手工生成一个带时间戳的标记文件。随后将 Procmon、进程创建日志、PCAP 和调试器命中时间按同一时间轴合并。例如看到 CreateProcessW 启动 powershell.exe 后,可继续关联其 DNS 请求及落地文件哈希。若事件时间相差较大,应先排查虚拟机暂停、时钟漂移和日志缓冲,避免把无关事件误拼成行为链。
 
顶部