程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> VC完成的病毒專殺對象完全實例

VC完成的病毒專殺對象完全實例

編輯:關於C++

VC完成的病毒專殺對象完全實例。本站提示廣大學習愛好者:(VC完成的病毒專殺對象完全實例)文章只能為提供參考,不一定能成為您想要的結果。以下是VC完成的病毒專殺對象完全實例正文


本文實例講述了VC完成的病毒專殺對象的辦法。異常適用,分享給年夜家供年夜家參考。詳細完成辦法以下:

現在病毒木馬蠕蟲層見疊出,變種也是一個接一個。反病毒公司和各年夜平安公司跟著影響很年夜的病毒的湧現都邑收費供給病毒專殺對象,這個舉動對通俗用戶來講確切很有贊助。其實寫病毒專殺對象也不像年夜家想象的那末奧秘,應用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 。

2、刪除文件

這一步調很簡略,挪用函數DeleteFile()便可,Bool DeleteFile(LPCTSTR lpFilename),把lpFilename設要指向刪除的文件的文件名的指針便可,可包括詳細途徑。

3、修正注冊表,刪除啟動項及文件聯系關系

起首用函數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操作等功效。總之,我信任年夜家必定能本身寫出病毒木馬專殺對象的!呵呵,是否是很有造詣感呢!

願望本文所述對年夜家的VC法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved