欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

VC實(shí)現(xiàn)的病毒專(zhuān)殺工具完整實(shí)例

 更新時(shí)間:2014年10月24日 09:03:29   投稿:shichen2014  
這篇文章主要介紹了VC實(shí)現(xiàn)的病毒專(zhuān)殺工具完整實(shí)例,詳細(xì)講述了針對(duì)病毒的進(jìn)程終止、刪除文件及回復(fù)注冊(cè)表與啟動(dòng)項(xiàng)等,同時(shí)介紹了與之相關(guān)的系統(tǒng)函數(shù),非常具有參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了VC實(shí)現(xiàn)的病毒專(zhuān)殺工具的方法。非常實(shí)用,分享給大家供大家參考。具體實(shí)現(xiàn)方法如下:

如今病毒木馬蠕蟲(chóng)層出不窮,變種也是一個(gè)接一個(gè)。反病毒公司以及各大安全公司隨著影響很大的病毒的出現(xiàn)都會(huì)免費(fèi)提供病毒專(zhuān)殺工具,這個(gè)舉措對(duì)普通用戶(hù)來(lái)說(shuō)確實(shí)很有幫助。其實(shí)寫(xiě)病毒專(zhuān)殺工具也不像大家想象的那么神秘,利用SDK寫(xiě)個(gè)控制臺(tái)程序來(lái)實(shí)現(xiàn)病毒專(zhuān)殺,因無(wú)須寫(xiě)圖形界面,所以簡(jiǎn)便快捷!你自己也能寫(xiě)!不信?就接著看吧^_^ 廢話(huà)不說(shuō)了,接下來(lái)就開(kāi)始談?wù)劜《緦?zhuān)殺工具的思路及實(shí)現(xiàn)方法。

本文中講解的病毒專(zhuān)殺工具是針對(duì)木馬、蠕蟲(chóng)等獨(dú)立的程序而言的廣義的病毒而言,而不是指那種自我復(fù)制感染PE文件的依附于其他程序的那種狹義的病毒。因?yàn)閷?xiě)那種病毒的專(zhuān)殺工具需要PE文件結(jié)構(gòu)等知識(shí),相對(duì)而言有點(diǎn)難度,所以我們就先從相對(duì)簡(jiǎn)單點(diǎn)的開(kāi)始,難的以后再介紹。

對(duì)于大多數(shù)病毒而言,殺毒的思路其實(shí)很簡(jiǎn)單,那就是:終止病毒的進(jìn)程、刪除自啟動(dòng)項(xiàng)目(一般在注冊(cè)表中的run*主鍵下)、刪除病毒文件,對(duì)設(shè)置了文件關(guān)聯(lián)的病毒而言還要修改注冊(cè)表恢復(fù)文件關(guān)聯(lián)。下面將分別陳述。

一.終止進(jìn)程

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

復(fù)制代碼 代碼如下:
HANDLE OpenProcess(
DWORD dwDesiredAccess, // 訪(fǎng)問(wèn)標(biāo)志
BOOL bInheritHandle, // 處理繼承的標(biāo)志
DWORD dwProcessId // 進(jìn)程標(biāo)識(shí)號(hào),即進(jìn)程ID
);

最后一個(gè)參數(shù)就是該進(jìn)程的ID,進(jìn)程句柄和進(jìn)程ID是兩回事,這時(shí)你可能很郁悶:怎么知道進(jìn)程ID呢?方法當(dāng)然有啦!在Windows9X/2000/XP/2003中,微軟均提供了用來(lái)枚舉進(jìn)程的ToolHelp API系列函數(shù)。先運(yùn)用函數(shù)CreateToolhelp32Snapshot()取得快照句柄,然后使用Process32First()以及 Process32Next()枚舉當(dāng)前的進(jìn)程。枚舉過(guò)程中會(huì)將每一個(gè)進(jìn)程的信息存放到PROCESSENTRY32結(jié)構(gòu)中。 PROCESSENTRY32的原型為:
復(fù)制代碼 代碼如下:
typedef struct tagPROCESSENTRY32
{
DWORD dwSize; // 結(jié)構(gòu)大小;
DWORD cntUsage; // 此進(jìn)程的引用計(jì)數(shù);
DWORD th32ProcessID; // 進(jìn)程ID;
DWORD th32DefaultHeapID; // 進(jìn)程默認(rèn)堆ID;
DWORD th32ModuleID; // 進(jìn)程模塊ID;
DWORD cntThreads; // 此進(jìn)程開(kāi)啟的線(xiàn)程計(jì)數(shù);
DWORD th32ParentProcessID; // 父進(jìn)程ID;
LONG pcPriClassBase; // 線(xiàn)程優(yōu)先權(quán);
DWORD dwFlags; // 保留;
char szExeFile[MAX_PATH]; // 進(jìn)程全名;
} PROCESSENTRY32;

其中th32ProcessID就是進(jìn)程的ID,szExeFile為該進(jìn)程的文件名。所以要終止指定進(jìn)程,我們可以枚舉進(jìn)程,逐一判斷szExeFile是否和我們欲終止的進(jìn)程名相同,如果相同就取其th32ProcessID參數(shù),然后代入OpenProcess函數(shù),取得目標(biāo)進(jìn)程的句柄。這樣就可以利用函數(shù)TerminateProcess()終止該進(jìn)程了。我寫(xiě)了個(gè)終止指定進(jìn)程的函數(shù),如下:
復(fù)制代碼 代碼如下:
void KillProcessFromName(LPCTSTR name)//name為你要終止的進(jìn)程的名稱(chēng),Win9X則需包括路徑
{
PROCESSENTRY32 pe;//定義一個(gè)PROCESSENTRY32結(jié)類(lèi)型的變量
HANDLE hShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);// 創(chuàng)建快照句柄
pe.dwSize=sizeof(PROCESSENTRY32);//一定要先為dwSize賦值
if (Process32First(hShot,&pe))
{
do
{if (strcmp(pe.szExeFile,name)==0) //判斷此進(jìn)程是否為你要終止的進(jìn)程
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe.th32ProcessID);//如果是就利用其ID獲得句柄
TerminateProcess(hProcess,0);//終止該進(jìn)程
}
while(Process32Next(hkz,&pe));
}
CloseHandle(hShot);//最后別忘記Close
}

在使用時(shí)只要在main()主函數(shù)里調(diào)用函數(shù)KillProcessFromName(),把參數(shù)設(shè)為你要終止的進(jìn)程的名稱(chēng)即可,Win9X則需包括路徑。還有一點(diǎn)值得注意一下,就是別忘了#include 。

二、刪除文件

這一步驟很簡(jiǎn)單,調(diào)用函數(shù)DeleteFile()即可,Bool DeleteFile(LPCTSTR lpFilename),把lpFilename設(shè)要指向刪除的文件的文件名的指針即可,可包含具體路徑。

三、修改注冊(cè)表,刪除啟動(dòng)項(xiàng)及文件關(guān)聯(lián)

首先用函數(shù)RegOpenKeyEx()打開(kāi)目標(biāo)主鍵,RegOpenKeyEx()函數(shù)原型為:

復(fù)制代碼 代碼如下:
LONG RegOpenKeyEx(
HKEY hKey,// 將要打開(kāi)的鍵的句柄
LPCTSTR lpSubKey,// 指向?qū)⒁蜷_(kāi)的包含子建的名稱(chēng)字符串指針
DWORD ulOptions,// 為保留字,必須為NULL
REGSAM samDesired,// 訪(fǎng)問(wèn)權(quán)限
PHKEY phkResult//指向打開(kāi)鍵的句柄指針
);

獲得句柄后用函數(shù)RegSetValueEx()進(jìn)行修改鍵值,函數(shù)原型為:
復(fù)制代碼 代碼如下:
LONG RegSetValueEx(
HKEY hKey, //當(dāng)前打開(kāi)的鍵的句柄
LPCTSTR lpValueName, //指向非空的包含要查詢(xún)的值名稱(chēng)的字符串指針
DWORD Reserved, //保留值,必須為NULL
DWORD dwType,//鍵值類(lèi)型,比如REG_SZ、REG_DWORD等
CONST BYTE * lpData , //指向鍵值數(shù)據(jù)的指針,注意此變量類(lèi)型,不是LPCTSTR!
DWORD cbData//指向保存設(shè)定值長(zhǎng)度變量的指針,以字節(jié)為單位
);

當(dāng)然也可以用函數(shù)RegDeleteValue()來(lái)刪除鍵值。操作完畢后別忘了用函數(shù)RegCloseKey()來(lái)Close。

使用這些函數(shù)很簡(jiǎn)單,只要把相應(yīng)的參數(shù)換為你要?jiǎng)h除或修改注冊(cè)表的相應(yīng)數(shù)值,唯一值得注意的是RegSetValueEx()函數(shù)中第5個(gè)參數(shù)的類(lèi)型是BYTE而不是LPCTSTR!通過(guò)這些就可以很方便刪除指定啟動(dòng)項(xiàng)以及恢復(fù)文件關(guān)聯(lián),為了便于大家理解,我舉個(gè)修復(fù)EXE文件關(guān)聯(lián)的例子,大家修改相應(yīng)的參數(shù)就可以適用其它鍵值的修改,換用RegDeleteValue函數(shù)就可以實(shí)現(xiàn)刪除自啟動(dòng)項(xiàng)。

復(fù)制代碼 代碼如下:
HKEY hKey;
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);

到這里,一個(gè)病毒專(zhuān)殺工具的模型就已初步完成了,大家自己編寫(xiě)時(shí)只需把文中函數(shù)的形參換為你要?dú)⒌哪繕?biāo)病毒的相應(yīng)特征數(shù)據(jù)編譯即可。這個(gè)是個(gè)簡(jiǎn)單的專(zhuān)殺工具,只能對(duì)付普通的木馬、蠕蟲(chóng)等病毒,大家應(yīng)具體情況具體分析,根據(jù)具體情況擴(kuò)充該程序功能,比如有些木馬是通過(guò)修改win.ini、system.ini來(lái)實(shí)現(xiàn)自動(dòng)運(yùn)行,我們就需操作文件刪除相應(yīng)數(shù)據(jù),除此之外,有時(shí)還需添加終止服務(wù)、卸載DLL模塊、進(jìn)入RING0操作等功能。總之,我相信大家一定能自己寫(xiě)出病毒木馬專(zhuān)殺工具的!呵呵,是不是很有成就感呢!

希望本文所述對(duì)大家的VC程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • C++空類(lèi)及沒(méi)有成員變量的類(lèi)的大小實(shí)例分析

    C++空類(lèi)及沒(méi)有成員變量的類(lèi)的大小實(shí)例分析

    這篇文章主要介紹了C++空類(lèi)及沒(méi)有成員變量的類(lèi)的大小,對(duì)于初學(xué)者更好的了解C++的指針及類(lèi)的存儲(chǔ)結(jié)構(gòu)很有幫助,需要的朋友可以參考下
    2014-07-07
  • C++實(shí)現(xiàn)病人就醫(yī)管理系統(tǒng)

    C++實(shí)現(xiàn)病人就醫(yī)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++語(yǔ)言實(shí)現(xiàn)病人就醫(yī)管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C指針原理教程之C內(nèi)嵌匯編

    C指針原理教程之C內(nèi)嵌匯編

    在學(xué)習(xí) C 語(yǔ)言?xún)?nèi)嵌匯編的實(shí)驗(yàn)過(guò)程中,發(fā)現(xiàn)內(nèi)嵌匯編極容易造成段錯(cuò)誤。
    2019-02-02
  • C語(yǔ)言程序設(shè)計(jì)之指針的應(yīng)用詳解

    C語(yǔ)言程序設(shè)計(jì)之指針的應(yīng)用詳解

    為了讓大家能夠更準(zhǔn)確的了解C語(yǔ)言中指針的使用,本文為大家準(zhǔn)備了四個(gè)指針相關(guān)的例題,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下
    2022-11-11
  • C語(yǔ)言代碼實(shí)現(xiàn)通訊錄管理系統(tǒng)

    C語(yǔ)言代碼實(shí)現(xiàn)通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言代碼實(shí)現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++圖論之Bellman-Ford算法和SPFA算法的實(shí)現(xiàn)

    C++圖論之Bellman-Ford算法和SPFA算法的實(shí)現(xiàn)

    貝爾曼-福特算法(Bellman-Ford)是由理查德·貝爾曼和萊斯特·福特創(chuàng)立的,求解單源最短路徑問(wèn)題的一種算法。SPFA 算法是 Bellman-Ford算法 的隊(duì)列優(yōu)化算法的別稱(chēng),通常用于求含負(fù)權(quán)邊的單源最短路徑。本文將詳解兩個(gè)算法的實(shí)現(xiàn),需要的可以參考一下
    2022-06-06
  • C++ 位圖及位圖的實(shí)現(xiàn)原理

    C++ 位圖及位圖的實(shí)現(xiàn)原理

    位圖實(shí)際上就是一個(gè)數(shù)組,因?yàn)閿?shù)組有隨機(jī)訪(fǎng)問(wèn)的功能,比較方便查找,這個(gè)數(shù)組一般是整形,今天通過(guò)本文給大家分享c++位圖的實(shí)現(xiàn)原理及實(shí)現(xiàn)代碼,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • 仿現(xiàn)代C++智能指針實(shí)現(xiàn)引用計(jì)數(shù)

    仿現(xiàn)代C++智能指針實(shí)現(xiàn)引用計(jì)數(shù)

    這篇文章主要為大家詳細(xì)介紹了如何仿現(xiàn)代C++智能指針實(shí)現(xiàn)引用計(jì)數(shù),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以了解下
    2024-03-03
  • C/C++中接收return返回來(lái)的數(shù)組元素方法示例

    C/C++中接收return返回來(lái)的數(shù)組元素方法示例

    return是C++預(yù)定義的語(yǔ)句,它提供了種植函數(shù)執(zhí)行的一種放大,最近學(xué)習(xí)中遇到了相關(guān)return的內(nèi)容,覺(jué)著有必要總結(jié)一下,這篇文章主要給大家介紹了關(guān)于C/C++中如何接收return返回來(lái)的數(shù)組元素的相關(guān)資料,需要的朋友可以參考下。
    2017-12-12
  • Matlab計(jì)算變異函數(shù)并繪制經(jīng)驗(yàn)半方差圖詳解

    Matlab計(jì)算變異函數(shù)并繪制經(jīng)驗(yàn)半方差圖詳解

    這篇文章主要為大家詳細(xì)介紹了基于MATLAB求取空間數(shù)據(jù)的變異函數(shù),并繪制經(jīng)驗(yàn)半方差圖的方法。文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2023-04-04

最新評(píng)論