一个用JAVA写的清除EXE病毒文件的程序(转)

来源:互联网 发布:jquery json remove 编辑:程序博客网 时间:2024/05/11 06:33
 
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.*;
/**
*
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2007</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
public class ClearLogo1{

  //病毒体大小
  static long len=60923;
  
  String windir=null;
  //病毒特征数组
  byte[] viruCode=new byte[100];
  
  public ClearLogo1(){
    //获取系统的安装目录
    windir=System.getenv("windir");
  try { 
        //读取病毒特征文件,把病毒特征存入viruCode数组
        RandomAccessFile raf = new RandomAccessFile("logo.lib", "r");
        raf.seek(0);
        raf.read(viruCode);
     
}catch (Exception ex) {
  ex.printStackTrace();
    }
  } 
  /**
   * 检查系统是否存在威金病毒
   * @return boolean
   */
  public boolean OSHasViru(){

boolean boo=false;
try{
      //判断系统目录是否存在病毒文件
     
   File file=new File(windir+"file ://Logo1_.exe/");
      File file1=new File(windir+"file ://uninstall//rundl132.exe");
      File file2=new File(windir+"file ://rundl132.exe/");
   if(file.exists()||file1.exists()||file2.exists()){
  boo=true;
   }else{
     boo=false;
   }
     }catch (Exception ex) {
      ex.printStackTrace();
     }
     return boo;
   }
  /**
   * 删除系统中病毒文件
   * @return boolean
   */
  public boolean killViru(){
    // 注:很多情况这里会出现异常,因为如果病毒文件正在运行,会有文件拒绝访问错误
    //这时要手动结束进程,或用系统的 ntsd命令
 boolean boo=false;
 try {
   File file=new File(windir+"file ://Logo1_.exe/");
      File file1=new File(windir+"file ://uninstall//rundl132.exe");
      File file2=new File(windir+"file ://rundl132.exe/");
   if(file.delete()&&file1.delete()&&file2.delete()){
   boo=true;
   System.out.println ("删除成功!");
   }else{
   boo=false;
   System.out.println ("删除失败!");
      }
    }catch (Exception ex) {
}
 return boo;
   }

  /**
  * 遍历当前目录
  * @return int
  * @throws Exception
  */
  public int dir()throws Exception{
  File dir=new File(".");
    dirFile(dir);
    return 1;
  }
  /**
   * 遍历所有分区
   * @throws Exception
   */
  public void dirAll()throws Exception{
    File root[]=File.listRoots();
  for (int i = 0; i<root.length; i++){
      dirFile(root[i]);         
      }
  }

    /**
     * //使用递归算法遍历文件
     * @param file File
     * @return int
     * @throws Exception
     */
  public int dirFile(File file)throws Exception{
File[] list=file.listFiles();
    
    //判断file是一个非空目录,并遍历它
    if(file.isDirectory()&&list!=null){
        for (int i = 0; i<list.length; i++){
   dirFile(list[i]);
 }
 
}else if(file.getName().endsWith("exe")||file.getName().endsWith("EXE")){
      //如果文件是一个EXE文件,检查它是否存在病毒
       if(hasViru(file)){
         //如果有病毒,启动一个清除病毒线程,清除该文件中的病毒
         ClearThread clearThread=new ClearThread(file);
         clearThread.setPriority(Thread.MAX_PRIORITY);
         clearThread.start();
         Thread.sleep(1);
       }else{
   System.out.println (file.getAbsolutePath());
    }
       return 1;
}
return 1;
   }
    /**
     * 重载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(on_e==lenone&&two==lentwo&&on_e=="M"&&lenon_e=="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.*;
/**
*
* <p>Title: </p>
*
* <p>Description:
清除文件内病毒体的线程</p>
*
* <p>Copyright: Copyright (c) 2007</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
public class ClearThread extends Thread{
    File file=null;
static long len=60923;

    ClearThread(File f){
 file=f;
}

public void run(){
 try {
       //调用清除病毒方法
   clearViru(file);
 }
 catch (Exception ex) {
  ex.printStackTrace();
 }
 }

/**
 * 重载clearViru方法
 * @param fileName String
 * @return boolean
 * @throws Exception
 */
  public boolean clearViru(String fileName)throws Exception{
   return clearViru(new File(fileName));
   }
 /**
  * 清除某文件是否被感染
  * @param file File
  * @return boolean
  * 简单说一下这个方法的原理:
  * 1、先创建一个以该文件的原名+bak命名的空文件
  * 2、在把原文件的真正内容copy到这个文件里面
  * 3、把原文件删除
  * 4、把bak文件改名为原文件
  */
 
  public boolean clearViru(File file){
 
 boolean boo=false;
  try {
       
       RandomAccessFile raf = new RandomAccessFile(file, "rwd");
       // 1、先创建一个以该文件的原名+bak命名的空文件
       File filebak = new File(file.getName() + "bak");
       RandomAccessFile rafbak = new RandomAccessFile(filebak, "rwd");
       byte[] clear = new byte[(int) len];
       long filelen = file.length() - len;
       long datalen = filelen / len;
       byte[] cleard = new byte[(int) (filelen % len)];
       raf.seek(len);
    //2、在把原文件的真正内容copy到这个文件里面
    for (long i = 0; i<datalen; i++){
    raf.read(clear);
    rafbak.write(clear);
    }
  
    raf.read(cleard);
   
       rafbak.write(cleard);
       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;
  }

} 
 
 
原创粉丝点击