为何豌豆荚能够在应用安装完成界面打广告?

本文同步自wing的地方酒馆php

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

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

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

正常安装

普通安装

豌豆荚安装

豌豆荚安装

观察

经过观察 咱们发现,竟然安装完毕以后,竟然不是同一个Activity,为此,我打开了个人DroidSword插件,来观察安装完毕的Activity究竟是何方神圣。web

从DroidSword中咱们能够看出,安装完毕之后并不是系统Activity:安全

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

(PP跟豌豆荚合并了?)app

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

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

破案

因而我就开始沉思,猜想这是怎么实现的。一般的作法是作一个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

相关文章
相关标签/搜索