从“中招”到“解毒”:一次手工查杀文件型病毒的完整实战记录(基于LaborDayVirus分析)
逆向工程实战从感染样本到手工查杀的完整技术解析当你的可执行文件突然膨胀三倍运行后系统行为异常这很可能遭遇了文件型病毒。不同于普通恶意软件这类病毒会直接寄生在PE文件中通过修改入口点和节表实现隐蔽传播。本文将基于一个真实案例LaborDayVirus带你体验从感染现象分析到手工清除的全过程。这不是实验室里的理论推演而是安全工程师日常面对的实战场景——你需要像法医一样检查PE文件每个字节的异常像侦探一样追踪病毒的执行路径最终像外科医生般精准清除感染组织。1. 感染特征分析与样本采集1.1 初始症状观察在隔离环境中执行病毒样本后对比目标程序hei0.exe的感染前后状态属性感染前感染后文件大小3KB9KB数字签名有效失效节区数量34入口点RVA0x10000x3200关键现象表明病毒采用了典型的节区附加感染方式。通过Process Monitor监控发现被感染程序运行时还会遍历当前目录搜索.exe文件修改系统临时目录下的文件属性注入代码到explorer.exe进程1.2 PE结构对比分析使用PE Explorer对比健康与感染文件的节区头# 健康文件节区 .text VirtualSize: 0x1000 VirtualAddress: 0x1000 .data VirtualSize: 0x27 VirtualAddress: 0x3000 # 感染文件节区 .text VirtualSize: 0x1000 VirtualAddress: 0x1000 .data VirtualSize: 0x1A00 VirtualAddress: 0x3000 .virus VirtualSize: 0x800 VirtualAddress: 0x5000通过UltraEdit二进制比对发现感染文件的.data节区存在异常膨胀——从原始0x27字节暴增至0x1A00字节。病毒代码就藏在这个水肿的节区中具体特征包括起始偏移0x800文件偏移结束标志0xE58BE0FF包含原始入口点地址0x4010002. 动态调试与行为追踪2.1 OllyDbg实战调试载入感染程序时OD会警告入口点超出代码范围——这是病毒修改OEP的典型迹象。关键调试步骤定位病毒出口00403200 PUSHAD ; 保存寄存器环境 00403201 MOV ESI,00401000 ; 原始代码起始地址 00403206 MOV ECX,2 ; 解密循环次数 0040320B XOR BYTE PTR[ESI],CC ; 解密算法异或CC 0040320E INC ESI ; 指针移动 0040320F LOOPD 0040320B ; 循环解密 00403211 POPAD ; 恢复寄存器 00403212 MOV EAX,00401000 ; 原始入口点 00403217 JMP EAX ; 关键跳转设置断点策略在0x403217下硬件执行断点在GetProcAddress等关键API设条件断点监控EAX寄存器值变化注意病毒可能检测调试器建议使用ScyllaHide插件隐藏OD特征2.2 内存转储技巧当程序执行到关键JMP时使用OllyDump插件脱壳选择重建输入表方式1和方式2分别保存为clean1.exe和clean2.exe验证哪个版本能正常运行且无感染行为测试发现方式2生成的文件仍具传染性说明病毒部分IAT未被正确修复。此时需要结合ImportREC工具手动修复输入表。3. 静态分析与病毒清除3.1 PE头修复指南手工查杀需要修正以下关键字段PE字段原始值修正值工具操作指令AddressOfEntryPoint0x32000x1000PEditor → Direct Editor → NT HeadersSizeOfImage0x60000x4000CFF Explorer → Optional Header.data.VirtualSize0x1A000x27PE Tools → Section Editor使用010 Editor执行模板脚本自动校验// PE结构校验脚本 if (Section[.data].VirtualSize 0x1000) { warning(Possible virus infection in .data section); } if (NTHeader.OptionalHeader.AddressOfEntryPoint ! Section[.text].VirtualAddress) { warning(Suspicious entry point modification); }3.2 节区手术实操定位病毒体在.data节区搜索特征码FF E0 8B E5查找原始OEP值小端序00 10 40 00清除感染数据# 使用dd命令切除病毒代码Linux环境 dd ifinfected.exe ofclean.exe bs1 count$((0x800)) dd ifinfected.exe ofclean.exe bs1 skip$((0xA00)) seek$((0x800)) convnotrunc修正节表属性 使用PE工具将.data节的Characteristics从E0000020恢复为C0000040移除可执行属性。4. 防御策略与检测方案4.1 静态检测特征基于本次分析可构建下列病毒特征rule LaborDayVirus { meta: description Detects LaborDayVirus variants strings: $opcodes { PUSHAD MOV ESI ?? ?? ?? 00 MOV ECX 02 XOR [ESI] CC } $ep_check (uint32(0) 0xFFFF0000) 0x00320000 $tail_sig FF E0 8B E5 condition: any of them and filesize 10KB }4.2 动态行为监控推荐使用下列API钩子检测类似病毒API函数监控点风险行为阈值CreateFiledwDesiredAccess多次尝试写.exeSetFilePointerFILE_END定位节区尾部扩展VirtualProtectPAGE_EXECUTE_READWRITE.data节属性修改对于持续对抗场景建议在沙箱中运行可疑程序并监控其节表修改行为入口点变化内存页保护属性变更5. 进阶病毒变种对抗技术现代文件型病毒已发展出更复杂的对抗手段多态引擎特征使用AES或RC4替代简单异或动态解密密钥如基于文件哈希代码混淆插入垃圾指令反调试技巧; 检测调试器时间戳 rdtsc sub eax,[fs:0x30] cmp eax,0x1000 jb DebuggerDetected ; TLS回调提前执行 #pragma comment(linker, /INCLUDE:__tls_used) void NTAPI TLS_Callback(PVOID DllHandle, DWORD Reason, PVOID Reserved) { if (Reason DLL_PROCESS_ATTACH) InitVirus(); }对抗这类高级威胁需要结合静态特征与动态行为分析。例如使用Capstone引擎反汇编解密后的代码或通过QEMU模拟执行捕获真实行为。