设为首页收藏本站
查看: 3492|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    2022-1-9 18:41
  • 签到天数: 5 天

    [LV.2]偶尔看看I

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

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

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

    8. // helper enum
    9. typedef enum _SYSTEM_FIRMWARE_TABLE_ACTION
    10. {
    11.     SystemFirmwareTable_Enumerate,
    12.     SystemFirmwareTable_Get
    13. } SYSTEM_FIRMWARE_TABLE_ACTION, *PSYSTEM_FIRMWARE_TABLE_ACTION;
    复制代码


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

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

    8. // Then initialized SYSTEM_FIRMWARE_TABLE_INFORMATION object is used as an argument for
    9. // the system information call in the following way in order to dump raw firmware table:
    10. NtQuerySystemInformation(
    11.     SystemFirmwareTableInformation,  // 76
    12.     sfti,
    13.     Length,
    14.     &Length);
    复制代码

    此代码样本归功于:VMDE项目
    识别标志:
    如果函数
    • NtQuerySystemInformation

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

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

    3. NtReadVirtualMemory(
    4.      hCSRSS,
    5.      0xC0000,
    6.      sfti,
    7.      RegionSize,
    8.      &memIO);
    复制代码

    识别标志:
    如果以下函数包含csrss.exe进程的PID作为其第3个参数:
    • HANDLE hCSRSS = OpenProcess(..., csrss_pid)

    并在其后调用以下函数:
    • NtReadVirtualMemory(hCSRSS, 0xC0000, ...)

    其中包含:
    • 第一个参数等于csrss.exe的句柄
    • 第2个参数等于0xC0000

    那么这就表明应用程序试图使用这种规避技术。
    检测表:
    检查原始固件表中是否存在以下字符串:
    检测
    字符串
    Parallels
    Parallels(R)
    VirtualBox
    Innotek
    Oracle
    VirtualBox
    VirtualPC
    S3 Corp.
    VMware
    VMware

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

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

    8. // Then initialized SYSTEM_FIRMWARE_TABLE_INFORMATION object is used as an argument for
    9. // the system information call in the following way in order to dump raw firmware table:
    10. NtQuerySystemInformation(
    11.     SystemFirmwareTableInformation,  // 76
    12.     sfti,
    13.     Length,
    14.     &Length);
    复制代码

    这个代码样本归功于:VMDE项目
    识别标志:
    如果函数:
    • NtQuerySystemInformation

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

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

    3. NtReadVirtualMemory(
    4.      hCSRSS,
    5.      0xC0000,
    6.      sfti,
    7.      RegionSize,
    8.      &memIO);
    复制代码

    识别标志:
    如果以下函数包含csrss.exe进程的PID作为其第3个参数:
    • HANDLE hCSRSS = OpenProcess(..., csrss_pid)

    并在其后调用以下函数:
    • NtReadVirtualMemory(hCSRSS, 0xE0000, ...)

    其中包含:
    • 第一个参数等于csrss.exe句柄
    • 第二个参数等于0xE0000

    那么这就表明应用程序试图使用这种规避技术。
    检测表:
    检查原始SMBIOS固件表中是否存在以下字符串:
    检测
    字符串
    Parallels
    Parallels Software International
    VirtualBox
    Innotek
    Oracle
    VirtualBox
    VirtualPC
    VS2005R2
    VMware
    VMware, Inc.
    VMware

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

    归功于
    归功于开源项目,代码样本来自该项目:
    • github上的VMDE项目

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

    本版积分规则

    红盟社区--红客联盟 

    Processed in 0.062932 second(s), 21 queries.

    站点统计| 举报| Archiver| 手机版| 黑屋 |   

    备案号:冀ICP备20006029号-1 Powered by HUC © 2001-2021 Comsenz Inc.

    手机扫我进入移动触屏客户端

    关注我们可获取更多热点资讯

    Honor accompaniments. theme macfee

    快速回复 返回顶部 返回列表