Android殺毒實現原理及實例

一個殺毒軟甲最核心的部分一個是病毒庫一個是殺毒引擎,病毒庫從服務器中獲得,殺毒引擎實際上是判斷程序中的包名和簽名是否匹配病毒庫中的包名和簽名,如果匹配則爲病毒,界面使用幀動畫來顯示。

 

思路:

1.從服務器端把病毒的版本庫信息下載下來將解析的數據存放到List集合中

2.獲取到手機中所有應用程序的包名以及程序的簽名

3.將病毒庫匹配手機應用程序包名及簽名

4.用ScrollView標籤進行自動滾動顯示

 

關鍵代碼如下:

特洛伊木馬病毒庫的信息:

<?xml version="1.0" encoding="utf-8"?>

<list>

<virus>
	<name>tory.virus</name>
	<packname>
cn.itcast.virus
</packname>

	<description>
惡意軟件,讀取用戶日誌</description>

	<signature>
3082020730820170a00302010202044ea7598f300d06092a864886f70d010105050030483
10a30080603550406130131310a30080603550408130131310a3008060355040713013131
0a3008060355040a130131310a3008060355040b130131310a30080603550403130131301
e170d3131313032363030353132375a170d3231313032333030353132375a3048310a3008
0603550406130131310a30080603550408130131310a30080603550407130131310a30080
60355040a130131310a3008060355040b130131310a3008060355040313013130819f300d
06092a864886f70d010101050003818d0030818902818100d915d7a98cde8bcd69b87ec52
11012ace847de42129a71bf679a059c2c55e893bc0ea886874432ab8b9097724211df6769
eacd3381ccac779ab7422d8101320b1e0b14e06ac8ee095b20e52cbe6163e10a87dc410b8
a91fb73d53c5bdb4a22d1295c61e04b8f8b68c475e69c1754a1dc35745e7c6ae0275c2620
b863b0d9ea8f0203010001300d06092a864886f70d01010505000381810038e1119fbb710
4180fddba4bc8b2c275df63f0df418b7480d8eba2891da20d34d3d083cfed7bb3eb546863
c76bc67cc93f2fa0e9377c470881c9a763c99cc035093184bb50f76e74155592eca3566a3
10af55e5fec19d6fdc1a74f226aef485f84389126e8e3f4b59fe2797cbfcac660b9f2cc81
e6f3dcaa7cb2001ecc496a7b
		
	</signature>
	
</virus>

</list>

 

殺毒引擎:

	/*
	 * 殺毒引擎(下載病毒庫、獲取程序的包名及簽名並進行匹配)
	 * (non-Javadoc)
	 * @see android.app.Activity#onTouchEvent(android.view.MotionEvent)
	 */
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		packagenames = new ArrayList<String>();
		virusResult = new ArrayList<String>();
		infos = new ArrayList<ApplicationInfo>();
		animationDrawable.start();//播放掃描病毒的動畫 
		new Thread(){
			@Override
			public void run() {
				try {
					URL url = new URL("http://192.168.1.168:8080/virus.xml");
					HttpURLConnection conn =  (HttpURLConnection) url.openConnection(); 
					InputStream is = conn.getInputStream();
					
					//從服務器解析病毒庫並獲取到病毒庫的集合
					virusbeans =	VirusInfo.getVirusInfos(is);
					TaskInfo taskInfo = new TaskInfo(KillVirusActivity.this); //實例化包資源管理器
					
					//獲取到當前手機裏面所有的包名 
					infos = pm.getInstalledApplications(0);
					for(ApplicationInfo info : infos ){
						packagenames.add(info.packageName); 
					}
					int count=0;
					
					// 殺毒引擎   根據病毒庫 比對當前系統裏面的程序包名 簽名進行  殺毒 
					StringBuilder sb = new StringBuilder();
					for(String packname : packagenames){
						sb.append("正在掃描 "+ packname);
						sb.append("\n");
						Message msg = new Message();
						msg.what = SCANNING;
						msg.obj  = sb;
						handler.sendMessage(msg);
						//檢查當前的packname 和對應簽名 是不是跟病毒庫裏面的信息一樣 
						for(VirusBean virusbean : virusbeans){
							if(packname.equals(virusbean.getPackname())&&
									taskInfo.getAppSignature(packname).equals(virusbean.getSignature()))
							{
								virusResult.add(packname);//添加一個病毒
							}
						}
						count ++;//記錄病毒的總數
					}
					Message msg = new Message();
					msg.what = SCANNING_FINISH;
					msg.obj  = count;
					handler.sendMessage(msg);
				} catch (Exception e) {
					e.printStackTrace();
				} 
			}
		}.start();
		return super.onTouchEvent(event);
	}

 

顯示病毒掃描信息:

	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			switch (msg.what) {
			case SCANNING:
			    StringBuilder sb =	(StringBuilder) msg.obj; 
			    tv_killvirus_info.setText(sb.toString());
			    sv.scrollBy(0, 25);//每次增加都會自動向下移動畫面
			    break;
			case SCANNING_FINISH:
				int i =  (Integer) msg.obj;
				StringBuilder sb1  = new StringBuilder();
				sb1.append("掃描完畢  共掃描 "+ i+ " 個程序");
				if(virusResult.size()>0){
					sb1.append("發現病毒 \n");
					   for(String packname : virusResult){
						   sb1.append("病毒名"+  packname);
						   sb1.append("\n");
					   }
				   }
				   tv_killvirus_info.setText(sb1.toString());
				   animationDrawable.stop();
				break;
			}
		}
	};

 

獲取到程序的簽名:

	/*
	 * 獲取程序的簽名 
	 */
	public String getAppSignature(String packname){
		  try {
			  PackageInfo packinfo =pm.getPackageInfo(packname, PackageManager.GET_SIGNATURES);
			  //獲取到所有的權限 
			  return packinfo.signatures[0].toCharsString();

			} catch (NameNotFoundException e) {
				e.printStackTrace();
				return null;
			}
	}

 

顯示掃描的文件頁面並自動滾動:

<ScrollView 
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/iv_killvirus_am"
android:id="@+id/sv_killvirus"
>
<TextView 
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv_killvirus_info"
></TextView>
</ScrollView>

 


 
發佈了89 篇原創文章 · 獲贊 13 · 訪問量 81萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章