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> 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏木宛城主

Unity应用架构设计(3)——构建View和ViewModel的生命周期

对于一个View而言,本质上是一个MonoBehaviour。它本身就具备生命周期这个概念,比如,Awake,Start,Update,OnDestory等。...

2335
来自专栏Python小屋

Python回文判断代码优化与6个思考题

送个福利:清华大学出版社和新宝图书专营店联合推出正版特价图书《Python程序设计开发宝典》,原价69元,特价47.6元,详情:https://detail.t...

3526
来自专栏cmazxiaoma的架构师之路

Android多线程+单线程+断点续传+进度条显示下载

4483
来自专栏Android开发指南

Android优化指南

4837
来自专栏Scott_Mr 个人专栏

RxSwift 实战操作【注册登录】

3766
来自专栏Golang语言社区

GoLang并发控制(下)

context的字面意思是上下文,是一个比较抽象的词,字面上理解就是上下层的传递,上会把内容传递给下,在go中程序单位一般为goroutine,这里的上下文便是...

2733
来自专栏finleyMa

ant design源码分析 1 研究方法

ant design 是一套设计语言。 这里为了学习react,我主要学习用 React实现 的各个组件。这个是由官方维护的,代码质量高些。还有 基于vue ...

3422
来自专栏编程之旅

iOS开发——带有暂停功能的计时器

上篇博客我跟大家分享了如何在iOS系统中使用原生框架获取步数,又是大半个月过去了,运动模块的全部功能也总算完成了,也打算有始有终的把如何做一个跑步类App跟大家...

2181
来自专栏Android 开发学习

data-binding 踩坑记

1954
来自专栏Java呓语

旧问新解·ListView 中的 OnItemSelectedListener 不生效

今天在写颜色识别的Demo 时有个场景是需要用户做出单项选择,脑中蹦出首选的方案就是 ListView 配合 ChoiceMode。

772

扫码关注云+社区

领取腾讯云代金券