本文同步自wing的地方酒馆

2018年过去了,好像今年没写什么文章,主要是过了写文章的年纪,不过有遇到奇闻轶事或者好玩的,还是会记录下来给大家,一起乐呵乐呵。

跟Iphone X没有太大的缘分,再屏幕又挂了之后,果断搞了一台迈凯伦定制版Android机,正当嗨时,发现使用豌豆荚安装应用完毕的时候,会弹出推荐相关应用的广告,如下图:

在厌烦的背后,也让我有了好奇心,这是怎么做到的? 为什么安装完成的界面会有广告? 为此我将从豌豆荚下载安装的app和正常安装的app进行了对比。

正常安装

豌豆荚安装

观察

通过观察 我们发现,居然安装完毕之后,居然不是同一个Activity,为此,我打开了我的DroidSword插件,来观察安装完毕的Activity到底是何方神圣。

从DroidSword中我们可以看出,安装完毕以后并非系统Activity:

而是 com.pp.assistant.install.installfinish.InstallFinishActivity.

(PP跟豌豆荚合并了?)

什..什么?? 为甚安装完毕的Activity是他自己的Activity,那系统的Activity去哪了?被干掉了吗?Android真的不安全,假想一下,如果其他App掌握了这个技术,我在一个商城下载了美团,直接弹出饿了么,那是多么可怕的一件事情。

好吧,这不是我们今天的重点,我们今天的重点是,豌豆荚是如何把系统的安装界面给干掉了。

破案

于是我就开始沉思,猜测这是怎么实现的。通常的做法是做一个Recevier ,监听完毕,然后关闭掉系统安装完成的Activity,弹出我自己的Activity,可是我如何关闭Activity呢。我为了安全起见,并没有root和给豌豆荚授权辅助功能,所以豌豆荚并没有办法帮我关掉Activity。那这到底是什么黑科技呢?

于是我开启了debug之路,打开DroidSword ,并且开启“调试所有应用”功能,就可以debug任意一个App了,这个功能要感谢XInstaller,因为实在太好用了,为了方便,我就移植到了DroidSwrod中。

调试之路漫漫,从InstallFinishActivity 调试到 startActivity的入口,纠结了很久,都没有发现是如何kill掉系统安装完毕的Activity的。

可以拿到的情报就只有注册了一个StaticPackageReceiver,在这个Receiver里面,做了对新安装应用的监听,以及包名的判断,最终判断是否豌豆荚推荐来的来启动InstallFinishActivity。

这里有个疑问先卖一下关子,为什么豌豆荚要判断是否豌豆荚安装的应用才启动他的Activity,如果有黑科技,那么全程所有安装都替换掉,卖广告岂不是美滋滋?

之后开始怀疑,是否是自己实现了一个安装文件的Activity,可是又好像自己实现的话,并没有权限可以这样做。 然后观察豌豆荚的转跳安装页面,也确实只是系统的


com.android.packageinstaller.PackageInstallerActivity复制代码

那也就是说没有自己实现一个安装时候的Activity。而且DroidSword也看不到在从豌豆荚转跳到安装界面的时候,有另外一个Activity弹出。

哎,愁啊,发愁啊,他到底怎么实现的呢,在我毫无头绪的时候,突然一个意外点击事件,提示了我:

WTF

这什么鬼,说好的豌豆荚自己没有实现一个安装程序呢? 难道是DroidSword 有问题了?他显示的完全就是系统的安装器啊! 于是我点击了下去,选择了豌豆荚的安装器。然后我发现。。。。

豌豆荚居然显示 安全安装(推荐),加粗 ,必须加粗!!

打广告也就算了,还把我系统安装器hook掉了,hook掉也就算了,你居然误导用户以系统的身份来打开你的安装器,去接受你推荐的广告。。 真是不敢想象如果一个小白用户,不小心点击了始终,每次安装都会强行,被迫接受来自豌豆荚的广告。这也有点太【文化人】了。

吐槽完毕,然后我打开了豌豆荚的安装器,发现 。。卧槽!!!!转跳的还是系统的com.android.packageinstaller.PackageInstallerActivity,并且没有被DroidSwrod抓下来,什么Gay ,我现在一脸黑人问号,就像这样:

好吧,不知道做了什么幺蛾子,只能全局搜索安装apk时候使用的URI了。结果果然发现一个问题:

在豌豆荚的清单文件中,发现了一个Activity,他接受了与系统安装器同样的URI:

那结果很明确了,肯定是用这个Activity作为跳板,然后转跳到系统Activity了。那为什么DroidSword会跟踪不到呢?于是我打开了这个Activity。。然后发现了。。

他并没有setContentView,而是给自身windowmanager加了个new view(),layoutParams 宽和高设置的大小是v4,而v4是。。

v4是 -2, -2好像是

 public static final int WRAP_CONTENT = -2;复制代码

也就是说,这个Activity 根本! 没有! 大小!! 简直比1dp Activity还可怕。 那他做了什么事情呢,是如何干掉系统的安装成功页面的呢?继续跟踪调用栈最后肯定是转跳到系统安装的Activity。只不过在之前,对intent做了包装处理:

在apk版本为:Wandoujia_484050_web_seo_baidu_homepage.apk的混淆下,有一个类叫做:

.class public final Lcom/pp/installhook/e;
复制代码

这个类就是从豌豆荚安装中转Activity转跳来的,他对intent做了个加工:

他把普通跳转系统安装Activity的Intent增加了一个Extra ,key为:android.intent.extra.RETURN_RESULT,值为true。 不知道这个会有啥效果,于是我写了个Demo,运行一下,发现~!!! 安装完成的界面居然没有了。。 也就是说,系统安装完成的Activity 是可以通过这个extra给干掉的。

结果

最终总结一下豌豆荚是怎么实现的,就是先起了一个监听器,安装完毕会判断包名来决定启动不启动他自己的广告页面,现在也可以解开疑问了,为什么要判断呢,不判断岂不是更好? 原因就在于,再外调起的安装Activity一般是不带android.intent.extra.RETURN_RESULT参数的,所以都会调起系统自身的安装完成页面。 如果豌豆荚不判断包名,那么会同时弹起系统的和他自己的广告页,这时候就东窗事发,做的事情大白于台下,会影响口碑。

我按照豌豆荚的实现,自己写了个Demo,结果如下,效果一毛一样。

试想一下,如果这个页面不是广告页,而我把安装美团成功后的页面调起为饿了么页面(这里只是举例,与美团饿了么无关),无论对用户还是企业,都是一种巨大的伤害。

反思

我没有root也没有给辅助功能权限,就可以有这么大的本领,来把系统狸猫换太子。 那实在是不敢想,如果我有root权限呢? 恰好是小白用户选择了默认通过授权呢? 这些拥有root权限的App会做什么事情? 细思极恐。作为Android用户,我们如何才能保护好自己?


欢迎加入Android开发 QQ群:425983695

为什么豌豆荚可以在应用安装完成界面打广告?相关推荐

  1. linux 6.4 图形界面,为CentOS 6.4安装图形界面并用VNC远程连接

    为CentOS 6.4安装图形界面并用VNC远程连接 1.安装VNC服务 #yum install -y tigervnc-server #passwd                        ...

  2. Ubuntu 12.04 安装图形界面

    安装图形界面,可使用下面的命令: sudo apt-get update sudo apt-get upgrade sudo apt-get install ubuntu-desktop 如果你只想安 ...

  3. 安装图形界面、VNCserver

    centos7 安装图形界面:     第一步:安装Gnome包  在命令行下 输入下面的命令来安装Gnome包.  #yumgroupinstall"GNOMEDesktop"& ...

  4. CentOS最小化系统,怎么安装图形界面

    CentOS最小化系统做服务器,都是没有图形界面的.很多初学者不习惯命令行操作,那么应该怎么安装图形界面?本经验咗嚛以centos6.5系统为例 方法步骤: 首先进入centos系统界面,先测试一下能 ...

  5. 【学习笔记】Tableau安装与界面介绍

    Tableau安装与界面介绍 一.Tableau下载与安装 网址:https://www.tableau.com 首页进去就可以看到这么一堆吹牛逼的大话,糟了,是那种心动的感觉.但我们大可不必当真,直 ...

  6. CentOS7中安装图形界面

    1.首先检测网络,没有问题,可以通过运行以下命令来安装图形界面: #yum groupinstall -y "GNOME Desktop" 2.yum命令是CentOS系统用来安装 ...

  7. centos7 安装图形界面、VNCserver

    centos7 安装图形界面: 第一步:安装Gnome包 在命令行下 输入下面的命令来安装Gnome包. # yum groupinstall "GNOME Desktop" &q ...

  8. centos恢复图形界面_centos7安装图形界面

    现在centos安装图形化界面主要的有两种,分别是kde和gnome,kde适合客户端,装了很多应用,操作起来像Windows一样,gnome适合服务器端,更精简一些.我安装的gnome桌面,以下是我 ...

  9. 解决 IntelliJ IDEA 安装后界面消失,再次打开后界面不动

    解决 IntelliJ IDEA 安装后界面消失,再次打开后界面不动   为了能解析 JDK 17,笔者不得不下载当前最新版的 IntelliJ IDEA,结果在安装完 IntelliJ IDEA 之 ...

最新文章

  1. Golang 入门系列(十) mysql数据库的使用
  2. pytorch argmax_PyTorch深度学习模型的服务化部署
  3. 畅通工程(kruskal算法)
  4. 北斗三号频点_海格通信发布国内首批北斗三号双模应用专用芯片
  5. xp系统怎么更改计算机用户名和密码,xp系统如何设置开机密码|xp系统电脑怎么改密码-系统城...
  6. NYOJ 小明的调查作业
  7. 数据挖掘算法揭秘篇——分类方法(一)
  8. UML用例图的作用、功能模块图作用与数据库设计三者关系
  9. 一文弄懂BIN、HEX、AXF、ELF文件格式的区别
  10. html 水印插件,Watermark.js 在浏览器端添加水印插件 - 文章教程
  11. 【STM32】通用定时器TIM2-TIM5中断配置方式+继电器控制
  12. freerdp 解压安装_FreeRDP的安装方法
  13. 知识图谱(一):概念与构建
  14. Live800:在线客服系统如何帮助企业创造持续的服务价值?
  15. android 投屏 ipad,ipad投屏到win10电脑
  16. java中的方法使用方法_Java 中方法的创建与使用
  17. MongoDB快速上手、windows安装、常用命令、文档基本增删改查、mongoDB的索引
  18. 人机工程学的基本设计原则(笔记)
  19. Vue使用axios取消上一次请求
  20. 福布斯:区块链——社会影响力未来的关键

热门文章

  1. python基础语法(一)
  2. 返回行javascript比较时间大小
  3. SDUT 1149 勾股定理第一弹 勾股数
  4. 一本计划中的WPF图书目录
  5. 【Scala】Scala中常见集合的使用---代码详解
  6. JConsole监控远程linux下的JVM
  7. 和nginx比较_谈谈Nginx和LVS各自的优缺点以及使用
  8. 03-17 APP自动遍历测试技术
  9. python数据库连接池neo4j_在python中操作neo4j数据库的方法
  10. php xml 实例教程,php解析xml方法实例详解,解析xml实例详解_PHP教程