首页
论坛
课程
招聘
[原创]手机毒霸去广告功能分析一:总体分析
2013-3-20 10:51 25648

[原创]手机毒霸去广告功能分析一:总体分析

2013-3-20 10:51
25648
不久前金山公司推出了手机毒霸,并声称手机毒霸具有了清除广告的功能,顿时在业内掀起轩然大波。国内众多靠广告生存的移动开发者们对金山的这一功能进行强烈的谴责,但另一方面,大多数用户都觉得这个功能挺不错的,毕竟国内市场上的应用里的广告真的实在太多了。
  当然口水战不是本文关注的重点,只是对手机毒霸的去广告功能产生的极大的兴趣。这东西到底是怎么实现的呢?在好奇心的驱使下,通过一些技术手段分析了一下手机毒霸(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。不过还是被我们发现了。

手机毒霸去广告功能分析一:总体分析
手机毒霸去广告功能分析二:广告View的识别
手机毒霸去广告功能分析三:java代码(dex)注入

@安卓安全小分队
http://weibo.com/androidsecurity

[看雪官方培训] Unicorn Trace还原Ollvm算法!《安卓高级研修班》2021年秋季班火热招生!!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (26)
雪    币: 3
活跃值: 活跃值 (295)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
yy大雄 活跃值 2013-3-20 11:04
2
0
图挂了
雪    币: 556
活跃值: 活跃值 (71)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
金罡 活跃值 1 2013-3-20 11:10
3
0
LZ图挂了,上传附件别引用外链。
雪    币: 0
活跃值: 活跃值 (11)
能力值: ( LV4,RANK:100 )
在线值:
发帖
回帖
粉丝
ansquad 活跃值 2013-3-20 11:14
4
0
图片改为附件了,大家能看到了吗?
雪    币: 761
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
赤子Anatta 活跃值 2013-3-20 11:46
5
0
其实设置成mp3,也是为了保护自身。
雪    币: 34607
活跃值: 活跃值 (151664)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
linhanshi 活跃值 2013-3-20 19:24
6
0
Thanks for share.
雪    币: 19
活跃值: 活跃值 (581)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
riusksk 活跃值 41 2013-3-20 21:27
7
0
不错,期待继集
雪    币: 51
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
麦小扣 活跃值 2013-3-20 22:45
8
0
弱弱的问一下 注入的时候一般使用ptrace()
ptrace() 不是需要 父子进程的关系吗
正在运行的 程序 怎么能成为子进程呢
雪    币: 0
活跃值: 活跃值 (11)
能力值: ( LV4,RANK:100 )
在线值:
发帖
回帖
粉丝
ansquad 活跃值 2013-3-21 10:31
9
0
有root权限后,就可以ptrace attach任何进程了。
雪    币: 6
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
haodaya 活跃值 2013-3-21 11:07
10
0
貌似LBE的广告拦截功能也很强大~也能实现金山毒霸的功能
雪    币: 0
活跃值: 活跃值 (11)
能力值: ( LV4,RANK:100 )
在线值:
发帖
回帖
粉丝
ansquad 活跃值 2013-3-21 11:15
11
0
好主意,我们回头也花点时间分析下LBE的广告拦截是怎么做的。然后比较下。
雪    币: 204
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
四个螳螂 活跃值 1 2013-3-21 17:15
12
0
好吧,其实手机毒霸内部的广告拦截机制lz分析的只是jar层中的一小部分,主要的禁用部分是jni里面实现的,jar层还做了其他一列的措施。。。
雪    币: 124
活跃值: 活跃值 (39)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ouyangtian 活跃值 2013-3-21 22:40
13
0
强贴,mark
雪    币: 370
活跃值: 活跃值 (16)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
荒野无灯 活跃值 5 2013-3-21 23:54
14
0
最后一句亮了:“把好几个重要的.so和.jar文件都隐藏成了.mp3文件~~”
呵呵
嗯,目前我用过的能去广告的,除了手机毒霸,还有lbe隐私卫士。
雪    币: 159
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
eddie 活跃值 2013-3-22 09:40
15
0
Mark 留着今后慢慢看。
雪    币: 67
活跃值: 活跃值 (11)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
coltor 活跃值 2 2013-3-22 23:51
16
0
mark,...
雪    币: 10
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
骨祭 活跃值 2013-3-25 11:15
17
0
看过之后 发现我学习的东西太肤浅了, 现在这篇文章, 只能看个大概明白. 细节部分, 完全搞不懂.
雪    币: 84
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
janecd 活跃值 2013-4-8 13:59
18
0
楼主很强大,学习了。
雪    币: 202
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
无胜 活跃值 2013-4-9 20:22
19
0
感谢分享!学习一下原理~~~
雪    币: 31
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
千灵紫皇 活跃值 2013-5-8 01:44
20
0
留下膜拜的印记
雪    币: 357
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
炎羽 活跃值 2013-9-6 11:19
21
0
哎哟,不错,这个屌.
雪    币: 100
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
MONKEYiiD 活跃值 2013-9-6 17:11
22
0
mark,谢谢分享~~
雪    币: 36
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
未来神棍 活跃值 2013-9-16 17:22
23
0
mark
雪    币: 41
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
丽seven 活跃值 2013-9-18 11:05
24
0
对于有金山毒霸图标的那种广告确实把view设置成gone就能消失,但金山好像并不是只有这一种策略拦截广告,对于一种在acitivity上方显示的滚动广告也能进行拦截,但用的却是另外一种机制,这种广告不会添加金山的边上不会添加金山的图标,拦截后却也能消失,不知道怎么做到的。。。
雪    币: 2
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jmbjlg 活跃值 2015-8-10 18:28
25
0
太强 太牛逼了
游客
登录 | 注册 方可回帖
返回