查询 32 次,耗时 0.2272 秒

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
主题
4
点赞
0
HakB
1 月
在社区成长 1 月
LEVEL 1 1 XP
 
一、背景

在木马分析和应急响应中,分析人员经常会拿到一个来源不明的 EXE 或 DLL:它可能来自邮件附件、终端告警、隔离区,也可能只是某个业务程序的误报。此时不应直接双击运行,更不能只凭杀毒软件的一次扫描就下结论。较稳妥的方法是先完成静态分诊,再在隔离环境中进行受控动态分析,最后把文件、进程、注册表、网络和持久化行为整理成可复核的证据链。

本文给出一套面向 Windows PE 文件的本地防御分析流程。重点不是判断某个样本“像不像病毒”,而是回答以下问题:文件身份是否稳定、是否经过加壳或混淆、具备哪些潜在能力、运行后修改了什么、是否存在持久化或进程注入迹象,以及如何提取可用于排查的 IOC。全文仅适用于自有样本、授权靶场和隔离实验环境。

二、核心原理

静态分析是在不执行目标文件的情况下检查 PE 头、节区、导入导出、字符串、资源和代码特征。其优点是安全、可重复,缺点是容易受到加壳、动态解析 API 和控制流混淆影响。

动态分析则让样本在受控虚拟机内运行,并记录进程创建、文件落地、注册表修改、模块加载、网络访问和异常行为。它能看到真实动作,但可能受到延时执行、环境检测、条件触发和休眠规避影响。

两者应相互校验。例如,静态分析发现样本导入 CreateProcessW、RegSetValueExW 和 WinHttpSendRequest,只能说明它可能具备相关能力;只有动态日志显示其确实创建子进程、写入启动项并建立连接,才能确认对应行为实际发生。

三、前置条件

1. 一台专用分析主机,宿主机不要保存生产凭据、浏览器会话或敏感文档。
2. Windows 10 或 Windows 11 分析虚拟机,建议使用 VMware、VirtualBox 或 Hyper-V,并在测试前创建干净快照。
3. 关闭共享剪贴板、拖放、共享目录、USB 自动挂载和宿主机磁盘映射。
4. 网络默认设为断网或 Host-only。确需观察网络行为时,可使用 INetSim、FakeNet-NG 等本地模拟服务,不要让未知样本直接访问互联网。
5. 常用工具:PowerShell、Sigcheck、PEStudio 或 Detect It Easy、FLOSS、capa、Process Monitor、Process Explorer、Autoruns、TCPView 或 Wireshark、x64dbg。工具应从官方来源下载并校验完整性。
6. 样本使用带密码的压缩包保存,文件名可改为 sample.bin,避免资源管理器预览、同步软件或安全产品误处理。

四、第一阶段:建立样本身份与证据记录

先复制一份只读工作副本,记录获取时间、来源、原始文件名、文件大小和分析人员。随后计算多种哈希:

PowerShell:
Get-FileHash .\sample.exe -Algorithm SHA256
Get-FileHash .\sample.exe -Algorithm SHA1
Get-FileHash .\sample.exe -Algorithm MD5

也可以使用系统命令:
certutil -hashfile sample.exe SHA256

SHA-256 应作为主要标识。MD5 和 SHA-1 不适合证明文件未被恶意碰撞,但仍可用于兼容旧日志和部分安全产品的查询格式。每次解包、脱壳或修补后都要重新计算哈希,避免把不同阶段的文件混为一谈。

使用 Sysinternals Sigcheck 检查签名和版本信息:
sigcheck64.exe -a -h -i .\sample.exe

需要注意,有数字签名不等于文件安全。应确认签名状态、证书链、签名时间和文件版本信息是否一致。无效签名、已撤销证书、签名主体与产品描述明显不符,都值得进一步调查。

五、第二阶段:PE 结构和加壳迹象检查

用 PEStudio 或 Detect It Easy 查看以下字段:

1. 编译架构:x86、x64、ARM64,避免选择错误的调试器。
2. 时间戳:只能作为线索,攻击者可以修改,不能单独用于归因。
3. 入口点:入口点落在名称异常或可写可执行节区时,需要关注。
4. 节区权限:同时具备读、写、执行权限的节区风险较高,但某些解释器和保护壳也会这样设置。
5. 节区熵值:接近随机数据的高熵节区可能包含压缩、加密内容,也可能只是正常资源。
6. 导入表:导入函数极少,同时存在 LoadLibrary、GetProcAddress,可能表示运行时动态解析 API,也可能是加壳后的常见表现。
7. TLS 回调:代码可能在常规入口点前执行,调试时不能只盯住 AddressOfEntryPoint。
8. 资源:检查嵌入式 PE、脚本、配置、图标和语言信息。

常见可疑能力与 API 线索包括:

进程操作:OpenProcess、VirtualAllocEx、WriteProcessMemory、CreateRemoteThread。
持久化:RegSetValueEx、CreateService、StartService、Task Scheduler COM 接口。
网络通信:WinHttpOpen、WinHttpConnect、InternetOpenUrl、WSAStartup、connect。
反调试:IsDebuggerPresent、CheckRemoteDebuggerPresent、NtQueryInformationProcess。
文件落地:CreateFile、WriteFile、MoveFile、GetTempPath。

这些 API 不能单独证明恶意。例如,调试器、升级程序和企业管理软件也可能操作其他进程。分析结论必须结合调用上下文和运行行为。

六、第三阶段:字符串与能力分析

普通 strings 工具只能发现明文字符串。对于栈字符串、简单异或编码和运行时拼接内容,可使用 FLOSS:

floss.exe .\sample.exe > floss_output.txt

重点检索以下内容:

http、https、域名、IP 地址、User-Agent、互斥体名称、管道名、注册表路径、计划任务名、服务名、临时目录、PowerShell 参数、cmd.exe、rundll32.exe、regsvr32.exe,以及看起来像 Base64 或十六进制编码的数据。

不要把发现的域名直接放入浏览器访问。若需核实格式,可先在离线文本中分析;若需解析 DNS 或协议行为,应使用受控网络模拟器。

随后使用 capa 识别可能的行为能力:
capa.exe .\sample.exe -v

capa 的结果适合作为调查导航。例如输出包含“create or open registry key”“inject thread”“communicate over HTTP”,应回到反汇编和动态日志中确认。规则匹配可能存在误报,尤其是静态链接大型运行库的程序。

七、第四阶段:建立动态分析基线

恢复虚拟机干净快照,在运行样本前记录系统状态。建议完成以下准备:

1. 启动 Process Monitor,过滤条件设置为 Process Name is sample.exe,同时保留其子进程。
2. 启动 Process Explorer,观察进程树、命令行、父进程、完整性级别和已加载 DLL。
3. 启动 Autoruns,并保存运行前结果。
4. 使用 TCPView、Wireshark 或 FakeNet-NG 记录网络活动。
5. 记录关键目录内容,例如 %TEMP%、%APPDATA%、%LOCALAPPDATA%、ProgramData 和启动目录。
6. 记录常见自启动位置:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
HKLM\Software\Microsoft\Windows\CurrentVersion\Run

Procmon 初期可以保留以下操作:Process Create、CreateFile、WriteFile、SetRenameInformationFile、RegCreateKey、RegSetValue、Load Image。事件过多时,不要立即删除日志,而应先保存 PML 原始文件,再通过过滤器缩小范围。

八、第五阶段:受控执行与行为记录

确认虚拟机没有宿主机共享资源后再运行样本。不要使用真实管理员密码,也不要在域成员机器上测试。若样本要求管理员权限,应先评估必要性,并使用一次性的本地测试账户。

执行后按时间顺序观察:

1. 样本是否立即退出,还是创建了子进程。
2. 是否复制自身到 AppData、Temp 或 ProgramData。
3. 是否创建名称随机的 EXE、DLL、脚本或配置文件。
4. 是否修改 Run 键、服务、计划任务、WMI 订阅或启动目录。
5. 是否启动 powershell.exe、cmd.exe、rundll32.exe、regsvr32.exe、mshta.exe 等系统组件,并检查完整命令行。
6. 是否打开其他进程并申请可执行内存。
7. 是否产生 DNS、HTTP、TLS 或自定义 TCP 流量。
8. 是否延迟执行、重复读取系统信息,或检查虚拟机相关进程和驱动。

可用 PowerShell辅助查看进程命令行:
Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name,CommandLine

查看当前 TCP 连接:
Get-NetTCPConnection | Sort-Object State,RemoteAddress

查看计划任务:
Get-ScheduledTask | Select-Object TaskName,TaskPath,State

查看服务:
Get-CimInstance Win32_Service | Select-Object Name,State,StartMode,PathName

建议分别观察 1 分钟、5 分钟和 15 分钟。部分样本存在延迟,但不要为了等待而长期开放外网。若程序依赖特定参数或文档输入,缺少触发条件可能导致“无行为”,此时结论应写成“当前条件下未观察到”,而不是“样本安全”。

九、第六阶段:用 x64dbg 定位关键行为

动态调试前先确认架构:32 位程序使用 x32dbg,64 位程序使用 x64dbg。建议优先对工作副本调试,并保留原始哈希。

可在以下 API 上设置断点:

bp kernel32.CreateProcessW
bp kernel32.WriteFile
bp advapi32.RegSetValueExW
bp kernel32.VirtualAlloc
bp kernel32.VirtualProtect
bp winhttp.WinHttpSendRequest

实际模块名可能因转发函数和系统版本而变化,断点未命中时可在符号窗口搜索对应 API,或在调用点设置断点。命中后重点查看:

1. 调用栈是否来自样本自身模块。
2. 参数指向的文件路径、注册表路径、缓冲区和命令行。
3. VirtualProtect 是否把内存权限改为可执行。
4. 新分配内存中是否出现 MZ、PE 字样或连续代码。
5. 网络发送缓冲区中是否含主机名、路径、请求头或加密前数据。

对于疑似加壳样本,可观察入口点附近是否存在大量解密循环、异常跳转,以及解密完成后跳入新内存区域的行为。不要机械地寻找所谓“一键 OEP”。更可靠的判断是:导入调用开始稳定出现、代码区结构趋于正常、栈平衡合理,并且控制流进入较完整的业务逻辑。若需要转储内存镜像,应明确记录转储时刻、基址、进程 ID 和对应哈希,避免后续分析无法复现。

十、形成行为时间线与 IOC

分析结果应按时间组织,而不是只堆砌截图。示例格式如下:

T+0 秒:sample.exe 启动,父进程为 explorer.exe。
T+2 秒:在 %LOCALAPPDATA%\ExampleCache\ 写入 update.dat。
T+3 秒:创建子进程,命令行包含本地测试路径。
T+5 秒:修改某测试注册表键。
T+8 秒:向 FakeNet-NG 模拟地址发起 HTTP 请求。

IOC 可分为:

文件类:SHA-256、文件大小、落地路径、PE 特征。
注册表类:完整键路径、值名、值数据。
进程类:父子进程关系、完整命令行、异常模块。
网络类:域名、URI、端口、User-Agent、证书指纹。
行为类:创建服务、计划任务、远程线程或可执行内存等。

不要只记录 IP 地址。云服务和共享主机的 IP 变化快,误封风险也较高。更有价值的是把域名、URI、请求特征、进程来源和时间范围组合起来。

十一、风险与注意事项

1. 不要在日常办公机、生产网络或域控环境运行未知样本。
2. NAT 并不等于安全隔离。样本仍可能访问外网或扫描同网段,优先使用断网或 Host-only。
3. 不要把客户文件、内部程序或含个人信息的样本直接上传到公开多引擎平台。此类平台可能保存并共享样本。
4. 分析完成后应恢复快照,而不是仅删除样本文件。持久化项、驱动和被修改的系统组件可能仍然存在。
5. 不要根据单个字符串、单条规则或单个 API 下结论,应至少结合两类独立证据。
6. 调试器可能改变程序时序和异常处理路径。必要时应把调试结果与不附加调试器的 Procmon 行为对照。
7. 如果样本疑似利用内核漏洞、包含驱动或可能逃逸虚拟机,应停止普通实验,转交具备专用硬件隔离条件的团队处理。

十二、常见问题

问题一:样本双击后没有任何现象,是否可以判定安全?
不能。它可能需要命令行参数、特定文件、管理员权限、网络响应、日期条件或父进程,也可能检测到虚拟机后退出。应检查进程生命周期、退出码、文件访问失败记录和分支条件。

问题二:检测到高熵节区,是否一定加壳?
不一定。压缩资源、图片、证书和加密配置也会产生高熵。应结合节区权限、入口点、导入数量和运行时内存变化判断。

问题三:样本没有导入网络 API,是否说明不会联网?
不能。它可能动态解析 API、使用 COM、调用系统工具、加载运行库,或把网络功能放在子进程和嵌入模块中。

问题四:Procmon 日志太多,如何快速定位?
先按进程树过滤,再关注写文件、注册表写入和进程创建。对频繁的查询操作暂时排除,但保留原始 PML 文件,以免过度过滤丢失证据。

问题五:发现可疑域名后能否直接访问确认?
不建议。浏览器访问可能暴露分析环境、触发下载或执行重定向。应优先分析抓包、DNS 请求和本地模拟服务记录,并按组织流程交由威胁情报系统核验。

十三、总结

可靠的 PE 样本分析不是简单运行几款工具,而是一套可复现的证据流程:先计算哈希并记录来源,再检查签名、PE 结构、字符串和能力特征;随后在隔离虚拟机中建立基线,受控执行并记录进程、文件、注册表和网络行为;必要时使用 x64dbg 在关键 API 和内存权限变化处定位真实参数;最后形成行为时间线、IOC 和带证据等级的结论。

最重要的原则有三点:静态能力不等于实际行为,未观察到行为不等于不存在行为,任何结论都应保留复核条件。按照这套流程,即使暂时无法完成完整反编译,也能较快判断风险范围,并为终端排查、检测规则编写和后续深度逆向提供可靠基础。
 

monika

New member

monika Rep
0
0
0
Rep
0
monika Vouches
Vouches
0
2 MONTHS
2 2 MONTHS OF SERVICE
monika 获得
0
0
0
获得
0
monika 凭证
0
0
0
凭证
0
主题
6
点赞
0
HakB
2 月
在社区成长 2 月
LEVEL 1 1 XP
 
建议在动态阶段把“观察”固化为可复核的时间线,而不是只截图。运行前记录虚拟机时间、样本 SHA-256、关键目录和 Autoruns 快照;运行后按 PID 关联 Procmon、网络日志与进程树,并统一转换为 UTC。对每个新落地文件立即计算哈希,记录父进程、命令行、写入路径和首次出现时间。例如 sample.exe 创建 powershell.exe 后写入 AppData\a.dll,应同时保存该 DLL 哈希、PowerShell 完整参数及对应网络连接。分析结束先导出原始 PML、PCAP 和快照差异,再恢复快照,避免清理动作覆盖证据。
 
顶部