Android系统扫描带广告应用的方法

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脚本等等统统可以搞定。

 

剩下的一个问题就是广告插件特征库的收集,收集越全,扫描出来的广告插件就可以越准确。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值