对一例包含特殊字符的远控木马进行逆向分析
字数 1434 2025-08-07 08:22:09
远控木马逆向分析教学文档
1. 样本概述
- 样本类型:远控木马(大灰狼家族变种)
- 特点:
- 使用"Mother360"作为解密密钥
- 创建事件时使用"Cao360"作为事件名
- 未加壳,可直接分析
- 采用动态加载API技术
- 使用RC4加密算法
2. 基本分析
2.1 静态分析
- 使用PEiD确认未加壳
- IDA Pro查看导入表:
- 关键导入函数:
- LoadLibraryA
- GetProcAddress
- WS2_32.dll中的网络相关函数(recv、gethostname等)
- 关键导入函数:
2.2 动态分析
- Process Monitor监控:
- 确认有网络连接行为
- 可获取C2服务器地址
3. 详细分析
3.1 动态加载函数技术
-
LoadLibraryA:
- 功能:获取模块句柄,未加载则加载模块
- 原型:
HMODULE LoadLibraryA([in] LPCSTR lpLibFileName)
-
GetProcAddress:
- 功能:从DLL中检索导出函数/变量地址
- 原型:
FARPROC GetProcAddress([in] HMODULE hModule, [in] LPCSTR lpProcName)
-
实现方式:
- 通过字符串拼接构造库名和函数名
- 示例:
; 加载kernel32.dll push "kernel32.dll" call LoadLibraryA ; 获取函数地址 push "CreateToolhelp32Snapshot" push eax ; LoadLibraryA返回的句柄 call GetProcAddress
3.2 配置信息解密
-
解密过程:
- 两次解密:
- 第一次:地址416208,大小472字节
- 第二次:地址416068,大小410字节
- 解密密钥:"Mother360"
- 解密算法:RC4
- 两次解密:
-
解密结果:
- 第一段配置信息:
[配置内容示例] - 第二段配置信息:
[配置内容示例] - 包含:分组信息、C2服务器IP等
- 第一段配置信息:
3.3 进程遍历技术
-
实现流程:
- 获取
CreateToolhelp32Snapshot函数地址 - 调用获取进程快照:
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); - 使用
Process32First和Process32Next遍历进程
- 获取
-
特殊行为:
- 查找"rundll32.exe"进程
- 发现后执行:
taskkill /f /im rundll32.exe - 目的:不明(可能为对抗安全软件)
3.4 C2通信建立
-
事件创建:
- 创建名为"Cao360"的事件
-
网络连接:
- 创建socket套接字
- 使用解密出的C2地址和端口
- 调用
connect连接C2服务器
-
信息收集:
- 创建线程进行持续通信
- 收集系统信息:
- 系统版本
- CPU频率(通过注册表查询)
- 磁盘空间
- 使用
send发送信息 - 使用
recv接收指令
-
指令执行:
- 调用
VirtualAlloc分配内存 - 将接收内容复制到新内存
- 执行C2下发的指令(加密且压缩)
- 调用
4. 远控功能分析
- 键盘记录
- 进程管理
- 远程CMD
- 服务管理
- 其他常见远控功能
5. 通信特征
- 加密流量但有固定格式
- 前五个字节固定
- 使用RC4加密算法
6. 分析工具推荐
-
静态分析:
- PEiD
- IDA Pro
-
动态分析:
- Process Monitor
- OllyDbg
- Wireshark
-
辅助工具:
- 字符串分析工具
- 加密算法识别工具
7. 防御建议
-
检测点:
- 查找"Mother360"、"Cao360"等字符串
- 检测动态加载API行为
- 监控异常进程终止行为(如rundll32.exe被终止)
- 检测特定格式的网络通信
-
防护措施:
- 启用行为检测
- 监控可疑的网络连接
- 限制未知程序的进程操作权限
8. 扩展分析方向
-
加密算法:
- 深入分析RC4实现
- 尝试破解通信内容
-
通信协议:
- 分析固定格式的含义
- 尝试模拟通信
-
功能模块:
- 分析各远控功能的实现
- 研究持久化机制
附录:关键函数原型
-
Windows API:
// 进程快照 HANDLE CreateToolhelp32Snapshot(DWORD dwFlags, DWORD th32ProcessID); BOOL Process32First(HANDLE hSnapshot, LPPROCESSENTRY32 lppe); BOOL Process32Next(HANDLE hSnapshot, LPPROCESSENTRY32 lppe); // 进程操作 UINT WinExec(LPCSTR lpCmdLine, UINT uCmdShow); // 网络通信 int send(SOCKET s, const char *buf, int len, int flags); int recv(SOCKET s, char *buf, int len, int flags); // 内存操作 LPVOID VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect); -
数据结构:
typedef struct tagPROCESSENTRY32 { DWORD dwSize; DWORD cntUsage; DWORD th32ProcessID; ULONG_PTR th32DefaultHeapID; DWORD th32ModuleID; DWORD cntThreads; DWORD th32ParentProcessID; LONG pcPriClassBase; DWORD dwFlags; CHAR szExeFile[MAX_PATH]; } PROCESSENTRY32;