托管样本保留元数据
.NET 可执行文件与脚本混淆程序不同,编译后仍保留类型、方法、命名空间与资源等元数据,字符串也常以 UTF-16 形式存放。这让静态排查的性价比很高:先用字符串工具扫一遍类名、方法名与可疑关键字,往往就能看出程序在做什么,再决定是否用反编译工具精读某一处逻辑。
重点看什么
优先关注外联相关线索(URL、IP、User-Agent 字符串)、执行相关调用(进程启动、脚本宿主调用)、加解密相关命名(密钥或算法名)、以及长 Base64 串。托管样本的密钥也常以 Base64 形式硬编码在代码或资源里,看到长串先记录下来,后续可能用于解密载荷配置。
基本信息
| 适用平台 | Windows(.NET 可执行文件与程序集);跨平台 .NET 程序同理 |
|---|---|
| 字符串编码 | 托管字符串多为 UTF-16,需用支持 -el 的工具提取 |
| 常见线索 | 类名与方法名、命名空间、资源段、长 Base64 串 |
| 工具顺序 | 字符串初筛,再按需用反编译工具精读 |
| 隔离要求 | 反编译与调试在隔离环境进行,避免运行原样本 |
典型使用场景
- 可疑可执行文件带托管特征:用字符串先看类名与方法名快速定性
- 发现外联地址:从字符串里提取域名、URL 与 User-Agent
- 定位配置解码逻辑:按加解密相关命名找到解密方法再精读
- 分析加载器:看它如何从资源或远端取回下一阶段载荷
- 同族比对:命名空间与类名相似可辅助关联多个样本
提取字符串与线索
提取字符串与线索
# UTF-16 字符串:托管代码里的类名、方法名与常量多在此
strings.exe -n 8 -el sample.dll | Select-String -Pattern 'http|powershell|cmd|Aes|Key|Base64' |
Select-Object -First 20
# ASCII 字符串补充(有的编译器会混用两种编码)
strings.exe -n 8 -e sample.dll | Select-String -Pattern 'http|\.exe|temp|run' |
Select-Object -First 20
# 记录可疑长串,可能与密钥或配置有关
strings.exe -n 8 -el sample.dll | Where-Object { $_.Length -gt 60 } | Select-Object -First 20线索类型与含义
| 线索 | 常见含义 | 后续动作 |
|---|---|---|
| URL 或域名 | 外联或下载地址 | 与流量日志、DNS 记录互证 |
| 进程启动相关调用 | 拉起子进程或脚本 | 关注命令行与父进程关系 |
| 加解密命名 | 载荷或配置解密逻辑 | 定位方法并记录密钥来源 |
| 长 Base64 字符串 | 硬编码的密钥或配置 | 记录后尝试按算法解码验证 |
| 资源段内容 | 内嵌的下一阶段载荷 | 导出资源并单独鉴定 |
混淆后的托管样本可能把字符串延迟到运行时解码,静态字符串会显得很干净;此时应把重点放到动态行为与内存中的解密结果上。
分析时只对副本操作并保留原始样本哈希:反编译工具可能生成同名中间文件,在证据目录里操作会造成文件混入。