梦幻的彼岸 发表于 2021-5-14 16:44:17

[翻译]规避技术:文件系统

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

备注
原文地址:https://evasions.checkpoint.com/techniques/filesystem.html
原文标题:Evasions: Filesystem
目录

[*]文件系统探测方法
[*]1. 检查特定文件是否存在
[*]2. 检查特定的目录是否存在
[*]3. 检查可执行文件的完整路径是否包含某个特定字符串
[*]4. 检查可执行文件是否从特定的目录中运行
[*]5. 检查具有特定名称的可执行文件是否存在于物理磁盘驱动器根目录中。
[*]反制措施
[*]归功于

static/image/hrline/1.gif
文件系统探测方法
所有文件系统检测方法的原则如下:在通常的主机中没有这样的文件和目录;但它们存在于特定的虚拟环境和沙盒中。如果存在这样的工件,虚拟环境就可以被检测出来。
1. 检查特定文件是否存在

这种方法利用了普通主机系统和虚拟环境中存在的文件差异。在虚拟环境中,有许多文件是专门为这类系统而存在的。这些文件在没有安装虚拟环境的普通主机系统中是不存在的。

使用的函数:

[*]GetFileAttributes // 如果属性无效则不存在文件

代码样本:
BOOL is_FileExists(TCHAR* szPath)
{
    DWORD dwAttrib = GetFileAttributes(szPath);
    return (dwAttrib != INVALID_FILE_ATTRIBUTES) && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY);
}

/*
Check against some of VMware blacklisted files
*/
VOID vmware_files()
{
    /* Array of strings of blacklisted paths */
    TCHAR* szPaths[] = {
      _T("system32\\drivers\\vmmouse.sys"),
      _T("system32\\drivers\\vmhgfs.sys"),
    };
   
    /* Getting Windows Directory */
    WORD dwlength = sizeof(szPaths) / sizeof(szPaths);
    TCHAR szWinDir = _T("");
    TCHAR szPath = _T("");
    GetWindowsDirectory(szWinDir, MAX_PATH);
   
    /* Check one by one */
    for (int i = 0; i < dwlength; i++)
    {
      PathCombine(szPath, szWinDir, szPaths);
      TCHAR msg = _T("");
      _stprintf_s(msg, sizeof(msg) / sizeof(TCHAR), _T("Checking file %s: "), szPath);
      if (is_FileExists(szPath))
            print_results(TRUE, msg);
      else
            print_results(FALSE, msg);
    }
}
该代码样本的作者:al-khaser project
识别标志:如果以下函数包含其唯一的参数来自表列`路径`。

[*]GetFileAttributes(路径)
则表明应用程序试图使用规避技术。
检测表

检查是否存在以下文件:
监测路径细节(如果有的话)
c:\用于编码的PC特有的文件
c:\take_screenshot.ps1
c:\loaddll.exe
c:\email.doc
c:\email.htm
c:\123\email.doc
c:\123\email.docx
c:\a\foobar.bmp
c:\a\foobar.doc
c:\a\foobar.gif
c:\symbols\aagmmc.pdb
Parallelsc:\windows\system32\drivers\prleth.sys网络适配器
c:\windows\system32\drivers\prlfs.sys
c:\windows\system32\drivers\prlmouse.sys鼠标同步工具
c:\windows\system32\drivers\prlvideo.sys
c:\windows\system32\drivers\prltime.sys时间同步驱动程序
c:\windows\system32\drivers\prl_pv32.sys准虚拟化驱动程序
c:\windows\system32\drivers\prl_paravirt_32.sys准虚拟化驱动程序
VirtualBoxc:\windows\system32\drivers\VBoxMouse.sys
c:\windows\system32\drivers\VBoxGuest.sys
c:\windows\system32\drivers\VBoxSF.sys
c:\windows\system32\drivers\VBoxVideo.sys
c:\windows\system32\vboxdisp.dll
c:\windows\system32\vboxhook.dll
c:\windows\system32\vboxmrxnp.dll
c:\windows\system32\vboxogl.dll
c:\windows\system32\vboxoglarrayspu.dll
c:\windows\system32\vboxoglcrutil.dll
c:\windows\system32\vboxoglerrorspu.dll
c:\windows\system32\vboxoglfeedbackspu.dll
c:\windows\system32\vboxoglpackspu.dll
c:\windows\system32\vboxoglpassthroughspu.dll
c:\windows\system32\vboxservice.exe
c:\windows\system32\vboxtray.exe
c:\windows\system32\VBoxControl.exe
VirtualPCc:\windows\system32\drivers\vmsrvc.sys
c:\windows\system32\drivers\vpc-s3.sys
VMwarec:\windows\system32\drivers\vmmouse.sys指向性PS/2设备驱动程序
c:\windows\system32\drivers\vmnet.sys
c:\windows\system32\drivers\vmxnet.sysPCI以太网适配器
c:\windows\system32\drivers\vmhgfs.sysHGFS文件系统驱动程序
c:\windows\system32\drivers\vmx86.sys
c:\windows\system32\drivers\hgfs.sys


2. 检查是否存在特定的目录
这种方法利用了通常主机系统和虚拟环境中存在的目录差异。在虚拟环境中存在许多目录工件,它们是为这类系统所特有的。这些目录在没有安装虚拟环境的普通主机系统中是不存在的。
使用的函数:

[*]GetFileAttributes // 如果属性无效则不存在文件。

代码样本:
BOOL is_DirectoryExists(TCHAR* szPath)
{
    DWORD dwAttrib = GetFileAttributes(szPath);
    return (dwAttrib != INVALID_FILE_ATTRIBUTES) && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY);
}

/*
Check against VMware blacklisted directory
*/
BOOL vmware_dir()
{
    TCHAR szProgramFile;
    TCHAR szPath = _T("");
    TCHAR szTarget = _T("VMware\\");
    if (IsWoW64())
      ExpandEnvironmentStrings(_T("%ProgramW6432%"), szProgramFile, ARRAYSIZE(szProgramFile));
    else
      SHGetSpecialFolderPath(NULL, szProgramFile, CSIDL_PROGRAM_FILES, FALSE);
    PathCombine(szPath, szProgramFile, szTarget);
    return is_DirectoryExists(szPath);
}
该代码样本的作者:al-khaser project
识别标志:
如果以下函数包含其唯一的参数来自于表列`路径`

[*]GetFileAttributes(路径)

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

检查是否存在以下文件:
检测路径
CWSandboxc:\analysis
VirtualBox%PROGRAMFILES%\oracle\virtualbox guest additions\
VMware%PROGRAMFILES%\VMware\

3.检查可执行文件的完整路径是否包含某个特定字符串
这种方法依赖于在虚拟环境中启动可执行文件的特殊性。一些环境从特定的路径启动可执行文件 - 恶意软件样本检查这些路径。
用于获取可执行文件路径的函数:

[*]GetModuleFileName
[*]GetProcessImageFileNameA/W
[*]QueryFullProcessImageName

代码样本:(函数GetModuleFileName)
int gensandbox_path() {
    char path;
    size_t i;
    DWORD pathsize = sizeof(path);

    GetModuleFileName(NULL, path, pathsize);

    for (i = 0; i < strlen(path); i++) { /* case-insensitive */
      path = toupper(path);
    }

    // some sample values from the table
    if (strstr(path, "\\SAMPLE") != NULL) {
      return TRUE;
    }
    if (strstr(path, "\\VIRUS") != NULL) {
      return TRUE;
    }
    if (strstr(path, "SANDBOX") != NULL) {
      return TRUE;
    }

    return FALSE;
}
该代码样本的作者:pafish project
代码样本:(函数QueryFullProcessImageName)
DWORD PID = 1337; // process ID of the target process
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, false, PID);
DWORD value = MAX_PATH;
char buffer;
QueryFullProcessImageName(hProcess, 0, buffer, &value);
printf("EXE Path: %s\n", buffer);
无明显特征:
没有提供明显特征,因为很难说究竟为什么应用程序要获得它的完整路径。函数调用可能会被拦截--仅此而已,只是一个常规特征。
检测表

检查可执行文件的完整路径是否包含以下任意一个字符串:
监测字符串
\sample
\virus
sandbox

4. 检查可执行文件是否从特定目录中运行
这种方法依赖于在虚拟环境中启动可执行文件的特殊性。一些环境从特定的目录启动可执行文件 - 恶意软件样本检查这些目录。
这只是检查整个应用程序路径中特定字符串存在的一个特殊情况,请参考上面的代码样本和签名建议部分。
由于这种方法非常古老,而且不常用,所以提供了外部来源的链接,以参考这种方法:

[*]VB code sample
[*]python code sample
[*]anti-emulation tricks
[*]stub for C code

检测表

检查可执行文件是否从以下目录运行:
检测路径
Anubisc:\insidetm

5. 检查具有特定名称的可执行文件是否存在于物理磁盘驱动器的根目录中。
这种方法依赖于虚拟环境的特殊性,在这种情况下,它是在磁盘根目录中存在的特定文件。

使用的函数:
GetFileAttributes // 如果属性无效则不存在文件
代码样本:(函数GetModuleFileName)
int pafish_exists_file(char * filename) {
    DWORD res = INVALID_FILE_ATTRIBUTES;
    if (pafish_iswow64() == TRUE) {
      void *old = NULL;
      // Disable redirection immediately prior to calling GetFileAttributes.
      if (pafish_disable_wow64_fs_redirection(&old) ) {
            res = GetFileAttributes(filename);
            // Ignoring MSDN recommendation of exiting if this call fails.
            pafish_revert_wow64_fs_redirection(old);
      }
    }
    else {
      res = GetFileAttributes(filename);
    }
    return (res != INVALID_FILE_ATTRIBUTES) ? TRUE : FALSE;
}

int gensandbox_common_names() {
    DWORD dwSize = MAX_PATH;
    char szLogicalDrives = {0};
    DWORD dwResult = GetLogicalDriveStrings(dwSize,szLogicalDrives);
    BOOL exists;

    if (dwResult > 0 && dwResult <= MAX_PATH)
    {
      char* szSingleDrive = szLogicalDrives;
      char filename = {0};
      while(*szSingleDrive)
      {
            if (GetDriveType(szSingleDrive) != DRIVE_REMOVABLE ) {
                snprintf(filename, MAX_PATH, "%ssample.exe",szSingleDrive);
                exists = pafish_exists_file(filename);
                if (exists) return TRUE;
               
                snprintf(filename, MAX_PATH, "%smalware.exe",szSingleDrive);
                exists = pafish_exists_file(filename);
                if (exists) return TRUE;
            }

            szSingleDrive += strlen(szSingleDrive) + 1;
      }
    }

    return FALSE;
}
该代码样本的作者:pafish project
明显特征:
如果以下函数包含其唯一的参数来自于表列`路径`。

[*]GetFileAttributes(路径)

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

检查磁盘根目录中是否存在具有特定名称的可执行文件:
检测路径
malware.exe
sample.exe

反制措施
拦截目标函数,如果指标(来自表格的文件)被检查,则返回适当的结果。
归功于
归功于开放源码项目,代码样本来自这些项目:

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

1otus 发表于 2021-5-17 23:30:26

感谢楼主分享

sweet891214 发表于 2021-5-18 00:47:15

感谢楼主分享

哈哈巨子 发表于 2021-5-18 09:43:10

虽然看不懂,但谢谢楼主分享

DMD 发表于 2021-5-22 11:10:50

翻译辛苦了!
页: [1]
查看完整版本: [翻译]规避技术:文件系统