飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2795|回复: 4

[病毒分析] [翻译]规避技术:文件系统

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

    [LV.8]以坛为家I

    发表于 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. 检查具有特定名称的可执行文件是否存在于物理磁盘驱动器根目录中。
    • 反制措施
    • 归功于


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

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

    使用的函数:
    • GetFileAttributes // 如果属性无效则不存在文件

    代码样本:
    [C++] 纯文本查看 复制代码
    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[0]);
        TCHAR szWinDir[MAX_PATH] = _T("");
        TCHAR szPath[MAX_PATH] = _T("");
        GetWindowsDirectory(szWinDir, MAX_PATH);
        
        /* Check one by one */
        for (int i = 0; i < dwlength; i++)
        {
            PathCombine(szPath, szWinDir, szPaths[i]);
            TCHAR msg[256] = _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(路径)
    则表明应用程序试图使用规避技术。
    检测表
    检查是否存在以下文件:
    监测路径细节(如果有的话)
    [general]c:\[60 random hex symbols]用于编码的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 // 如果属性无效则不存在文件。

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

    6. /*
    7. Check against VMware blacklisted directory
    8. */
    9. BOOL vmware_dir()
    10. {
    11.     TCHAR szProgramFile[MAX_PATH];
    12.     TCHAR szPath[MAX_PATH] = _T("");
    13.     TCHAR szTarget[MAX_PATH] = _T("VMware\");
    14.     if (IsWoW64())
    15.         ExpandEnvironmentStrings(_T("%ProgramW6432%"), szProgramFile, ARRAYSIZE(szProgramFile));
    16.     else
    17.         SHGetSpecialFolderPath(NULL, szProgramFile, CSIDL_PROGRAM_FILES, FALSE);
    18.     PathCombine(szPath, szProgramFile, szTarget);
    19.     return is_DirectoryExists(szPath);
    20. }
    复制代码

    该代码样本的作者:al-khaser project
    识别标志:
    如果以下函数包含其唯一的参数来自于表列`路径`
    • GetFileAttributes(路径)

    那么这就表明应用程序试图使用规避技术。
    检测表
    检查是否存在以下文件:
    检测
    路径
    CWSandbox
    c:\analysis
    VirtualBox
    %PROGRAMFILES%\oracle\virtualbox guest additions\
    VMware
    %PROGRAMFILES%\VMware\

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

    代码样本:(函数GetModuleFileName)
    1. int gensandbox_path() {
    2.     char path[500];
    3.     size_t i;
    4.     DWORD pathsize = sizeof(path);

    5.     GetModuleFileName(NULL, path, pathsize);

    6.     for (i = 0; i < strlen(path); i++) { /* case-insensitive */
    7.         path[i] = toupper(path[i]);
    8.     }

    9.     // some sample values from the table
    10.     if (strstr(path, "\\SAMPLE") != NULL) {
    11.         return TRUE;
    12.     }
    13.     if (strstr(path, "\\VIRUS") != NULL) {
    14.         return TRUE;
    15.     }
    16.     if (strstr(path, "SANDBOX") != NULL) {
    17.         return TRUE;
    18.     }

    19.     return FALSE;
    20. }
    复制代码

    该代码样本的作者:pafish project
    代码样本:(函数QueryFullProcessImageName)
    1. DWORD PID = 1337; // process ID of the target process
    2. HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, false, PID);
    3. DWORD value = MAX_PATH;
    4. char buffer[MAX_PATH];
    5. QueryFullProcessImageName(hProcess, 0, buffer, &value);
    6. printf("EXE Path: %s\n", buffer);
    复制代码

    无明显特征:
    没有提供明显特征,因为很难说究竟为什么应用程序要获得它的完整路径。函数调用可能会被拦截--仅此而已,只是一个常规特征。
    检测表
    检查可执行文件的完整路径是否包含以下任意一个字符串:
    监测
    字符串
    [general]
    \sample
    \virus
    sandbox

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

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

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

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

    17. int gensandbox_common_names() {
    18.     DWORD dwSize = MAX_PATH;
    19.     char szLogicalDrives[MAX_PATH] = {0};
    20.     DWORD dwResult = GetLogicalDriveStrings(dwSize,szLogicalDrives);
    21.     BOOL exists;

    22.     if (dwResult > 0 && dwResult <= MAX_PATH)
    23.     {
    24.         char* szSingleDrive = szLogicalDrives;
    25.         char filename[MAX_PATH] = {0};
    26.         while(*szSingleDrive)
    27.         {
    28.             if (GetDriveType(szSingleDrive) != DRIVE_REMOVABLE ) {
    29.                 snprintf(filename, MAX_PATH, "%ssample.exe",szSingleDrive);
    30.                 exists = pafish_exists_file(filename);
    31.                 if (exists) return TRUE;
    32.                
    33.                 snprintf(filename, MAX_PATH, "%smalware.exe",szSingleDrive);
    34.                 exists = pafish_exists_file(filename);
    35.                 if (exists) return TRUE;
    36.             }

    37.             szSingleDrive += strlen(szSingleDrive) + 1;
    38.         }
    39.     }

    40.     return FALSE;
    41. }
    复制代码

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

    那么这就表明应用程序试图使用规避技术。
    检测表
    检查磁盘根目录中是否存在具有特定名称的可执行文件:
    检测
    路径
    [general]
    malware.exe
    sample.exe

    反制措施
    拦截目标函数,如果指标(来自表格的文件)被检查,则返回适当的结果。
    归功于
    归功于开放源码项目,代码样本来自这些项目:
    尽管Check Point工具InviZzzible已经实现了所有这些功能,但由于代码的模块化结构,需要更多的空间来展示这个工具的代码样本,以达到相同的目的。这就是为什么我们决定在整个百科全书中使用其他伟大的开源项目作为例子。
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2023-5-13 23:22
  • 签到天数: 853 天

    [LV.10]以坛为家III

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

    使用道具 举报

  • TA的每日心情

    2021-5-22 12:23
  • 签到天数: 3 天

    [LV.2]偶尔看看I

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

    使用道具 举报

  • TA的每日心情
    无聊
    昨天 11:44
  • 签到天数: 305 天

    [LV.8]以坛为家I

    发表于 2021-5-18 09:43:10 | 显示全部楼层
    虽然看不懂,但谢谢楼主分享
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-14 22:24
  • 签到天数: 79 天

    [LV.6]常住居民II

    发表于 2021-5-22 11:10:50 | 显示全部楼层
    翻译辛苦了!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

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