windows样本高级静态分析之识别汇编中C代码结构
字数 2109 2025-08-24 23:51:12

Windows样本高级静态分析:识别汇编中C代码结构

概述

本文档详细讲解如何通过高级静态分析技术识别Windows恶意样本中的C代码结构,帮助分析人员理解样本的总体功能。文档基于先知社区提供的两个实例分析,涵盖基础静态分析、基础动态分析和高级静态分析的全过程。

分析流程

  1. 基础静态分析
  2. 基础动态分析
  3. 高级静态分析

实例分析1:Lab06-01.exe

基础静态分析

导入表分析:

  • 导入库:wininet.dll、kernel32.dll
  • 关键导入函数:InternetGetConnectedState

字符串分析:

  • "Error 1.1: No Internet"
  • "Success: Internet Connection"

初步结论:
样本具有检测网络连接状态的功能。

基础动态分析

测试场景:

  1. 联网状态下运行样本
  2. 断网状态下运行样本

观察结果:
样本在不同网络状态下输出不同信息,验证了网络状态检测功能。

高级静态分析

代码结构识别:

  • 发现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函数分析:

  1. 包含两个关键if语句,只有同时满足才会输出"Success: Parsed command is %c"
  2. 不满足条件时程序直接退出

sub_401000函数分析(第一个条件):

  • 功能与实例1相同,检测网络连接状态
  • 联网时返回1,满足第一个if条件

sub_401040函数分析(第二个条件):

  1. 尝试打开指定URL(http://www.practicalmalwareanalysis.com/cc.htm)
  2. 成功打开后读取网页内容
  3. 检查网页内容是否以"<!--"开头
  4. 满足条件则返回网页第5个字符

数组修复技术:

问题:
IDA未正确识别InternetReadFile函数的缓冲区大小,导致变量命名混乱(如var_20F等)

解决方案:

  1. 根据MSDN文档,InternetReadFile函数参数:
    • lpBuffer:接收数据的缓冲区
    • dwNumberOfBytesToRead:要读取的字节数
  2. 手动修复数组大小为512字节
  3. 修复后IDA能正确识别函数参数和数组元素

关键技术总结

C代码结构识别技巧

  1. 条件分支识别:

    • 查找cmp指令后跟jz/jnz等条件跳转
    • 结合字符串和API调用推断条件逻辑
  2. 函数调用识别:

    • 通过参数传递方式识别调用约定(stdcall/cdecl等)
    • 通过字符串引用识别标准库函数(如printf)
  3. 循环结构识别:

    • 查找向后跳转的jmp指令
    • 识别循环计数器(通常使用ecx寄存器)

数组和缓冲区处理

  1. 缓冲区大小确定:

    • 参考API文档的标准参数
    • 分析内存分配大小(如push 200h)
    • 跟踪缓冲区使用范围
  2. 数组元素访问模式:

    • 识别基址+偏移量的访问模式
    • 注意编译器优化的不同表现形式

IDA Pro高级使用技巧

  1. 类型和变量重定义:

    • 右键变量选择"Convert to array"
    • 使用"Edit → Operand types"修改变量类型
  2. 结构体应用:

    • 对已知API参数使用标准结构体定义
    • 自定义结构体匹配样本数据结构
  3. 伪代码优化:

    • 修改变量名提高可读性
    • 添加注释记录分析结果

实践建议

  1. 结合动态分析验证:

    • 使用调试器验证静态分析假设
    • 比较运行时行为与静态分析结果
  2. 文档记录:

    • 详细记录每个函数的分析结果
    • 标记未确定的功能区域
  3. 参考资源:

    • MSDN文档了解Windows API标准用法
    • 编译器特性文档理解代码生成模式

通过系统性地应用这些技术,分析人员可以有效地从汇编代码中还原出高级语言结构,从而更准确地理解恶意样本的功能和行为。

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标准用法 编译器特性文档理解代码生成模式 通过系统性地应用这些技术,分析人员可以有效地从汇编代码中还原出高级语言结构,从而更准确地理解恶意样本的功能和行为。