Notice: Undefined variable: row in
/var/www/html/blog.inc.php on line
25
當一個程式被切斷網路通訊 (見上一篇) 後,若程式有植入 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 /
回應:0