windows样本高级静态分析之识别汇编中C代码结构(switch)
字数 1564 2025-08-24 23:51:13
Windows样本高级静态分析:识别汇编中的C代码结构(Switch语句)
一、分析目标
通过分析代码结构来理解恶意样本的总体功能,重点掌握switch语句在汇编层面的表现形式。
二、分析流程
- 基础静态分析
- 基础动态分析
- 高级静态分析
三、实例分析:Lab06-03.exe
1. 基础静态分析
导入函数分析:
- 网络相关:
- InternetOpenUrlA
- InternetCloseHandle
- InternetReadFile
- InternetGetConnectedState
- InternetOpenA
- 注册表操作:
- RegSetValueExA
- RegOpenKeyExA
- 文件操作:
- CreateDirectoryA
- CopyFileA
- DeleteFileA
- GetFileType
- WriteFile
关键字符串:
http://www.practicalmalwareanalysis.com/cc.htmSoftware\Microsoft\Windows\CurrentVersion\RunC:\Temp\cc.exeC:\Temp- 各种错误信息如:"Error 1.1: No Internet", "Success: Internet Connection"等
初步判断:
- 存在联网访问特定网址的行为,可能解析网页获取命令
- 通过注册表实现自启动
- 在C:\Temp目录下操作衍生文件cc.exe
2. 基础动态分析
根据网络状态返回不同打印内容,需要进一步通过高级静态分析了解程序后续操作。
3. 高级静态分析
主函数分析:
- 使用cmp指令进行条件判断,形成if-else结构
- 判断条件:sub_401000函数返回结果(联网状态)
- 如果条件成立:调用sub_401040函数获取返回结果
- 返回结果不为0则跳转到loc_40123C
- 如果条件不成立:eax置0并跳转到main函数结尾
- 如果条件成立:调用sub_401040函数获取返回结果
sub_401040函数分析(三层嵌套if结构):
- 最外层if:判断是否可以打开目标网页
- 第二层if:判断是否可以读取该网页文件
- 第三层if:判断读取内容是否以
<!--开头- 如果条件成立,将后续数据赋给al并跳转返回
loc_40123C分析(switch结构):
- 根据从网页获取的数据确定edx值
- 通过跳转表实现多分支跳转
- 可能的操作:
- 创建目录
- 复制当前程序到C:\Temp\cc.exe
- 删除C:\Temp\cc.exe
- 设置自启动注册表键值
恶意行为总结:
通过网页获取指令执行以下操作:
- 样本隐藏(复制到Temp目录)
- 文件删除
- 自启动设置
- 目录创建
四、Switch语句的汇编实现形式
1. 跳转表形式(如实例中所示)
通过计算偏移量直接跳转到对应代码块,效率较高。
2. cmp + jz + jmp实现的if形式
示例C代码:
#include <stdio.h>
void main() {
int i = 0;
scanf("%d", &i);
switch(i) {
case 0: printf("a"); break;
case 1: printf("b"); break;
case 2: printf("c"); break;
default: break;
}
}
对应汇编实现:
- 使用一系列cmp指令比较输入值
- 配合jz(跳转如果为零)指令实现条件跳转
- 每个case对应一个cmp+jz组合
- 最后通过jmp实现break功能
五、分析技巧总结
-
识别if-else结构:
- 查找cmp/test指令
- 分析后续的条件跳转指令(jz/jnz等)
- 将跳转目标和后续指令分别对应if和else块
-
识别switch结构:
- 查找跳转表特征(通常包含基地址+偏移计算)
- 或查找连续的cmp/jz指令序列
- 注意case值的范围和default处理
-
恶意代码分析要点:
- 重点关注网络操作和持久化机制
- 分析命令获取和执行流程
- 跟踪文件系统操作
- 检查注册表修改
-
动态与静态结合:
- 静态分析确定代码结构
- 动态分析验证实际行为
- 通过错误信息字符串辅助理解程序逻辑
通过掌握这些分析方法和代码结构识别技巧,可以有效分析恶意样本的功能和行为模式。