通过ACPI检测沙箱
字数 976 2025-08-10 08:28:21
ACPI检测沙箱技术详解
1. ACPI基础概念
ACPI(Advanced Configuration and Power Management Interface)即高级配置和电源管理接口,是Windows、BIOS和系统硬件之间的工作接口标准。它定义了操作系统控制电源管理和设备配置的机制。
1.1 ACPI表
- ACPI表是存储这些配置信息的数据结构
- 在Windows中可以通过用户态API访问ACPI表
- 不同硬件环境(物理机/虚拟机)的ACPI表存在差异
2. 检测技术原理
2.1 核心检测方法
通过分析ACPI表的以下特征来检测虚拟环境:
- ACPI表的数量差异
- 特定OEM ID(如"WAETH")的存在
- 特定表(如HPET)的缺失
2.2 关键发现
- Windows虚拟机中存在"WAETH" OEM ID
- 非Linux hypervisor(如VBox/KVM/XEN)通常没有WAETH
- 虚拟机中的ACPI表通常比物理机少
- Linux沙箱(如Cuckoo)中可能缺少HPET表
3. 技术实现
3.1 API使用
// 获取ACPI表信息
DWORD EnumSystemFirmwareTables(
DWORD FirmwareTableProviderSignature,
PVOID pFirmwareTableBuffer,
DWORD BufferSize
);
3.2 检测代码示例
static const auto FirmwareTableProviderSignature = 'ACPI';
auto main() -> int {
printf("acpi sandbox detect by huoji 2023.6.19 \n");
// 获取ACPI表缓冲区大小
auto firmwareTableBufferSize = EnumSystemFirmwareTables(
FirmwareTableProviderSignature, 0, 0);
char* firmwareTableBuffer = nullptr;
do {
if (firmwareTableBufferSize == 0) break;
firmwareTableBuffer = reinterpret_cast<char*>(malloc(firmwareTableBufferSize));
if (firmwareTableBuffer == nullptr) break;
firmwareTableBufferSize = EnumSystemFirmwareTables(
FirmwareTableProviderSignature,
firmwareTableBuffer,
firmwareTableBufferSize);
if (firmwareTableBufferSize == 0) break;
bool foundHpet = false;
auto index = 0;
// 遍历ACPI表
for (size_t i = 0; i < firmwareTableBufferSize / 4; i++) {
const auto tableHeader = reinterpret_cast<acpi_table_header*>(
reinterpret_cast<uint64_t>(firmwareTableBuffer) + i);
char tid[6] = {0};
char oemid[7] = {0};
memcpy(tid, &tableHeader->signature, sizeof(unsigned long));
memcpy(oemid, reinterpret_cast<char*>(tableHeader->oem_id),
sizeof(tableHeader->oem_id));
printf("tid: %s oemid: %s oem_table_id: %08X \n",
tid, oemid, tableHeader->oem_table_id);
index++;
}
// 检测规则
if (index < 7) {
printf("[detected] table size \n");
}
if (foundHpet == false) {
printf("[detected] HPET not found,Cuckoo detected \n");
}
} while (false);
if (firmwareTableBuffer != nullptr) {
free(firmwareTableBuffer);
}
getchar();
return 0;
}
3.3 检测规则
- 表数量检测:ACPI表数量小于8可能是虚拟机
- WAETH检测:存在"WAETH" OEM ID说明在Windows虚拟机中
- HPET检测:缺少HPET表可能是在Linux沙箱中
4. 实际检测结果
4.1 物理机特征
- ACPI表数量较多(通常≥8)
- 没有"WAETH" OEM ID
- 存在HPET表
4.2 VMware虚拟机特征
- 存在"WAETH" OEM ID
- 表数量可能较少
4.3 Cuckoo沙箱特征
- 缺少HPET表
- 表数量较少
5. 相关资源
6. 防御与对抗
6.1 防御检测
- 修改hypervisor的ACPI表实现
- 添加缺失的表(如HPET)
- 修改OEM ID信息
6.2 检测规避
- 使用更复杂的检测方法组合
- 结合其他虚拟化检测技术
- 动态分析ACPI表行为而非静态特征
7. 总结
ACPI表检测是一种有效的虚拟环境识别方法,具有以下特点:
- 实现简单,只需用户态API调用
- 检测准确率较高
- 难以被常规沙箱完全模拟
- 可作为多层检测策略的一部分
该技术适用于安全研究、反病毒检测和软件保护等多个领域。