鱼C论坛

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

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

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

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

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

x

原理概述

手机杀毒的话,其实就是通过PackageManager的管理者获得手机上面所有安装好的程序,然后在病毒库里面检测与当前程序是否与病毒库里面的程序匹配,如果匹配的话,那就有病毒,然后将其删除就行了!

在这之前需要一个DAO来进行检查是否有病毒:

  1. package cn.cbd.mobilesafe.activity.db.dao;  
  2.   
  3. import android.database.Cursor;  
  4. import android.database.sqlite.SQLiteDatabase;  
  5.   
  6. public class AntVirusDao {  
  7.       
  8.     public static boolean isVirus(String md5)   
  9.     {  
  10.         boolean bol=false;  
  11.         SQLiteDatabase db=SQLiteDatabase.openDatabase("/data/data/cn.cbd.mobilesafe.activity/files/antivirus.db", null,SQLiteDatabase.OPEN_READONLY);  
  12.         Cursor cursor=db.rawQuery("select * from datable where md5=?", new String[]{md5});  
  13.         while(cursor.moveToFirst())  
  14.         {  
  15.             bol=true;  
  16.         }  
  17.         cursor.close();  
  18.         db.close();  
  19.         return bol;  
  20.     }  
  21. }  
复制代码

然后就是加载界面的主要类了:


  1. package cn.cbd.mobilesafe.activity;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.app.Activity;  
  7. import android.app.AlertDialog;  
  8. import android.app.AlertDialog.Builder;  
  9. import android.content.DialogInterface;  
  10. import android.content.DialogInterface.OnClickListener;  
  11. import android.content.Intent;  
  12. import android.content.pm.ApplicationInfo;  
  13. import android.content.pm.PackageInfo;  
  14. import android.content.pm.PackageManager;  
  15. import android.graphics.Color;  
  16. import android.net.Uri;  
  17. import android.os.AsyncTask;  
  18. import android.os.Bundle;  
  19. import android.util.Log;  
  20. import android.view.View;  
  21. import android.view.animation.Animation;  
  22. import android.view.animation.RotateAnimation;  
  23. import android.widget.ImageView;  
  24. import android.widget.LinearLayout;  
  25. import android.widget.ProgressBar;  
  26. import android.widget.TextView;  
  27.   
  28. import cn.cbd.mobilesafe.activity.db.dao.AntVirusDao;  
  29. import cn.cbd.mobilesafe.activity.util.MD5Util;  
  30.   
  31. public class AntVirusActivity extends Activity {  
  32.   
  33.     private ImageView iv_scan;  
  34.     private TextView tv_scan_stauts;  
  35.     private ProgressBar pb_scan_status;  
  36.     private LinearLayout ll_container;  
  37.     private PackageManager pm;  
  38.     private List<String> virusList;  
  39.     @Override  
  40.     protected void onCreate(Bundle savedInstanceState) {  
  41.         super.onCreate(savedInstanceState);  
  42.         setContentView(R.layout.activity_kill_virus);  
  43.          
  44.         virusList=new ArrayList<String>();  
  45.         tv_scan_stauts=(TextView) findViewById(R.id.tv_scan_stauts);  
  46.         pb_scan_status=(ProgressBar) findViewById(R.id.pb_scan_status);  
  47.         ll_container=(LinearLayout) findViewById(R.id.ll_container);  
  48.          
  49.         iv_scan=(ImageView) findViewById(R.id.iv_scan);  
  50.         RotateAnimation animation=new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 1.0f, Animation.RELATIVE_TO_SELF, 1.0f);  
  51.         animation.setDuration(1000);  
  52.         animation.setRepeatCount(Animation.INFINITE);  
  53.         iv_scan.startAnimation(animation);  
  54.          
  55.         new AsyncTask<Void, Object, Void>(){  
  56.   
  57.               
  58.             @Override  
  59.             protected void onPreExecute() {  
  60.                   
  61.                 tv_scan_stauts.setText("正在初始化八核扫描引擎...");  
  62.                 super.onPreExecute();  
  63.             }  
  64.               
  65.             @Override  
  66.             protected Void doInBackground(Void... params) {  
  67.                   
  68.                 try   
  69.                 {  
  70.                     Thread.sleep(1000);  
  71.                     pm=getPackageManager();  
  72.                     //通过包的管理者获得安装的程序集合  
  73.                     List<PackageInfo> packageInfos=pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_SIGNATURES);  
  74.                     pb_scan_status.setMax(packageInfos.size());  //设置进度条的最大刻度  
  75.                     Log.i("aaa",""+packageInfos.size());  
  76.                     int total=0;  
  77.                     for(PackageInfo packageInfo : packageInfos)  
  78.                     {  
  79.                         //循环出每一个安装的程序  
  80.                         String signatures=packageInfo.signatures[0].toCharsString();  
  81.                         boolean isVirsus=AntVirusDao.isVirus(MD5Util.ecode(signatures));  
  82.                         //如果是病毒  
  83.                         if(isVirsus)  
  84.                         {  
  85.                             virusList.add(packageInfo.packageName);  
  86.                         }  
  87.                         Log.i("ccc",signatures);  
  88.                         total++;  
  89.                         pb_scan_status.setProgress(total);  
  90.                         publishProgress("正在扫描:"+packageInfo.applicationInfo.loadLabel(pm),packageInfo.applicationInfo,isVirsus);  
  91.                         Thread.sleep(200);  
  92.                     }  
  93.                 }  
  94.                 catch (Exception e) {  
  95.                     e.printStackTrace();  
  96.                 }  
  97.                   
  98.                   
  99.                 return null;  
  100.             }  
  101.   
  102.             @Override  
  103.             protected void onPostExecute(Void result) {  
  104.                 tv_scan_stauts.setText("全部扫描完毕!");  
  105.                 iv_scan.clearAnimation();  
  106.                 if(virusList.size()>0)  //检测病毒列表是不是大于0的如果大于0就弹出来一个对话框  
  107.                 {  
  108.                     AlertDialog.Builder builder=new Builder(AntVirusActivity.this);  
  109.                     builder.setTitle("警告");  
  110.                     builder.setMessage("发现病毒是否清理?");  
  111.                     builder.setPositiveButton("确定", new OnClickListener(){  
  112.   
  113.                         @Override  
  114.                         public void onClick(DialogInterface dialog, int which) {  
  115.                             for (String packname : virusList) {  
  116.                                 Intent intent = new Intent();  
  117.                                 intent.setAction(Intent.ACTION_DELETE);  
  118.                                 intent.setData(Uri.parse("package:" + packname));  
  119.                                 startActivity(intent);  
  120.   
  121.                             }  
  122.                               
  123.                         }  
  124.                           
  125.                     });  
  126.                     builder.setNegativeButton("取消", new OnClickListener() {  
  127.   
  128.                         public void onClick(DialogInterface dialog, int which) {  
  129.                             // TODO Auto-generated method stub  
  130.   
  131.                         }  
  132.                     });  
  133.                     builder.create().show();  
  134.                      
  135.                 }  
  136.                 super.onPostExecute(result);  
  137.             }  
  138.   
  139.             @Override  
  140.             protected void onProgressUpdate(Object... values) {  
  141.                 /**
  142.                  * 这里比较关键一些,这里的布局是这样的:
  143.                  *   <ScrollView
  144.                         android:layout_width="fill_parent"
  145.                         android:layout_height="fill_parent"  
  146.                         android:scrollbars="none">
  147.                  
  148.                         <LinearLayout
  149.                             android:id="@+id/ll_container"
  150.                             android:layout_width="fill_parent"
  151.                             android:layout_height="fill_parent"
  152.                             android:orientation="vertical" >
  153.                         </LinearLayout>
  154.                     </ScrollView>
  155.                     也就是说,列表显示的部分是一个ScrollView布局
  156.                  */  
  157.                   
  158.                 tv_scan_stauts.setText((String)values[0]);  
  159.                 ApplicationInfo applicationInfo=(ApplicationInfo) values[1];  
  160.                 boolean isVirsus=(Boolean) values[2];  
  161.                 View view=View.inflate(getApplicationContext(), R.layout.layout_cache_item, null);  
  162.                 ImageView iv=(ImageView) view.findViewById(R.id.iv_cache);  
  163.                 TextView tv_name=(TextView) view.findViewById(R.id.tv_cache);  
  164.                 TextView tv_info=(TextView) view.findViewById(R.id.tv_cache_size);  
  165.                 iv.setImageDrawable(applicationInfo.loadIcon(pm));  
  166.                 tv_name.setText(applicationInfo.loadLabel(pm));  
  167.                 if(isVirsus)  
  168.                 {  
  169.                     tv_info.setTextColor(Color.RED);  
  170.                     tv_info.setText("发现病毒");  
  171.                 }else{  
  172.                     tv_info.setText("扫描安全");  
  173.                 }  
  174.                   
  175.                 ll_container.addView(view,0);  
  176.                 super.onProgressUpdate(values);  
  177.             }  
  178.               
  179.         }.execute();  
  180.       
  181.     }  
  182. }  
复制代码

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-4-25 07:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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