集成病毒数据查询

1、把antivirus.db(手机归属地数据库)在assets目录中。
2、在SplashActivity.java(应用启动时显示的动画界面)中把antivirus.db拷贝到应用的files目录下。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //拷贝数据库
    copyDB("address.db");
}

/**
 * 把assert目录下文件拷贝到本地(/data/data/包名/files)
 * @param dbName
 *      assert目录下的文件名
 * @throws IOException 
 */
private void copyDB(final String dbName)  {
    new Thread(){
        public void run() {

            //判断文件是否存在,如果存在不需要拷贝
            File file = new File("/data/data/"+getPackageName() + "/files/" + dbName);
            if (file.exists()) {//文件存在
                return;
            }
            // 文件的拷贝
            try {
                filecopy(dbName);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        };
    }.start();

}

private void filecopy(String dbName) throws IOException,
        FileNotFoundException {
    //io流来拷贝
    //输入流
    AssetManager assets = getAssets();
    //读取assert的文件,转换成InputStream
    InputStream is = assets.open(dbName);

    //输出流
    FileOutputStream fos = openFileOutput(dbName, MODE_PRIVATE );

    //流的拷贝
    //定义缓冲区大小10k
    byte[] buffer = new byte[10240];

    //读取的长度
    int len = is.read(buffer);
    int counts = 1;
    //循环读取,如果读到文件尾部,返回-1
    while (len != -1) {
        //把缓冲区的数据写到输出流
        fos.write(buffer,0,len);
        //每次100k的时候刷新缓冲区的数据到文件中
        if (counts % 10 == 0) {
            fos.flush();//刷新缓冲区
        }
        //继续读取
        len = is.read(buffer);
        counts++;
    }
    fos.flush();
    fos.close();
    is.close();
}

3、操作病毒数据库的Dao类实现

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.widget.SlidingDrawer;

/**
 * 病毒的业务类
 * @author Administrator
 *
 */
public class AntiVirusDao {

    /**
     * @param version
     *     传递的服务器的病毒库版本
     * @return
     *    病毒库版本是否一致,true说明目前本地的病毒库是最新的
     */
    public static boolean isNewVirus(int version){
        boolean res = false;
        SQLiteDatabase database = SQLiteDatabase.openDatabase(
                "/data/data/"+getPackageName()+ "/files/antivirus.db", null,
                SQLiteDatabase.OPEN_READWRITE);
        Cursor cursor = database.rawQuery("select 1 from version where subcnt=?", new String[]{version+""});
        if (cursor.moveToNext()) {
            res = true;
        }
        cursor.close();
        database.close();
        return res;
    }
    /**
     * @param md5   病毒文件的md5
     *        desc  病毒的描述信息
     *     
     */
    public static void addVirus(String md5,String desc){
        //获取数据库 
        SQLiteDatabase database = SQLiteDatabase.openDatabase(
                "/data/data/"+getPackageName()+ "/files/antivirus.db", null,
                SQLiteDatabase.OPEN_READWRITE);
        ContentValues values = new ContentValues();
        values.put("md5", md5);
        values.put("type", 6);
        values.put("name", "Android.Hack.CarrierIQ.a");
        values.put("desc", desc);
        database.insert("datable", null, values);
        database.close();
    }

    /**
     * @param md5
     *      文件的md5值
     * @return
     *      是否是病毒文件
     */
    public static boolean isVirus(String md5){
        boolean res = false;
        SQLiteDatabase database = SQLiteDatabase.openDatabase(
                "/data/data/"+getPackageName()+ "/files/antivirus.db", null,
                SQLiteDatabase.OPEN_READWRITE);
        Cursor cursor = database.rawQuery("select 1 from datable where md5=?", new String[]{md5});
        if (cursor.moveToNext()) {
            res = true;
        }
        cursor.close();
        database.close();
        return res;
    }
}

4、判断应用是否是病毒

//根据应用的apk路径得到apk对应的文件md5(即特征码)
String md5 = Md5Utils.getFileMD5(appBean.getApkPath());
//根据文件md5判断该应用是否是病毒
dao.isVirus(md5)

Md5Utils的源码:http://blog.csdn.net/CSDN_LQR/article/details/51175064

AppBean 的源码:http://blog.csdn.net/csdn_lqr/article/details/51168246

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值