sub_403C98与sub_405360,分析字符串拷贝逻辑与自定义异或解密算法的实现细节。sub_403C98、sub_405360等关键函数的调用链。步骤1:入口函数静态分析
使用IDA Pro加载“熊猫烧香”样本,跳转至0x0040CC28处的start函数。观察push ebp及mov fs:[eax], esp指令,识别出Delphi程序的入口特征及SEH结构化异常处理安装代码。向下分析汇编代码,重点关注连续的call指令,确认参数传递方式:mov eax指向目标地址,mov edx指向源地址,mov ecx指向缓冲区。识别出程序先调用sub_403C98进行字符串准备,再调用sub_405360进行解密,最后通过sub_404018进行比对的自校验逻辑。
步骤2:数据段字符串解析
在IDA中双击交叉引用中提到的dword_40CC40地址,进入十六进制数据视图。选中数据块按下Alt+A,在弹出的选项中将字符串类型设置为C-style,编码格式选择GB2312。此时视图窗口成功解析出明文“武汉男生感染下载者”。同理,查看dword_40CC6C解析出作者备注信息。同时确认dword_40E7D4位于BSS段,初始状态为全0,是用于存储运行时字符串的全局变量。
步骤3:核心函数算法逆向
进入sub_403C98函数,分析其循环体,确认其为基于EAX(目标)、EDX(源)的标准字符串拷贝函数。重点进入sub_405360函数,定位到0x4053D1处的解密循环。识别关键指令:mov ecx, 0xA设置除数10,idiv ecx执行除法,xor edx, eax执行异或。结合寄存器变化,推导出算法逻辑:取出密钥xboy的字节,将其ASCII值对10取余,再与密文字节进行逐字节异或。提取参数:密钥位于EDX,密文位于EAX,输出缓冲区位于ECX。
步骤4:OD动态调试验证
启动OllyDbg加载样本,在call sub_403C98(地址0x0040CB7E)处设置断点。按F9运行程序断下后,在数据窗口跟随EAX寄存器(0040E7D4),观察到初始内存全为00。按下F8单步步过该函数,发现0040E7D4处已被写入明文字符串。继续运行至sub_405360调用后,检查ECX指向的栈内存,成功观察到解密后的汉字字符串,验证了静态分析的准确性。
步骤5:C++代码复现
根据逆向出的汇编逻辑编写C++代码。定义Decode函数,实现核心逻辑:byte xor_key = key[j % key_len]; pBuf[j-1] ^= xor_key % 10;。在主函数中定义原始密文数组"++戊+缓...",并传入密钥xboy进行调用。编译并运行该程序,控制台成功输出“武汉男生感染下载者”,完成了从汇编指令到高级语言算法的完整复现。
实验结果
实验成功逆向分析了熊猫烧香样本的初始化流程。确认了程序严格遵循Delphi寄存器传参约定,利用sub_403C98将数据段的密文搬运至BSS段全局变量进行初始化。完整复现了sub_405360的解密算法,即利用密钥xboy的ASCII值模10后与密文进行逐字节异或。C++复现代码的运行结果与OD内存dump数据完全一致,成功还原出“武汉男生感染下载者”核心明文,验证了分析逻辑的正确性与严密性。
个人收获 通过本次综合实验,我深入理解了Delphi程序特有的结构化异常处理(SEH)及调用约定,有效提升了通过内存特征(如BSS段全零)定位关键数据结构的能力。在算法还原环节,我掌握了从汇编层面的算术与逻辑指令(IDIV、XOR)反推高级语言算法的方法,意识到恶意软件常使用简单异或加密来隐藏特征。这种“静态分析-算法推导-代码复现-动态验证”的闭环分析方法,极大地增强了我的逆向工程实战技能。
本文作者:Linxiong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!