windows样本高级静态分析之识别汇编中C代码结构
字数 2109 2025-08-24 23:51:12
Windows样本高级静态分析:识别汇编中C代码结构
概述
本文档详细讲解如何通过高级静态分析技术识别Windows恶意样本中的C代码结构,帮助分析人员理解样本的总体功能。文档基于先知社区提供的两个实例分析,涵盖基础静态分析、基础动态分析和高级静态分析的全过程。
分析流程
- 基础静态分析
- 基础动态分析
- 高级静态分析
实例分析1:Lab06-01.exe
基础静态分析
导入表分析:
- 导入库:wininet.dll、kernel32.dll
- 关键导入函数:InternetGetConnectedState
字符串分析:
- "Error 1.1: No Internet"
- "Success: Internet Connection"
初步结论:
样本具有检测网络连接状态的功能。
基础动态分析
测试场景:
- 联网状态下运行样本
- 断网状态下运行样本
观察结果:
样本在不同网络状态下输出不同信息,验证了网络状态检测功能。
高级静态分析
代码结构识别:
- 发现if-else结构,根据InternetGetConnectedState的返回值打印不同字符串
- 通过动态分析结果推断sub_40105F函数为printf函数
关键点:
- 网络状态检测逻辑:调用InternetGetConnectedState并根据返回值分支
- 输出函数识别:通过字符串输出模式匹配标准库函数
实例分析2:复杂网络交互样本
基础静态分析
导入函数分析:
- InternetOpenUrlA
- InternetCloseHandle
- InternetReadFile
- InternetGetConnectedState
- InternetOpenA
字符串分析:
- "http://www.practicalmalwareanalysis.com/cc.htm"
- "Error 1.1: No Internet"
- "Success: Internet Connection"
- "Error 2.3: Fail to get command"
- "Error 2.2: Fail to ReadFile"
- "Error 2.1: Fail to OpenUrl"
- "Internet Explorer 7.5/pma"
- "Success: Parsed command is %c"
初步结论:
样本会访问特定URL并尝试解析网页内容获取命令。
基础动态分析
测试结果:
- 访问URL失败(实际测试该网页已失效)
- 错误信息显示样本尝试访问但未能成功
高级静态分析
main函数分析:
- 包含两个关键if语句,只有同时满足才会输出"Success: Parsed command is %c"
- 不满足条件时程序直接退出
sub_401000函数分析(第一个条件):
- 功能与实例1相同,检测网络连接状态
- 联网时返回1,满足第一个if条件
sub_401040函数分析(第二个条件):
- 尝试打开指定URL(http://www.practicalmalwareanalysis.com/cc.htm)
- 成功打开后读取网页内容
- 检查网页内容是否以"<!--"开头
- 满足条件则返回网页第5个字符
数组修复技术:
问题:
IDA未正确识别InternetReadFile函数的缓冲区大小,导致变量命名混乱(如var_20F等)
解决方案:
- 根据MSDN文档,InternetReadFile函数参数:
- lpBuffer:接收数据的缓冲区
- dwNumberOfBytesToRead:要读取的字节数
- 手动修复数组大小为512字节
- 修复后IDA能正确识别函数参数和数组元素
关键技术总结
C代码结构识别技巧
-
条件分支识别:
- 查找cmp指令后跟jz/jnz等条件跳转
- 结合字符串和API调用推断条件逻辑
-
函数调用识别:
- 通过参数传递方式识别调用约定(stdcall/cdecl等)
- 通过字符串引用识别标准库函数(如printf)
-
循环结构识别:
- 查找向后跳转的jmp指令
- 识别循环计数器(通常使用ecx寄存器)
数组和缓冲区处理
-
缓冲区大小确定:
- 参考API文档的标准参数
- 分析内存分配大小(如push 200h)
- 跟踪缓冲区使用范围
-
数组元素访问模式:
- 识别基址+偏移量的访问模式
- 注意编译器优化的不同表现形式
IDA Pro高级使用技巧
-
类型和变量重定义:
- 右键变量选择"Convert to array"
- 使用"Edit → Operand types"修改变量类型
-
结构体应用:
- 对已知API参数使用标准结构体定义
- 自定义结构体匹配样本数据结构
-
伪代码优化:
- 修改变量名提高可读性
- 添加注释记录分析结果
实践建议
-
结合动态分析验证:
- 使用调试器验证静态分析假设
- 比较运行时行为与静态分析结果
-
文档记录:
- 详细记录每个函数的分析结果
- 标记未确定的功能区域
-
参考资源:
- MSDN文档了解Windows API标准用法
- 编译器特性文档理解代码生成模式
通过系统性地应用这些技术,分析人员可以有效地从汇编代码中还原出高级语言结构,从而更准确地理解恶意样本的功能和行为。