Stark Wong 的個人開發網站
 


 此頁面:更新於 2019 年 5 月 2 日 12 時 04 分 09 秒,頁面處理需時 0.0009 秒
 網站內容版權所有(C)Stark Wong。頁面(不包括檔案)可自由連結。網站系統版本 1.90-AngularJSBase (2015/9/27)
 
網站地圖

Notice: Undefined variable: row in /var/www/html/blog.inc.php on line 22
Android 程式斷網化 - Firebase 篇

當一個程式被切斷網路通訊 (見上一篇) 後,若程式有植入 Firebase 時,程式啟動後短時間就會自動關閉且顯示如下的錯誤記錄:

FATAL EXCEPTION: firebase-installations-executor-2
Process:                           , PID: 3006
java.lang.SecurityException: Permission denied (missing INTERNET permission?)
        at java.net.Inet6AddressImpl.lookupHostByName(…)
        at java.net.Inet6AddressImpl.lookupAllHostAddr(…)
        at java.net.InetAddress.getAllByName(InetAddress.java:1154)
        at com.android.okhttp.Dns$1.lookup(Dns.java:39)
        at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(…)
        at com.android.okhttp.internal.http.RouteSelector.nextProxy(…)
        at com.android.okhttp.internal.http.RouteSelector.next(…)
        at com.android.okhttp.internal.http.StreamAllocation.findConnection(…)
        at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(…)
        at com.android.okhttp.internal.http.StreamAllocation.newStream(…)
        at com.android.okhttp.internal.http.HttpEngine.connect(…)
        at com.android.okhttp.internal.http.HttpEngine.sendRequest(…)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(…)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(…)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(…)
        at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(…)
        at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(…)
        at com.google.firebase.installations.s.c.a(Unknown Source:0)
        at com.google.firebase.installations.s.c.a(Unknown Source:8)
        at com.google.firebase.installations.s.c.a(Unknown Source:53)
        at com.google.firebase.installations.h.d(Unknown Source:45)
        at com.google.firebase.installations.h.d(Unknown Source:34)
        at com.google.firebase.installations.h.b(Unknown Source:0)
        at com.google.firebase.installations.b.run(Unknown Source:4)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)

雖然從 Stack Trace 中看到也是 okhttp.Dns$1.lookup 拋出的錯誤,但由於 com.android.okhttp 是存在於系統的套件,無法直接在程式源碼層面中修改。要避過 Firebase 的斷網問題,有至少兩個方法可以實行。

1. 停止 Firebase 的自動初始化功能

有進行過植入 Firebase 的網友都應該記得,我們並不需要寫任何編碼 Firebase 就能自動初始化。究竟 Firebase 是如何自動初始化的呢?根據官方解釋 (https://firebase.googleblog.com/2016/12/how-does-firebase-initialize-on-android.html),Firebase 是利用 Content Provider 會自動被系統建立的特性來故意濫用作自動初始化 Firebase 的,所以最簡單迴避 Firebase 初始化的方法就是把 AndroidManifest 裡如下列的定義刪掉:

<provider android:authorities="                          .firebaseinitprovider" android:directBootAware="true" android:exported="false" android:initOrder="100" android:name="com.google.firebase.provider.FirebaseInitProvider"/>

這個方法對只使用單一 Firebase App 的程式上沒有問題,不過對於會手動呼叫 FirebaseApp.initializeApp() 的程式則沒有作用,需要使用方法 2 解決。

2. 強制初始化失敗

對於會呼 FirebaseApp.initializeApp(),我們需要參照上列的 Stack Trace 研究可以防止初始化的方法。首先在com\google\firebase\installations\s\c.smali 中尋找呼叫 getOutputStream() 的位置,然後可以確定是在 private static void a(URLConnection p0, byte[] p1)。往下面看一點,:cond_0 是拋出 IOException 的地方,我們又可以利用這個地方進行拋出。在 getOutputStream() 那一句前面加 goto :cond_0 作無條件式跳到 :cond_0 就完成修改。

在防止 Firebase 初始化後,程式就可以完全斷網而不會因沒有定義 INTERNET 權限而發生錯誤。


撰寫於:2021/8/29 00:37:27 / 回應已關閉
正在讀取回響內容...
其他內容請回到主頁