鱼C论坛

 找回密码
 立即注册
查看: 4124|回复: 25

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

[复制链接]
发表于 2015-1-5 18:04:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

原理概述

手机杀毒的话,其实就是通过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[0].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[0]);  
                ApplicationInfo applicationInfo=(ApplicationInfo) values[1];  
                boolean isVirsus=(Boolean) values[2];  
                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();  
      
    }  
}  
QQ截图20150105180250.jpg


评分

参与人数 3荣誉 +18 鱼币 +18 贡献 +13 收起 理由
拈花小仙 + 8 + 8 + 5 热爱鱼C^_^
小甲鱼的二师兄 + 5 + 5 + 3 感谢楼主无私奉献!
chishubiao + 5 + 5 + 5 感谢楼主无私奉献!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-1-5 18:08:13 | 显示全部楼层
强烈支持楼主哦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-5 18:10:33 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-5 18:15:26 | 显示全部楼层
厉害呀!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-5 18:18:13 | 显示全部楼层
我想问一下楼主。手机杀毒是看程序 不是看特征码什么的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2015-1-5 18:33:23 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

呵呵! 不用客气!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-5 18:41:03 | 显示全部楼层
本帖最后由 青玄 于 2015-1-5 18:53 编辑
kklloo 发表于 2015-1-5 18:18
我想问一下楼主。手机杀毒是看程序 不是看特征码什么的吗?

恩恩! 目前我所知道的,是从病毒库里面进行匹配的!而病毒库是专门每天有更新的! 当然我这个就比较简单了,没有连接云端病毒库! 只是在本地的一个病毒数据库而已!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-5 18:47:41 | 显示全部楼层
代码啊 看不懂的,。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-5 19:00:16 | 显示全部楼层
补充一下,与病毒库里的程序匹配的时候,它是通过程序的签名来做的!首先在PackageInfo里面获得程序的签名信息,packageinfo.signatures[0].toCharsString();然后对它进行md5加密:
  boolean isVirsus=AntVirusDao.isVirus(MD5Util.ecode(signatures));  
然后就是查询病毒数据库看有没有匹配的程序,如果有就有病毒,如果没有就没有病毒!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-5 19:03:26 | 显示全部楼层
学习了 @小布丁
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

每天更新   那更新数据库的时候  软件需要更新不?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-5 19:08:31 | 显示全部楼层
kklloo 发表于 2015-1-5 19:04
每天更新   那更新数据库的时候  软件需要更新不?

恩~~   软件不需要更新! 除非检测到软件的版本号发生改变的时候,会更新软件!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

那病毒库是怎么更新的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-5 19:55:57 | 显示全部楼层
学习学习:big
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-5 20:36:39 | 显示全部楼层
青玄越来越好了!:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-5 20:49:34 | 显示全部楼层

呵呵! 兄弟过奖了! 哎! 到现在还没工作呢!我们现在正在找工作呢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-5 20:52:32 | 显示全部楼层
kklloo 发表于 2015-1-5 19:39
那病毒库是怎么更新的?

虽然没试过! 但是我想与软件的版本更新是一样的,首先应该检查一下,病毒库的更新标志是否发生改变,如果发生改变的话,就请求服务器下载最新的病毒数据库!当然,这只是我根据版本更新的说法来说的! 真正还没有试过呢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

知道啦 谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-5 21:38:27 | 显示全部楼层
厉害!不懂安卓。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 16:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表