查询 36 次,耗时 0.2236 秒

Windows 可疑 PE 样本的静态与动态分析:从哈希归档到行为证据链

speedhacker

New member

speedhacker Rep
0
0
0
Rep
0
speedhacker Vouches
Vouches
0
5 MONTHS
5 5 MONTHS OF SERVICE
speedhacker 获得
0
0
0
获得
0
speedhacker 凭证
0
0
0
凭证
0
主题
13
点赞
0
HakB
5 月
在社区成长 5 月
LEVEL 100 XP
 
【背景与目标】

拿到一个来源不明的 EXE 或 DLL 时,最容易犯的错误是直接双击运行,或者只根据杀毒软件的单次告警就下结论。前者可能污染宿主机,后者则容易受到误报、壳和延迟执行的干扰。更可靠的方法是建立一条可复核的分析链:先固定样本身份,再进行静态分诊,随后在隔离环境中观察进程、文件、注册表和网络行为,最后把观察结果整理成可用于检测和处置的指标。

本文面向本地实验室、授权靶场和企业防御分析场景,演示一套 Windows PE 样本的基础分析流程。重点不是破解商业软件,也不讨论绕过安全产品,而是说明如何安全地判断未知程序“是什么、做了什么、留下了什么”。不要下载或运行来历不明的真实恶意样本;初学者可以先用自行编译的无害测试程序验证工具链。

【原理概览】

静态分析是在不执行样本的前提下检查 PE 结构、导入函数、字符串、数字签名和编译特征。它速度快、风险相对低,但可能受到压缩壳、字符串加密、动态解析 API 等手法影响。

动态分析是在受控虚拟机中执行样本,记录真实行为。它可以发现运行时解密、子进程创建、持久化和网络访问,但样本也可能检查虚拟机、等待特定时间或要求特定参数。因此,静态与动态结果必须相互印证,不能只依赖单一工具。

分析结果通常分为三类:第一类是事实,例如 SHA-256、签名状态、创建了某个文件;第二类是推断,例如高熵节区可能经过压缩;第三类是结论,例如样本具有凭据窃取能力。报告中应明确区分三者,避免把工具标签当成最终定性。

【前置条件】

1. 一台专用分析主机,建议不要存放真实账号、浏览器数据和办公文件。
2. VMware、VirtualBox 或 Hyper-V 中的 Windows 10/11 虚拟机,关闭共享剪贴板、拖放、共享目录、USB 自动连接和宿主机磁盘映射。
3. 创建干净快照,并使用仅主机网络或完全断网。若需要观察联网行为,应使用 INetSim、FakeNet-NG 等模拟服务,不能把未知样本直接接入互联网。
4. 工具建议:Sysinternals Sigcheck、Process Monitor、Process Explorer、Autoruns,以及 Detect It Easy、PE-bear、FLOSS、capa、Wireshark。工具应从官方项目页面获取并校验发布签名或哈希。
5. 准备一个加密压缩的样本保存目录,并采用统一命名规则。不要让资源管理器预览器、邮件客户端或同步盘自动处理样本。

【第一步:接收样本并固定证据】

先记录样本来源、接收时间、原始文件名、文件大小和分析人员。不要在原文件上修改、脱壳或打补丁;复制一份工作副本,原件只用于校验。

在 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 仅用于兼容旧情报库,不能用于证明文件唯一性。把命令输出保存到案件目录,并记录文件系统时间。注意,PE 头中的编译时间戳可以伪造,不能等同于真实编译时间。

【第二步:确认文件类型与数字签名】

不要只相信扩展名。使用 Detect It Easy 或 PE-bear 判断文件是否为有效 PE、目标架构是 x86 还是 x64、入口点落在哪个节区,以及是否存在异常节名或覆盖数据。

使用 Sigcheck 检查签名:

sigcheck64.exe -a -h -i .\sample.exe

重点查看签名是否有效、证书链是否可信、签名主体是否与文件用途匹配。必须注意:“已签名”不等于“安全”,证书可能被盗用,也可能由信誉较低的主体签发;“未签名”同样不能直接证明恶意。

典型异常包括:入口点位于可写且可执行的节区、节区原始大小与虚拟大小差距很大、文件尾存在大量覆盖数据、导入表极少但熵值很高。这些只构成进一步分析的理由,不应单独用于定性。

【第三步:提取字符串与能力线索】

普通 strings 对 UTF-16、栈字符串和简单混淆的覆盖有限,可以先执行:

floss.exe .\sample.exe > floss-output.txt

然后搜索路径、域名、注册表键、互斥体名称、命令行参数和错误信息。例如可重点关注但不要机械定性的内容有:AppData、Temp、CurrentVersion\\Run、schtasks、powershell、cmd.exe、User-Agent、HTTP 路径等。

接着使用 capa 识别潜在能力:

capa.exe .\sample.exe -vv > capa-report.txt

capa 的规则结果可以提示“创建进程”“修改注册表”“枚举进程”“解析 API”等能力,但规则命中仍需回到反汇编或动态日志核实。安装程序、远程管理工具和安全软件也可能具有类似行为。

【第四步:检查导入表和关键 API】

在 PE-bear、Ghidra 或 IDA Free 中检查导入表。分析时建议按行为分组,而不是看到单个 API 就下结论:

文件行为:CreateFileW、WriteFile、DeleteFileW;
进程行为:CreateProcessW、ShellExecuteW、OpenProcess;
注册表行为:RegCreateKeyExW、RegSetValueExW;
网络行为:WinHttpOpen、WinHttpConnect、InternetOpenW、connect;
动态解析:LoadLibraryW、GetProcAddress。

如果导入表只剩 LoadLibrary 和 GetProcAddress,可能说明程序在运行时解析其他 API,也可能只是正常的软件保护或体积优化。可以在调试器中对相关 API 设置断点,记录解析出的模块名和函数名,而不是猜测。

【第五步:建立动态分析基线】

恢复虚拟机干净快照,确认网络模式、系统时间和工具状态。先启动 Process Monitor,但不要立即运行样本。设置过滤器以减少噪声,例如:

Process Name is sample.exe → Include
Operation is Process Create → Include
Operation is WriteFile → Include
Operation is RegSetValue → Include

如果样本会创建子进程,仅按进程名过滤可能漏报。更稳妥的做法是先记录样本 PID,再跟踪其进程树,并在 Process Explorer 中确认父子关系。运行前还可以使用 Autoruns 保存一份基线,或导出关键注册表位置,便于前后对比。

建议同时启动 Wireshark 或 FakeNet-NG。完全断网时只能看到连接失败,无法获知后续协议内容;模拟网络服务则可以记录 DNS 查询、目标主机名、HTTP 请求路径和 User-Agent,同时避免流量离开实验室。

【第六步:受控执行并记录行为】

执行工作副本,记录准确时间。观察至少包括以下内容:

1. 是否生成子进程,命令行参数是什么;
2. 是否向 Temp、AppData、ProgramData 或用户启动目录写入文件;
3. 是否修改 Run、RunOnce、服务、计划任务等自启动位置;
4. 是否注入其他进程,或以异常权限打开其他进程;
5. 是否发起 DNS、TCP、HTTP 或 TLS 连接;
6. 进程退出后,新增文件和持久化项是否仍然存在。

不要只看界面。一个没有窗口的程序可能执行大量后台操作;一个弹出错误框的程序也可能已完成部分行为。Procmon 中应保存原始 PML 日志,再另行导出 CSV 用于筛选,因为 CSV 会丢失部分上下文信息。

如果样本疑似休眠,不建议随意修改系统时间或直接修补跳转。可以先在调试器中观察 Sleep、WaitForSingleObject 等调用,确认等待来源。调试动作必须记录,否则修改后的行为可能与原始样本不同。

【第七步:提取可防御的检测指标】

分析完成后,将指标分为强指标与弱指标。SHA-256 通常精确但容易随版本变化;固定域名、证书指纹、互斥体、特定注册表路径和稳定的文件结构可能更适合关联分析;临时文件名、普通系统 API 和公共云地址往往误报较高。

报告至少应包含:

样本 SHA-256 与文件大小;
文件类型、架构、签名状态;
关键静态发现及对应证据位置;
进程树和完整命令行;
新增、修改、删除的文件与注册表项;
网络请求及捕获时间;
分析环境和网络模式;
事实、推断和待确认项;
建议的隔离、封禁、排查与恢复措施。

例如,与其写“样本会持久化”,不如写“在本次 Windows 11 虚拟机测试中,进程向 HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run 写入名为 ExampleUpdate 的值,数据指向用户 AppData 下的新文件;该行为在进程退出后仍存在”。后者可复核,也便于蓝队编写查询。

【风险与注意事项】

第一,不要在宿主机直接运行样本,也不要依赖虚拟机快照代替隔离。配置错误的共享目录和桥接网络仍可能造成外溢。

第二,真实恶意样本可能包含虚拟机逃逸利用,但这类情况并不常见且后果严重。分析主机和虚拟化软件应及时更新,实验室网络应与生产网分离。

第三,不要把样本上传到公开多引擎平台,除非确认其中不含客户数据、内部路径、未公开漏洞样本或受保密协议约束的内容。公开上传可能导致样本和元数据被第三方共享。

第四,分析日志本身可能包含敏感信息,例如用户名、机器名和内部路径。发布报告前应脱敏,但不要删除影响复核的关键上下文。

第五,工具可能解析失败甚至被畸形文件触发漏洞。静态分析工具也应放在隔离环境内运行,并保持更新。

【常见问题】

问:杀毒软件没有报警,是否可以判定安全?
答:不能。新样本、定向样本、合法工具滥用和延迟执行都可能暂时不触发告警。应综合签名、结构、行为和上下文判断。

问:熵值很高是否说明加壳?
答:高熵常见于压缩、加密资源和壳,但安装包、媒体资源及正常保护软件也可能高熵。需要结合节区权限、入口点、导入表和运行时内存变化确认。

问:动态分析没有网络流量,是否表示没有联网能力?
答:不一定。样本可能等待参数、配置文件、特定日期、用户交互或可访问的 DNS,也可能先检查环境。应核对静态网络 API、字符串和实际执行路径。

问:为什么 Procmon 看不到子进程后续行为?
答:过滤条件可能只包含原始进程名。应根据 Process Create 事件找到子进程 PID,扩展过滤范围,或先采集全量日志再离线筛选。

问:能否依据编译时间判断攻击时间?
答:不能直接判断。PE 时间戳可被编译器设置、复制或人为修改,只能作为弱线索,并需结合签名时间、文件系统时间和外部日志。

【总结】

Windows PE 分析的关键不是堆砌工具,而是建立可重复、可审计的流程:先用哈希固定样本,验证格式与签名,再从字符串、导入表和结构中形成假设;随后在隔离虚拟机里通过进程、文件、注册表和网络日志验证假设;最后把结果转化为强弱分级的检测指标和明确的处置建议。

静态分析负责回答“它可能具备什么能力”,动态分析负责回答“它在当前条件下实际做了什么”。两者都存在盲区,因此报告应保留环境条件、原始日志和不确定项。只要证据链完整,即使暂时无法完成深度反编译,也能给防御团队提供可靠、可操作的判断依据。
 

180647004

New member

180647004 Rep
0
0
0
Rep
0
180647004 Vouches
Vouches
0
1 MONTH
1 1 MONTH OF SERVICE
180647004 获得
0
0
0
获得
0
180647004 凭证
0
0
0
凭证
0
主题
9
点赞
0
HakB
1 月
在社区成长 1 月
LEVEL 1 1 XP
 
补充一个容易遗漏的实践细节:动态分析前可用 Procmon 的 Tools→Process Tree 锁定样本及其后代进程,再将过滤条件设为 PID 集合,而不是只按映像名筛选。样本若复制自身后改名启动,或借助 cmd.exe、rundll32.exe 执行,单纯按 sample.exe 过滤会漏掉关键证据。导出结果时建议同时保留 PML、进程树截图及事件时间范围,并记录虚拟机快照编号;这样能把子进程命令行、落地文件和 Run 键写入按时间串成可复核证据链。
 
顶部