小白马卫士项目总结之手机杀毒
原理概述手机杀毒的话,其实就是通过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();
}
}
{:7_139:}强烈支持楼主哦~ @百日维新 @springwindyike @kklloo @Angel丶L @~风介~ @andalousie @chishubiao 厉害呀!{:7_146:} 我想问一下楼主。手机杀毒是看程序 不是看特征码什么的吗? chishubiao 发表于 2015-1-5 18:33
楼主这个已经有了一个简单的框架,加上UI和检测的引擎,再有了一套大量特征的云平台就能成为一个完整的杀毒 ...
呵呵! 不用客气! 本帖最后由 青玄 于 2015-1-5 18:53 编辑
kklloo 发表于 2015-1-5 18:18
我想问一下楼主。手机杀毒是看程序 不是看特征码什么的吗?
恩恩! 目前我所知道的,是从病毒库里面进行匹配的!而病毒库是专门每天有更新的! 当然我这个就比较简单了,没有连接云端病毒库! 只是在本地的一个病毒数据库而已! 代码啊 看不懂的,。 补充一下,与病毒库里的程序匹配的时候,它是通过程序的签名来做的!首先在PackageInfo里面获得程序的签名信息,packageinfo.signatures.toCharsString();然后对它进行md5加密:
boolean isVirsus=AntVirusDao.isVirus(MD5Util.ecode(signatures));
然后就是查询病毒数据库看有没有匹配的程序,如果有就有病毒,如果没有就没有病毒! 学习了 @小布丁 青玄 发表于 2015-1-5 18:41
恩恩! 目前我所知道的,是从病毒库里面进行匹配的!而病毒库是专门每天有更新的! 当然我这个就比较简单 ...
每天更新 那更新数据库的时候软件需要更新不? kklloo 发表于 2015-1-5 19:04
每天更新 那更新数据库的时候软件需要更新不?
恩~~ 软件不需要更新! 除非检测到软件的版本号发生改变的时候,会更新软件! 青玄 发表于 2015-1-5 19:08
恩~~ 软件不需要更新! 除非检测到软件的版本号发生改变的时候,会更新软件!
那病毒库是怎么更新的? 学习学习:big 青玄越来越好了!:lol: springwindyike 发表于 2015-1-5 20:36
青玄越来越好了!
呵呵! 兄弟过奖了! 哎! 到现在还没工作呢!我们现在正在找工作呢! kklloo 发表于 2015-1-5 19:39
那病毒库是怎么更新的?
虽然没试过! 但是我想与软件的版本更新是一样的,首先应该检查一下,病毒库的更新标志是否发生改变,如果发生改变的话,就请求服务器下载最新的病毒数据库!当然,这只是我根据版本更新的说法来说的! 真正还没有试过呢!{:5_109:} 青玄 发表于 2015-1-5 20:52
虽然没试过! 但是我想与软件的版本更新是一样的,首先应该检查一下,病毒库的更新标志是否发生改变,如 ...
{:5_92:}知道啦 谢谢 厉害!不懂安卓。
页:
[1]
2