首页
社区
课程
招聘
[原创][翻译]规避技术:文件系统
2021-5-14 16:51 6732

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

2021-5-14 16:51
6732

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

更新日期:2021年5月17日

此文后期:根据自身所学进行内容扩充

因自身技术有限,只能尽自身所能翻译国外技术文章,供大家学习,若有不当或可完善的地方,希望可以指出,用于共同完善这篇文章。

目录

  • 文件系统探测方法

  • 1. 检查特定文件是否存在

  • 2. 检查特定的目录是否存在

  • 3. 检查可执行文件的完整路径是否包含某个特定字符串

  • 4. 检查可执行文件是否从特定的目录中运行

  • 5. 检查具有特定名称的可执行文件是否存在于物理磁盘驱动器根目录中。

  • 反制措施

  • 归功于



文件系统探测方法
所有文件系统检测方法的原则如下:在通常的主机中没有这样的文件和目录;但它们存在于特定的虚拟环境和沙盒中。如果存在这样的工件,虚拟环境就可以被检测出来。
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[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 // 如果属性无效则不存在文件。


代码样本:

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
识别标志:
如果以下函数包含其唯一的参数来自于表列`路径`

  • GetFileAttributes(路径)


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

检查是否存在以下文件:

检测

路径


CWSandbox

c:\analysis


VirtualBox

%PROGRAMFILES%\oracle\virtualbox guest additions\


VMware

%PROGRAMFILES%\VMware\



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

  • GetModuleFileName

  • GetProcessImageFileNameA/W

  • QueryFullProcessImageName


代码样本:(函数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
明显特征:
如果以下函数包含其唯一的参数来自于表列`路径`。

  • GetFileAttributes(路径)


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

检查磁盘根目录中是否存在具有特定名称的可执行文件:

检测

路径

[general]

malware.exe

sample.exe


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

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



[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2021-5-20 09:26 被梦幻的彼岸编辑 ,原因:
收藏
点赞2
打赏
分享
最新回复 (1)
雪    币: 12278
活跃值: (8185)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Genes 2021-5-17 15:11
2
0
感谢妹子分享~~
游客
登录 | 注册 方可回帖
返回