飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2818|回复: 1

[病毒分析] [翻译]规避技术: 固件表

  [复制链接]
  • TA的每日心情
    开心
    2019-3-15 11:00
  • 签到天数: 262 天

    [LV.8]以坛为家I

    发表于 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日
    此文后期:根据自身所学进行内容扩充
    因自身技术有限,只能尽自身所能翻译国外技术文章,供大家学习,若有不当或可完善的地方,希望可以指出,用于共同完善这篇文章。


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

    固件表的检测方法
    如果操作系统是在虚拟环境下运行的,那么操作系统会使用一些特殊的内存区域,其中包含特定的伪装。根据操作系统版本的不同,可以使用不同的方法转储这些内存区域。
    固件表是通过SYSTEM_FIRMWARE_TABLE_INFORMATION对象检索的。它的定义如下:
    [C++] 纯文本查看 复制代码
    typedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION {
        ULONG ProviderSignature;
        SYSTEM_FIRMWARE_TABLE_ACTION Action;
        ULONG TableID;
        ULONG TableBufferLength;
        UCHAR TableBuffer[ANYSIZE_ARRAY];  // <- 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+
    代码样本:
    [C++] 纯文本查看 复制代码
    // 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
    代码样本:
    [C++] 纯文本查看 复制代码
    // 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

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

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

    根据Windows的版本,不同的功能被用于这种检查。见下面的代码样本。
    2.1. Windows Vista+
    代码样本:
    [C++] 纯文本查看 复制代码
    // 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
    代码样本:
    [C++] 纯文本查看 复制代码
    // 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固件表中是否存在以下字符串:
    检测
    字符串
    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已经实现了所有这些功能,但由于代码的模块化结构,需要更多的空间来展示这个工具的代码样本,以达到相同的目的。这就是为什么我们决定在整个百科全书中使用其他伟大的开源项目作为例子。

    评分

    参与人数 1威望 +1 飘云币 +1 收起 理由
    zhczf + 1 + 1 PYG有你更精彩!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2023-5-13 23:22
  • 签到天数: 853 天

    [LV.10]以坛为家III

    发表于 2021-5-31 23:03:32 | 显示全部楼层
    感谢楼主分享
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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