Stark Wong 的個人開發網站
 


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

Notice: Undefined variable: row in /var/www/html/blog.inc.php on line 22
去網路化 - okhttp 4.3

某程式的新版本改用了 okhttp 4.3 或以上的版本,沿用的去網路化方式不再適用。

在舊版本的 okhttp 中,Dns$1.lookup() 裡可以直接跳到 :cond_0 以拋出 UnknownHostException,然而在新版本的 okhttp,Dns$1 被 Dns$Companion$DnsSystem 所取代,而 lookup() 方法裡並沒有檢查參數是否空值 (即原來 if-eqz p1, :cond_0),改為依賴 InetAddress.getAllByName() 拋出 NullPointerException,然後再改拋 UnknownHostException。

catch_0 就是改拋 UnknownHostException 的位置,但由於它會將原來捕捉到的例外存到 v0 並在後面插入到例外原因,所以我們不能直接用 goto 跳到那個位置。理論上我們可以把 move-exception v0 和 .line 3 後面 initCause 那句刪掉就應該可以用 goto,但有沒有更簡單的方法呢?

答案是有的!既然我們知道這個 lookup() 方法會捕捉 NullPointerException,那麼我們讓 InetAddress.getAllByName() 拋出 NullPointerException 就行。至於方法當然就是直接讓傳入參數變成 null!我們只需要在呼叫 InetAddress.getAllByName() 前 (在 .line 1 與 :try_start_0 之間) 加 “const/4 p1, 0x0” 就可以讓 lookup() 的第一個參數變成 null (Dalvik 中物件是以地址方式存放在變數中,所以將地址改成 0 即為 null),然後在呼叫 InetAddress.getAllByName() 的時候就會拋出 NullPointerException,至此對 okhttp 4.3 的去網路化完成。


撰寫於:2022/5/25 18:00:09 / 回應已關閉
正在讀取回響內容...
其他內容請回到主頁