通过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表的以下特征来检测虚拟环境:

  1. ACPI表的数量差异
  2. 特定OEM ID(如"WAETH")的存在
  3. 特定表(如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 检测规则

  1. 表数量检测:ACPI表数量小于8可能是虚拟机
  2. WAETH检测:存在"WAETH" OEM ID说明在Windows虚拟机中
  3. HPET检测:缺少HPET表可能是在Linux沙箱中

4. 实际检测结果

4.1 物理机特征

  • ACPI表数量较多(通常≥8)
  • 没有"WAETH" OEM ID
  • 存在HPET表

4.2 VMware虚拟机特征

  • 存在"WAETH" OEM ID
  • 表数量可能较少

4.3 Cuckoo沙箱特征

  • 缺少HPET表
  • 表数量较少

5. 相关资源

  1. WAET技术文档
  2. 示例代码仓库
  3. VMProtect相关实现

6. 防御与对抗

6.1 防御检测

  • 修改hypervisor的ACPI表实现
  • 添加缺失的表(如HPET)
  • 修改OEM ID信息

6.2 检测规避

  • 使用更复杂的检测方法组合
  • 结合其他虚拟化检测技术
  • 动态分析ACPI表行为而非静态特征

7. 总结

ACPI表检测是一种有效的虚拟环境识别方法,具有以下特点:

  • 实现简单,只需用户态API调用
  • 检测准确率较高
  • 难以被常规沙箱完全模拟
  • 可作为多层检测策略的一部分

该技术适用于安全研究、反病毒检测和软件保护等多个领域。

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使用 3.2 检测代码示例 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. 相关资源 WAET技术文档 示例代码仓库 VMProtect相关实现 6. 防御与对抗 6.1 防御检测 修改hypervisor的ACPI表实现 添加缺失的表(如HPET) 修改OEM ID信息 6.2 检测规避 使用更复杂的检测方法组合 结合其他虚拟化检测技术 动态分析ACPI表行为而非静态特征 7. 总结 ACPI表检测是一种有效的虚拟环境识别方法,具有以下特点: 实现简单,只需用户态API调用 检测准确率较高 难以被常规沙箱完全模拟 可作为多层检测策略的一部分 该技术适用于安全研究、反病毒检测和软件保护等多个领域。