非ROOT環(huán)境下使用Frida及JEB調(diào)試
設(shè)備
Android版本: 9 MIUI版本: 11.0.5穩(wěn)定版 手機型號: Redmi Note 8 CPU信息:

關(guān)于ROOT
ARMV8的引入以及Google對安全的重視,使得Android獲取ROOT權(quán)限很難。那個僅僅依靠一個apk就能實現(xiàn)手機ROOT的時代基本上一去不返了。apk提權(quán)基于的是Android系統(tǒng)的漏洞,目前Android已經(jīng)很完善了,尋找漏洞非常困難。
目前獲取ROOT基本都是通過刷安裝包來實現(xiàn)。當(dāng)然了Android模擬器可以很輕松獲取ROOT權(quán)限。但是很多APP都對模擬器有檢測,并且模擬器的架構(gòu)基本上基于的是x86,與arm有很大的區(qū)別。
市面上大多數(shù)的手機都是非ROOT的,不能為了使用一次Frida就去刷機吧。
刷機有風(fēng)險,智能變板磚。筆者曾刷小米6的手機,結(jié)果很不幸。
非ROOT環(huán)境下使用Frida
本文使用的apk是領(lǐng)跑娛樂.apk。有需要的可以私心我。一個賭博類的app,不要作非法的事情噢。
(1)解包: java-jar apktool_2.4.1.jar d game.apk
(2)修改AndroidManifext文件。添加 android:debuggable="true"
。
(3)下載相應(yīng)的gadget放到lib/ABI目錄下。通過file命令可以查看動態(tài)庫的具體信息。

由于是32位,這里選擇android-arm.so.xz版本。

下載完成后,復(fù)制到對應(yīng)的目錄下面,如下圖:

(4)修改smali代碼,加載libfrida-gadget.so,通常是在Application的onCreate方法或者啟動Activity的onCreate方法。
筆者選擇在啟動Activity的onCreate方法中添加。
.method public constructor <init>()V
? ?.locals 1
? ?invoke-direct {p0}, Lcom/fish/main/BaseGameActivity;-><init>()V
? ?const/4 v0, 0x0
? ?iput-boolean v0, p0, Lcom/fish/main/MainGameActivity;->p:Z
? ?# System.loadLibrary("frida-gadget")
? ?const-string v0, "frida-gadget"
? ?invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
? ?return-void
.end method
(5)打包 java-jar apktool_2.4.1.jar b game
(6)重新簽名 jarsigner-verbose-keystore burning.keystore-signedjar game_signed.apk game.apk burning
(7)安裝 adb install-r game_signed.apk
(8)啟動程序,這里通常會黑屏,等待連接,具體可參見第9步
(9)查看進程信息,可以看出注入成功了。

通過logcat可以看到如下的信息,說明frida-server已經(jīng)開啟了監(jiān)聽。

(10)運行 frida-UGadget-l1.js
。腳本能夠正常運行,于是可以愉快的HOOK了。

權(quán)限
如果本來就有這個權(quán)限,那就不需要添加了。
<uses-permission android:name="android.permission.INTERNET" />
調(diào)試
(2)修改AndroidManifext文件。添加
android:debuggable="true"
。
加上這句話之后,就可以通過jeb進行調(diào)試了。關(guān)于JEB調(diào)試,后面會專門講解。

寫在最后
這種方式有一個明顯的缺點,那就是需要修改smali源代碼,而很多apk是不允許修改smali源碼的(dex文件),當(dāng)然這個可以通過Frida給HOOK掉。
有什么辦法不改smali?有的,通過動態(tài)連接庫的依賴加載來實現(xiàn),這個會在Frida高級篇進行介紹。
公眾號
關(guān)于Frida更多內(nèi)容,歡迎關(guān)注我的微信公眾號:無情劍客。
