當前位置:編程學習大全網 - 源碼下載 - 如何設計壹個殺毒軟件!

如何設計壹個殺毒軟件!

信息來源:neeao blog

如今病毒木馬蠕蟲層出不窮,變種也是壹個接壹個。反病毒公司以及各大安全公司隨著影響很大的病毒的出現都會免費提供病毒專殺工具,這個舉措對普通用戶來說確實很有幫助。其實寫病毒專殺工具也不像大家想象的那麽神秘,利用SDK寫個控制臺程序來實現病毒專殺,因無須寫圖形界面,所以簡便快捷!妳自己也能寫!不信?就接著看吧 廢話不說了,接下來就開始談談病毒專殺工具的思路及實現方法。

此文中講解的病毒專殺工具是針對木馬、蠕蟲等獨立的程序而言的廣義的病毒而言,而不是指那種自我復制感染PE文件的依附於其他程序的那種狹義的病毒。因為寫那種病毒的專殺工具需要PE文件結構等知識,相對而言有點難度,所以我們就先從相對簡單點的開始,難的以後再介紹。

對於大多數病毒而言,殺毒的思路其實很簡單,那就是:終止病毒的進程、刪除自啟動項目(壹般在註冊表中的run*主鍵下)、刪除病毒文件,對設置了文件關聯的病毒而言還要修改註冊表恢復文件關聯。下面將分別陳述。

壹.終止進程

以前網上曾有許多朋友問我怎麽根據文件名終止指定進程,為什麽使用函數TerminateProcess()不能直接終止指定進程。首先讓我們來看看函數TerminateProcess()的聲明吧:Bool TerminateProcess(HANDLE hPeocess,UINT uExitCode),其中第壹個參數為進程句柄,而不是進程名稱(文件名)。那怎樣才能獲得指定進程的句柄呢?我們可以使用函數OpenProcess(),其原型為

HANDLE OpenProcess(

DWORD dwDesiredAccess, // 訪問標誌

BOOL bInheritHandle, // 處理繼承的標誌

DWORD dwProcessId // 進程標識號,即進程ID

);

最後壹個參數就是該進程的ID,進程句柄和進程ID是兩回事,這時妳可能很郁悶:怎麽知道進程ID呢?方法當然有啦!在Windows9X/2000/XP/2003中,微軟均提供了用來枚舉進程的ToolHelp API系列函數。先運用函數CreateToolhelp32Snapshot()取得快照句柄,然後使用Process32First()以及Process32Next()枚舉當前的進程。枚舉過程中會將每壹個進程的信息存放到PROCESSENTRY32結構中。PROCESSENTRY32的原型為:

typedef struct tagPROCESSENTRY32

{

DWORD dwSize; // 結構大小;

DWORD cntUsage; // 此進程的引用計數;

DWORD th32ProcessID; // 進程ID;

DWORD th32DefaultHeapID; // 進程默認堆ID;

DWORD th32ModuleID; // 進程模塊ID;

DWORD cntThreads; // 此進程開啟的線程計數;

DWORD th32ParentProcessID; // 父進程ID;

LONG pcPriClassBase; // 線程優先權;

DWORD dwFlags; // 保留;

char szExeFile[MAX_PATH]; // 進程全名;

} PROCESSENTRY32;

其中th32ProcessID就是進程的ID,szExeFile為該進程的文件名。所以要終止指定進程,我們可以枚舉進程,逐壹判斷szExeFile是否和我們欲終止的進程名相同,如果相同就取其th32ProcessID參數,然後代入OpenProcess函數,取得目標進程的句柄。這樣就可以利用函數TerminateProcess()終止該進程了。我寫了個終止指定進程的函數,如下:

void KillProcessFromName(LPCTSTR name)//name為妳要終止的進程的名稱,Win9X則需包括路徑

{

PROCESSENTRY32 pe;//定義壹個PROCESSENTRY32結類型的變量

HANDLE hShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);// 創建快照句柄

pe.dwSize=sizeof(PROCESSENTRY32);//壹定要先為dwSize賦值

if (Process32First(hShot,&pe))

{

do

{if (strcmp(pe.szExeFile,name)==0) //判斷此進程是否為妳要終止的進程

HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe.th32ProcessID);//如果是就利用其ID獲得句柄

TerminateProcess(hProcess,0);//終止該進程

}

while(Process32Next(hkz,&pe));

}

CloseHandle(hShot);//最後別忘記Close

}

在使用時只要在main()主函數裏調用函數KillProcessFromName(),把參數設為妳要終止的進程的名稱即可,Win9X則需包括路徑。還有壹點值得註意壹下,就是別忘了#include <TlHelp32.h>。

二、刪除文件

這壹步驟很簡單,調用函數DeleteFile()即可,Bool DeleteFile(LPCTSTR lpFilename),把lpFilename設要指向刪除的文件的文件名的指針即可,可包含具體路徑。

三、修改註冊表,刪除啟動項及文件關聯

首先用函數RegOpenKeyEx()打開目標主鍵,RegOpenKeyEx()函數原型為

LONG RegOpenKeyEx(

HKEY hKey,// 將要打開的鍵的句柄

LPCTSTR lpSubKey,// 指向將要打開的包含子建的名稱字符串指針

DWORD ulOptions,// 為保留字,必須為NULL

REGSAM samDesired,// 訪問權限

PHKEY phkResult//指向打開鍵的句柄指針

);

獲得句柄後用函數RegSetValueEx()進行修改鍵值,函數原型為:

LONG RegSetValueEx(

HKEY hKey, //當前打開的鍵的句柄

LPCTSTR lpValueName, //指向非空的包含要查詢的值名稱的字符串指針

DWORD Reserved, //保留值,必須為NULL

DWORD dwType,//鍵值類型,比如REG_SZ、REG_DWORD等

CONST BYTE * lpData , //指向鍵值數據的指針,註意此變量類型,不是LPCTSTR!

DWORD cbData//指向保存設定值長度變量的指針,以字節為單位

);

當然也可以用函數RegDeleteValue()來刪除鍵值。操作完畢後別忘了用函數RegCloseKey()來Close。

使用這些函數很簡單,只要把相應的參數換為妳要刪除或修改註冊表的相應數值,唯壹值得註意的是RegSetValueEx()函數中第5個參數的類型是BYTE而不是LPCTSTR!通過這些就可以很方便刪除指定啟動項以及恢復文件關聯,為了便於大家理解,我舉個修復EXE文件關聯的例子,大家修改相應的參數就可以適用其它鍵值的修改,換用RegDeleteValue函數就可以實現刪除自啟動項。

HKEY hKey;

LPCTSTR data1="\"%1\" %*";//EXE文件默認的open方式,”%1\"表EXE文件本身

DWORD lResult=RegOpenKeyEx(HKEY_CLASSES_ROOT,"exefile\\shell\\open\\command",0,KEY_WRITE,&hKey);

if(lResult==ERROR_SUCCESS)

RegSetValueEx(hKey,"",NULL,REG_SZ,(LPBYTE)data1,9);//修改鍵值

RegCloseKey(hKey);

到這裏,壹個病毒專殺工具的模型就已初步完成了,大家自己編寫時只需把文中函數的形參換為妳要殺的目標病毒的相應特征數據編譯即可。這個是個簡單的專殺工具,只能對付普通的木馬、蠕蟲等病毒,大家應具體情況具體分析,根據具體情況擴充該程序功能,比如有些木馬是通過修改win.ini、system.ini來實現自動運行,我們就需操作文件刪除相應數據,除此之外,有時還需添加終止服務、卸載DLL模塊、進入RING0操作等功能。總之,我相信大家壹定能自己寫出病毒木馬專殺工具的!呵呵,是不是很有成就感呢!

  • 上一篇:網站被cc攻擊了。怎麽處理?
  • 下一篇:php網站怎麽搭建環境配置php網站怎麽搭建環境配置文件
  • copyright 2024編程學習大全網