虚拟机反检测技术:文件系统

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

目录

  • 文件系统探测方法

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

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

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

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

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

  • 反制措施

  • 归功于

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

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

使用的函数:

  • GetFileAttributes // 如果属性无效则不存在文件

代码样本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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  
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 // 如果属性无效则不存在文件。

代码样本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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);
}

识别标志:
如果以下函数包含其唯一的参数来自于表列`路径`

  • GetFileAttributes(路径)

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

检查是否存在以下文件:

检测

路径

 

CWSandbox

c:\analysis

 

VirtualBox

%PROGRAMFILES%\oracle\virtualbox guest additions\

 

VMware

%PROGRAMFILES%\VMware\

 

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

  • GetModuleFileName

  • GetProcessImageFileNameA/W

  • QueryFullProcessImageName

代码样本:(函数GetModuleFileName)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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;
}

代码样本:(函数QueryFullProcessImageName)

1
2
3
4
5
6
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)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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;
}

明显特征:
如果以下函数包含其唯一的参数来自于表列`路径`。

  • GetFileAttributes(路径)

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

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

检测

路径

[general]

malware.exe

sample.exe

反制措施
拦截目标函数,如果指标(来自表格的文件)被检查,则返回适当的结果。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容