本文同步自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彈出。
哎,愁啊,發愁啊,他到底怎麼實現的呢,在我毫無頭緒的時候,忽然一個意外點擊事件,提示了我:
這什麼鬼,說好的豌豆莢本身沒有實現一個安裝程序呢? 難道是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