某加速器配置信息解密
字数 1317 2025-08-29 22:41:24
加速器配置文件解密逆向分析教学文档
1. 背景与需求分析
1.1 背景介绍
- 目标样本是一款被用于非法翻墙活动的加速器软件
- 软件对存储的连接服务器地址、更新源及访问站点信息进行了加密
- 需要破解加密机制以获取真实服务器信息用于防控和取证
1.2 任务目标
- 定位解密服务器信息的关键反汇编代码段
- 还原解密算法的高级语言等价源码
- 使用还原算法解密密文配置文件获取服务器地址
2. 分析思路与工具选型
2.1 分析思路
- 使用OllyDbg动态调试工具
- 监控Windows API调用,重点关注文件读取和内存访问
- 配合断点调试逐步定位解密算法实现
2.2 工具资源
- OllyDbg下载地址: https://tool.kanxue.com/index-detail-1.htm
- 目标样本和API文档: https://drive.google.com/drive/folders/1HNGdEGAcJgMc6dCoI_aFDNdSmsMhqFob
3. 信息收集
3.1 目标样本特征
- 加速器软件,对代理服务器地址进行加密
- 目标目录下发现加密文件: system.ini等
3.2 关键API函数
| API函数名 | 作用 | 调试意义 |
|---|---|---|
| CreateFileA | 打开system.ini文件 | 确定加密数据来源 |
| ReadFile | 读取密文至缓冲区 | 跟踪密文数据流向 |
| WriteFile | (可选)加密写回 | 判断是否为自修改型程序 |
4. 逆向分析过程
4.1 定位输入文件
- 用OllyDbg打开程序
- 搜索CreateFile调用
- 找到KERNEL32.CreateFileA调用点
- 查看函数参数:
- lpFileName: "system.ini"
- dwDesiredAccess: GENERIC_READ
- dwCreationDisposition: OPEN_EXISTING
4.2 定位解密函数
- 获取文件句柄(0x20c)
- 跟踪句柄存储地址(0x00185690)
- 发现句柄被放入ecx寄存器并传递给后续函数
4.3 解密函数分析
- 函数内部调用ReadFile:
- 读取system.ini内容到缓冲区(0x001857C8)
- 对内存区域设置访问断点
- 跟踪数据调用过程
- 发现密文被解密的过程
4.4 精准定位解密代码
-
计算密文长度的指令:
mov eax, [ebp+arg_0] mov ecx, [eax] mov edx, [ecx+4] mov eax, edx- 结果保存在eax中
-
解密循环特征:
- 逐字节处理密文
- 处理后数据区域部分内容变为明文
5. 解密算法还原
5.1 算法分析
- 采用逐字节异或与加法混合操作
- 加密强度较低但具有一定迷惑性
5.2 高级语言代码还原
void decrypt(unsigned char* data, int length) {
for(int i = 0; i < length; i++) {
data[i] = (data[i] ^ 0x55) + 0x10;
}
}
5.3 验证过程
- 读取密文数据与原始文件一致
- 解密后明文与预期结果一致
- 完整程序运行成功提取服务器信息
6. 完整解密程序实现
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
void decrypt(unsigned char* data, int length) {
for(int i = 0; i < length; i++) {
data[i] = (data[i] ^ 0x55) + 0x10;
}
}
int main() {
HANDLE hFile = CreateFileA("system.ini", GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE) {
printf("Failed to open file\n");
return 1;
}
DWORD fileSize = GetFileSize(hFile, NULL);
unsigned char* buffer = (unsigned char*)malloc(fileSize);
DWORD bytesRead;
if(!ReadFile(hFile, buffer, fileSize, &bytesRead, NULL)) {
printf("Failed to read file\n");
CloseHandle(hFile);
return 1;
}
decrypt(buffer, fileSize);
printf("Decrypted content:\n%s\n", buffer);
free(buffer);
CloseHandle(hFile);
return 0;
}
7. 结论
- 成功定位并分析了目标样本的加密配置文件读取与解密流程
- 通过动态调试明确了程序调用关键API的时机与行为
- 识别出解密算法为逐字节异或与加法混合操作
- 还原算法并编写解密工具成功提取服务器地址等敏感信息
- 为网络审查和取证工作提供了技术支撑