自己利用BCB写病毒专杀

[ 来源:http://www.91now.com/down/ | 作者: | 时间:2007-12-12 | 浏览: 人次 ]

来源:灰狐's Blog

注:本文已发表在2007年《黑客防线》第11期,转载请注明出处!

话说某天晚上,小菜我写代码写的煞是心烦,刚想放松一会儿,任务栏里的企鹅图标就不停地叫了起来,MM求救:电脑中毒了。
她的卡巴已经查到了病毒,但没有杀掉。根据扫描提示,很快在百度上找到了答案,司机报警的文件名为algsrvs.exe,经查得知是fun.xls.exe病毒,tel.xls.exe的变种之一。网上给出了一个比较完整的查杀方法,主要症状如下:
1、在“我的电脑”中双击任意驱动器时,会在新窗口中打开此驱动器;
2、不能显示隐藏文件;
3、右击任一驱动器时,在快捷菜单中的第一项显有“Auto”命令;
查杀方法:
第一步:在“任务管理器”中结束“Excel”程序(也就是algsrvs.exe进程);
第二步:删除如下四个文件:
C:\Windows\ufdata2000.log
C:\Windows\System32\algsrvs.exe
C:\Windows\System32\msfun80.exe
C:\Windows\System32\msime82.exe
第三步:在注册表在搜索“fun.xls.exe”项值,然后一一删除;
第四步:打开注册表,找到如下项
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\
Explorer\Advanced\Folder\Hidden\SHOWALL,将“CheckedValue”项删除,然后新建 一个同名的DWORD值项,设其值为“1”;
第五步:在“文件夹选项”在中选择“显示所有文件和文件夹”,取消“隐藏受保护的操作系统 文件(推荐)”的选择;
第六步:打开“我的电脑”,逐一删除各驱动器下名为“AUTORUN.EXE”和“fun.xls.exe”的这两个文件(注意,一定不能用双击打开,右击各驱动器选择“打开”命令来打开);最后重新启动计算机就大功告成了!
上面的方法讲的很详细,我根据这些提示一步步地很快就搞定了,也没什么麻烦的。不过最后她说了句:“这是实验室的电脑,我U盘上的病毒估计还在,回去把自己电脑感染下自己学习学习。”
当即晕倒,万一没搞定我岂不得累死?因为根据她的说法:她寝室同学都在用她的U盘......这可不是开玩笑的,跟女生讲电脑真的累死人......。
二话不说,立马拖出咱的RAD利器:C++ Builder 6.0,弄一个简单的专杀工具。
界面就没必要做那么复杂了,先放一个RadioGroup控件,将其Items属性改为:快速查杀、深度扫描、仅扫描U盘,Name属性改为 ConfigRadioGroup;然后添加一个Button控件,Caption属性改为:查杀;最后再加上一个Memo控件,Name属性改为 StateMemo,用来显示扫描的状态进度。
双击Button控件,进入代码编辑:
StateMemo->Clear();
if(ConfigRadioGroup->ItemIndex==2) //仅扫描U盘,因为这个比较简单
{
char filepath[MAX_PATH];
char USB='A'; //保存U盘盘符
char szDriveName[4]={0};
wsprintf(szDriveName,"C:\0");
for(szDriveName[0]='C';szDriveName[0]<'Z';szDriveName[0]++)
{ //从C到Z遍历硬盘
//使用GetDriveType判断是否为可移动磁盘
if(GetDriveType(szDriveName)==DRIVE_REMOVABLE)
{
USB=szDriveName[0]; //将U盘盘符赋给变量USB
StateMemo->Lines->Add("找到U盘"+AnsiString(USB));
sprintf(filepath,"%c:\\autorun.inf",USB); //构造完整文件名
//其实这里可以不用这么麻烦的,因为这个文件只会存在于U盘的根目录下
WIN32_FIND_DATA wfd;
HANDLE hFind = FindFirstFile(filepath, &wfd);
if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{ //此路径是个文件夹
StateMemo->Lines->Add("该U盘已经经过免疫,无需查杀!");
}
else
{ //此文件存在,通常可能为不正常文件
StateMemo->Lines->Add("发现可疑文件autorun.inf");
FileSetAttr(filepath,~faReadOnly); //去掉其只读属性
DeleteFile(filepath); //删除
StateMemo->Lines->Add("已删除可疑文件autorun.inf");
}
FindClose(hFind);
}
}
if(USB=='A') //如果此值没改变说明没有发现U盘
{
StateMemo->Lines->Add("没有发现可移动磁盘!");
}
return;
}
扫描U盘的代码就算完工了,下面我们开始写扫描硬盘的代码,首先当然是要查杀病毒进程,见以下代码:
int count=0; //可疑进程数量
//创建当前进程快照
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
StateMemo->Lines->Add("创建进程快照失败!");
}
PROCESSENTRY32 processEntry={0};
processEntry dwSize=sizeof(PROCESSENTRY32);
//开始遍历进程快照
bool bRet=Process32First(hProcessSnap,&processEntry);
while(bRet) //如果返回不为空就继续执行循环
{ //ExtraceFileName是提取出纯文件名,去掉路径
if(ExtractFileName(processEntry.szExeFile)=="algsrvs.exe")
{
StateMemo->Lines->Add("发现可疑进程algsrvs.exe!");
//根据进程PID以完全权限打开此进程,然后强制终止
HANDLE hVirus = OpenProcess(PROCESS_ALL_ACCESS,false,processEntry.th32ProcessID);
TerminateProcess(hVirus,0);
CloseHandle(hVirus);
StateMemo->Lines->Add("可疑进程已经被结束!");
count++; //可疑进程数量加1
}
bRet=Process32Next(hProcessSnap,&processEntry);
}
CloseHandle(hProcessSnap);
if(count==0) //没找到可疑进程
{
StateMemo->Lines->Add("没有发现可疑进程!");
}
上面这段是非常经典的遍历进程的代码,大家务必要理解哦,以后想查找其他进程的话只要把其中的进程名改一下就OK了,hoho~~~。
下面开始查杀系统中存在的病毒文件,通常情况下病毒文件的分布都是有规律的,一般在系统文件夹和各个分区的根目录下,所以我们不需要进行全盘扫描,因为如果你的硬盘中的文件很多的话这可是一件相当痛苦的事情。但我们根据文件名来打开文件,通过其返回值判断文件是否存在,而没有做杀毒软件通常的查找特征码的操作,所以速度会提升不少。

上一篇:

下一篇:BCB快速打造多线程端口扫描器

广告位