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

2024-04-29 00:38

本文主要是介绍手机毒霸去广告功能分析之一:总体分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 不久前金山公司推出了手机毒霸,并声称手机毒霸具有了清除广告的功能,顿时在业内掀起轩然大波。国内众多靠广告生存的移动开发者们对金山的这一功能进行强烈的谴责,但另一方面,大多数用户都觉得这个功能挺不错的,毕竟国内市场上的应用里的广告真的实在太多了。
         当然口水战不是本文关注的重点,只是对手机毒霸的去广告功能产生的极大的兴趣。这东西到底是怎么实现的呢?在好奇心的驱使下,通过一些技术手段分析了一下手机毒霸(v1.6.0)去广告功能的实现原理,在此与大家一起分享。如有错误的地方,敬请不吝赐教!
1.       手机毒霸去广告功能简介
         去广告1.jpg 
    如图所示,当用户打开某款带有广告的应用后,广告在屏幕底部显示了出来,而此时在屏幕的左下角,出现的手机毒霸的一个小窗口。当用户点击这个 去广告2.gif 小窗口里的叉叉,广告就会被去除。
         那这个毒霸的小窗口是手机毒霸放出来的一个悬浮窗口吗?是与不是,只需要看一下当前屏幕上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就是刚才提到的关闭广告的小窗口图标了 去广告2.gif 
         顺便提一下,手机毒霸不仅注入普通应用进程,同时也注入了zygotesystem_server以及com.android.systemui三个系统进程,但注入之后所做的事情跟注入普通应用进程是不一样的。
         
3.       注入后做了些什么
想要实现Java层的注入,通常的做法是首先注入.so,然后通过.so加载.jar/.dex文件。libksrootclient.so 很显然担起了这个重任,并且跳到ksremote.dexKsRemoteCtrl类的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_ACTIVITYPAUSE_ACTIVITYRECEIVERACTIVITYBIND_APPLICATION
在广告应用中某个ActivityonResume()触发前,注入的代码会先遍历当前Activity里的所有View,一旦找到广告View,就会调用addView()将添加到广告View的附近。
同样在ActivityonPause()触发前,会做一些清理工作。
4.       广告是怎么“去除”的
当用户点击时,注入的代码主要做了如下几件事情:
a)  将目标广告view设成View.GONE,从而隐藏。
b)  将 去广告2.gif 设成View.GONE
总的来说,手机毒霸的去广告的功能的用户体验还是不错的。无需修改应用就能去除应用中的广告。而且目前市场上还未曾出现过第二款能去嵌入式广告的安全软件。
但同时手机毒霸也存在着一些不足和可以改进的空间:
1)  需要root,毕竟并不是所有的用户都会root自己的手机,而且root以后手机的风险将更大。
2)  仅能去除部分类型的广告。有些广告手机毒霸目前还检测不出来 去广告2.gif 都没能显示。
3)  去除的广告有可能复发。因为有些广告插件会反复将广告View设成VISIBLE,而手机毒霸只是去除第一次的显示。
4)  手机毒霸的去广告功能其实只是一个UI操作,广告SDK如果还在后台继续下载广告内容的话,依然会占用流量,也会占用一定的CPU
另外,补充一点,手机毒霸的开发人员还真是大大滴狡猾,把好几个重要的.so.jar文件都隐藏成了.mp3文件,然后打包进了apk。不过还是被我们发现了。

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

这篇关于手机毒霸去广告功能分析之一:总体分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/944678

相关文章

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

Spring中Bean有关NullPointerException异常的原因分析

《Spring中Bean有关NullPointerException异常的原因分析》在Spring中使用@Autowired注解注入的bean不能在静态上下文中访问,否则会导致NullPointerE... 目录Spring中Bean有关NullPointerException异常的原因问题描述解决方案总结