青玄 发表于 2015-1-5 18:04:58

小白马卫士项目总结之手机杀毒

原理概述手机杀毒的话,其实就是通过PackageManager的管理者获得手机上面所有安装好的程序,然后在病毒库里面检测与当前程序是否与病毒库里面的程序匹配,如果匹配的话,那就有病毒,然后将其删除就行了!在这之前需要一个DAO来进行检查是否有病毒:package cn.cbd.mobilesafe.activity.db.dao;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class AntVirusDao {
      
    public static boolean isVirus(String md5)   
    {
      boolean bol=false;
      SQLiteDatabase db=SQLiteDatabase.openDatabase("/data/data/cn.cbd.mobilesafe.activity/files/antivirus.db", null,SQLiteDatabase.OPEN_READONLY);
      Cursor cursor=db.rawQuery("select * from datable where md5=?", new String[]{md5});
      while(cursor.moveToFirst())
      {
            bol=true;
      }
      cursor.close();
      db.close();
      return bol;
    }
}
然后就是加载界面的主要类了:
package cn.cbd.mobilesafe.activity;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;

import cn.cbd.mobilesafe.activity.db.dao.AntVirusDao;
import cn.cbd.mobilesafe.activity.util.MD5Util;

public class AntVirusActivity extends Activity {

    private ImageView iv_scan;
    private TextView tv_scan_stauts;
    private ProgressBar pb_scan_status;
    private LinearLayout ll_container;
    private PackageManager pm;
    private List<String> virusList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_kill_virus);
         
      virusList=new ArrayList<String>();
      tv_scan_stauts=(TextView) findViewById(R.id.tv_scan_stauts);
      pb_scan_status=(ProgressBar) findViewById(R.id.pb_scan_status);
      ll_container=(LinearLayout) findViewById(R.id.ll_container);
         
      iv_scan=(ImageView) findViewById(R.id.iv_scan);
      RotateAnimation animation=new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 1.0f, Animation.RELATIVE_TO_SELF, 1.0f);
      animation.setDuration(1000);
      animation.setRepeatCount(Animation.INFINITE);
      iv_scan.startAnimation(animation);
         
      new AsyncTask<Void, Object, Void>(){

            
            @Override
            protected void onPreExecute() {
                  
                tv_scan_stauts.setText("正在初始化八核扫描引擎...");
                super.onPreExecute();
            }
            
            @Override
            protected Void doInBackground(Void... params) {
                  
                try   
                {
                  Thread.sleep(1000);
                  pm=getPackageManager();
                  //通过包的管理者获得安装的程序集合
                  List<PackageInfo> packageInfos=pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_SIGNATURES);
                  pb_scan_status.setMax(packageInfos.size());//设置进度条的最大刻度
                  Log.i("aaa",""+packageInfos.size());
                  int total=0;
                  for(PackageInfo packageInfo : packageInfos)
                  {
                        //循环出每一个安装的程序
                        String signatures=packageInfo.signatures.toCharsString();
                        boolean isVirsus=AntVirusDao.isVirus(MD5Util.ecode(signatures));
                        //如果是病毒
                        if(isVirsus)
                        {
                            virusList.add(packageInfo.packageName);
                        }
                        Log.i("ccc",signatures);
                        total++;
                        pb_scan_status.setProgress(total);
                        publishProgress("正在扫描:"+packageInfo.applicationInfo.loadLabel(pm),packageInfo.applicationInfo,isVirsus);
                        Thread.sleep(200);
                  }
                }
                catch (Exception e) {
                  e.printStackTrace();
                }
                  
                  
                return null;
            }

            @Override
            protected void onPostExecute(Void result) {
                tv_scan_stauts.setText("全部扫描完毕!");
                iv_scan.clearAnimation();
                if(virusList.size()>0)//检测病毒列表是不是大于0的如果大于0就弹出来一个对话框
                {
                  AlertDialog.Builder builder=new Builder(AntVirusActivity.this);
                  builder.setTitle("警告");
                  builder.setMessage("发现病毒是否清理?");
                  builder.setPositiveButton("确定", new OnClickListener(){

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            for (String packname : virusList) {
                              Intent intent = new Intent();
                              intent.setAction(Intent.ACTION_DELETE);
                              intent.setData(Uri.parse("package:" + packname));
                              startActivity(intent);

                            }
                              
                        }
                        
                  });
                  builder.setNegativeButton("取消", new OnClickListener() {

                        public void onClick(DialogInterface dialog, int which) {
                            // TODO Auto-generated method stub

                        }
                  });
                  builder.create().show();
                     
                }
                super.onPostExecute(result);
            }

            @Override
            protected void onProgressUpdate(Object... values) {
                /**
               * 这里比较关键一些,这里的布局是这样的:
               *   <ScrollView
                        android:layout_width="fill_parent"
                        android:layout_height="fill_parent"
                        android:scrollbars="none">
               
                        <LinearLayout
                            android:id="@+id/ll_container"
                            android:layout_width="fill_parent"
                            android:layout_height="fill_parent"
                            android:orientation="vertical" >
                        </LinearLayout>
                  </ScrollView>
                  也就是说,列表显示的部分是一个ScrollView布局
               */
                  
                tv_scan_stauts.setText((String)values);
                ApplicationInfo applicationInfo=(ApplicationInfo) values;
                boolean isVirsus=(Boolean) values;
                View view=View.inflate(getApplicationContext(), R.layout.layout_cache_item, null);
                ImageView iv=(ImageView) view.findViewById(R.id.iv_cache);
                TextView tv_name=(TextView) view.findViewById(R.id.tv_cache);
                TextView tv_info=(TextView) view.findViewById(R.id.tv_cache_size);
                iv.setImageDrawable(applicationInfo.loadIcon(pm));
                tv_name.setText(applicationInfo.loadLabel(pm));
                if(isVirsus)
                {
                  tv_info.setTextColor(Color.RED);
                  tv_info.setText("发现病毒");
                }else{
                  tv_info.setText("扫描安全");
                }
                  
                ll_container.addView(view,0);
                super.onProgressUpdate(values);
            }
            
      }.execute();
      
    }
}


拈花小仙 发表于 2015-1-5 18:08:13

{:7_139:}强烈支持楼主哦~

拈花小仙 发表于 2015-1-5 18:10:33

@百日维新 @springwindyike @kklloo @Angel丶L @~风介~ @andalousie @chishubiao

~风介~ 发表于 2015-1-5 18:15:26

厉害呀!{:7_146:}

康小泡 发表于 2015-1-5 18:18:13

我想问一下楼主。手机杀毒是看程序 不是看特征码什么的吗?

chishubiao 发表于 2015-1-5 18:33:23

青玄 发表于 2015-1-5 18:36:02

chishubiao 发表于 2015-1-5 18:33
楼主这个已经有了一个简单的框架,加上UI和检测的引擎,再有了一套大量特征的云平台就能成为一个完整的杀毒 ...

呵呵! 不用客气!

青玄 发表于 2015-1-5 18:41:03

本帖最后由 青玄 于 2015-1-5 18:53 编辑

kklloo 发表于 2015-1-5 18:18
我想问一下楼主。手机杀毒是看程序 不是看特征码什么的吗?
恩恩! 目前我所知道的,是从病毒库里面进行匹配的!而病毒库是专门每天有更新的! 当然我这个就比较简单了,没有连接云端病毒库! 只是在本地的一个病毒数据库而已!

Angel丶L 发表于 2015-1-5 18:47:41

代码啊 看不懂的,。

青玄 发表于 2015-1-5 19:00:16

补充一下,与病毒库里的程序匹配的时候,它是通过程序的签名来做的!首先在PackageInfo里面获得程序的签名信息,packageinfo.signatures.toCharsString();然后对它进行md5加密:
boolean isVirsus=AntVirusDao.isVirus(MD5Util.ecode(signatures));
然后就是查询病毒数据库看有没有匹配的程序,如果有就有病毒,如果没有就没有病毒!

小甲鱼的二师兄 发表于 2015-1-5 19:03:26

学习了 @小布丁

康小泡 发表于 2015-1-5 19:04:10

青玄 发表于 2015-1-5 18:41
恩恩! 目前我所知道的,是从病毒库里面进行匹配的!而病毒库是专门每天有更新的! 当然我这个就比较简单 ...

每天更新   那更新数据库的时候软件需要更新不?

青玄 发表于 2015-1-5 19:08:31

kklloo 发表于 2015-1-5 19:04
每天更新   那更新数据库的时候软件需要更新不?

恩~~   软件不需要更新! 除非检测到软件的版本号发生改变的时候,会更新软件!

康小泡 发表于 2015-1-5 19:39:11

青玄 发表于 2015-1-5 19:08
恩~~   软件不需要更新! 除非检测到软件的版本号发生改变的时候,会更新软件!

那病毒库是怎么更新的?

百日维新 发表于 2015-1-5 19:55:57

学习学习:big

springwindyike 发表于 2015-1-5 20:36:39

青玄越来越好了!:lol:

青玄 发表于 2015-1-5 20:49:34

springwindyike 发表于 2015-1-5 20:36
青玄越来越好了!

呵呵! 兄弟过奖了! 哎! 到现在还没工作呢!我们现在正在找工作呢!

青玄 发表于 2015-1-5 20:52:32

kklloo 发表于 2015-1-5 19:39
那病毒库是怎么更新的?

虽然没试过! 但是我想与软件的版本更新是一样的,首先应该检查一下,病毒库的更新标志是否发生改变,如果发生改变的话,就请求服务器下载最新的病毒数据库!当然,这只是我根据版本更新的说法来说的! 真正还没有试过呢!{:5_109:}

康小泡 发表于 2015-1-5 21:15:33

青玄 发表于 2015-1-5 20:52
虽然没试过! 但是我想与软件的版本更新是一样的,首先应该检查一下,病毒库的更新标志是否发生改变,如 ...

{:5_92:}知道啦 谢谢

wei_Y 发表于 2015-1-5 21:38:27

厉害!不懂安卓。
页: [1] 2
查看完整版本: 小白马卫士项目总结之手机杀毒