病毒查杀

来源:互联网 发布:windows任务栏不见了 编辑:程序博客网 时间:2024/04/26 14:21

        大家好,今晚给大家分享的是病毒查杀功能,原理是本机应用根据已备好的病毒数据库,进行扫描检查判断,若有病毒则会显示那个应用含有病毒。简单的分析三大步骤,

第一步骤:导入病毒数据库,写入在应用私有文件,第二步骤:创建病毒查询封装方法,第三步骤:病毒查杀,显示扫描信息。



步骤一:将antivirus.db导入assest目录,再拷贝到本应用的私有目录下

在oncreate方法里,创建copyDB(antivirus.db)方法。

public void copyDB(String name) {
try {
//读取assest目录下的数据库db
InputStream is = getAssets().open(name);
// 开始拷贝数据库,参数一:文件的路径,参数二:文件命名
File file = new File(getFilesDir(), name);

// 如果文件存在就返回
if (file.exists()) {
return;
}
//文件输出流写入文件
FileOutputStream fos = new FileOutputStream(file);

//将流转换为字符节数组
int len = -1;
byte[] buff = new byte[2014];
while ((len = is.read(buff)) != -1) {
fos.write(buff, 0, len);
}
//关闭流
is.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}

步骤二:创建病毒数据库查询业务类,AntivirusDao

public class AntivirusDao {

//参数一:传入的md5值

public static String checkAntivirus(String md5, Context context) {
String desc = null;
//数据库保存的路径
String PATH = context.getFilesDir() + "/antivirus.db";
//打开数据库,SqliteDatabase类,参数三:数据库的打开方式
SQLiteDatabase db = SQLiteDatabase.openDatabase(PATH, null,
SQLiteDatabase.OPEN_READONLY);
//sql语句,查询病毒描述
String sql = "select desc from datable where md5 = ?";
//查询数据,游标查询
Cursor cursor = db.rawQuery(sql, new String[] { md5 });
while (cursor.moveToNext()) {

        //得到查询值
desc = cursor.getString(0);
}

        //返回查询值
return desc;
}

步骤三:病毒查询,显示查询信息,AntivirusActivity.java

public class AntivirusActivity extends Activity {
protected static final int BEGIN = 1;
protected static final int SCAN = 2;
protected static final int FINISH = 3;
@ViewInject(R.id.scanning_iv)
private ImageView mScanningIv;
private Context context;
private ScanInfo scanInfo;
private Message message;
private TextView mAntiTv;
private ProgressBar mPb;
private LinearLayout mLl;
private ScrollView mSv;


//实体类bean对象
static class ScanInfo {
boolean desc;
String name;
String packageName;
}


//接受消息机制

private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case BEGIN://扫描之前
mAntiTv.setText("开始扫描");
break;
case SCAN://正在扫描
                TextView tv=new TextView(context);
                //得到传过来的数据msg.obj
                ScanInfo scanInfo=(ScanInfo) msg.obj;

             //有描述是,表示含有病毒
                if(scanInfo.desc){
                tv.setText(scanInfo.name+"有病毒");
                tv.setTextSize(18);
                tv.setTextColor(Color.RED);

          //没描述,表示没有病毒
                }else{
                tv.setText(scanInfo.name+"扫描安全");
                tv.setTextSize(18);
                LogUtil.i("AAA", "应用名:"+scanInfo.name);
               
               
                }
               //将TextView控件添加到LinearLayout布局里
                mLl.addView(tv);
               
                //滚动游标向下滑
                mSv.post(new Runnable() {

@Override
public void run() {
//往下滑动
mSv.fullScroll(ScrollView.FOCUS_DOWN);

}
});
                
                

break;
case FINISH://扫描之后

                                //动画结束
mScanningIv.clearAnimation();
mAntiTv.setText("扫描结束");
break;


default:
break;
}


};
};


protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_antivirus);


ViewUtils.inject(this);
context = this;
mAntiTv=(TextView) findViewById(R.id.anti_tv);
mPb=(ProgressBar) findViewById(R.id.anti_pb);
mLl=(LinearLayout) findViewById(R.id.anti_body_ll);
mSv=(ScrollView) findViewById(R.id.anti_sv);


getActionBar().setDisplayHomeAsUpEnabled(true);

//创建实体类对象
scanInfo = new ScanInfo();
//旋转对象
RotateAnimation rotateAnimation = new RotateAnimation(0, 360,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
rotateAnimation.setDuration(5000);
//永不重复
rotateAnimation.setRepeatCount(-1);
mScanningIv.startAnimation(rotateAnimation);


initData();//初始化数据


}


// 初始化数据
private void initData() {


//耗时操作,需要开启子线程
new Thread(new Runnable() {


@Override
public void run() {
//创建信息对象,用于发消息机制
message = Message.obtain();
message.what = BEGIN;//扫描之前
                handler.sendMessage(message);
创建包管理器
PackageManager packageManager = getPackageManager();
     //获取所有的包安装信息
List<PackageInfo> info = packageManager.getInstalledPackages(0);
//应用程序的总数
int size = info.size();
//设置进度条总长度
mPb.setMax(size);
//设置起始进度为0
int process=0;

// 遍历
for (PackageInfo infos : info) {
//应用名
String name = infos.applicationInfo.loadLabel(
packageManager).toString();
//保存到实体类里
scanInfo.name = name;


String packageName = infos.applicationInfo.packageName;
// 保存在实体类
scanInfo.packageName = packageName;


//获取所有应用名的目录,infos.applicationInfo.sourceDir
//sourceDir:/system/app/PhaseBeam.apk
String sourceDir = infos.applicationInfo.sourceDir;
// LogUtil.i("AAA", "sourceDir:"+sourceDir);

                                       //转换为md5值
String md5 = MD5.getMD5(sourceDir);
LogUtil.i("AAA", "md5:"+md5);
//md5:6673db57d0033a4d35979c64f43555eb

                                         //调用封装方法,得到病毒描述
String desc = AntivirusDao.checkAntivirus(md5, context);
LogUtil.i("AAA", "desc:"+desc);


//病毒信息为空时,说明没发现病毒
if (desc == null) {
// 保存到实体类里
scanInfo.desc = false;

                                       //病毒信息不为空,说明含有病毒
} else {
scanInfo.desc = true;
}

process++;
//设置休眠时间
SystemClock.sleep(100);

                                   //设置进度条
  mPb.setProgress(process);


message = Message.obtain();
message.what = SCAN;//正在扫描
message.obj = scanInfo;//传递数据,让消息机制接受
handler.sendMessage(message);


}


message = Message.obtain();
message.what = FINISH;//扫描之后
handler.sendMessage(message);


}
}).start();


}


public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.antivirus, menu);
return true;
}

//actionBar的返回图标
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
break;


default:
break;
}
return super.onOptionsItemSelected(item);
}
}

今晚就到这里了。大家晚安。


0 0
原创粉丝点击