简介:面向网络安全分析人员与恶意代码研究者的病毒样本提取工具包,聚焦从受感染系统或可疑文件中安全获取、分析恶意代码的完整闭环。这套资料系统梳理了安全隔离、样本捕获、静态分析、动态监控、逆向工程与特征签名创建等关键环节,既阐释如何通过日志与网络监控锁定可疑痕迹,也说明如何利用文件结构、内存行为等视角还原恶意逻辑。在静态分析环节,可关注文件头、导入导出表及资源段等特征;动态分析则应观察进程行为、网络连接与注册表变化。结合伪装文件识别、异常系统服务排查等典型场景,能够帮助读者构建标准化的样本处置方法论,既适用于日常恶意样本分析,也能支撑应急响应中的快速研判。资源以RAR压缩包形式提供,整体约2.08MB,内容精炼、便于快速获取查阅;已有832人学习下载,适合希望系统掌握恶意代码分析技能的安全从业者、应急响应人员及攻防研究者参考。 半夜接到应急电话,说办公区有台机器异常,CPU跑满,网络连接持续往外发包。远程登录一看,进程列表里一个伪装成 svchost.exe 的进程,路径却落在临时目录下。这种情景对做过恶意代码分析的人太熟悉了——真正的研究工作,不是立刻结束进程,而是先想办法把病毒样本提取工具这块棋下好。很多人以为提取样本就是"复制一个文件",实际上,一套规范的提取流程,直接决定你后续能拿到多干净的样本、能不能还原完整攻击链。这篇文章就围绕样本提取这件事,把我自己实操中验证过的工具、顺序和坑,一次性讲清楚。
1. 提取前的"现场纪律":决定样本价值的不是工具,是顺序
1.1 为什么第一个动作是断网而不是双击杀毒
我先说个反直觉的点:装上杀毒软件全盘扫描,可能是样本提取阶段最容易翻车的操作。杀毒软件的本职是清除威胁,不是你做分析的助手。很多场景里,你一扫描,恶意外联进程被杀掉,文件被隔离甚至删除,等你再想提取样本去还原攻击链时,现场早就被"打扫"干净了。
我处理过好几起案例,客户自己先用某款杀软扫了一遍,病毒文件进了隔离区,结果提取出来的文件缺失了释放物,只剩下加载器,后续分析非常被动。所以接到现场后的第一个动作应该是物理断网或拔掉网线,切断恶意程序的 C2 通信,防止它进一步自我删除、加密文件或者二次扩散。断网这个动作不需要任何工具,但它是所有提取工作的前置条件。
还有一个很容易被忽略的细节:断网不代表拔电。有些应急人员为了"安全",直接强制关机,这等于把内存里最关键的攻击痕迹全部丢掉。正确做法是保持系统运行,优先做内存镜像,然后再处理磁盘。
1.2 易失性数据优先:内存、进程、磁盘的抓取顺序
数字取证里有个经典原则叫"易失性数据优先"(Order of Volatility)。意思是说,越容易丢失的数据,越要先采集。内存里的数据几毫秒就可能变,进程退出就没了,网络连接随时断开,而磁盘上的文件相对稳定,可以放到后面处理。
所以在样本提取这件事上,我的习惯顺序是:先做内存镜像,再导出进程列表和网络连接,最后才去磁盘上复制文件。很多无文件攻击的样本只存在于内存中,不按这个顺序操作,你后面再想提取,已经什么都捞不到了。
这里需要强调的是,内存镜像不是清理完现场之后"补拍"的,它是"现场照片",必须在第一时间拍下来。DumpIt、FTK Imager Lite 这类工具都能在 Windows 系统运行状态下生成物理内存镜像,操作成本很低,后面我会展开讲具体用法。
1.3 提取前必须记录的现场信息清单
我见过不少分析人员,花大力气把样本提取出来了,结果问起来源路径、发现时间、当时的进程 PID 是多少,一概不知。样本脱离了上下文,分析价值至少打对折。所以在动手提取前,花三分钟把现场信息记下来,是有回报的投资。
我常用的现场信息记录模板大致是这样的:
| 字段 | 说明 | 示例 |
|---|---|---|
| 发现时间 | 第一次发现异常的时间 | 2024-06-18 02:31 |
| 设备信息 | 主机名、IP、MAC、系统版本 | WIN-FILE03 / 10.20.3.7 / Win10 22H2 |
| 可疑进程 | 进程名、PID、路径 | svchost.exe / PID 4832 / C:\Users\Public\svchost.exe |
| 网络行为 | 外联IP、端口、连接状态 | 203.0.113.5:443 ESTABLISHED |
| 文件路径 | 样本在磁盘上的原始位置 | C:\Users\Public\svchost.exe |
| 用户上下文 | 以哪个用户运行 | SYSTEM |
| 启动方式 | 服务、计划任务、启动项等 | 计划任务 \Microsoft\Windows\Update\Updater |
这些信息不需要专门的工具,记事本就能记,但它的价值在于给样本提供了"案发背景"。后面你分析样本时,很多线索都是靠这些记录串起来的。
2. 按场景选型:磁盘、进程、内存、流量,每类样本都有趁手的工具
2.1 磁盘与文件层面的工具组合
磁盘层面的提取,核心任务是找到恶意文件在文件系统里的实体,并把它完整复制出来。这里我用得最顺手的工具是 Sysinternals 套件里的 Process Explorer 和 Autoruns,再加一个 FTK Imager。
Process Explorer 比 Windows 自带的任务管理器强在两点:一是能显示进程对应的完整命令行和路径,二是能验证文件数字签名。很多恶意程序把自己的进程名伪装成 svchost.exe、explorer.exe,但路径和签名一验就露馅。Autoruns 则是排查开机自启动、计划任务、服务、驱动的大杀器,勾选 Options -> Filter Options -> Hide Signed Microsoft Entries 之后,非微软签名的启动项一目了然。
如果需要在离线状态下提取磁盘文件,或者做整盘镜像,FTK Imager 是免费且经得起法庭检验的工具。它可以直接挂载物理磁盘或逻辑分区,然后把可疑目录导出成本地文件,过程中不会修改原始介质。
2.2 进程与内存层面的工具组合
进程和内存层面的提取,服务于两种典型场景:一种是恶意程序正在运行,你想把它的进程内存抓下来;另一种是怀疑存在无文件攻击,需要做整个物理内存的镜像。
正在运行的进程,我用微软官方出的 procdump。它可以把指定进程的内存完整 dump 成一个文件,后续可以直接用分析工具打开,也可以提交到分析平台。命令很简单:
procdump -ma -o -accepteula -x dump_dir 进程PID-ma表示抓取完整内存,-o表示覆盖同名文件,-x指定输出目录。整个物理内存镜像的话,我习惯用 DumpIt,它只有一个文件,双击运行后在当前目录生成一个 .raw 格式的内存镜像,对 64 位系统的兼容性也不错。镜像文件可能有好几个 GB,提取时先确认目标磁盘剩余空间充足。
2.3 网络流量层面的工具组合
流量层面提取样本的场景,通常是恶意程序已经在传输数据,或者你拿到了一个包含恶意下载行为的 pcap 包。这时的核心工具是 Wireshark 和 NetworkMiner。
Wireshark 负责看协议细节和手工导出对象,NetworkMiner 则更"自动化",它能自动从 pcap 包中还原文件、解析 HTTP 请求、提取证书信息,非常适合快速定位样本。NetworkMiner 有个独立的 GUI 版本,直接把 pcap 拖进去就能看到 Files 标签页里还原出来的文件列表。
需要提醒一句,流量提取对 HTTPS 加密流量基本无能为力,除非你能拿到会话密钥或者做中间人解密,否则只能提取到加密后的密文,没法还原成可执行文件。所以流量侧更适合发现 IOC(域名、IP、JA3 指纹等)和提取明文协议传输的样本,真正的文件级样本,还是要靠主机侧提取。
3. 主机文件提取实操:从可疑进程反查文件实体
3.1 用Process Explorer定位可疑进程的完整路径
第一步虽然老套,但最关键:打开 Process Explorer,找到可疑进程,右键 -> Properties,重点看 Image 页签里的 Path 和 Command line。
我实际处理过的一个样本,进程名伪装成wsearch.exe,乍一看像 Windows Search,但 Path 显示C:\Users\Public\wsearch.exe,签名状态是 "No signature was present in the file"。公共目录下的未签名 exe,基本可以直接判定为恶意。如果是服务进程,去 Services 页签可以看它注册的服务名和对应的镜像路径,方便后续定位注册表持久化。
定位到文件路径后,在 Process Explorer 里右键进程 -> Create Dump File,可以直接把该进程的完整内存转储保存下来。这会同时得到一个 .dmp 文件,即使源文件被删除,进程内存里的代码段通常也还在。
3.2 文件被占用时,用卷影副本和进程转储"曲线救国"
提取过程中最常见的尴尬是:恶意文件正在运行,右键删除提示"文件被占用"。解决办法有三个,按优先级排序。
第一个是直接抓进程内存(procdump 或 Process Explorer 的 Create Dump File),内存里包含了进程的代码和动态数据,很多时候比磁盘上的原始文件信息量更大。
第二个是使用卷影副本(Volume Shadow Copy)获取被锁定文件的副本。管理员权限下执行:
vssadmin list shadows会列出系统的还原点(卷影副本)。如果存在的话,可以通过 UNC 路径\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\...访问快照里的历史文件,把被锁定的文件复制出来。不过 VSS 快照不一定覆盖到样本所在目录,尤其是临时目录。
第三个方案是准备一个 WinPE 启动盘或把硬盘拆到另一台机器上离线复制。这是最"笨"但最可靠的方法,适用于文件被内核级驱动保护的情况。有时恶意软件会给自己加文件保护,普通方式怎么都删不掉、复制不了,离线挂载就能绕过。
3.3 脚本类和宏文档类样本的提取姿势
不是所有病毒都是 PE 文件,近几年的攻击里,PowerShell 脚本、JS 脚本、宏文档占了相当比例。这类样本的提取方式不能照搬 exe 的流程。
PowerShell 无文件攻击经常会留下事件日志中的脚本块记录。Windows 如果启用了 PowerShell ScriptBlock Logging,Event ID 4104 会记录完整脚本内容。我做过一次应急,恶意代码已经被内存清理掉了,磁盘上只剩一个加载器,但通过Get-WinEvent检索 4104 日志,成功还原了攻击者用 PowerShell 从远程服务器下载并执行的完整命令。这是提取脚本类样本最有效的一条路:
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-PowerShell/Operational'; Id=4104} -MaxEvents 50 | Format-List Message宏文档(docm/xlsm)的提取核心是拿到 VBA 工程。最简单的办法是直接用 7-Zip 解压 docm 文件,在 word/vbaProject.bin 里找到宏代码的二进制容器,再用 olevba 等工具解析出源码。如果文档启用了 VBA 密码保护,olevba -c可以对 vbaProject.bin 执行暴力破解(这类工具本质上是对已知哈希格式做字典爆破),实践中大部分简单密码都能解出来。
JS/VBS 文件提取时,要注意文件编码。很多恶意脚本是 UTF-16 编码的,直接用记事本打开会看到乱码,用 VS Code 或 Notepad++ 切换编码后再看。复制脚本时一定要保留原始编码和原始文件名变化规律,因为攻击者经常会通过文件名的 Unicode 欺骗手法诱导执行。
4. 无文件攻击样本:内存转储才是"案发现场"
4.1 为什么磁盘上找不到,内存里全是线索
无文件攻击(fileless attack)这几年特别多,恶意代码不落地成独立 exe,而是直接通过 PowerShell、WMI、注册表回调或合法办公软件执行。磁盘上找不到伪装的可疑文件,不代表没有攻击发生,样本实际上就藏在内存的进程空间里。
我接触过的一个无文件攻击样本,攻击者通过一个恶意 dll 注入到explorer.exe,整个过程没有创建任何新的文件。如果用传统思路去磁盘找样本,找到天亮也找不到。但只要把内存镜像拉出来,用 Volatility 一查malfind,马上就能看到 explorer.exe 进程里有一段标记为 RWX(可读可写可执行)的内存区域,内容就是恶意 dll 的 PE 文件头。
这就是内存转储的核心价值:它记录的是"运行时的现场"。代码可能不落盘,但只要执行过,就一定会在内存里留下痕迹。
4.2 DumpIt + Volatility 的最小可用提取流程
先做内存镜像。在目标机器上,管理员权限运行 DumpIt,它会生成一个YYYYMMDD_HHMMSS.dmp的物理内存镜像文件。DumpIt 是命令行交互的,运行后按y确认即可。生成的文件可能非常大,16GB 内存的机器,镜像文件也是 16GB 级别,确认目标盘空间充足再操作。我一般习惯把镜像直接输出到移动硬盘。
拿到镜像后,用 Volatility 分析。Volatility 版本我用的是 Volatility 3,命令格式和 2.x 不太一样,但核心思路相同。最小可用流程是:
# 先识别镜像的操作系统版本信息 vol3 -f memory.dmp windows.info # 列出进程列表 vol3 -f memory.dmp windows.pslist # 查看进程内的可疑注入区域 vol3 -f memory.dmp windows.malfind # 提取指定进程的内存到目录 vol3 -f memory.dmp windows.procdump --pid 4832 --dumpwindows.procdump输出的就是可疑进程的完整内存转储,里面的 PE 文件可以用工具进一步提取和修复。windows.malfind的输出会直接标出存在可疑内存属性的区域,定位速度比全量翻进程快得多。
4.3 从内存里抠出可执行样本的注意事项
提取出来的进程内存转储,并不是一个可直接运行的 PE 文件——它包含的是进程地址空间的数据,可能有多个 PE 镜像的残片。所以拿到 procdump 的输出后,还要用 PE 分析工具(比如 PE-bear、CFF Explorer)去校验文件头,确认 Physical Address、Size of Image 等字段是否完整。
如果发现 PE 头不完整,不要灰心,这是常态。内存中的恶意代码经常是经过加密的,只有执行到内存中才会解密,你 dump 下来的可能只是一部分解密后的代码块。这时候需要结合行为分析(监控 API 调用、文件操作)和网络流量一起综合判断,别指望一个工具一条命令就自动还原创伤完整样本。
另外,内存镜像文件本身就是敏感数据,里面可能包含密码、聊天记录、文档内容。做分析时务必在隔离环境里处理,分析完的镜像文件按保密要求销毁,不能随便放在共享目录里。
5. 流量侧捞样本:被动还原可执行文件与恶意脚本
5.1 什么时候该去流量里找样本
主机侧提取理论上最完整,但现实中有两类情况必须依赖流量侧:一是攻击者已经清理了主机痕迹,文件被删除、事件日志被清空;二是被攻击的机器是内网隔离的,你手上只有一个抓包文件,没有主机访问权。
还有一类常见的场景:钓鱼邮件附件或恶意链接先通过下载器落地第一阶段 payload,后续 C2 再下发第二阶段恶意工具。你盯着第一阶段文件分析半天,可能只是下载器,真正的恶意模块是从流量里"捞"出来的。
所以,流量侧提取不是主机侧提取的替代品,而是互补关系。遇到样本,先把流量包留好,甚至比主机提取更早抓包——因为网络连接随时会断,一旦断掉,等你想起来抓包,攻击者早就撤了。
5.2 Wireshark 导出HTTP对象:最快还原上传/下载文件
如果恶意程序通过 HTTP 明文上下传文件,Wireshark 里有一个功能比手动翻包高效得多:File -> Export Objects -> HTTP。
打开之后会列出所有 HTTP 会话中传递的对象,包括 HTML 页面、JS 脚本、图片、可执行文件等。点选你关注的 URL,点 Save,就能还原出完整文件。这里保存下来的是原始字节,不需要你手动拼接 TCP 分段,Wireshark 已经帮你做了重组。
有一个细节需要留意:HTTP 会话里同一个 URL 可能会有多次请求,对应不同的响应内容。导出时注意看 Content-Type 和 Content-Length,优先导出 Content-Type 为 application/octet-stream、application/x-msdownload 或者长度异常大的对象,这些更可能是可执行文件。
5.3 编码和分块传输:流量还原不只是点导出
很多恶意样本在传输前会做编码转换,最常见的是 Base64 编码。攻击者把恶意脚本编码成一大段字符串,放在 URL 参数或 POST 请求体里,客户端下载后先解码再执行。
这种流量你直接导出是拿不到脚本的,需要先把编码字段提取出来,再做 Base64 解码。我的习惯是先在 Wireshark 里过滤出可疑请求:
http.request.method == "POST" && http contains "powershell"然后用tshark或 Wireshark 的 "Follow HTTP Stream" 功能把完整请求体复制出来,放到 Python 或在线工具里解码。实际操作时还会遇到分块传输(Chunked Transfer-Encoding),Wireshark 会自动重组,但如果你用别的工具解析 pcap,要确认它支持 Chunked,否则提取出来的文件会不完整。
加密流量是流量提取的天花板。HTTPS 流量在 pcap 里只能看到加密后的 TCP 载荷,无法还原文件。遇到这种情况,妥协方案是记录下 TLS 握手中的服务器名称(SNI)、证书信息和 JA3 指纹,作为后续威胁情报关联的指标,而不是试图暴力解密。
6. 样本到手后的收尾:哈希、加密打包、留痕一个不能少
6.1 先算哈希再动文件,保证样本完整性和可追溯
样本提取出来后的第一个动作,不是急着打开看,而是计算哈希值。哈希相当于文件的 DNA,MD5 虽然已经被证明可碰撞,但在样本查重场景下仍然常用,真正用于完整性校验的是 SHA-256。
Windows 上一条命令就能搞定:
certutil -hashfile sample.bin SHA256Linux 上用sha256sum。这一步的意义比我强调的还要重要:哈希值是样本的唯一标识,后续你提交分析、写报告、团队协作查重,全靠它。没有哈希,你说"我提取了一个样本",别人根本不知道你提的是哪个文件;有了哈希,大家一比对就知道是不是同一个样本的不同变种。
6.2 加密压缩与改名存证,防止杀软二次"灭口"
这一步是新手最容易忽略的:提取出来的样本如果直接放在桌面上,很可能会被本机杀毒软件再次隔离删除。杀软无法分辨你这是恶意样本副本还是真实感染,统一按威胁处理。
我的做法是:提取后立即改名(把 .exe 后缀改成 .bin 或 .vir),然后用 7-Zip 加密码压缩:
7z a -pinfected -mhe=on sample.7z sample.bin-pinfected设定了压缩密码,-mhe=on会加密文件列表,别人不输入密码甚至看不到压缩包里有什么文件。加密码的另一个目的是方便在网络传输、网盘分享时,避免被邮件网关或云盘的安全策略拦截。
这里有个安全底线:加密码压缩不代表加密后就可以随意传播。恶意样本依然属于敏感数据,压缩包文件名和校验信息也要脱敏,做好访问控制,不能公开分发。
6.3 样本归档的元数据记录模板
样本锁进加密包之后,还需要一份结构化的记录,方便团队长期维护。我在样本库里维护的字段大致包含:
| 字段 | 例子 |
|---|---|
| 事件编号 | INC-2024-0618-003 |
| 样本哈希(SHA256) | 9f8c1b7d2a... |
| 原文件名 | svchost.exe |
| 提取路径 | C:\Users\Public\svchost.exe |
| 提取时间 | 2024-06-18 03:12 |
| 提取工具 | Process Explorer + procdump |
| 提取人 | 张三 |
| 关联进程 PID | 4832 |
| 家族标签 | RedLine Stealer(暂定) |
| 备注 | 无文件,内存中提取到加载器 |
如果你维护过一段时间的样本库,就会发现哈希去重和家族标签是最值得投入的字段。第一年你可能会重复分析同一个家族的不同变种,第二年你回溯事件时,靠家族标签能快速把多个事件关联成一轮攻击。这个价值,是临时复制一个文件完全体会不到的。
最后再分享一个我踩过的坑。早期我以为把样本提取完就万事大吉,随手把文件复制到优盘带走,结果回到分析机后,样本包里的脚本在预览时被本地解压工具自动执行了,虚拟机的杀软触发报警,虽然没造成实际损失,但过程非常惊险。后来我形成了一条铁律:任何样本进入分析环境之前,必须已经完成改名、加密码压缩、哈希登记三步;样本包一路绝不裸奔。就靠这条规矩,我后来再也没因为手里的样本"二次触发"造成过麻烦。样本提取这活儿,看着是技术,实际上做久了你会发现,真正拉开差距的是流程纪律——这也是我从这些年应急经历里学到的最值钱的东西。
本文还有配套的精品资源,点击获取