在做android病毒分析工作时,有时我们需要主动把一个正常文件感染为病毒文件,这时候通常有两种方法,第一种方法是把病毒apk文件复制到正常应用程序的assert文件夹下,然后在应用程序运行后以通知的方式要求用户安装病毒文件,第二种方式是把病毒文件解压到smali源代码,然后把病毒smali文件复制到正常应用程序解压后的smali文件夹下,之后把正常应用的smali文件压缩到apk文件,而到底采用哪一种方式关键就取决于病毒apk文件中是否含有Activiy,因为我们知道如果一个应用如果含有Activity,那这个应用可能含有大量打图像,字符串等,并且布局文件中可能含有大量的View,而R.java文件就是根据这些资源自动生成的,而这和正常应用中的R.java势必是有冲突,若手动修改避开冲突的话,相比一定相当困难,所以采取复制apk到assert文件下下的方式.

好了,下面介绍在apk下查找Activity个数的方法

 

String archiveFilePath="sdcard/SSearch.apk";

PackageManager pm=context.getPackageManager();

PackageInfo info=pm.getPackageArchiveInfo(archiveFilePath,PackageManager.GET_ACTIVITIES);

ActivityInfo[] activities=info.activities;

if(null!=activities)

{ Log.e(tag,"activities:"+activities.length); }

这样就得到了Activity的个数,如果activities为null,说明这个apk中不含有Acticity

同样,用几乎相同的方式,可以得到apk含有Service或者Receiver的个数:

PackageInfo info1=pm.getPackageArchiveInfo(archiveFilePath,PackageManager.GET_SERVICES);

if(null!=services){Log.e(tag,"services:"+services.length);}

PackageInfo info2=pm.getPackageArchiveInfo(archiveFilePath,PackageManager.GET_RECEIVERS);

if(null!=receivers){ Log.e(tag,"receivers:"+receivers.length); }