VC實現(xiàn)的病毒專殺工具完整實例
本文實例講述了VC實現(xiàn)的病毒專殺工具的方法。非常實用,分享給大家供大家參考。具體實現(xiàn)方法如下:
如今病毒木馬蠕蟲層出不窮,變種也是一個接一個。反病毒公司以及各大安全公司隨著影響很大的病毒的出現(xiàn)都會免費提供病毒專殺工具,這個舉措對普通用戶來說確實很有幫助。其實寫病毒專殺工具也不像大家想象的那么神秘,利用SDK寫個控制臺程序來實現(xiàn)病毒專殺,因無須寫圖形界面,所以簡便快捷!你自己也能寫!不信?就接著看吧^_^ 廢話不說了,接下來就開始談?wù)劜《緦⒐ぞ叩乃悸芳皩崿F(xiàn)方法。
本文中講解的病毒專殺工具是針對木馬、蠕蟲等獨立的程序而言的廣義的病毒而言,而不是指那種自我復(fù)制感染PE文件的依附于其他程序的那種狹義的病毒。因為寫那種病毒的專殺工具需要PE文件結(jié)構(gòu)等知識,相對而言有點難度,所以我們就先從相對簡單點的開始,難的以后再介紹。
對于大多數(shù)病毒而言,殺毒的思路其實很簡單,那就是:終止病毒的進程、刪除自啟動項目(一般在注冊表中的run*主鍵下)、刪除病毒文件,對設(shè)置了文件關(guān)聯(lián)的病毒而言還要修改注冊表恢復(fù)文件關(guān)聯(lián)。下面將分別陳述。
一.終止進程
以前網(wǎng)上曾有許多朋友問我怎么根據(jù)文件名終止指定進程,為什么使用函數(shù) TerminateProcess()不能直接終止指定進程。首先讓我們來看看函數(shù)TerminateProcess()的聲明吧:Bool TerminateProcess(HANDLE hPeocess,UINT uExitCode),其中第一個參數(shù)為進程句柄,而不是進程名稱(文件名)。那怎樣才能獲得指定進程的句柄呢?我們可以使用函數(shù)OpenProcess (),其原型為
DWORD dwDesiredAccess, // 訪問標(biāo)志
BOOL bInheritHandle, // 處理繼承的標(biāo)志
DWORD dwProcessId // 進程標(biāo)識號,即進程ID
);
最后一個參數(shù)就是該進程的ID,進程句柄和進程ID是兩回事,這時你可能很郁悶:怎么知道進程ID呢?方法當(dāng)然有啦!在Windows9X/2000/XP/2003中,微軟均提供了用來枚舉進程的ToolHelp API系列函數(shù)。先運用函數(shù)CreateToolhelp32Snapshot()取得快照句柄,然后使用Process32First()以及 Process32Next()枚舉當(dāng)前的進程。枚舉過程中會將每一個進程的信息存放到PROCESSENTRY32結(jié)構(gòu)中。 PROCESSENTRY32的原型為:
{
DWORD dwSize; // 結(jié)構(gòu)大小;
DWORD cntUsage; // 此進程的引用計數(shù);
DWORD th32ProcessID; // 進程ID;
DWORD th32DefaultHeapID; // 進程默認(rèn)堆ID;
DWORD th32ModuleID; // 進程模塊ID;
DWORD cntThreads; // 此進程開啟的線程計數(shù);
DWORD th32ParentProcessID; // 父進程ID;
LONG pcPriClassBase; // 線程優(yōu)先權(quán);
DWORD dwFlags; // 保留;
char szExeFile[MAX_PATH]; // 進程全名;
} PROCESSENTRY32;
其中th32ProcessID就是進程的ID,szExeFile為該進程的文件名。所以要終止指定進程,我們可以枚舉進程,逐一判斷szExeFile是否和我們欲終止的進程名相同,如果相同就取其th32ProcessID參數(shù),然后代入OpenProcess函數(shù),取得目標(biāo)進程的句柄。這樣就可以利用函數(shù)TerminateProcess()終止該進程了。我寫了個終止指定進程的函數(shù),如下:
{
PROCESSENTRY32 pe;//定義一個PROCESSENTRY32結(jié)類型的變量
HANDLE hShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);// 創(chuàng)建快照句柄
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()主函數(shù)里調(diào)用函數(shù)KillProcessFromName(),把參數(shù)設(shè)為你要終止的進程的名稱即可,Win9X則需包括路徑。還有一點值得注意一下,就是別忘了#include 。
二、刪除文件
這一步驟很簡單,調(diào)用函數(shù)DeleteFile()即可,Bool DeleteFile(LPCTSTR lpFilename),把lpFilename設(shè)要指向刪除的文件的文件名的指針即可,可包含具體路徑。
三、修改注冊表,刪除啟動項及文件關(guān)聯(lián)
首先用函數(shù)RegOpenKeyEx()打開目標(biāo)主鍵,RegOpenKeyEx()函數(shù)原型為:
HKEY hKey,// 將要打開的鍵的句柄
LPCTSTR lpSubKey,// 指向?qū)⒁蜷_的包含子建的名稱字符串指針
DWORD ulOptions,// 為保留字,必須為NULL
REGSAM samDesired,// 訪問權(quán)限
PHKEY phkResult//指向打開鍵的句柄指針
);
獲得句柄后用函數(shù)RegSetValueEx()進行修改鍵值,函數(shù)原型為:
HKEY hKey, //當(dāng)前打開的鍵的句柄
LPCTSTR lpValueName, //指向非空的包含要查詢的值名稱的字符串指針
DWORD Reserved, //保留值,必須為NULL
DWORD dwType,//鍵值類型,比如REG_SZ、REG_DWORD等
CONST BYTE * lpData , //指向鍵值數(shù)據(jù)的指針,注意此變量類型,不是LPCTSTR!
DWORD cbData//指向保存設(shè)定值長度變量的指針,以字節(jié)為單位
);
當(dāng)然也可以用函數(shù)RegDeleteValue()來刪除鍵值。操作完畢后別忘了用函數(shù)RegCloseKey()來Close。
使用這些函數(shù)很簡單,只要把相應(yīng)的參數(shù)換為你要刪除或修改注冊表的相應(yīng)數(shù)值,唯一值得注意的是RegSetValueEx()函數(shù)中第5個參數(shù)的類型是BYTE而不是LPCTSTR!通過這些就可以很方便刪除指定啟動項以及恢復(fù)文件關(guān)聯(lián),為了便于大家理解,我舉個修復(fù)EXE文件關(guān)聯(lián)的例子,大家修改相應(yīng)的參數(shù)就可以適用其它鍵值的修改,換用RegDeleteValue函數(shù)就可以實現(xiàn)刪除自啟動項。
LPCTSTR data1="/"%1/" %*";//EXE文件默認(rèn)的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);
到這里,一個病毒專殺工具的模型就已初步完成了,大家自己編寫時只需把文中函數(shù)的形參換為你要殺的目標(biāo)病毒的相應(yīng)特征數(shù)據(jù)編譯即可。這個是個簡單的專殺工具,只能對付普通的木馬、蠕蟲等病毒,大家應(yīng)具體情況具體分析,根據(jù)具體情況擴充該程序功能,比如有些木馬是通過修改win.ini、system.ini來實現(xiàn)自動運行,我們就需操作文件刪除相應(yīng)數(shù)據(jù),除此之外,有時還需添加終止服務(wù)、卸載DLL模塊、進入RING0操作等功能??傊?,我相信大家一定能自己寫出病毒木馬專殺工具的!呵呵,是不是很有成就感呢!
希望本文所述對大家的VC程序設(shè)計有所幫助。
- linux服務(wù)器被植入ddgs、qW3xT.2挖礦病毒的處理實戰(zhàn)記錄
- 通過批處理關(guān)閉135 137 445等端口的實現(xiàn)代碼(勒索病毒)
- 對一個vbs腳本病毒的病毒原理分析
- php網(wǎng)頁病毒清除類
- 利用DOS命令來對抗U盤病毒保護U盤數(shù)據(jù)
- 自制殺u盤病毒的批處理代碼
- c病毒程序原理分析(防范病毒 c語言小病毒示例)
- 解析:清除SQL被注入惡意病毒代碼的語句
- Autorun 病毒清除工具bat代碼
- VBS.Runauto腳本病毒分析篇
- 一段病毒常用的VBS代碼
- 記事本U盤病毒 Notepad.exe查殺方法
- 美女游戲病毒iwbkvd.exe查殺方法
- 批處理 Autorun 病毒清除工具
- Rootkit病毒的解決辦法
相關(guān)文章
C++圖論之Bellman-Ford算法和SPFA算法的實現(xiàn)
貝爾曼-福特算法(Bellman-Ford)是由理查德·貝爾曼和萊斯特·福特創(chuàng)立的,求解單源最短路徑問題的一種算法。SPFA 算法是 Bellman-Ford算法 的隊列優(yōu)化算法的別稱,通常用于求含負(fù)權(quán)邊的單源最短路徑。本文將詳解兩個算法的實現(xiàn),需要的可以參考一下2022-06-06仿現(xiàn)代C++智能指針實現(xiàn)引用計數(shù)
這篇文章主要為大家詳細(xì)介紹了如何仿現(xiàn)代C++智能指針實現(xiàn)引用計數(shù),文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以了解下2024-03-03C/C++中接收return返回來的數(shù)組元素方法示例
return是C++預(yù)定義的語句,它提供了種植函數(shù)執(zhí)行的一種放大,最近學(xué)習(xí)中遇到了相關(guān)return的內(nèi)容,覺著有必要總結(jié)一下,這篇文章主要給大家介紹了關(guān)于C/C++中如何接收return返回來的數(shù)組元素的相關(guān)資料,需要的朋友可以參考下。2017-12-12Matlab計算變異函數(shù)并繪制經(jīng)驗半方差圖詳解
這篇文章主要為大家詳細(xì)介紹了基于MATLAB求取空間數(shù)據(jù)的變異函數(shù),并繪制經(jīng)驗半方差圖的方法。文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-04-04