
做 Android 逆向或者開發(fā)調(diào)試時(shí)手里只有一個(gè) APK 卻沒有源碼很多人第一反應(yīng)就是“反編譯”。JADX 這個(gè)工具在我用過的一堆方案里算是體驗(yàn)最省心的下載、安裝、把 APK 拖進(jìn)去Java 源碼就出來了。這篇教程我打算把 JADX 的下載、安裝和首次使用從頭到尾捋一遍從下載渠道到環(huán)境變量再到常見報(bào)錯(cuò)全部按實(shí)際操作來寫。哪怕你之前沒碰過逆向照著這篇走完也能把 JADX 跑起來。先說明一下教程里的“附安裝包”不是說我在文末塞了一個(gè)網(wǎng)盤鏈接。JADX 更新速度不慢網(wǎng)盤里的版本很快就會(huì)過時(shí)還可能被第三方改動(dòng)。我建議你直接去官方 GitHub Releases 頁面下載最新版我會(huì)把每個(gè)平臺(tái)該選哪個(gè)文件、下載之后怎么校驗(yàn)、怎么安裝都寫清楚。老規(guī)矩只反編譯你自己有權(quán)限分析的 APK這既是對(duì)原作者的尊重也是這一行能持續(xù)下去的基礎(chǔ)。1. 下載前的工具認(rèn)知JADX 憑什么值得裝1.1 一個(gè) APK 在 JADX 里能變成什么JADX 全稱是 Java Android Decompiler名字很直白。它的核心功能就是把 Android 應(yīng)用安裝包里的 dex 字節(jié)碼轉(zhuǎn)換成我們可以讀的 Java 源碼。過去傳統(tǒng)方案是先用 dex2jar 把 dex 轉(zhuǎn)成 jar再用 JD-GUI 打開 jar 看代碼中間一旦遇到多 dex 或者復(fù)雜的字符串加密就容易斷在某個(gè)環(huán)節(jié)。JADX 把這些步驟合并成了一個(gè)動(dòng)作直接把 .apk 拖進(jìn)窗口等待進(jìn)度條走完左側(cè)是包名樹右側(cè)就是還原出來的 Java 代碼。JADX 能看到的還不止代碼。AndroidManifest.xml、資源索引值、布局 XML、圖片資源、字符串資源它都會(huì)幫你整理好。對(duì)于大多數(shù)做分析的人來說這意味著一個(gè)工具就能覆蓋“看入口、看權(quán)限、看邏輯、看資源”的完整鏈路不用在多個(gè)軟件之間來回切換。尤其是剛?cè)胄械呐笥训谝淮伟?APK 拖進(jìn) JADX看到完整源碼的瞬間基本都會(huì)覺得這個(gè)工具值得裝。1.2 和 dex2jar JD-GUI 那套老組合比優(yōu)勢在哪如果只用一句話概括我會(huì)說 JADX 把“看代碼”這個(gè)核心體驗(yàn)做到了極致。JD-GUI 看反編譯結(jié)果時(shí)經(jīng)常會(huì)出現(xiàn)變量名退化成 a、b、c 之類或者代碼結(jié)構(gòu)錯(cuò)亂的情況JADX 在語法還原上更接近編譯器源碼。它對(duì)匿名內(nèi)部類、lambda、switch 字符串哈希的處理都做了優(yōu)化分析業(yè)務(wù)邏輯的時(shí)候干擾少很多。拿我自己的一個(gè)體驗(yàn)來說以前用 dex2jar 處理好幾個(gè) dex 的 App 時(shí)經(jīng)常要手動(dòng) merge類重復(fù)定義的問題能把人逼瘋。JADX 會(huì)自動(dòng)合并所有 dex類名沖突的也會(huì)保留并標(biāo)注。這一點(diǎn)在分析微信、淘寶這種大型應(yīng)用時(shí)尤其重要。下表是我自己常用的幾個(gè)工具橫向?qū)Ρ确奖隳氵x型工具組合能否直接出源碼資源處理上手難度適合場景JADX能一般可看可導(dǎo)出低快速分析業(yè)務(wù)邏輯、找入口、導(dǎo)出工程dex2jar JD-GUI能步驟多弱中老項(xiàng)目、臨時(shí)看某個(gè)類apktool不能只出 smali強(qiáng)可重打包中修改資源、改包名、小改動(dòng)回編譯GDA能較弱中高偏移動(dòng)安全審計(jì)需要多維度調(diào)試平時(shí)我把 JADX 當(dāng)主力閱讀工具遇到需要改資源再回編的情況才會(huì)搬出 apktool。如果某個(gè) App 做了很強(qiáng)的代碼混淆JADX 依然能給你一個(gè)可讀的框架只是具體邏輯會(huì)像“被揉碎的紙片”這時(shí)候就要配合 smali 和動(dòng)態(tài)調(diào)試?yán)^續(xù)往下追了這一點(diǎn)后面會(huì)單獨(dú)講。2. 下載安裝前的環(huán)境準(zhǔn)備2.1 到哪兒下載靠譜版本JADX 的官方發(fā)布地址在 GitHub 上項(xiàng)目名是 skylot/jadx。我不建議在搜索引擎首頁隨便點(diǎn)“高速下載”原因很簡單這種會(huì)被 SEO 優(yōu)化過的頁面經(jīng)常帶捆綁軟件你還沒裝上 JADX先被安裝上一堆全家桶。正確做法是打開 GitHub Releases 頁面認(rèn)準(zhǔn)發(fā)布的 tag一般形式是 v1.5.x。頁面里會(huì)列出當(dāng)前版本的發(fā)行包常見的有jadx-x.x.x.zip # 通用壓縮包Windows / macOS / Linux 都能用 jadx-x.x.x.msi # Windows 安裝程序 jadx-x.x.x.dmg # macOS 磁盤映像 jadx-x.x.x.tgz # Linux 壓縮包選好文件后如果下載慢可以找找有沒有鏡像源但務(wù)必保證文件校驗(yàn)值和官方發(fā)布的一致。官方頁面一般會(huì)提供 SHA256 散列值下載完之后用 PowerShell 或終端算一遍比對(duì)一致再解壓。這一步看著麻煩卻能過濾掉絕大多數(shù)第三方改包。Windows 下校驗(yàn) SHA256 的命令是Get-FileHash .\jadx-1.5.1.zip -Algorithm SHA256macOS 和 Linux 用自帶的shasum -a 256或sha256sum就能算。比對(duì)結(jié)果那串字符串和官方發(fā)布頁是否一致一致再繼續(xù)這是我多年下載工具養(yǎng)成的習(xí)慣。2.2 Java 環(huán)境檢查與安裝JADX 是用 Java 寫的運(yùn)行它必須要有 Java 運(yùn)行時(shí)環(huán)境而且不是隨便一個(gè)舊版本都行。當(dāng)前主流 JADX 版本要求 Java 11 及以上我本機(jī)用的是 OpenJDK 17跑 1.5.x 沒有任何問題。檢查方法很簡單打開終端窗口輸入java -version如果系統(tǒng)提示找不到 java或者顯示版本是 1.8那就要先去裝一個(gè) JDK。發(fā)行版不限Oracle JDK、Eclipse Temurin、Zulu、騰訊 Kona 都可以選一個(gè)比較全的開源版本安裝。安裝完之后關(guān)鍵一步是配環(huán)境變量Windows 用戶在系統(tǒng)變量里新建JAVA_HOME指向 JDK 安裝目錄然后把%JAVA_HOME%\bin追加到Path。macOS 用戶裝完 .pkg 一般會(huì)自動(dòng)配置好Linux 用戶根據(jù)自己的包管理器安裝即可。這里有一個(gè)經(jīng)驗(yàn)如果你電腦上已經(jīng)裝過 Android Studio那么往往已經(jīng)自帶 JBRJetBrains RuntimeJADX 大概率能直接覆蓋以前的版本。但如果你同時(shí)裝了多個(gè) Java 版本終端里的java -version顯示的可能不是你想用的那個(gè)后續(xù)啟動(dòng) JADX 報(bào)版本不足時(shí)優(yōu)先檢查這里。還有一個(gè)小技巧很多系統(tǒng)自帶 Java 配置管理命令Windows 可以用where javamacOS/Linux 可以用which java來確認(rèn)實(shí)際生效的是哪個(gè)路徑。2.3 把命令行工具加進(jìn) PATH可選JADX 安裝包里其實(shí)帶了兩套入口圖形界面jadx-gui和命令行jadx。日常拖 APK 看代碼用 GUI 就夠了但如果你想寫腳本批量反編譯或者通過命令行導(dǎo)出工程就需要把bin目錄加進(jìn) PATH。Windows 下解壓后的目錄假定是D:\tools\jadx-1.5.1那么在“系統(tǒng)屬性 - 環(huán)境變量”里找到Path新增一行D:\tools\jadx-1.5.1\bin。macOS/Linux 下直接把解壓目錄里的bin做成軟鏈接或者把這一行寫進(jìn).bashrc/.zshrcexport PATH$HOME/tools/jadx-1.5.1/bin:$PATH配好之后重新打開終端輸入jadx --version能看到版本號(hào)就說明環(huán)境沒有問題了。這一步不是必須的但配好之后會(huì)讓后面的命令行操作順滑不少。尤其是后面講批量反編譯的時(shí)候不用每次都敲一長串絕對(duì)路徑體驗(yàn)完全不同。3. JADX 安裝全過程圖文拆解3.1 Windows 用戶zip 包免安裝玩法我第一次用 JADX 的時(shí)候選的就是 zip 包原因是不需要注冊表和安裝記錄解壓就能用。具體流程如下下載jadx-x.x.x.zip建議放到一個(gè)不含中文和空格的路徑下比如D:\tools\jadx-1.5.1因?yàn)楹竺娴哪_本對(duì)路徑里的特殊字符可能會(huì)出問題。右鍵壓縮包選擇“解壓到當(dāng)前文件夾”完成后你會(huì)看到類似這樣的目錄結(jié)構(gòu)D:\tools\jadx-1.5.1 │ ├─ bin │ ├─ jadx.bat │ ├─ jadx-gui.bat │ └─ jadx-gui │ └─ lib ├─ jadx-1.5.1.jar └─ ...打開bin目錄雙擊jadx-gui.bat稍等一兩秒會(huì)彈出一個(gè)深色主題的主窗口。如果雙擊后沒有任何反應(yīng)或者屏幕閃了一下就沒了大概率是 Java 環(huán)境的問題。你先打開一個(gè) cmd 窗口手動(dòng)切到bin目錄執(zhí)行jadx-gui.bat這樣屏幕上會(huì)留下具體的報(bào)錯(cuò)信息排查起來會(huì)清楚很多。等窗口啟動(dòng)成功后頂部菜單是File、View、Navigation、Tools這些標(biāo)準(zhǔn)菜單界面布局非常接近常見的 IDE幾乎不需要學(xué)習(xí)成本。首次使用我建議先隨便找一個(gè) APK 打開滾動(dòng)一下源碼面板感受一下字體和配色不喜歡就去View - Theme里換主題。3.2 Windows 用戶MSI 安裝包玩法如果你習(xí)慣像裝普通軟件一樣點(diǎn)“下一步”那選 MSI 安裝包。雙擊運(yùn)行安裝向?qū)б宦?Next到選擇安裝目錄那一步仍然建議改成純英文路徑。安裝完成后開始菜單里會(huì)多出來一個(gè) JADX 文件夾里面有jadx和jadx-gui兩個(gè)快捷方式。MSI 版的好處是它會(huì)自動(dòng)把相關(guān)命令注冊好你不需要手動(dòng)配 PATH缺點(diǎn)是卸載和更新的時(shí)候某些殺毒軟件可能會(huì)把它當(dāng)成可疑程序。遇到這種情況不用慌把jadx-gui.exe或者安裝目錄加入殺毒軟件的信任列表就行。另外MSI 安裝的版本如果以后要卸載記得別直接刪安裝目錄不然注冊表里留一堆垃圾。去“設(shè)置 - 應(yīng)用 - 已安裝的應(yīng)用”找到 JADX 再卸載順便能把 JADX 的緩存文件清理干凈。這樣下次裝新版時(shí)不會(huì)出現(xiàn)環(huán)境沖突。3.3 macOS 用戶DMG 拖拽安裝macOS 下打開下載的.dmg文件系統(tǒng)會(huì)掛載出一個(gè)磁盤映像窗口里面一般有一個(gè) JADX 應(yīng)用圖標(biāo)和一個(gè) Applications 文件夾的替身。你只需要把 JADX 圖標(biāo)拖到 Applications 文件夾里就完成了安裝。首次啟動(dòng)時(shí)如果提示“無法打開因?yàn)?Apple 無法檢查其是否包含惡意軟件”去“系統(tǒng)偏好設(shè)置 - 安全性與隱私 - 通用”頁面點(diǎn)擊“仍要打開”即可。如果連這個(gè)按鈕都沒有可以在終端里執(zhí)行xattr -dr com.apple.quarantine /Applications/jadx-gui.app之后再啟動(dòng)就不會(huì)被攔了。需要注意的是 macOS 版的 GUI 入口其實(shí)是jadx-gui這個(gè)可執(zhí)行腳本如果你想把命令行工具軟鏈到/usr/local/bin可以直接鏈過去。不少 macOS 用戶還習(xí)慣用 Homebrew 安裝 JADX命令是brew install jadx這種方式能自動(dòng)處理 Java 依賴但版本更新可能略晚于官方 GitHub Release怎么方便怎么來。3.4 Linux 用戶tgz 包快速部署Linux 用戶下載.tgz壓縮包或.zip都行解壓后進(jìn)入目錄給 bin 下的腳本加上執(zhí)行權(quán)限chmod x bin/jadx bin/jadx-gui ./bin/jadx-gui如果你是在無桌面環(huán)境的服務(wù)器上使用那就用命令行版./bin/jadx app.apk反編譯結(jié)果會(huì)輸出到指定目錄。我經(jīng)常在遠(yuǎn)程機(jī)器上跑批量反編譯再用 scp 把結(jié)果拉到本地用 GUI 翻這樣能省下不少本地內(nèi)存。Linux 用戶還需要注意一點(diǎn)如果用的是精簡版系統(tǒng)可能缺少libgtk-3之類的圖形庫GUI 啟動(dòng)會(huì)報(bào)錯(cuò)。建議在帶桌面的發(fā)行版上直接運(yùn)行服務(wù)器環(huán)境老老實(shí)實(shí)用命令行版就好。4. 第一次實(shí)戰(zhàn)從 APK 到 Java 源碼4.1 準(zhǔn)備一個(gè)測試 APK學(xué)習(xí)階段不建議直接拿一個(gè)商業(yè) App 練手。你可以去 GitHub 上找一個(gè)開源項(xiàng)目的 debug APK或者用 Android Studio 自己打一個(gè)包。這樣做有好處第一代碼本來就能看到方便你對(duì)照 JADX 反編譯的結(jié)果準(zhǔn)不準(zhǔn)第二不會(huì)觸碰使用條款避免不必要的麻煩。如果確實(shí)要分析某個(gè) App請確保你有足夠的授權(quán)或者是在合規(guī)的測試環(huán)境里進(jìn)行。自己打測試包的時(shí)候我建議打開 Android Studio 的開發(fā)者選項(xiàng)里的“不壓縮庫文件”功能默認(rèn)反編譯資源時(shí)就不會(huì)被壓縮干擾。如果你手頭連 Android Studio 都沒有也可以去一些開源社區(qū)找現(xiàn)成的 sample APK??傊葴?zhǔn)備一個(gè)小體積、結(jié)構(gòu)簡單的包第一次運(yùn)行會(huì)順很多。4.2 jadx-gui 的界面操作打開 GUI 之后File - Open file...選擇你要分析的 APK。文件會(huì)開始加載左下角的進(jìn)度條會(huì)顯示解析到哪個(gè)階段。遇到大型 APK 時(shí)這一步可能持續(xù)幾十秒耐心等待就好不要反復(fù)點(diǎn)擊菜單。加載完成后左側(cè)是一個(gè)樹形結(jié)構(gòu)按照包名層級(jí)展開右側(cè)顯示選中類對(duì)應(yīng)的源碼。很多新手第一次看到這一屏?xí)芘d奮但要注意這個(gè)窗口不是簡簡單單的“源碼閱讀器”它還有很多實(shí)用功能藏得很深。常用的幾個(gè)操作按CtrlShiftF全局搜索字符串或類名這對(duì)定位某個(gè)頁面特別有用在左側(cè)樹里右鍵類名選擇Find Usage可以查看這個(gè)方法被誰調(diào)用頂部Tools菜單里還有反混淆重命名、保存為 Gradle project 等功能。我個(gè)人最常用的是Navigation - Search class by name輸入 Activity 名稱秒跳到目標(biāo)類。如果你要找某個(gè)應(yīng)用的主入口可以看AndroidManifest.xml里帶有MAIN和LAUNCHERaction 的 Activity再順著它往下翻 onCreate整個(gè)啟動(dòng)流程就很清晰了。4.3 項(xiàng)目導(dǎo)出與命令行反編譯GUI 適合人工分析批量場景還是要靠命令行。先把完整命令貼出來jadx -d output_dir your_app.apk-d指定輸出目錄運(yùn)行結(jié)束后輸出目錄里會(huì)有sources文件夾和resources文件夾前者是還原出來的 Java 源碼后者是資源文件。如果你想在 Android Studio 里導(dǎo)入繼續(xù)改源碼JADX 也支持導(dǎo)出 Gradle 工程GUI 里是File - Save as Gradle project...命令行參數(shù)是--export-gradle。用這種方式導(dǎo)出的工程結(jié)構(gòu)和正經(jīng) Android 項(xiàng)目已經(jīng)比較接近但不要指望能一行不改直接編譯官方文檔自己都說了“反編譯后的代碼只能作為參考”。這里還有一個(gè)非常實(shí)用的參數(shù)--show-bad-code遇到某些 JADX 無法完整還原的代碼塊時(shí)它會(huì)把這部分用近似代碼展示出來而不是直接留空。分析疑難樣本時(shí)我基本都會(huì)加上。命令行版的完整調(diào)用我常用的是jadx -d out --show-bad-code --no-res app.apk--no-res表示只反編譯代碼不導(dǎo)出資源文件速度會(huì)快很多。如果你只關(guān)心某個(gè)關(guān)鍵方法可以用--single-class來導(dǎo)出指定類減少無關(guān)干擾。5. 安裝和使用中的高頻問題與排查實(shí)錄5.1 雙擊 bat 閃退的排查套路Windows 上最容易遇到的問題就是雙擊jadx-gui.bat后黑色窗口一閃而過GUI 沒起來。絕大多數(shù)原因是 Java 沒裝好或者 Java 版本低于要求。首先要做的不是重裝而是用當(dāng)前用戶的命令行窗口手動(dòng)執(zhí)行這個(gè) bat。命令行會(huì)顯示具體的錯(cuò)誤如果提示java 不是內(nèi)部或外部命令說明 Java 沒配置到 PATH如果提示UnsupportedClassVersionError說明版本不夠去裝 Java 11 以上的 JDK。還有一個(gè)常見坑用戶裝的是 32 位 JDK而系統(tǒng)是 64 位也可能導(dǎo)致啟動(dòng)異常建議統(tǒng)一用 64 位版本。另外如果你把解壓路徑放在C:\Program Files這種帶空格和權(quán)限控制的目錄里也有概率遇到腳本找不到類路徑的問題。把整個(gè) JADX 目錄移到D:\tools這種簡單路徑能省掉很多煩惱。還有一個(gè)容易被忽略的問題殺毒軟件實(shí)時(shí)防護(hù)。有的安全軟件會(huì)把jadx-gui.bat或java.exe的運(yùn)行攔截掉導(dǎo)致界面閃退。去安全中心看攔截記錄把 JADX 目錄加白名單問題立刻消失。5.2 內(nèi)存不足或卡在加載界面JADX 默認(rèn)的 JVM 堆內(nèi)存不是很大遇到幾十 MB 甚至上百 MB 的 APK會(huì)卡在解析 dex 的過程里甚至直接報(bào)OutOfMemoryError。解決辦法是修改腳本里的 JVM 參數(shù)。Windows 的jadx-gui.bat里會(huì)讀取一個(gè)環(huán)境變量JADX_OPTS你可以在系統(tǒng)環(huán)境變量里新增JADX_OPTS-Xmx2gmacOS/Linux 下同樣把JADX_OPTS導(dǎo)出后再啟動(dòng)。-Xmx2g表示最大堆內(nèi)存 2GB如果你內(nèi)存富余可以設(shè)到 4g。調(diào)大之后大型應(yīng)用反編譯的成功率會(huì)明顯提高。另外反編譯是 CPU 密集型任務(wù)多核機(jī)器可以加-j 0讓 JADX 自動(dòng)使用所有可用核心速度提升非常明顯。如果你是在命令行版里跑直接寫jadx -j 0 -Xmx2g -d out app.apk注意JVM 參數(shù)要放在java命令后面而不是jadx后面所以通過環(huán)境變量來傳遞是最穩(wěn)妥的方式。5.3 中文注釋亂碼怎么處理有時(shí)反編譯出來的源碼里中文字符串全都變成了方塊或問號(hào)。這一般不是 JADX 的問題而是文件編碼沒有設(shè)置為 UTF-8。GUI 啟動(dòng)時(shí)可以在jadx-gui.bat前加一行set JAVA_TOOL_OPTIONS-Dfile.encodingUTF-8或者在你的JADX_OPTS里補(bǔ)上-Dfile.encodingUTF-8。改完重啟工具字符串基本就能正常顯示了。某些資源文件本身就用了 GBK 編碼這時(shí)要看原始 APK 的情況JADX 會(huì)盡可能地按聲明編碼去解。這個(gè)問題在 Windows 中文系統(tǒng)上尤其常見因?yàn)橄到y(tǒng)默認(rèn)代碼頁是 GBKJava 讀取文件時(shí)如果沒有顯式指定 UTF-8就會(huì)按系統(tǒng)默認(rèn)編碼去解析。建議在環(huán)境變量里把JAVA_TOOL_OPTIONS和JADX_OPTS都加上 UTF-8 配置。修改完記得重啟終端和 JADX不然不生效。5.4 反編譯結(jié)果與源碼不一致正常嗎很多新人看到反編譯代碼和自己寫的源碼對(duì)不上會(huì)以為工具壞了。其實(shí) JADX 本質(zhì)上是在做“翻譯”它沒有原始符號(hào)表只能根據(jù)字節(jié)碼逆推。編譯器做過內(nèi)聯(lián)、常量折疊、switch 優(yōu)化之后反編譯代碼和原來寫的多多少少會(huì)不一樣。遇到明顯不合理的邏輯可以先看看是不是混淆過的原因?;煜龝?huì)把類名、方法名改成 a、b、c甚至加入無用代碼JADX 再厲害也變不回人類命名的樣子。這時(shí)候有兩條路一是用 JADX 自帶的反混淆功能它會(huì)給變量重新起有意義的名稱二是對(duì)著 smali 逐行看雖然累但能看到最底層的東西。JADX 的反混淆功能在Tools - Deobfuscation菜單下它會(huì)嘗試根據(jù)上下文推斷變量含義但不能保證 100% 還原。對(duì)于嚴(yán)重混淆的代碼我更推薦 JADX 配合--deobf參數(shù)在命令行里導(dǎo)出時(shí)自動(dòng)做反混淆效果比 GUI 里的默認(rèn)選項(xiàng)好一截。還有一個(gè)規(guī)律如果反編譯后的代碼里頻繁出現(xiàn)goto或者異常 try/catch 嵌套往往說明源碼用了 ASM 字節(jié)碼插樁或者雙護(hù)城河加固這時(shí)候不要死磕 JADX換個(gè)動(dòng)態(tài)分析的思路可能更高效。6. 我的實(shí)操心得與后續(xù)擴(kuò)展6.1 讓 JADX 更好用的幾個(gè)小配置第一次打開 JADX你會(huì)覺得深色主題很酷但長時(shí)間看字會(huì)覺得累。我習(xí)慣在View - Theme里切到淺色主題再把字體調(diào)成等寬字體比如 JetBrains Mono 或 Consolas。遇到某個(gè)類源碼行數(shù)特別多時(shí)可以用View - Show Bytecode在源碼和字節(jié)碼之間快速切換定位到關(guān)鍵邏輯后再切回 Java 視圖這種閱讀效率比單純抱著反編譯源碼啃高很多。還有一個(gè)快捷鍵值得記住在左側(cè)樹里按類名首字母能快速跳到對(duì)應(yīng)的類在源碼里按CtrlB可以直接跳轉(zhuǎn)到方法定義。GUI 默認(rèn)會(huì)在啟動(dòng)時(shí)加載上一次打開過的項(xiàng)目如果不希望泄露工作痕跡可以在Setting里關(guān)掉“Restore previous session”。我還會(huì)把Code area - Word wrap打開長行邏輯讀起來不用橫向拖滾動(dòng)條。這些配置看起來都是小事但實(shí)際分析一整天代碼后體驗(yàn)差別非常大。6.2 組合拳JADX apktool 動(dòng)態(tài)調(diào)試JADX 不是萬能的。碰到需要修改資源再回編譯的場景我會(huì)用 apktool 解包和重打包碰到關(guān)鍵邏輯走不通時(shí)再用動(dòng)態(tài)調(diào)試工具在系統(tǒng)層去驗(yàn)證。一個(gè)典型流程是這樣先用 JADX 打開 APK定位到目標(biāo)方法確認(rèn)它最終調(diào)用了哪些 native 函數(shù)接著用 apktool 解包看看 so 文件在哪里最后用調(diào)試器 hook 一下參數(shù)看真正傳給 native 層的數(shù)據(jù)是不是 JADX 里看到的那樣。這套組合拳能覆蓋大多數(shù)逆向分析的常規(guī)需求而 JADX 在其中承擔(dān)的是“地圖”的角色先有地圖再去探索比直接深入底層高效得多。簡單說就是 JADX 負(fù)責(zé)靜態(tài)代碼閱讀apktool 負(fù)責(zé)資源修改和重打包動(dòng)態(tài)調(diào)試負(fù)責(zé)驗(yàn)證運(yùn)行時(shí)行為。三者各司其職缺一不可。如果你是剛開始接觸可以把一個(gè)簡單的開源 App 從 JADX 到動(dòng)態(tài)調(diào)試完整走一遍比看一百篇教程都有用。6.3 學(xué)習(xí)方向與合規(guī)提醒如果你是因?yàn)榕d趣開始接觸 JADX我建議把 Android 開發(fā)四大組件、dex 文件格式、smali 語法這三塊補(bǔ)一補(bǔ)。逆向分析不是只會(huì)按按鈕理解了底層數(shù)據(jù)結(jié)構(gòu)和系統(tǒng)啟動(dòng)流程你看到的反編譯代碼才會(huì)從“天書”變成“有邏輯的文檔”。同時(shí)也提醒一句反編譯別人的應(yīng)用之前一定要確認(rèn)授權(quán)邊界。你可以用它來分析自己開發(fā)的 App 的加固是否到位也可以用它做安全研究但不要拿 JADX 去竊取別人的核心代碼或繞過付費(fèi)機(jī)制。工具本身沒有立場使用方式?jīng)Q定了它的價(jià)值。最后分享一個(gè)我個(gè)人的操作習(xí)慣每次更新 JADX 版本前我會(huì)先把舊版本目錄整個(gè)刪掉再用新版本重新跑一遍平時(shí)常用的那批 APK。JADX 的更新經(jīng)常帶來反編譯邏輯的改進(jìn)有些老版本里崩潰的樣本新版可能一次就解開了。留一臺(tái)干凈的環(huán)境能幫你更快發(fā)現(xiàn)新版本的脾氣。