不久前金山公司推出了手机毒霸,并声称手机毒霸具有了清除广告的功能,顿时在业内掀起轩然大波。国内众多靠广告生存的移动开发者们对金山的这一功能进行强烈的谴责,但另一方面,大多数用户都觉得这个功能挺不错的,毕竟国内市场上的应用里的广告真的实在太多了。
         当然口水战不是本文关注的重点,只是对手机毒霸的去广告功能产生的极大的兴趣。这东西到底是怎么实现的呢?在好奇心的驱使下,通过一些技术手段分析了一下手机毒霸(v1.6.0)去广告功能的实现原理,在此与大家一起分享。如有错误的地方,敬请不吝赐教!
1.       手机毒霸去广告功能简介
          
    如图所示,当用户打开某款带有广告的应用后,广告在屏幕底部显示了出来,而此时在屏幕的左下角,出现的手机毒霸的一个小窗口。当用户点击这个  小窗口里的叉叉,广告就会被去除。
         那这个毒霸的小窗口是手机毒霸放出来的一个悬浮窗口吗?是与不是,只需要看一下当前屏幕上View的层级关系即可。请出SDK自带工具hierarchyviewer后,可以发现这个小窗口不是悬浮的,它就是在广告应用的界面之中。到这里读者应该也猜到了,广告应用被手机毒霸注入了。这也是手机毒霸需要申请root权限才能去广告的原因。
2.       手机毒霸把什么注进了广告应用
进程注入的通常做法是使用ptrace()来使目标进程加载一个预先准备好的.so,然后执行.so里的函数。那广告应用被注入时,加载了哪个.so呢?其实通过访问/proc节点就可以知道了。运行adb shell su 0 cat /proc/xxx/maps(其中xxx是广告应用的pid)。
51914000-51915000 r--s 00014000 b3:14 97609      /data/data/com.ijinshan.duba/app_jar/ksremote.jar
5b31f000-5b32c000 rwxp 00000000 b3:14 97610      /data/data/com.ijinshan.duba/app_ctrl/libksrootclient.so
5b353000-5b369000 r--p 00000000 b3:14 97612      /data/data/com.ijinshan.duba/app_jar/ksremote.dex
5b369000-5b36b000 r--p 00016000 b3:14 97612      /data/data/com.ijinshan.duba/app_jar/ksremote.dex
5b36b000-5b388000 r--p 00018000 b3:14 97612      /data/data/com.ijinshan.duba/app_jar/ksremote.dex
可以看到广告应用被注入后,加载了3个文件: ksremote.jar
ksremote.dex 和libksrootclient.so。
         其中ksremote.jar 包含了两个文件:ksremote.dex 和 adclose.png。这个adclose.png就是刚才提到的关闭广告的小窗口图标了  。
         顺便提一下,手机毒霸不仅注入普通应用进程,同时也注入了zygote,system_server以及com.android.systemui三个系统进程,但注入之后所做的事情跟注入普通应用进程是不一样的。
         
3.       注入后做了些什么
想要实现Java层的注入,通常的做法是首先注入.so,然后通过.so加载.jar/.dex文件。libksrootclient.so 很显然担起了这个重任,并且跳到ksremote.dex中KsRemoteCtrl类的SetAppHook()中去执行。在SetAppHook()里主要做了一下几件事情。
a) 加载图片资源:adclose.png
b) 反射得到ActivityThread类的currentActivityThread()获得当前ActivityThread对象
c) 加载/data/data/com.ijinshan.duba/app_ctrl/libksrootclient.so,并调用native方法StartSocketHook()。这里是在Native层对网络操作函数加Hook。
d) 反射获得当前ActivityThread对象的mInitialApplication成员(Application 类型),从而获得当前包名(Context.getPackageName())
e) 如果发现自己不是"com.ijinshan.duba",就开始更新广告规则
f) 替换当前ActivityThread中的mH(Handler类型)的mCallback,用金山自定义的一个callback对象来包裹过原callback并且替换原callback,从而起到hook作用。
拦截的消息有:RESUME_ACTIVITY,PAUSE_ACTIVITY,RECEIVER,ACTIVITYBIND_APPLICATION
在广告应用中某个Activity的onResume()触发前,注入的代码会先遍历当前Activity里的所有View,一旦找到广告View,就会调用addView()将添加到广告View的附近。
同样在Activity的onPause()触发前,会做一些清理工作。
4.       广告是怎么“去除”的
当用户点击时,注入的代码主要做了如下几件事情:
a)  将目标广告view设成View.GONE,从而隐藏。
b)  将  设成View.GONE。
总的来说,手机毒霸的去广告的功能的用户体验还是不错的。无需修改应用就能去除应用中的广告。而且目前市场上还未曾出现过第二款能去嵌入式广告的安全软件。
但同时手机毒霸也存在着一些不足和可以改进的空间:
1)  需要root,毕竟并不是所有的用户都会root自己的手机,而且root以后手机的风险将更大。
2)  仅能去除部分类型的广告。有些广告手机毒霸目前还检测不出来  都没能显示。
3)  去除的广告有可能复发。因为有些广告插件会反复将广告View设成VISIBLE,而手机毒霸只是去除第一次的显示。
4)  手机毒霸的去广告功能其实只是一个UI操作,广告SDK如果还在后台继续下载广告内容的话,依然会占用流量,也会占用一定的CPU。
另外,补充一点,手机毒霸的开发人员还真是大大滴狡猾,把好几个重要的.so和.jar文件都隐藏成了.mp3文件,然后打包进了apk。不过还是被我们发现了。

@安卓安全小分队
http://weibo.com/androidsecurity
原文地址:点击打开链接

手机毒霸去广告功能分析之一:总体分析相关推荐

  1. 手机毒霸去广告功能分析二:广告View的识别

    手机毒霸去广告功能分析二:广告View的识别 手机毒霸对于广告View的判定规则分析 上次我们提到手机毒霸获得root权限之后,生成一个root进程,然后通过进程注入的方式将广告应用中的广告检测出来, ...

  2. 手机毒霸去广告功能分析一:总体分析

    不久前金山公司推出了手机毒霸,并声称手机毒霸具有了清除广告的功能,顿时在业内掀起轩然大波.国内众多靠广告生存的移动开发者们对金山的这一功能进行强烈的谴责,但另一方面,大多数用户都觉得这个功能挺不错的, ...

  3. 金山手机毒霸屏蔽广告 19家广告平台联合抵制

    [搜狐IT消息]9月14日消息,针对金山手机毒霸屏蔽应用广告一事,安沃.力美.多盟.捕鱼达人等19家移动开发者和移动广告平台发表联合声明,要求金山尽快更改其手机毒霸软件,立即停止破坏正常移动广告商业行 ...

  4. 金山手机毒霸工作原理

    本文章由Jack_Jia编写,转载请注明出处.   文章链接:http://blog.csdn.net/jiazhijun/article/details/8804402 作者:Jack_Jia    ...

  5. 谈谈对金山手机毒霸事件的看法

    近来,"金山手机毒霸"事件被吵的沸沸扬扬的. 所谓的金山手机毒霸事件,就是金山推出的以屏蔽Android平台广告为卖点的安全软件,可以清除软件内置广告.在推出测试版并且在未进行推广 ...

  6. 安卓4.3系统,请问如何关闭通知栏里金山手机毒霸的常驻通知

    分享到: 2013-10-19 10:08提问者采纳 您好,感谢您对金山网络的支持:关闭常驻通知:左上角主界面----软件设置----通知栏图标,关闭.希望可以帮到您!微笑为您解答,如果有什么问题还可 ...

  7. 新毒霸悟空2014 v0709 官方版

    新毒霸悟空2014 v0709 官方版 软件大小:19.8MB 软件语言:简体中文 软件性质:常用软件 软件授权:官方版 更新时间:2014-07-11 应用平台:/Win8/Win7/WinXP 新 ...

  8. 手机 听广播 不用 耳机 android,FM手机调频收音机无广告

    fm手机调频收音机去广告版是一款非常实用的听收音机的软件,用户在收听电台时不会出现语音广告内容,将界面弹窗也进行了删除,软件变得清爽流畅,用户可以随意调节频道,收听不同地区的电台广播,并且无需要天线即 ...

  9. 小米手机ADB删除系统应用去广告

    小米手机ADB删除系统应用去广告 前言 1.准备 2.进入开发者模式 3.连接手机与电脑 4.使用ADB命令删除系统应用 前言 本文要介绍的方法可以免 root 卸载预置应用,仅删除当前用户下的 AP ...

最新文章

  1. 如何将你拍摄的照片转换成全景图及六面体(PTGui)
  2. 将windows系统装到USB存储设备
  3. 使用C#开发交互式命令行应用
  4. linux链接器脚本,vmlinux-lds 连接器脚本
  5. HDU1249 三角形【切割平面】
  6. Matlab取整函数: fix, floor, ceil, round.
  7. 外省市机动车驾驶证换领本市机动车驾驶证
  8. 多媒体音箱选购指南--理论篇
  9. 正点原子 fac_us=SystemCoreClock/8000000
  10. sublime text3 英文版转为中文版
  11. 如何查看交换机型号(厂商)
  12. css——给多张图片设置一个背景图:上下固定尺寸+中间拉伸,里面放内容
  13. VMWare虚拟机 网络连接模式
  14. html生成真正的空图片代码 用canvas和script生成无实质性的空白图像 比图像透明处理还要牛 那种空白透明头像就是这么做出来的
  15. VPS融合怪测评脚本(主体已完善,历史遗留问题解决时间未知)(VPS fusion monster evaluation script)
  16. 栈和队列的区别,栈和堆得区别
  17. 综合算法03—FrankWolfe_BPR配流算法
  18. Java医院就诊挂号系统
  19. JavaScript-字符串知识讲解
  20. Python Matplotlib 画心形曲线

热门文章

  1. [Delphi]罗技无限灵貂,驱动程序扩展补丁-Logz V3.0 (所有四向滚轮鼠标、应用窗体对话框均能通用)
  2. 超实用!6种方法教你轻松删除Word空白页
  3. 原生JS实现移动端选择器插件
  4. 用c语言求一组数中最大值和最小值,用c语言求一组数组的最大值以及最小值
  5. Windows与Linux虚拟机间的简单文件互传
  6. “这里不会发生”:大多数组织都否认网络威胁
  7. 批量爬取手机某app动态壁纸
  8. 华为十年测试老鸟教您如何写高质量的自动化测试工程师简历--看完必有所获
  9. 骑行用什么蓝牙耳机好,盘点骑行达人必备的耳机
  10. 读《长安十二时辰》有感——SIEM/SOC建设要点