集成病毒数据查询

来源:互联网 发布:c语言中return的用法 编辑:程序博客网 时间:2024/06/10 13:34

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

@Overrideprotected 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

0 0