扫描带有广告应用原理
简要说明下,目前市面上已经有几款软件可以实现扫描出手机里那款软件包含了广告,甚至连广告平台以及插件数量都可以知道。
肯定的是android没有提供一个API来告诉你是否有广告,那怎么实现的呢?
在这里我拒绝直接上来就是代码,代码很简单,我希望大家学会一种思维模式,而不是单纯的copy。
以下是我在考虑这个问题的时候一些想法。
假设一:扫描APK内包含的3方广告插件jar,通过与收集到的jar做对比。
假设二:扫描manifest,对比一些广告平台声明的activity之类。
假设三:2点之前搞不定就睡觉。
好了,我首先想到的是假设一,我觉得他的可能性最大,因为我们知道,我们可以获得一个APK的icon、packagename、permission等等等等的东西,没错,首先想到的就是packageinfo和ApplicationInfo两个类,如果这里面可以得到程序所有jar包的某些特征,是不是就可以达到扫描广告应用的效果了呢?
经过验证,尽管里面有如sharedLibraryFiles等方法,依然没有得到想要的效果。转战假设二。
在假设二中,我尝试得到某个程序的所有activity,这种方法虽然可行,可是明显过于粗糙,显然达不到市面上反广告软件的99%扫描率一说。再次失败。
转战假设三。
继续实验:
1、把manifest的关于广告需要的声明全去掉,结果被查出广告。
2、把jar包不add进工程,只放在libs下面,结果被查出广告。
3、把jar包彻底删掉,终于没有被查了。
这样又回到了假设一,他到底是怎么把我的jar包搞到的,并且可以和他库内的特征对比。
直到12点,感觉搞不定了,准备睡觉。
睡觉前又想了一遍,为什么,为什么反广告软件不仅能知道你的广告平台,更神的是加载了同一广告平台的不同程序,他可扫描出你用了哪种形式的广告。
突然有了假设四:扫描所有类文件。
仔细想想,如果想得到上面效果,就必须知道你引用了那种广告的类,才肯能判断你加了什么广告。
进一步验证,由于假设三中有一种情况是不add广告的jar包也会被查,果断的反编译自己的APK,查看后了然,尽管项目中没有add,可以在libs下的jar包毅然也被打进了工程,见下图。
注意对比,看到没,waps的包还是被打进工程了,看到包里的类众猿应该明白了把,成功就在眼前,因为大多广告平台由于要把SDK给开发者用,都会把不同的广告做成不同的类,再看类的命名就一切都明白了。
以防万一自己模拟了一个广告SDK的包名、类名,果然被查出广告。
至此得出结论:反广告软件通过扫描程序内所有类文件,根据其包名、类名确定广告平台以及广告种类。
最后抛出一个问题,他是如何获取到程序所有类名。由于packageinfo和ApplicationInfo都没有关于所有类的描述,最后找到了方法,不废话了,直接代码给大家
<SPAN style="FONT-SIZE: 18px"> String path = "";
try {
path = getPackageManager().getApplicationInfo(
"com.xxx.xxx", 0).sourceDir;//获得某个程序的APK路径
} catch (NameNotFoundException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
try {
DexFile df = new DexFile(path);//传如APK实例一个dexfile
Enumeration<String> s = df.entries();
while (s.hasMoreElements()) {//遍历出所有类
String string = (String) s.nextElement();
Log.i("test", string);
}
Log.i("test", df.getName() + "");
} catch (IOException e1) {
// TODO Auto-generated catch block
Log.i("test", "error" + e1.getMessage());
e1.printStackTrace();
}</SPAN>
String path = "";
try {
path = getPackageManager().getApplicationInfo(
"com.xxx.xxx", 0).sourceDir;//获得某个程序的APK路径
} catch (NameNotFoundException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
try {
DexFile df = new DexFile(path);//传如APK实例一个dexfile
Enumeration<String> s = df.entries();
while (s.hasMoreElements()) {//遍历出所有类
String string = (String) s.nextElement();
Log.i("test", string);
}
Log.i("test", df.getName() + "");
} catch (IOException e1) {
// TODO Auto-generated catch block
Log.i("test", "error" + e1.getMessage());
e1.printStackTrace();
}
好了,得到了想要的,接下来就是和收集到的广告平台做对比然后反馈给用户了。
最后多说一下关于广告的看法,首先我在另一个论坛说了要找应对反广告策略,就不再继续了,时间实在有限。有兴趣的同学可自行研究。因为一些反广告软件也逐渐的收敛了,我自己而言对那些常驻通知栏的流氓广告也极其讨厌。
这又说明了一点,选择一个有良心的广告平台也是一个关键,近期央视曝光的一些垃圾平台偷用户隐私也该死,也害苦各位程序猿。
运用上面的知识你可以更好的选择广告,当然你也可以制作一个反广告软件,只要不让本就苦逼的程序猿更苦逼就好。
补充:移动开发 , Android ,