前言:
可能大家想到病毒,第一反應(yīng)就是可能是用asm來編寫,或者是VBsript,而高級(jí)語言如Delphi就好象不能編寫一樣,其實(shí)事實(shí)并不是這個(gè)樣子的,只要我們花一些時(shí)間,照樣可以寫出簡(jiǎn)短而高效的病毒程序來,一點(diǎn)也不輸那些用匯編寫出來的程序哦。
一個(gè)病毒程序首先要短小,我們的目標(biāo)是經(jīng)過壓縮后控制在30k以下。用過delphi的朋友都知道,如果在uses里面加入forms,classes.....等就會(huì)使目標(biāo)文件非常的大,所以,在我們的程序里,我們要盡可能的不用這些庫。我們只用Windows,winsock,shellapi,sysutils(這個(gè)里面包含了一些常用的函數(shù),比如對(duì)文件的操作,對(duì)字符串的操作,如果用自己的程序來代替,目標(biāo)文件會(huì)更加的小)
首先,我們知道,一個(gè)病毒程序一般都分下面三個(gè)模塊:
①保護(hù)模塊;
②感染模塊;
③發(fā)作模塊。
下面我們就從這三個(gè)模塊開始,分別實(shí)現(xiàn)他們的代碼。
一)保護(hù)模塊。
一般,我們都是把自身拷貝到系統(tǒng)的一些目錄里,比如%systemroot%。那么,我們首先要取得這些特定的目錄的路徑sdk里面給我們提供了一個(gè)這樣的函數(shù)GetSystemDirectory :
UINT GetSystemDirectory(
LPTSTR lPBuffer, // 存放返回的字符串的緩沖區(qū)
UINT uSize // 上面的緩沖去的長(zhǎng)度
);
相關(guān)的函數(shù)還有GetWindowsDirectory可以得到%windows%的路徑
得到了系統(tǒng)的目錄后,第二步就是拷貝文件了。sdk為我們提供了一個(gè)函數(shù)copyfile :
BOOL CopyFile(
LPCTSTR lpExistingFileName, // 源文件的路徑
LPCTSTR lpNewFileName, // 目標(biāo)文件的路徑
BOOL bFailIfExists // 這是一個(gè)標(biāo)志,如果目標(biāo)文件已經(jīng)存在,是否強(qiáng)制覆蓋
);
拷貝文件完畢后,我們來把這個(gè)文件設(shè)置為系統(tǒng)和隱藏,那么一般情況是看不見該文件的,除非選取查看所有文件,以及顯示受保護(hù)文件。 同樣,介紹一個(gè)函數(shù)SetFileAttributes :
BOOL SetFileAttributes(
LPCTSTR lpFileName, // 需要設(shè)置的文件的文件名
DWORD dwFileAttributes // 設(shè)置的值。
);
我們這里要設(shè)置為隱藏和系統(tǒng),那么就為第二個(gè)參數(shù)傳遞FILE_ATTRIBUTE_HIDDEN+FILE_ATTRIBUTE_SYSTEM
下面就是最重要的,讓該文件開機(jī)自動(dòng)運(yùn)行,我們一般都是寫注冊(cè)表,首先用RegOpenKey函數(shù)來打開一個(gè)鍵。
LONG RegOpenKey(
HKEY hKey, // 主鍵,比如HKEY_LOCAL_MACHINE
LPCTSTR lpSubKey, // 跟隨的subkey
PHKEY phkResult // 存放函數(shù)返回這個(gè)打開的鍵的句柄
);
可能大家想到病毒,第一反應(yīng)就是可能是用asm來編寫,或者是VBsript,而高級(jí)語言如Delphi就好象不能編寫一樣,其實(shí)事實(shí)并不是這個(gè)樣子的,只要我們花一些時(shí)間,照樣可以寫出簡(jiǎn)短而高效的病毒程序來,一點(diǎn)也不輸那些用匯編寫出來的程序哦。
一個(gè)病毒程序首先要短小,我們的目標(biāo)是經(jīng)過壓縮后控制在30k以下。用過delphi的朋友都知道,如果在uses里面加入forms,classes.....等就會(huì)使目標(biāo)文件非常的大,所以,在我們的程序里,我們要盡可能的不用這些庫。我們只用Windows,winsock,shellapi,sysutils(這個(gè)里面包含了一些常用的函數(shù),比如對(duì)文件的操作,對(duì)字符串的操作,如果用自己的程序來代替,目標(biāo)文件會(huì)更加的小)
首先,我們知道,一個(gè)病毒程序一般都分下面三個(gè)模塊:
①保護(hù)模塊;
②感染模塊;
③發(fā)作模塊。
下面我們就從這三個(gè)模塊開始,分別實(shí)現(xiàn)他們的代碼。
一)保護(hù)模塊。
一般,我們都是把自身拷貝到系統(tǒng)的一些目錄里,比如%systemroot%。那么,我們首先要取得這些特定的目錄的路徑sdk里面給我們提供了一個(gè)這樣的函數(shù)GetSystemDirectory :
UINT GetSystemDirectory(
LPTSTR lPBuffer, // 存放返回的字符串的緩沖區(qū)
UINT uSize // 上面的緩沖去的長(zhǎng)度
);
相關(guān)的函數(shù)還有GetWindowsDirectory可以得到%windows%的路徑
得到了系統(tǒng)的目錄后,第二步就是拷貝文件了。sdk為我們提供了一個(gè)函數(shù)copyfile :
BOOL CopyFile(
LPCTSTR lpExistingFileName, // 源文件的路徑
LPCTSTR lpNewFileName, // 目標(biāo)文件的路徑
BOOL bFailIfExists // 這是一個(gè)標(biāo)志,如果目標(biāo)文件已經(jīng)存在,是否強(qiáng)制覆蓋
);
拷貝文件完畢后,我們來把這個(gè)文件設(shè)置為系統(tǒng)和隱藏,那么一般情況是看不見該文件的,除非選取查看所有文件,以及顯示受保護(hù)文件。 同樣,介紹一個(gè)函數(shù)SetFileAttributes :
BOOL SetFileAttributes(
LPCTSTR lpFileName, // 需要設(shè)置的文件的文件名
DWORD dwFileAttributes // 設(shè)置的值。
);
我們這里要設(shè)置為隱藏和系統(tǒng),那么就為第二個(gè)參數(shù)傳遞FILE_ATTRIBUTE_HIDDEN+FILE_ATTRIBUTE_SYSTEM
下面就是最重要的,讓該文件開機(jī)自動(dòng)運(yùn)行,我們一般都是寫注冊(cè)表,首先用RegOpenKey函數(shù)來打開一個(gè)鍵。
LONG RegOpenKey(
HKEY hKey, // 主鍵,比如HKEY_LOCAL_MACHINE
LPCTSTR lpSubKey, // 跟隨的subkey
PHKEY phkResult // 存放函數(shù)返回這個(gè)打開的鍵的句柄
);