从反汇编看恶意程序的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)
主要逻辑结构
-
主函数位置:0x401040
-
关键调用:调用0x401000处的函数
-
控制流分析:
- 使用
cmp [ebp+var_4], 0指令比较结果 jz指令根据ZF标志位跳转- 网络连接存在时(ZF=0)跳转到false分支
- 无连接时(ZF=1)跳转到true分支
- 使用
-
输出函数识别:
- 调用前push格式化字符串(带
\n换行符) - 确认为
printf函数
- 调用前push格式化字符串(带
功能总结
- 检查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)
- case 'a':创建
-
注册表操作流程:
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个逐步复杂的样本分析,可以建立起基础的恶意代码逆向分析框架,为进一步分析更复杂的恶意软件奠定基础。