从反汇编看恶意程序的C语言结构
字数 2398 2025-08-09 13:33:44

从反汇编分析恶意程序的C语言结构 - 详细教学文档

0x00 前言

本文通过IDA Pro工具分析4个逐步复杂的恶意程序样本,揭示其C语言逻辑结构。这些样本功能逐渐增强,从简单的网络检测到复杂的持久化机制,适合逆向工程初学者学习恶意代码分析基础。

0x01 样本1分析 - 基础网络检测

关键导入函数

  • WININET.dll中的InternetGetConnectedState:检测网络连接状态
    • 成功连接返回1,失败返回0
    • 函数原型:BOOL InternetGetConnectedState(LPDWORD lpdwFlags, DWORD dwReserved)

主要逻辑结构

  1. 主函数位置:0x401040

  2. 关键调用:调用0x401000处的函数

  3. 控制流分析

    • 使用cmp [ebp+var_4], 0指令比较结果
    • jz指令根据ZF标志位跳转
    • 网络连接存在时(ZF=0)跳转到false分支
    • 无连接时(ZF=1)跳转到true分支
  4. 输出函数识别

    • 调用前push格式化字符串(带\n换行符)
    • 确认为printf函数

功能总结

  • 检查Internet连接状态
  • 存在连接输出1,否则输出0

0x02 样本2分析 - 基础网络通信

新增导入函数

  • InternetOpenUrl:通过URL打开资源
  • InternetCloseHandle:关闭连接句柄
  • InternetReadFile:读取网络数据
  • InternetOpenA:设置User-Agent

主要逻辑结构

  1. 网络初始化

    • 调用InternetOpen初始化WinINet
    • 设置User-Agent为"Internet Explorer 7.5"
  2. URL访问

    • InternetOpenUrl打开静态网页
    • 返回句柄赋值给hFile并与0比较
    • 成功则继续,失败则返回
  3. 数据读取

    • InternetReadFile读取网页内容
    • 检查buffer前4字节是否为<!--(HTML注释开头)
    • 匹配成功则返回第5个字符
  4. 延迟机制

    • 调用Sleep函数,参数0xEA60(60000ms/1分钟)

功能总结

  1. 检查网络连接
  2. 使用特定User-Agent下载网页
  3. 解析HTML注释中的第一个字符
  4. 输出解析结果后休眠1分钟
  5. 通过HTML注释隐藏指令,伪装正常网页访问

0x03 样本3分析 - 持久化机制

新增导入函数

  • RegSetValueExARegOpenKeyExA:操作注册表
  • CreateDirectoryA:创建目录
  • CopyFileA:复制文件
  • DeleteFileA:删除文件

关键字符串

  • C:\Temp\cc.exe:恶意文件路径
  • Software\Microsoft\Windows\CurrentVersion\Run\Malware:自启动注册表项

主要逻辑结构

  1. 新增功能函数:0x401130处的switch结构

    • 参数来自HTML解析的字符(AL寄存器)
    • 减去0x61('a')得到case索引
    • 跳转表结构(edx*4寻址)
  2. switch case分析

    • case 'a':创建C:\Temp目录
    • case 'b':复制当前程序到C:\Temp\cc.exe
    • case 'c':删除C:\Temp\cc.exe
    • case 'd':设置注册表自启动项
    • case 'e'`:休眠100秒(0x186A0ms)
  3. 注册表操作流程

    • RegOpenKeyExA打开注册表键
    • RegSetValueExA设置"Malware"值为恶意程序路径

功能总结

  1. 基础网络检测和HTML解析(同样本2)
  2. 根据解析字符执行不同操作:
    • 文件系统操作(创建/复制/删除)
    • 注册表持久化
    • 延迟执行

0x04 样本4分析 - 循环执行与UA伪装

新增特征

  • 循环计数器var_C(最大5A0h/1440次)
  • 动态User-Agent生成:"Internet Explorer 7.50/pma%d"

主要逻辑结构

  1. 循环结构

    • 初始化var_C=0
    • 每次循环递增var_C
    • 比较var_C与1440,达到则退出循环
    • 每次循环间隔1分钟(0xEA60ms)
  2. 动态User-Agent

    • 使用_sprintf格式化UA字符串
    • 包含循环计数器值(%d)
    • 示例:"Internet Explorer 7.50/pma123"
  3. HTML解析增强

    • 解析函数(0x401040)接收计数器参数
    • 用于向攻击者反馈程序运行时长

功能总结

  1. 24小时持续运行(1440分钟)
  2. 每次迭代:
    • 生成含计数器的User-Agent
    • 下载并解析HTML指令
    • 执行对应操作(同样本3)
    • 休眠1分钟
  3. 通过UA中的计数器向攻击者报告运行状态

通用分析技巧总结

  1. 导入函数分析

    • 识别关键功能模块(网络、文件、注册表等)
    • 注意不常见的DLL调用(WININET.dll等)
  2. 控制流识别

    • cmp+jz/jnz组合识别if结构
    • 跳转表识别switch结构
    • 循环计数器识别循环
  3. 字符串分析

    • 文件路径、URL、注册表项等关键字符串
    • 格式化字符串识别输出函数
  4. 参数传递分析

    • 跟踪push入栈顺序
    • 识别IDA生成的arg_0等标签
  5. 恶意功能识别

    • 持久化机制(注册表、启动目录)
    • 文件系统操作
    • 网络通信特征
    • 反检测措施(HTML注释隐藏)

进阶学习建议

  1. 练习更多样本分析,建立行为模式识别能力
  2. 学习Windows API文档,理解函数参数和返回值
  3. 研究反逆向技术(混淆、反调试等)
  4. 搭建沙箱环境进行动态分析验证
  5. 学习x86汇编语言,提升反汇编理解能力

通过这4个逐步复杂的样本分析,可以建立起基础的恶意代码逆向分析框架,为进一步分析更复杂的恶意软件奠定基础。

从反汇编分析恶意程序的C语言结构 - 详细教学文档 0x00 前言 本文通过IDA Pro工具分析4个逐步复杂的恶意程序样本,揭示其C语言逻辑结构。这些样本功能逐渐增强,从简单的网络检测到复杂的持久化机制,适合逆向工程初学者学习恶意代码分析基础。 0x01 样本1分析 - 基础网络检测 关键导入函数 WININET.dll 中的 InternetGetConnectedState :检测网络连接状态 成功连接返回1,失败返回0 函数原型: BOOL InternetGetConnectedState(LPDWORD lpdwFlags, DWORD dwReserved) 主要逻辑结构 主函数位置 :0x401040 关键调用 :调用0x401000处的函数 控制流分析 : 使用 cmp [ebp+var_4], 0 指令比较结果 jz 指令根据ZF标志位跳转 网络连接存在时(ZF=0)跳转到false分支 无连接时(ZF=1)跳转到true分支 输出函数识别 : 调用前push格式化字符串(带 \n 换行符) 确认为 printf 函数 功能总结 检查Internet连接状态 存在连接输出1,否则输出0 0x02 样本2分析 - 基础网络通信 新增导入函数 InternetOpenUrl :通过URL打开资源 InternetCloseHandle :关闭连接句柄 InternetReadFile :读取网络数据 InternetOpenA :设置User-Agent 主要逻辑结构 网络初始化 : 调用 InternetOpen 初始化WinINet 设置User-Agent为"Internet Explorer 7.5" URL访问 : InternetOpenUrl 打开静态网页 返回句柄赋值给hFile并与0比较 成功则继续,失败则返回 数据读取 : InternetReadFile 读取网页内容 检查buffer前4字节是否为 <!-- (HTML注释开头) 匹配成功则返回第5个字符 延迟机制 : 调用 Sleep 函数,参数0xEA60(60000ms/1分钟) 功能总结 检查网络连接 使用特定User-Agent下载网页 解析HTML注释中的第一个字符 输出解析结果后休眠1分钟 通过HTML注释隐藏指令,伪装正常网页访问 0x03 样本3分析 - 持久化机制 新增导入函数 RegSetValueExA 和 RegOpenKeyExA :操作注册表 CreateDirectoryA :创建目录 CopyFileA :复制文件 DeleteFileA :删除文件 关键字符串 C:\Temp\cc.exe :恶意文件路径 Software\Microsoft\Windows\CurrentVersion\Run\Malware :自启动注册表项 主要逻辑结构 新增功能函数 :0x401130处的switch结构 参数来自HTML解析的字符(AL寄存器) 减去0x61('a')得到case索引 跳转表结构(edx* 4寻址) switch case分析 : case 'a' :创建 C:\Temp 目录 case 'b' :复制当前程序到 C:\Temp\cc.exe case 'c' :删除 C:\Temp\cc.exe case 'd' :设置注册表自启动项 case 'e' ` :休眠100秒(0x186A0ms) 注册表操作流程 : RegOpenKeyExA 打开注册表键 RegSetValueExA 设置"Malware"值为恶意程序路径 功能总结 基础网络检测和HTML解析(同样本2) 根据解析字符执行不同操作: 文件系统操作(创建/复制/删除) 注册表持久化 延迟执行 0x04 样本4分析 - 循环执行与UA伪装 新增特征 循环计数器var_ C(最大5A0h/1440次) 动态User-Agent生成:"Internet Explorer 7.50/pma%d" 主要逻辑结构 循环结构 : 初始化 var_C=0 每次循环递增 var_C 比较 var_C 与1440,达到则退出循环 每次循环间隔1分钟(0xEA60ms) 动态User-Agent : 使用 _sprintf 格式化UA字符串 包含循环计数器值(%d) 示例:"Internet Explorer 7.50/pma123" HTML解析增强 : 解析函数(0x401040)接收计数器参数 用于向攻击者反馈程序运行时长 功能总结 24小时持续运行(1440分钟) 每次迭代: 生成含计数器的User-Agent 下载并解析HTML指令 执行对应操作(同样本3) 休眠1分钟 通过UA中的计数器向攻击者报告运行状态 通用分析技巧总结 导入函数分析 : 识别关键功能模块(网络、文件、注册表等) 注意不常见的DLL调用(WININET.dll等) 控制流识别 : cmp + jz/jnz 组合识别if结构 跳转表识别switch结构 循环计数器识别循环 字符串分析 : 文件路径、URL、注册表项等关键字符串 格式化字符串识别输出函数 参数传递分析 : 跟踪push入栈顺序 识别IDA生成的arg_ 0等标签 恶意功能识别 : 持久化机制(注册表、启动目录) 文件系统操作 网络通信特征 反检测措施(HTML注释隐藏) 进阶学习建议 练习更多样本分析,建立行为模式识别能力 学习Windows API文档,理解函数参数和返回值 研究反逆向技术(混淆、反调试等) 搭建沙箱环境进行动态分析验证 学习x86汇编语言,提升反汇编理解能力 通过这4个逐步复杂的样本分析,可以建立起基础的恶意代码逆向分析框架,为进一步分析更复杂的恶意软件奠定基础。