前几天电脑中了威金病毒,专门感染EXE文件,就连杀毒软件也中招。 于是决定自己写个程序清除这些病毒。 以下是编程思路和源码,特拿出与大家共享一下
Clear.java
这是一个主类,主要是负责运行程序和参数检查,不是核心
import java.io.*;
public class Clear{
public static void main(String[] args){
try {
ClearLogo1 clearLogo=new ClearLogo1();
if(clearLogo.OSHasViru()){
clearLogo.killViru();
}
if(args.length!=0){
if(args[0].equals("/c")){//检查当前目录下的EXE文件
clearLogo.dir();
}else if(args[0].equals("/a")){//检查所有盘下的EXE文件
clearLogo.dirAll();
}else if(args[0].equals("/k")){//检查指定目录下的EXE文件
if(args[1]==null&&args[1].equals("")){
System.out.println ("需要参数!");
}else{
clearLogo.dirFile(new File(args[1]));
}
}
}else{
clearLogo.dir(); //默认检查当前目录下的EXE文件
}
}catch (Exception ex) {
ex.printStackTrace();
}
}
}
ClearLogo1.java
这个类主要是用来遍历文件、检查EXE文件是否中毒
import java.io.*;
/**
*
*
Title:
Description:
Copyright: Copyright (c) 2007
Company:
/**
* 重载hasViru方法
* @param file String
* @return boolean
* @throws Exception
*/
public boolean hasViru(String file)throws Exception{
return hasViru(new File(file));
}
/**
*检查文件是否被感染
* @param file File
* @return boolean
*/
public boolean hasViru(File file){
boolean boo=false;
try {
RandomAccessFile raf=new RandomAccessFile(file,"r");
if(raf.length()>len){
char one = (char) raf.readByte();
char two = (char) raf.readByte();
raf.seek(len);
char lenone = (char) raf.readByte();
char lentwo = (char) raf.readByte();
//判断该文件是否存在两个MZ标志
if(one==lenone&&two==lentwo&&one=='M'&&lenone=='M'&&two=='Z'&&lentwo=='Z'){
//如果该文件存在两个MZ标志,检查文件的内容是否是病毒
boo=hasViruCode(raf);
raf.seek(0);
}
}
raf.close();
}catch (Exception ex) {
Debug.info(file.getAbsolutePath()+" Kill Viru Fail!");
boo=false;
}
return boo;
}
/**
* 获取病毒文件的大小
* @return long
* @throws Exception
*/
private long viruLen() throws Exception {
File file = new File(windir + "file://Logo1_.exe/");
return file.length();
}
/**
* 检查文件内容是否是病毒内容
* @param file RandomAccessFile
* @return boolean
* @throws Exception
*/
public boolean hasViruCode(RandomAccessFile file)throws Exception{
byte[] fileCode=new byte[100];
boolean boo=false;
file.seek(0);
file.read(fileCode);
int i;
//比较文件的前100个字节是否与病毒的前100个字节相同
for (i=0; i<100; i++){
if(viruCode[i]!=fileCode[i]){
break;
}
}
if(i==100){
boo=true;
} else {
boo=false;
}
return boo;
}
}
ClearThread.java
这个是清除文件中病毒的线程
import java.io.*;
/**
*
*
Title:
Description: 清除文件内病毒体的线程
Copyright: Copyright (c) 2007
Company:
raf.close();
rafbak.close();
//3、把原文件删除
if (file.delete()) {
//4、把bak文件改名为原文件
boo = filebak.renameTo(file);
}
}catch (Exception ex) {
boo=false;
}
String info;
if(boo){
info=file.getAbsolutePath()+" Kill Viru Success!";
}else{
info=file.getAbsolutePath()+" Kill Viru Fails!";
}
System.out.println (info);
//输出日志到日志文件
Debug.info(info);
return boo;
}
}
还有一个Debug.java类,用来将杀毒信息写入日志文件,很简单。这里就不贴出来啦。
logo.lib病毒库文件,这里就没办法贴出来了。
用法:运行cmd
//检查当前目录下的EXE文件
logo.exe /c
//检查所有分区下的EXE文件
logo.exe /a
//检查指定目录下的EXE文件
logo.exe /k C:\Program Files
感觉实现清除病毒的方法有点牵强,哪位高手有更好的方法,贴出来一块研究研究。
如果在这个程序上加上结束病毒进程和清理注册表功能,就可以算是一个威金专杀工具啦
有兴趣的朋友可以完善一下啊。
↑返回目录
前一篇: JAVA6学习文集2.0
后一篇: 从Coding Fan到真正的技术专家.htm