我就從簡單分析下怎樣躲過殺毒軟體的查殺說起吧
這是我以前的文章,據說這種技術可以過主動防禦
.386
.Model Flat, StdCall
Option Casemap :None
Include windows.inc
Include user32.inc
Include kernel32.inc
IncludeLib user32.lib
IncludeLib kernel32.lib
.DATA
szDllKernel db 'user32.dll',0
szMessageBox db 'MessageBoxA',0
.DATA?
lpMessageBox dd ?
.CODE
START:
invoke GetModuleHandle,addr szDllKernel
mov ebx,eax
invoke GetProcAddress,ebx,offset szMessageBox
mov lpMessageBox,eax
push MB_OK
push 0
push 0
push 0
mov EAX,offset _END
push EAX
jmp lpMessageBox
_END:
invoke ExitProcess,0
END START
上面的代碼可用於反殺毒軟體的病毒裡,殺毒軟體一般都用特徵碼判斷是否調用了危險API,而上面的代碼就是把CALL分解開來,實現了簡單的代碼變形
如果殺毒軟體是靠判斷JMP的目標是否為危險API的話,也可以寫成這樣躲過殺毒軟體
.CODE
START:
invoke GetModuleHandle,addr szDllKernel
mov ebx,eax
invoke GetProcAddress,ebx,offset szMessageBox
mov lpMessageBox,eax
push MB_OK
push 0
push 0
push 0
mov EAX,offset _END
push EAX
;添加的代碼開始
mov edi,edi
push ebp
mov ebp,esp
add lpMessageBox,5
;添加的代碼結束
jmp lpMessageBox
_END:
invoke ExitProcess,0
END START
殺毒軟體一般是靠特徵碼判斷病毒的,比如殺毒軟體監視MessageBox這個函數的調用,只要調用這個函數殺毒軟體就認為你有破壞系統的動機,所以我們就得想辦法躲過殺毒軟體的監視,但又不能不用這個函數那怎麼辦呢?
www.xbin.cn
瞭解調用過程的人都知道CALL指令就是先把下一條指令地址壓棧然後在用JMP跳轉到函數入口處,那我們的解決辦法就出來了,我們可以自己完成這個調用動作,先把下一條指令壓棧
mov EAX,offset _END
push EAX
在跳轉到函數入口處
jmp lpMessageBox
這樣就騙過殺毒軟體了,因為在二進位代碼層級上,上面的代碼和CALL指令的二進位是不同的,但實現的功能是相同的。
有的殺毒軟體不光靠判斷特徵碼,而且還判斷跳轉的目標地址,就是判斷你的指令是否跳轉到他認為危險的API入口處,當然我們也有辦法騙過他,那就是把目標API的前幾行代碼在自己程式裡實現,然後在跳轉到API函數中去繼續運行。比如我是把MessageBox的前3行代碼在自己的程式裡實現,然後在條到MessageBox的第4行裡繼續運行。
www.xbin.cn
這樣跳轉到目標入口地址就不是API函數的入口了
如果殺毒軟體是靠判斷是否跳轉到一個指定的地區的話,那還有一個更毒的招,那就是分配一個動態記憶體,把API函數代碼考到自己的2G空間裡運行