梦幻的彼岸 发表于 2021-5-31 16:00:40

[翻译]规避技术: 固件表

本帖最后由 梦幻的彼岸 于 2021-5-31 16:11 编辑

备注
原文地址:https://evasions.checkpoint.com/techniques/firmware-tables.html
原文标题:Evasions: Firmware tables
更新日期:2021年5月31日
此文后期:根据自身所学进行内容扩充
因自身技术有限,只能尽自身所能翻译国外技术文章,供大家学习,若有不当或可完善的地方,希望可以指出,用于共同完善这篇文章。

static/image/hrline/1.gif
目录

[*]固件表的检测方法
[*]1. 检查原始固件表中是否存在特定的字符串
[*]1.1. Windows Vista+
[*]1.2. Windows XP
[*]2. 检查原始SMBIOS固件表中是否存在特定字符串
[*]2.1. Windows Vista+
[*]2.2. Windows XP
[*]反制措施
[*]归功于

固件表的检测方法
如果操作系统是在虚拟环境下运行的,那么操作系统会使用一些特殊的内存区域,其中包含特定的伪装。根据操作系统版本的不同,可以使用不同的方法转储这些内存区域。
固件表是通过SYSTEM_FIRMWARE_TABLE_INFORMATION对象检索的。它的定义如下:
typedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION {
    ULONG ProviderSignature;
    SYSTEM_FIRMWARE_TABLE_ACTION Action;
    ULONG TableID;
    ULONG TableBufferLength;
    UCHAR TableBuffer;// <- the result will reside in this field
} SYSTEM_FIRMWARE_TABLE_INFORMATION, *PSYSTEM_FIRMWARE_TABLE_INFORMATION;

// helper enum
typedef enum _SYSTEM_FIRMWARE_TABLE_ACTION
{
    SystemFirmwareTable_Enumerate,
    SystemFirmwareTable_Get
} SYSTEM_FIRMWARE_TABLE_ACTION, *PSYSTEM_FIRMWARE_TABLE_ACTION;

1. 检查原始固件表中是否存在特定的字符串
扫描检索到的固件表以确定是否存在特定字符串。

根据Windows的版本,不同的功能被用于这种检查。见下面的代码样本。
1.1. Windows Vista+
代码样本:
// First, SYSTEM_FIRMWARE_TABLE_INFORMATION object is initialized in the following way:
SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti =
    (PSYSTEM_FIRMWARE_TABLE_INFORMATION)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Length);
sfti->Action = SystemFirmwareTable_Get;// 1
sfti->ProviderSignature = 'FIRM';
sfti->TableID = 0xC0000;
sfti->TableBufferLength = Length;

// Then initialized SYSTEM_FIRMWARE_TABLE_INFORMATION object is used as an argument for
// the system information call in the following way in order to dump raw firmware table:
NtQuerySystemInformation(
    SystemFirmwareTableInformation,// 76
    sfti,
    Length,
    &Length);
此代码样本归功于:VMDE项目
识别标志:
如果函数

[*]NtQuerySystemInformation

包含:

[*]第1个参数等于76 (SystemFirmwareTableInformation)
[*]第2个参数的sfti->ProviderSignature字段被初始化为'FIRM'并且 sffti ->Action字段初始化为1

那么这就表明应用程序试图使用这种规避技术。
1.2. Windows XP
代码样本:
// In case if OS version is Vista+ csrss.exe memory space is read in order to dump raw firmware table:
hCSRSS = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, csrss_pid);

NtReadVirtualMemory(
   hCSRSS,
   0xC0000,
   sfti,
   RegionSize,
   &memIO);
识别标志:
如果以下函数包含csrss.exe进程的PID作为其第3个参数:

[*]HANDLE hCSRSS = OpenProcess(..., csrss_pid)

并在其后调用以下函数:

[*]NtReadVirtualMemory(hCSRSS, 0xC0000, ...)

其中包含:

[*]第一个参数等于csrss.exe的句柄
[*]第2个参数等于0xC0000

那么这就表明应用程序试图使用这种规避技术。
检测表:

检查原始固件表中是否存在以下字符串:
检测字符串
ParallelsParallels(R)
VirtualBoxInnotek
Oracle
VirtualBox
VirtualPCS3 Corp.
VMwareVMware

2. 检查原始SMBIOS固件表中是否存在特定字符串
检索的固件表被扫描,以确定是否存在特定的字符串。

根据Windows的版本,不同的功能被用于这种检查。见下面的代码样本。
2.1. Windows Vista+
代码样本:
// SYSTEM_FIRMWARE_TABLE_INFORMATION object is initialized in the following way:
SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti =
    (PSYSTEM_FIRMWARE_TABLE_INFORMATION)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Length);
sfti->Action = SystemFirmwareTable_Get; // 1
sfti->ProviderSignature = 'RSMB';
sfti->TableID = 0;
sfti->TableBufferLength = Length;

// Then initialized SYSTEM_FIRMWARE_TABLE_INFORMATION object is used as an argument for
// the system information call in the following way in order to dump raw firmware table:
NtQuerySystemInformation(
    SystemFirmwareTableInformation,// 76
    sfti,
    Length,
    &Length);
这个代码样本归功于:VMDE项目
识别标志:
如果函数:

[*]NtQuerySystemInformation

包含:

[*]第1个参数等于76 (SystemFirmwareTableInformation)
[*]第二个参数的sfti->ProviderSignature字段被初始化为'RSMB'并且sfti->Action字段被初始化为1。

那么这就表明应用程序试图使用这种规避技术。
2.2. Windows XP
代码样本:
// In case if OS version is Vista+ csrss.exe memory space is read in order to dump raw firmware table:
hCSRSS = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, csrss_pid);

NtReadVirtualMemory(
   hCSRSS,
   0xC0000,
   sfti,
   RegionSize,
   &memIO);
识别标志:
如果以下函数包含csrss.exe进程的PID作为其第3个参数:

[*]HANDLE hCSRSS = OpenProcess(..., csrss_pid)

并在其后调用以下函数:

[*]NtReadVirtualMemory(hCSRSS, 0xE0000, ...)

其中包含:

[*]第一个参数等于csrss.exe句柄
[*]第二个参数等于0xE0000

那么这就表明应用程序试图使用这种规避技术。
检测表:

检查原始SMBIOS固件表中是否存在以下字符串:
检测字符串
ParallelsParallels Software International
VirtualBoxInnotek
Oracle
VirtualBox
VirtualPCVS2005R2
VMwareVMware, Inc.
VMware

反制措施

[*]在Vista以上的系统中,改变csrss.exe在指定地址的内存内容。
[*]在Vista+操作系统上,拦截NtQuerySystemInformation以检索SystemFirmwareTableInformation类,并解析SFTI结构以获得提供的字段值。

归功于
归功于开源项目,代码样本来自该项目:

[*]github上的VMDE项目

尽管Check Point工具InviZzzible已经实现了所有这些功能,但由于代码的模块化结构,需要更多的空间来展示这个工具的代码样本,以达到相同的目的。这就是为什么我们决定在整个百科全书中使用其他伟大的开源项目作为例子。

1otus 发表于 2021-5-31 23:03:32

感谢楼主分享
页: [1]
查看完整版本: [翻译]规避技术: 固件表