|
为了下面的调用方便,我们先写两个独立的函数分别判断文件是否存在和删除文件,见下: bool __fastcall TMainForm::ScanFile(char buffer[MAX_PATH]) { //查找文件是否存在,参数为文件的完整路径名 FILE *fp; fp=fopen(buffer,"rb"); if(fp==NULL) { return false; } StateMemo->Lines->Add("发现可疑文件"+String(buffer)); fclose(fp); return true; }
bool __fastcall TMainForm::DeleteVirusFile(char buffer[MAX_PATH]) { //根据完整文件名删除文件 bool result=false; FileSetAttr(buffer,~faReadOnly); result = DeleteFile(buffer); if(result==true) { StateMemo->Lines->Add("可疑文件"+String(buffer)+"成功被清除!"); return true; } StateMemo->Lines->Add("可疑文件"+String(buffer)+"清除失败!"); return false; } 下面将会频繁地调用这两个函数,我们的重点在于快速查杀,通常情况下这样就足够了。请看代码: if(ConfigRadioGroup->ItemIndex==0) //快速扫描 { char filename[MAX_PATH]; //保存文件名 char filepath[MAX_PATH]; //保存文件路径 DWORD dwSize=MAX_PATH+1;
GetWindowsDirectory(filepath,dwSize); sprintf(filename,"%s\\algsrvs.exe",filepath); //搜索Windows目录 if(ScanFile(filename)==true) { DeleteVirusFile(filename); } sprintf(filename,"%s\\msfun80.exe",filepath); if(ScanFile(filename)==true) { DeleteVirusFile(filename); } sprintf(filename,"%s\\msime82.exe",filepath); if(ScanFile(filename)==true) { DeleteVirusFile(filename); } sprintf(filename,"%s\\ufdata2000.log",filepath); if(ScanFile(filename)==true) { DeleteVirusFile(filename); } sprintf(filename,"%s\\fun.xls.exe",filepath); if(ScanFile(filename)==true) { DeleteVirusFile(filename); } //下面都一样,就不浪费版面空间了,呵呵,仅给出路径代码 sprintf(filename,"%s\\system\\algsrvs.exe",filepath); //搜索system目录 GetSystemDirectory(filepath,dwSize); sprintf(filename,"%s\\algsrvs.exe",filepath); //搜索system32目录 } 这样就是快速扫描的代码了,至于深度扫描其实是不停地递归遍历全盘,找到可疑文件就进行删除,主要就是利用FindFirstFile()和 FindNextFile()这两个函数,每找到一个文件就判断,如果是文件则判断是否符合要求,如果是目录就进入继续递归。这个代码网上非常多,就不浪费版面空间了。 然后是搜索注册表中的相关键值,关于注册表的使用其实也很简单,我没使用API函数,因为VCL提供了一个封装好的类TRegister,使用起来非常方便,方法大致如下: TRegistry *Reg=new TRegistry; try { Reg->RootKey=HKEY_LOCAL_MACHINE; Reg->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run",true); Reg->DeleteValue("这里写你要删除的值"); //如果想新建一个项则可以使用OpenKey()打开,不存在的话它就会自动创建。 } __finally { delete Reg; } 在使用前记得包含头文件#include <Registry.hpp>。 OK,注册表清理过程大概就是这样了,由于这个程序加入的注册表项比较多,我杀毒的时候使用的是手工查找,不停地按F3同样很快就把有关项清理干净了,但问题是不可能把每一项的位置记录下来,所以这里只能给出删除的方法,不太完整的一点,算遗憾吧。 最后清理各分区根目录下的病毒文件,这个就非常简单了,请参考上面扫描U盘的代码,这里还更简单点。下面是内核代码: for(szDriveName[0]='C';szDriveName[0]<'Z';szDriveName[0]++) { //从C到Z遍历硬盘 //使用GetDriveType判断是否为固定磁盘 if(GetDriveType(szDriveName)==3) //固定磁盘 { //这里加入判断是否有病毒文件存在和删除其的代码 //通常只用检查根目录,所以很简单,就不多说了 char buffer[MAX_PATH]; sprintf(buffer,"%s:\\Autorun.inf",szDriveName[0]); ScanFile(buffer); DeleteVirusFile(buffer); } } 这样一个简单但又比较完整的病毒专杀程序就完工了,当然要想拿得出手我们还得花很多努力更好地完善,比如程序的容错处理,代码的优化,界面友好度等等。 上一页 [1] [2] |