手機殺毒的幾種方式:
1.
基於簽名的特徵碼的掃描(hash碼-md5特徵碼的掃描)
特徵
:
只能查殺已知的病毒,不能查殺未知的病毒。
大概原理:根據病毒數據庫進行查殺,病毒庫中保存病毒對應的hash,經過比較程序簽名和病毒庫中的簽名判斷是否病毒。
補充:各殺毒軟件的原理都是相同的,區別主要在於殺毒引擎。
殺毒引擎用於獲取
硬件上文件的
hash
碼,並依據此hash碼
查詢數據庫的算法.
2.主動防護
經過監控敏感
api進行防護,例如監控如下敏感操做:
更改瀏覽器主頁
註冊開機啓動的行爲
應用程序的內存注入
3.啓發式掃描:
根據程序敏感的api 提示風險代碼
4.雲查殺
利用服務器端的病毒數據庫進一步查詢可疑程序。
人工智能:
引用人工智能算法,即
一套複雜的
if
語句
下面是根據第1種方式實現簡單殺毒功能核心程序代碼:
package com.alex.mobilesafe.ui;
import java.util.List;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.MotionEvent;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.ScrollView;
import android.widget.TextView;
import com.alex.mobilesafe.util.MD5Encoder;
import com.alex.mobilesafe.R;
public class AntiVirusActivity extends Activity {
protected static final int STOP = 100;
private ImageView iv;
private ProgressBar pb;
private LinearLayout ll;
private AnimationDrawable anim;
private ScrollView sv;
private SQLiteDatabase db;
private boolean flagscanning = false;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what==STOP){
ll.removeAllViews();
anim.stop();
}
String str = (String) msg.obj;
TextView tv = new TextView(getApplicationContext());
tv.setText(str);
ll.setOrientation(LinearLayout.VERTICAL);
ll.addView(tv);
sv.scrollBy(0, 20);
System.out.println(str);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.antivirus);
//antivirus.db 爲手機病毒庫
db = SQLiteDatabase.openDatabase("/sdcard/antivirus.db", null,SQLiteDatabase.OPEN_READONLY);
iv = (ImageView) this.findViewById(R.id.iv);
//掃描病毒進度條
pb = (ProgressBar) this.findViewById(R.id.progressBar1);
ll = (LinearLayout) this.findViewById(R.id.ll);
//設置ImageView背景資源爲動畫文件
iv.setBackgroundResource(R.drawable.anti_anim);
//sv用來顯示病毒的掃描結果
sv = (ScrollView) this.findViewById(R.id.sv);
anim = (AnimationDrawable) iv.getBackground();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//若是程序正在殺毒過程當中,拒絕再次啓動殺毒線程
if(flagscanning){
return false;
}
//若是用戶觸摸屏幕,則開啓殺毒線程
if (event.getAction() == MotionEvent.ACTION_UP) {
flagscanning= true;
anim.start();
new Thread() {
public void run() {
// 獲取每個應用程序的簽名,簽名須與數據庫的簽名想比較
List<PackageInfo> infos = getPackageManager()
.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_SIGNATURES);
//設置進度條的掃描範圍
pb.setMax(infos.size());
int total = 0;
int virustotal = 0;//設置初始病毒數爲0
for (PackageInfo info : infos) {
total++;
try {
sleep(20);//只爲便於觀察掃描效果和進度,無實質做用
} catch (InterruptedException e) {
e.printStackTrace();
}
Message msg = Message.obtain();
msg.obj = "正在掃描" + info.packageName;
handler.sendMessage(msg);
Signature[] signs = info.signatures;
String str = signs[0].toCharsString();
String md5 = MD5Encoder.encode(str);
//將應用程序簽名與數據庫中保存的簽名進行比較,若是相一致,則使病毒數加1,並經過handler在界面顯示病毒包名
Cursor cursor = db.rawQuery("select desc from datable where md5=?",new String[] { md5 });
if (cursor.moveToFirst()) {
String desc = cursor.getString(0);
msg = Message.obtain();
msg.obj = info.packageName + ": " + desc;
handler.sendMessage(msg);
virustotal++;
}
cursor.close();
pb.setProgress(total);
}
Message msg = Message.obtain();
msg.what = STOP;
msg.obj = "掃描完畢 ,共發現" + virustotal + "個病毒";
handler.sendMessage(msg);
flagscanning = false;
pb.setProgress(0);
};
}.start();
}
return super.onTouchEvent(event);
}
@Override
protected void onDestroy() {
if (db.isOpen())
db.close();
super.onDestroy();
}
}
運行效果: