设为首页 | 收藏本站
首页>IT学院>黑客防线>正文
杀毒我做主:病毒专杀工具自己编
WWW.DBIT.CN 2006-8-30 9:34:07 热度:
 

如今病毒木马蠕虫层出不穷,变种也是一个接一个。反病毒公司以及各大安全公司随着影响很大的病毒的出现都会免费提供病毒专杀工具,这个举措对普通用户来说确实很有帮助。其实写病毒专杀工具也不像大家想象的那么神秘,利用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
}

本新闻共2页,当前在第1页  1  2  

 
上一篇:再见了网络一个中国黑客的心声
下一篇:高手出招:从病毒命名识别病毒
打印】【关闭
  相关文章:
·恶意网页病毒症状分析及简单修复方·只防病毒并不安全 安全攻略全解
·详细了解进程和病毒的相关十七点安·关于病毒命名规则的说明
·services.exe进程病毒·My123出现6个变种流氓软件彻底变病
·小心手机病毒“战神之子”·综合方法解决防制ARP欺骗问题
·给你预防病毒的八个忠告·RavMonE病毒剿灭记
·近期电脑病毒三最 高危病毒变种成·黑客攻破Google服务器 通过中国网
·恢复威金病毒感染的EXE文件小方法·巧用系统控制台删除死顽固病毒
·如何捕获电脑病毒样本·必须掌握的防病毒知识
☆联姻学院☆

保养电脑的26个窍门
文件夹删除不掉怎么办?
教你如何用手工迅速剿灭QQ广告
“熊猫烧香”病毒的病毒描述和
在Excel中只打印图表以外区域
Excel中只选中包含文本的单元
Windows XP操作系统的几个实用
用XP系统自带网络诊断程序解决
风雨雷电→自然现象动画实战技
Flash遮罩特效之百叶窗效果
十二个Dreamweaver鲜为人知的
如何用 Dreamweaver 批量做we
JavaScript的系统函数学习
Java之父:关于Java我也有遗憾
排除网上邻居使用4大常见麻烦
解除上网限制IP和MAC捆绑的破