集成病毒数据查询

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

1@Override 2protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 //拷贝数据库 5 copyDB("address.db"); 6} 7 8/** 9 * 把assert目录下文件拷贝到本地(/data/data/包名/files) 10 * @param dbName 11 * assert目录下的文件名 12 * @throws IOException 13 */ 14private void copyDB(final String dbName) { 15 new Thread(){ 16 public void run() { 17 18 //判断文件是否存在,如果存在不需要拷贝 19 File file = new File("/data/data/"+getPackageName() + "/files/" + dbName); 20 if (file.exists()) {//文件存在 21 return; 22 } 23 // 文件的拷贝 24 try { 25 filecopy(dbName); 26 } catch (FileNotFoundException e) { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 } catch (IOException e) { 30 // TODO Auto-generated catch block 31 e.printStackTrace(); 32 } 33 }; 34 }.start(); 35 36} 37 38private void filecopy(String dbName) throws IOException, 39 FileNotFoundException { 40 //io流来拷贝 41 //输入流 42 AssetManager assets = getAssets(); 43 //读取assert的文件,转换成InputStream 44 InputStream is = assets.open(dbName); 45 46 //输出流 47 FileOutputStream fos = openFileOutput(dbName, MODE_PRIVATE ); 48 49 //流的拷贝 50 //定义缓冲区大小10k 51 byte[] buffer = new byte[10240]; 52 53 //读取的长度 54 int len = is.read(buffer); 55 int counts = 1; 56 //循环读取,如果读到文件尾部,返回-1 57 while (len != -1) { 58 //把缓冲区的数据写到输出流 59 fos.write(buffer,0,len); 60 //每次100k的时候刷新缓冲区的数据到文件中 61 if (counts % 10 == 0) { 62 fos.flush();//刷新缓冲区 63 } 64 //继续读取 65 len = is.read(buffer); 66 counts++; 67 } 68 fos.flush(); 69 fos.close(); 70 is.close(); 71} 72

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

1import android.content.ContentValues; 2import android.database.Cursor; 3import android.database.sqlite.SQLiteDatabase; 4import android.widget.SlidingDrawer; 5 6/** 7 * 病毒的业务类 8 * @author Administrator 9 * 10 */ 11public class AntiVirusDao { 12 13 /** 14 * @param version 15 * 传递的服务器的病毒库版本 16 * @return 17 * 病毒库版本是否一致,true说明目前本地的病毒库是最新的 18 */ 19 public static boolean isNewVirus(int version){ 20 boolean res = false; 21 SQLiteDatabase database = SQLiteDatabase.openDatabase( 22 "/data/data/"+getPackageName()+ "/files/antivirus.db", null, 23 SQLiteDatabase.OPEN_READWRITE); 24 Cursor cursor = database.rawQuery("select 1 from version where subcnt=?", new String[]{version+""}); 25 if (cursor.moveToNext()) { 26 res = true; 27 } 28 cursor.close(); 29 database.close(); 30 return res; 31 } 32 /** 33 * @param md5 病毒文件的md5 34 * desc 病毒的描述信息 35 * 36 */ 37 public static void addVirus(String md5,String desc){ 38 //获取数据库 39 SQLiteDatabase database = SQLiteDatabase.openDatabase( 40 "/data/data/"+getPackageName()+ "/files/antivirus.db", null, 41 SQLiteDatabase.OPEN_READWRITE); 42 ContentValues values = new ContentValues(); 43 values.put("md5", md5); 44 values.put("type", 6); 45 values.put("name", "Android.Hack.CarrierIQ.a"); 46 values.put("desc", desc); 47 database.insert("datable", null, values); 48 database.close(); 49 } 50 51 /** 52 * @param md5 53 * 文件的md5值 54 * @return 55 * 是否是病毒文件 56 */ 57 public static boolean isVirus(String md5){ 58 boolean res = false; 59 SQLiteDatabase database = SQLiteDatabase.openDatabase( 60 "/data/data/"+getPackageName()+ "/files/antivirus.db", null, 61 SQLiteDatabase.OPEN_READWRITE); 62 Cursor cursor = database.rawQuery("select 1 from datable where md5=?", new String[]{md5}); 63 if (cursor.moveToNext()) { 64 res = true; 65 } 66 cursor.close(); 67 database.close(); 68 return res; 69 } 70} 71

4、判断应用是否是病毒

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

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

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

代码交流 2021