通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
文章搜索:
热门搜索:红客 黑鹰 红客技术 安全动画 红客培训
首页 文章 软件 动画 资源 励志 论坛 邮箱 会员 军事 科技 博客 爱心红客 最近更新 800g资源
 业内新闻 漏洞公告 病毒公告 电脑知识 网络知识 菜鸟入门 攻防教程 黑客攻防 安全编程 工具使用 综合安全 个人安全 安全相关 Q Q安全 原创精华 红客人物 站内事件
您现在的位置: 爱国者安全网 >> 文章类 >> 红客教程 >> 网络编程 >> 文章正文
自己利用BCB写病毒专杀
责任编辑:酷酷の鱼   更新日期:2007-12-12
 


为了下面的调用方便,我们先写两个独立的函数分别判断文件是否存在和删除文件,见下:
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] 

  • 上一篇文章:
  • 下一篇文章:
  • 最近更新
    固顶文章 爱国者安全网2007年度优秀版主评选
    普通文章 瑞星公司01月11日发布 每日计算机病毒及木马播报
    普通文章 破解博彩神助(专注彩票) V2.8.01
    推荐文章 推荐:跨站脚本执行漏洞代码的六点思路
    普通文章 Windows系统下的远程堆栈溢出 实战篇
    普通文章 Windows系统下的远程堆栈溢出 原理篇
    普通文章 MsSQLServer是如何加密口令的
    普通文章 浅谈国内的渗透评估过程
    普通文章 Dvbbs8.1 0DAY(通杀Access和mssql版本)
    普通文章 微软:我们的代码比赛门铁克更安全
    热门文章
    普通文章REAL蛀虫利用播放器漏洞下载恶意程序
    普通文章李彦宏:中国要在互联网领域逐渐超越美国
    普通文章马云:阿里巴巴的成功是一个生态链的成功
    普通文章Ingres用户认证非授权访问漏洞
    普通文章TCPreen FD_SET()函数远程栈溢出漏洞
    普通文章Winace UUE文件解压堆溢出漏洞
    普通文章Pclxav木马猎手第一代特征码引擎源代码
    普通文章IE收藏夹管理小精灵算法分析
    普通文章Extra Drive Pro算法分析历程
    普通文章雨过天晴自我注册
    精彩专题