android上应用广告检测,广告检查,广告扫描,广告杀手,广告插件杀手的应用甚多,但是他们采用了什么原理来进行的呢,今天进行深入剖析。
在反编译带广告的apk的包后,会发下如下特征:
1. manifest.xml文件中有对各个activity的声明,其中包含了广告插件的窗口;
2.广告插件是一个单独的jar包,在混淆中,proguard.cfg文件中必须对public的类和方法做相应的keep处理。
所以,在反编译后的包里面依然可以找到广告插件对应的包名。
针对上述迹象,对目前带广告检测功能的应用进行试验:
1.将待扫描的APK打包进广告插件,给“广告扫描工具”进行扫描。
2.在manifest.xml中声明一些广告平台使用的activity。
LBE和360对广告插件的扫描结果不大一样,LBE能扫描数来的相对多一些。
测试结果如下:
方法1能扫描出来。
方法2不能扫描出来。
所以,在此也打算用包名,类名匹配的方法来进行广告插件扫描。在具体的广告插件扫描方案是:
(1) 列出系统安装的所有apk;
(2)列出每个apk使用的所有class;
(3)单个class与广告插件特征库进行匹配;
在android系统上
(1)获取所有安装的包的代码:
PackageManager packagemgr= getPackageManager();
List<PackageInfo> packageList= packagemgr.getInstalledPackages(0);
count = packageList.size();
for(int i = 0; i < count; i++) {
PackageInfo pi = packageList.get(i);
if (pi.versionName == null)
continue;
//判断该软件包是否在/data/app目录下
File file = new File( "/data/app/" + pi.packageName + ".apk");
if(!file.exists())
systemInstalledApk++;
userInstalledApk++;
/**
* 应用程序的名字
*/
applicationName = pi.applicationInfo.loadLabel(packagemgr).toString();
packageName = pi.packageName;
}
(2)获取单个package内所有的class:
try {
path = context.getPackageManager().getApplicationInfo(packageName, 0).sourceDir;// 获得某个程序的APK路径
} catch (NameNotFoundException e) {
e.printStackTrace();
}
try {
DexFile dexFile = new DexFile(path);// get dex file of APK
Enumeration<String> entries = dexFile.entries();
while (entries.hasMoreElements()) {// travel all classes
String className = (String) entries.nextElement();
}
} catch (IOException e) {
e.printStackTrace();
}
在PC端上:
实现实现上述两点也容易,也不容易。
完全自己的程序的话,可以考虑解析class.dex文件。这个涉及去了解dex文件的格式,然后读取响应的class内容。
如果仅仅是做一个自动化工具的话,可以考虑使用dexdump.exe程序去解析class.dex文件。
剩下的工作可以使,C应用,MFC,Java,shell脚本等等统统可以搞定。
剩下的一个问题就是广告插件特征库的收集,收集越全,扫描出来的广告插件就可以越准确。android广告扫描 广告拦截 相关原理和处理方式可以继续查看相关博文,谢谢!