| 
注册时间2017-12-1
阅读权限90
最后登录1970-1-1UID238621 版主   
 
 TA的每日心情|  | 开心 2019-3-15 11:00
 | 
|---|
 签到天数: 262 天 [LV.8]以坛为家I | 
 
| 本帖最后由 梦幻的彼岸 于 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
 识别标志:如果以下函数包含其唯一的参数来自表列`路径`。
 则表明应用程序试图使用规避技术。
 检测表
 
 | 检查是否存在以下文件: |  | 监测 | 路径 | 细节(如果有的话) |  | [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 |  |  | Parallels | c:\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 | 准虚拟化驱动程序 |  | VirtualBox | c:\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 |  |  | VirtualPC | c:\windows\system32\drivers\vmsrvc.sys |  |  | c:\windows\system32\drivers\vpc-s3.sys |  |  | VMware | c:\windows\system32\drivers\vmmouse.sys | 指向性PS/2设备驱动程序 |  | c:\windows\system32\drivers\vmnet.sys |  |  | c:\windows\system32\drivers\vmxnet.sys | PCI以太网适配器 |  | c:\windows\system32\drivers\vmhgfs.sys | HGFS文件系统驱动程序 |  | 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[MAX_PATH];
    TCHAR szPath[MAX_PATH] = _T("");
    TCHAR szTarget[MAX_PATH] = _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
 识别标志:
 如果以下函数包含其唯一的参数来自于表列`路径`
 
 那么这就表明应用程序试图使用规避技术。
 检测表
 
 | 检查是否存在以下文件: |  | 检测 | 路径 |  | CWSandbox | c:\analysis |  | VirtualBox | %PROGRAMFILES%\oracle\virtualbox guest additions\ |  | VMware | %PROGRAMFILES%\VMware\ | 
 3.检查可执行文件的完整路径是否包含某个特定字符串
 这种方法依赖于在虚拟环境中启动可执行文件的特殊性。一些环境从特定的路径启动可执行文件 - 恶意软件样本检查这些路径。
 用于获取可执行文件路径的函数:
 
 GetModuleFileNameGetProcessImageFileNameA/WQueryFullProcessImageName
 代码样本:(函数GetModuleFileName)
 
 复制代码int gensandbox_path() {
    char path[500];
    size_t i;
    DWORD pathsize = sizeof(path);
    GetModuleFileName(NULL, path, pathsize);
    for (i = 0; i < strlen(path); i++) { /* case-insensitive */
        path[i] = toupper(path[i]);
    }
    // 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[MAX_PATH];
QueryFullProcessImageName(hProcess, 0, buffer, &value);
printf("EXE Path: %s\n", buffer);
无明显特征:
 没有提供明显特征,因为很难说究竟为什么应用程序要获得它的完整路径。函数调用可能会被拦截--仅此而已,只是一个常规特征。
 检测表
 
 | 检查可执行文件的完整路径是否包含以下任意一个字符串: |  | 监测 | 字符串 |  | [general] | \sample |  | \virus |  | sandbox | 
 4. 检查可执行文件是否从特定目录中运行
 这种方法依赖于在虚拟环境中启动可执行文件的特殊性。一些环境从特定的目录启动可执行文件 - 恶意软件样本检查这些目录。
 这只是检查整个应用程序路径中特定字符串存在的一个特殊情况,请参考上面的代码样本和签名建议部分。
 由于这种方法非常古老,而且不常用,所以提供了外部来源的链接,以参考这种方法:
 
 检测表
 
 | 检查可执行文件是否从以下目录运行: |  | 检测 | 路径 |  | Anubis | c:\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[MAX_PATH] = {0};
    DWORD dwResult = GetLogicalDriveStrings(dwSize,szLogicalDrives);
    BOOL exists;
    if (dwResult > 0 && dwResult <= MAX_PATH)
    {
        char* szSingleDrive = szLogicalDrives;
        char filename[MAX_PATH] = {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
 明显特征:
 如果以下函数包含其唯一的参数来自于表列`路径`。
 
 那么这就表明应用程序试图使用规避技术。
 检测表
 
 | 检查磁盘根目录中是否存在具有特定名称的可执行文件: |  | 检测 | 路径 |  | [general] | malware.exe |  | sample.exe | 
 反制措施
 拦截目标函数,如果指标(来自表格的文件)被检查,则返回适当的结果。
 归功于
 归功于开放源码项目,代码样本来自这些项目:
 尽管Check Point工具InviZzzible已经实现了所有这些功能,但由于代码的模块化结构,需要更多的空间来展示这个工具的代码样本,以达到相同的目的。这就是为什么我们决定在整个百科全书中使用其他伟大的开源项目作为例子。
 
 | 
 |