Android编程之杀毒的实现原理及具体实例

本文实例讲述了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>

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • 解析后台进程对Android性能影响的详解

    Android现在这么火,各种的设备也是琳琅满目,高中低等,大小屏幕都有,但是它始终未能达到iOS那样的令人称赞的卓越体验和性能,其操作的流畅度,性能和安全性方面总是略输iOS一筹.据说iPhone4虽然是单核512M内存,但是比Android的双核1G内存的操作起来更流畅,iPad2虽然是也只有512M的内存但是操作起来比Android四核1G内存还要流畅.另外在安全性方面也不如iOS. 造成Android性能,待机时间,操作流畅和安全性不好的原因是Android后台进程的管理. Androi

  • Android Service 服务不被杀死的妙招

    Service是android 系统中的一种组件,它跟Activity的级别差不多,但是他不能自己运行,只能后台运行,并且可以和其他组件进行交互. Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStartCommand方法中做一些处理. 从Android官方文档中,我们知道onStartCommand有4种int返回值,首先简单地讲讲int返回值的作用.

  • Android编程简单实现雷达扫描效果

    本文实例讲述了Android编程简单实现雷达扫描效果.分享给大家供大家参考,具体如下: 在eoe看到有一篇关于雷达扫描的文章,然后看了下,很简单,但是觉得还有很多可以优化的地方,下面贴出来 package com.example.wave; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; im

  • Android编程防止进程被第三方软件杀死的方法

    本文实例讲述了Android编程防止进程被第三方软件杀死的方法.分享给大家供大家参考,具体如下: 项目测试的时候发现,按home键回到桌面,再用360清理内存,软件被结束,再次进入的时候报错,看了下log,以为是有的地方没有控制好,但是又不知道360结束的是什么(这个现在还没弄明白).使用小米系统的进程管理优化内存就不报错. 后来想到用Service防止软件被kill掉,查了下资料,发现google 管方就有,ForegroundService 前台服务,让服务一直以前台任务的方式运行,可以在s

  • 基于Android扫描sd卡与系统文件的介绍

    如果你做过多媒体应用,一定会苦恼过,怎样获取sd卡中的多媒体文件.android还是很强大的,如果你知道怎么调用android的api,万事就ok了. 当手机或模拟器开机时,会调用android的MediaScanner,扫描sd卡和内存里的文件.以下是log信息. 复制代码 代码如下: 12-13 15:39:11.062: VERBOSE/MediaPlayerService(67): Create new media retriever from pid 349<BR> 12-13 15

  • Android 进程间通信实现原理分析

    Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务(Remote Service):被另一个apk调用远程服务需要借助AIDL来完成. AIDL 是什么 AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码.如果在一个进程中(例如Activit

  • Android中扫描多媒体文件操作详解

    这篇文章从系统源代码分析,讲述如何将程序创建的多媒体文件加入系统的媒体库,如何从媒体库删除,以及大多数程序开发者经常遇到的无法添加到媒体库的问题等.本人将通过对源代码的分析,一一解释这些问题. Android中的多媒体文件扫描机制 Android提供了一个很棒的程序来处理将多媒体文件加入的媒体库中.这个程序就是MediaProvider,现在我们简单看以下这个程序.首先看一下它的Receiver 复制代码 代码如下: <receiver android:name="MediaScanner

  • 让Android应用不被杀死(killer)的方法

    方法: 对于一个service,可以首先把它设为在前台运行: 复制代码 代码如下: public void MyService.onCreate() {         super.onCreate();         Notification notification = new Notification(android.R.drawable.my_service_icon,                "my_service_name",                 Sys

  • Android编程之杀毒的实现原理及具体实例

    本文实例讲述了Android杀毒的实现原理.分享给大家供大家参考,具体如下: 一个杀毒软甲最核心的部分一个是病毒库一个是杀毒引擎,病毒库从服务器中获得,杀毒引擎实际上是判断程序中的包名和签名是否匹配病毒库中的包名和签名,如果匹配则为病毒,界面使用帧动画来显示. 思路: 1.从服务器端把病毒的版本库信息下载下来将解析的数据存放到List集合中 2.获取到手机中所有应用程序的包名以及程序的签名 3.将病毒库匹配手机应用程序包名及签名 4.用ScrollView标签进行自动滚动显示 关键代码如下: 特

  • Android编程之绝对布局AbsoluteLayout和相对布局RelativeLayout实例详解

    本文实例分析了Android编程之绝对布局AbsoluteLayout和相对布局RelativeLayout.分享给大家供大家参考,具体如下:  一.绝对布局AbsoluteLayout 绝对定位AbsoluteLayout,又可以叫做坐标布局,可以直接指定子元素的绝对位置,这种布局简单直接,直观性强,但是由于手机屏幕尺寸差别比较大,使用绝对定位的适应性会比较差. 下面我们举一个例子看看:例子里的机器人图片大小是250X250,可以看到我们使用android:layout_x和android:l

  • Android编程之基于Log演示一个activity生命周期实例详解

    本文实例讲述了Android编程之基于Log演示一个activity生命周期.分享给大家供大家参考,具体如下: 利用Android的Log 演示一个activity的生命周期 代码: //DemoActivity.java package uni.activity; /* @author octobershiner 2011 7 22 SE.HIT */ import android.app.Activity; import android.os.Bundle; import android.u

  • Android编程实现QQ表情的发送和接收完整实例(附源码)

    本文实例讲述了Android编程实现QQ表情的发送和接收.分享给大家供大家参考,具体如下: 在自己做一个聊天应用练习的时候,需要用到表情,于是就想着模仿一下QQ表情,图片资源完全copy的QQ.apk,解压就可以得到,这里不细说. 下面将该应用中的表情模块功能抽离出来,以便自己以后复习回顾.. 先看一下效果图: 首先进入界面:(完全仿照QQ) 点击一下上面的表情图标: 选择一些表情,输入一些文字混合: 点击发送: 可以看到文字和表情图片都一起显示出来了. 下面列出一些关键代码: 表情工具类Exp

  • Android编程图片加载类ImageLoader定义与用法实例分析

    本文实例讲述了Android编程图片加载类ImageLoader定义与用法.分享给大家供大家参考,具体如下: 解析: 1)图片加载使用单例模式,避免多次调用时产生死锁 2)核心对象 LruCache 图片加载时先判断缓存里是否有图片,如果有,就使用缓存里的 没有就加载网络的,然后置入缓存 3)使用了线程池ExecutorService mThreadPool技术 4)使用了Semaphore 信号来控制变量按照先后顺序执行,避免空指针的问题 如何使用: 在Adapter里加载图片时 复制代码 代

  • Android编程图片操作类定义与用法示例【拍照,相册选图及裁剪】

    本文实例讲述了Android编程图片操作类定义与用法.分享给大家供大家参考,具体如下: 主界面类:拍照及选择相册图片 import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import androi

  • Android编程中Handler原理及用法实例分析

    本文实例讲述了Android编程中Handler用法.分享给大家供大家参考,具体如下: 在Android的UI开发中,我们经常会使用Handler来控制主UI程序的界面变化.有关Handler的作用,我们总结为:与其他线程协同工作,接收其他线程的消息并通过接收到的消息更新主UI线程的内容. 我们假设在一个UI界面上面,有一个按钮,当点击这个按钮的时候,会进行网络连接,并把网络上的一个字符串拿下来显示到界面上的一个 TextView上面,这时就出现了一个问题,如果这个网络连接的延迟过大,可能是10

  • Android编程之九宫格实现方法实例分析

    本文实例讲述了Android编程之九宫格实现方法.分享给大家供大家参考,具体如下: 显示九宫格需要用GridView , 要显示每个格子中的视图有两种方式,第一种方式是做成xml文件,再将xml文件做成视图.第二种方式就是在代码中构建出这样一种布局,这里采用第一种方式来实现: GridView: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="ht

  • Android编程实现两个Activity之间共享数据及互相访问的方法

    本文实例讲述了Android编程实现两个Activity之间共享数据及互相访问的方法.分享给大家供大家参考,具体如下: 本人从windows编程转过来学习Android开发,一直在想如果两个Activity之间能够像C#或delphi中的Form一样,可以直接访问其成员(字符.数值.成员对象等),并能调用其公开的方法,那应该比用Intent来传递数据直接方便的多,于是偿试了如下办法,测试基本没有问题,发出来大家讨论一下.本人学习android不久,幼稚的地方希望大家不要见笑 原理:假设有两个Ac

  • Android编程实现WebView全屏播放的方法(附源码)

    本文实例讲述了Android编程实现WebView全屏播放的方法.分享给大家供大家参考,具体如下: 最近因为项目要用webview加载html5的视频,开始不能全屏播,做了很久才做出来!那按我的理解说下怎么实现全屏吧. 首先写布局文件activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.

随机推荐