熊猫烧香病毒逆向工程深度解析IDA Pro静态分析与功能模块拆解逆向分析环境搭建与样本预处理工欲善其事必先利其器。在开始逆向分析之前我们需要搭建一个安全、隔离的分析环境。推荐使用以下配置组合虚拟机系统Windows XP SP3兼容性最佳分析工具套件IDA Pro 6.8主逆向工具PEiD 0.95查壳工具Process Monitor 3.2行为监控LordPEPE结构分析ImportREC导入表重建重要提示所有分析操作应在断网环境下进行避免病毒样本意外执行网络通信行为。建议在虚拟机快照后操作便于随时回滚。样本预处理阶段发现几个关键特征# 样本基础信息验证代码示例 pe pefile.PE(panda.exe) print(f入口点: 0x{pe.OPTIONAL_HEADER.AddressOfEntryPoint:X}) print(f编译时间: {pe.FILE_HEADER.TimeDateStamp}) print(f节区数量: {pe.FILE_HEADER.NumberOfSections}) # 输出结果示例 入口点: 0x40CB70 编译时间: 2006-12-29 09:15:22 节区数量: 5通过PEiD检测确认样本使用Delphi编写Borland Delphi 6.0-7.0这直接影响后续的反编译策略特征项C程序表现Delphi程序表现参数传递通过栈传递优先使用寄存器(eax/edx/ecx)函数调用call前push参数mov eax/edx参数后直接call局部变量ebp相对寻址同样使用ebp但可能混合寄存器病毒初始化逻辑与自解密机制病毒入口点0x0040CB70处开始执行首先会进行双重自校验密钥验证阶段使用xboy和whboy作为解密密钥通过循环异或操作解密内存中的字符串将解密结果与硬编码字符串比对武汉男生感染下载者; 典型解密代码片段 mov ecx, 0xA xor edx, edx div ecx movzx eax, byte ptr [eaxebx-1] xor al, byte ptr [esi] mov byte ptr [edi], al内存分配策略调用LocalAlloc分配0xFF8字节空间使用InitializeCriticalSection创建临界区通过EnterCriticalSection实现线程同步关键函数调用关系图start() ├── DecodeString(xboy) → 验证第一层密钥 ├── CMPString() → 比对解密结果 ├── DecodeString(whboy) → 验证第二层密钥 └── MainFunction() → 进入核心逻辑逆向过程中发现三个关键数据区0x0040CC40 - 作者标识字符串区0x0040D030 - API函数跳转表0x0040E7D4 - 全局配置数据指针核心功能模块逆向解析模块一文件感染与传播机制病毒采用多线程方式实现文件感染主要技术特点包括文件类型识别矩阵文件类型处理方式特征标记.exe/.scr二进制替换WhBoy前缀.htm/.asp追加iframe 标签.gho直接删除无备份其他可执行文件部分感染大小校验感染流程伪代码void InfectFile(LPCSTR filename) { if (CheckInfected(filename)) return; HANDLE hFile CreateFile(filename, GENERIC_READ|GENERIC_WRITE); DWORD fileSize GetFileSize(hFile); LPBYTE buffer VirtualAlloc(fileSize); ReadFile(hFile, buffer, fileSize); if (IsPE32Valid(buffer)) { ProcessPEInfection(buffer); } else if (IsScriptFile(filename)) { AppendMaliciousCode(buffer); } WriteFile(hFile, buffer, fileSize); CloseHandle(hFile); }特别感染技巧利用SetFileAttributes隐藏感染痕迹通过进程快照检查目标文件是否运行中感染后保留原文件时间戳避免引起怀疑模块二持久化与自我保护病毒通过多种技术实现长期驻留主要手段包括注册表操作清单HKCU\Software\Microsoft\Windows\CurrentVersion\Run键值svcshare → %System%\drivers\spoclsv.exeHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL修改CheckedValue为0隐藏文件不可见定时器触发机制Timer11秒间隔杀软进程检测Timer26秒间隔服务项删除Timer310秒间隔共享文件夹清理Timer420分钟间隔C2通信尝试反分析技巧调试器检测IsDebuggerPresent虚拟机检测通过特定指令如CPUID关键API动态获取GetProcAddress模块三网络传播与横向移动病毒的网络模块采用分层架构设计局域网扫描策略端口扫描139/445SMB服务弱口令字典admin/123456/root等IPC$共享利用传播流程图开始 ↓ 获取本地IP段GetAdaptersInfo ↓ 生成目标IP列表192.168.0.1-254 ↓ for each IP { 尝试连接445端口 → 成功尝试弱口令爆破 → 成功复制病毒文件 → 失败跳过 } ↓ 定时重复执行每30分钟C2通信协议HTTP协议明文通信固定URLhttp://wangma.9966.org/down.txt响应内容直接作为Shellcode执行静态分析实战技巧与IDA高级应用函数识别与重命名策略针对Delphi程序的特殊处理关键函数特征识别参数传递eax/edx/ecx寄存器优先调用约定register方式局部变量ebp相对偏移访问推荐命名规范解密函数Prefix_Decode[类型]比较函数Prefix_Cmp[类型]内存操作Prefix_Mem[操作]示例// 原始函数 sub_403C98(int a1, int a2) // 优化后 StringAllocAndCopy(char *src, char *dst)交叉引用分析与数据流追踪关键API调用链文件操作CreateFileA → WriteFile → CloseHandle注册表RegOpenKeyEx → RegSetValueEx → RegCloseKey进程CreateToolhelp32Snapshot → Process32First数据流追踪方法在IDA中使用Jump to xref功能对关键内存地址添加书签使用IDAPython脚本自动化标记# IDAPython数据流追踪示例 for ref in XrefsTo(0x0040D030, 0): print(f调用来自: 0x{ref.frm:X}) print(GetDisasm(ref.frm))伪代码重构与注释规范优秀逆向注释应包含函数功能描述参数/返回值说明关键算法解释与其他模块的关联示例伪代码/* 功能感染PE格式可执行文件 * 参数lpFileName - 目标文件路径 * 返回BOOL - 是否感染成功 */ BOOL InfectPE(LPSTR lpFileName) { // 检查是否已感染 if (CheckInfectionMark(lpFileName)) return FALSE; // 映射文件到内存 HANDLE hMap CreateFileMapping(...); LPVOID pMap MapViewOfFile(...); // 添加感染标记 AddVirusSignature(pMap); // 修复PE头校验 FixPEChecksum(pMap); UnmapViewOfFile(pMap); CloseHandle(hMap); return TRUE; }防御方案设计与分析启示病毒特征提取方法静态特征文件哈希MD5 512301C535C88255C9A252FDF70B7A03字符串特征WhBoy、spoclsv.exe资源段图标熊猫烧香图案行为特征注册表键值修改模式特定目录文件创建行为网络通信特征现代安全防护启示防御策略对比传统防御现代改进方案特征码扫描行为沙箱分析静态规则匹配机器学习检测单点防护终端EDR联动代码安全启示输入验证强化最小权限原则进程行为监控网络通信加密逆向工程经验总结Delphi程序分析要点注意寄存器传参特性识别RTL运行时库函数关注TApplication等框架结构多线程病毒分析技巧使用IDA的线程标记功能重点分析同步原语临界区、事件等对定时器回调单独建立分析窗口高效逆向工作流建立标准化注释体系使用IDAPython自动化重复工作保持分析笔记与代码同步