Android編程之殺毒的實現(xiàn)原理及具體實例
本文實例講述了Android殺毒的實現(xiàn)原理。分享給大家供大家參考,具體如下:
一個殺毒軟甲最核心的部分一個是病毒庫一個是殺毒引擎,病毒庫從服務(wù)器中獲得,殺毒引擎實際上是判斷程序中的包名和簽名是否匹配病毒庫中的包名和簽名,如果匹配則為病毒,界面使用幀動畫來顯示。
思路:
1.從服務(wù)器端把病毒的版本庫信息下載下來將解析的數(shù)據(jù)存放到List集合中
2.獲取到手機(jī)中所有應(yīng)用程序的包名以及程序的簽名
3.將病毒庫匹配手機(jī)應(yīng)用程序包名及簽名
4.用ScrollView標(biāo)簽進(jìn)行自動滾動顯示
關(guān)鍵代碼如下:
特洛伊木馬病毒庫的信息:
<?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>
殺毒引擎:
/* * 殺毒引擎(下載病毒庫、獲取程序的包名及簽名并進(jìn)行匹配) * (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(); //從服務(wù)器解析病毒庫并獲取到病毒庫的集合 virusbeans = VirusInfo.getVirusInfos(is); TaskInfo taskInfo = new TaskInfo(KillVirusActivity.this); //實例化包資源管理器 //獲取到當(dāng)前手機(jī)里面所有的包名 infos = pm.getInstalledApplications(0); for(ApplicationInfo info : infos ){ packagenames.add(info.packageName); } int count=0; // 殺毒引擎 根據(jù)病毒庫 比對當(dāng)前系統(tǒng)里面的程序包名 簽名進(jìn)行 殺毒 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); //檢查當(dāng)前的packname 和對應(yīng)簽名 是不是跟病毒庫里面的信息一樣 for(VirusBean virusbean : virusbeans){ if(packname.equals(virusbean.getPackname())&& taskInfo.getAppSignature(packname).equals(virusbean.getSignature())) { virusResult.add(packname);//添加一個病毒 } } count ++;//記錄病毒的總數(shù) } 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("發(fā)現(xiàn)病毒 \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); //獲取到所有的權(quán)限 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>
希望本文所述對大家Android程序設(shè)計有所幫助。
相關(guān)文章
android wifi信號強(qiáng)度等級區(qū)分的修改介紹
calculateSignalLevel為計算信號等級函數(shù),MAX_RSSI和MIN_RSSI分別為最強(qiáng)和最弱信號強(qiáng)度等級的信號強(qiáng)度閥值2013-06-06Flutter onTap中讓你脫穎而出的5條規(guī)則
這篇文章主要為大家介紹了Flutter onTap中讓你脫穎而出的5條規(guī)則,小事情決定了你的熟練程度,這些小細(xì)節(jié)的有趣之處在于它們的豐富性2023-11-11Android實現(xiàn)從本地圖庫/相機(jī)拍照后裁剪圖片并設(shè)置頭像
玩qq或者是微信的盆友都知道,這些聊天工具里都要設(shè)置頭像,一般情況下大家的解決辦法是從本地圖庫選擇圖片或是從相機(jī)拍照,然后根據(jù)自己的喜愛截取圖片,接下來通過本文給大家介紹Android實現(xiàn)從本地圖庫/相機(jī)拍照后裁剪圖片并設(shè)置頭像,需要的朋友參考下2016-02-02Android開發(fā)之Android studio的安裝與使用
本文是此系列文章的第一篇,主要給大家講述的是Android studio的安裝與使用,十分的詳細(xì),有需要的小伙伴可以參考下2016-02-02Android實現(xiàn)音量調(diào)節(jié)的方法
這篇文章主要介紹了Android實現(xiàn)音量調(diào)節(jié)的方法,涉及Android頁面布局及多媒體播放的設(shè)置技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-09-09kotlin anko頁面跳轉(zhuǎn)實現(xiàn)方式,攜帶參數(shù)或flag
這篇文章主要介紹了kotlin anko頁面跳轉(zhuǎn)實現(xiàn)方式,攜帶參數(shù)或flag,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android studio將Module打包成Jar的方法
這篇文章主要介紹了Android studio將Module打包成Jar的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10Android手機(jī)衛(wèi)士之確認(rèn)密碼對話框
這篇文章主要為大家詳細(xì)介紹了Android手機(jī)衛(wèi)士之確認(rèn)密碼對話框,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10