[英]Decompiling obfuscated Android dex/jar files into Java source code
[英]decompiling DEX into Java sourcecode
如何將Android DEX(VM字節碼)文件反編譯成對應的Java源代碼?
獲取這些工具:
源代碼非常易讀,因為 dex2jar 做了一些優化。
這是有關如何反編譯的過程:
將 test_apk-debug.apk 中的 classes.dex 轉換為 test_apk-debug_dex2jar.jar
d2j-dex2jar.sh -f -o output_jar.jar apk_to_decompile.apk
d2j-dex2jar.sh -f -o output_jar.jar dex_to_decompile.dex
注 1:在 Windows 機器中,所有
.sh
腳本都替換為.bat
腳本
注 2:在 linux/mac 上不要忘記
sh
或bash
。 完整的命令應該是:
sh d2j-dex2jar.sh -f -o output_jar.jar apk_to_decompile.apk
注意 3:另外,記得給
dex2jar-XX
目錄添加執行權限,例如sudo chmod -R +x dex2jar-2.0
在 JD-GUI 中打開 jar
為了稍微澄清一下,根據您要完成的任務,您可以在此處采用兩條主要路徑:
將 Dalvik 字節碼 (dex) 反編譯為可讀的 Java 源代碼。 正如 fred 所提到的,您可以使用dex2jar和jd-gui輕松完成此操作。 生成的源代碼對於閱讀和理解應用程序的功能很有用,但可能不會生成 100% 可用的代碼。 換句話說,您可以閱讀源代碼,但您無法真正修改和重新打包它。 請注意,如果源代碼已被混淆器混淆,則生成的源代碼將更難以解開。
另一個主要的替代方法是將字節碼反匯編為smali ,這是一種專為此目的而設計的匯編語言。 我發現最簡單的方法是使用apktool 。 一旦你安裝了 apktool,你只需將它指向一個 apk 文件,你就會為應用程序中包含的每個類返回一個 smali 文件。 您可以通過從新的 Java 源代碼生成 smali 來讀取和修改 smali 甚至完全替換類(為此,您可以使用 javac 將您的 .java 源代碼編譯為 .class 文件,然后將您的 .class 文件轉換為使用 Android 的 .dex 文件dx 編譯器,然后使用 baksmali(smali 反匯編程序)將 .dex 文件轉換為 .smali 文件,如本問題所述。這里可能有快捷方式)。 完成后,您可以輕松地再次使用 apktool 將 apk 打包備份。 請注意,apktool 不會對生成的 apk 進行簽名,因此您需要 像處理任何其他 Android 應用程序一樣處理它。
如果您走 smali 路線,您可能想嘗試APK Studio ,這是一個自動執行上述某些步驟的 IDE,以幫助您反編譯和重新編譯 apk 並將其安裝到設備上。
簡而言之,您的選擇幾乎是反編譯為 Java,后者更易讀但可能不可逆,或者反匯編為 smali,后者更難閱讀但更靈活地進行更改和重新打包修改后的應用程序。 您選擇哪種方法取決於您要實現的目標。
最后,大膽的建議也值得注意。 它是一個重定向工具,用於將 .dex 和 .apk 文件轉換為 java .class 文件,以便使用典型的 java 靜態分析工具對其進行分析。
我實際上建議去這里: https : //github.com/JesusFreke/smali
它提供了 BAKSMALI,這是一個最優秀的 DEX 文件逆向工程工具。 它是由 JessFreke 制作的,他為 Android 創建了著名的 ROM。
首先,您需要一個工具將 DEX 上的所有(已編譯)類提取到 JAR 中。
有一個叫做dex2jar ,它是由中國學生制作的。
然后,您可以使用jd-gui將 JAR 上的類反編譯為源代碼。
生成的源代碼應該非常易讀,因為 dex2jar 應用了一些優化。
您可以使用APKTool 。 它會自動提取所有類( .dex
)、資源( .asrc
),然后將二進制 XML轉換為人類可讀的 XML ,並且還會為您分解類。
反匯編總是比反編譯更健壯,尤其是在
使用 Pro Guard 混淆的 JAR!
直接告訴APKTool把APK解碼成目錄,然后修改你想要的,
最后將其編碼回 APK。 就這樣。
重要提示: APKTool反匯編. 它不會反編譯。
生成的代碼不會是 Java 源代碼。
但是如果您熟悉jasmin ,您應該能夠閱讀它,甚至可以編輯它。
如果您需要 Java 源代碼,請查看手動方式。
由於Dheeraj Bhaskar
的答案與過去許多年一樣古老。
這是我最新的(2019 年)回答:
從dex
轉java sourcecode
,目前有兩種解決方案:
One Step
:直接將dex
轉java sourcecode
Two Step
:首先將dex
轉換為jar
,然后將jar
轉換為java sourcecode
dex
直接轉java sourcecode
bin
文件夾中可以看到命令行jadx
或者GUI版本jadx-gui
,雙擊運行GUI版本: jadx-gui
dex
文件然后可以顯示java源代碼:
File
-> save as gradle project
然后得到java源代碼:
dex
到jar
下載dex2jar zip ,解壓得到d2j-dex2jar.sh
,然后:
apk
到jar
: sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
dex
到jar
: sh d2j-dex2jar.sh -f ~/path/to/dex_to_decompile.dex
例子:
➜ v3.4.8 /Users/crifan/dev/dev_tool/android/reverse_engineering/dex-tools/dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f com.huili.readingclub8825612.dex
dex2jar com.huili.readingclub8825612.dex -> ./com.huili.readingclub8825612-dex2jar.jar
➜ v3.4.8 ll
-rw------- 1 crifan staff 9.5M 3 21 10:00 com.huili.readingclub8825612-dex2jar.jar
-rw------- 1 crifan staff 8.4M 3 19 14:04 com.huili.readingclub8825612.dex
jar
轉java sourcecode
這里演示Procyon
將 jar 轉換為 java 源代碼:
下載procyon-decompiler-0.5.34.jar
然后使用語法:
java -jar /path/to/procyon-decompiler-0.5.34.jar -jar your_to_decompile.jar -o outputFolderName
例子:
java -jar /Users/crifan/dev/dev_tool/android/reverse_engineering/Procyon/procyon-decompiler-0.5.34.jar -jar com.huili.readingclub8825612-dex2jar.jar -o com.huili.readingclub8825612
使用編輯器VSCode打開導出的源代碼,如下所示:
轉換正確性: Jadx
> Procyon
> CRF
> JD-GUI
推薦使用:(一步解決方案) Jadx
更詳細的解釋請參考我的在線中文電子書: 安卓應用的安全和破解
有時您會在使用dex2jar
/ apktool
時遇到損壞的代碼,尤其是在循環中。 為避免這種情況,請使用jadx ,它將 dalvik 字節碼反編譯為 java 源代碼,而無需像dex2jar
那樣首先創建.jar
/ .class
文件(我認為 apktool 使用 dex2jar)。 它也是開源的並且正在積極開發中。 對於 GUI 狂熱者來說,它甚至還有一個 GUI。 嘗試一下!
由於沒有人提到這一點,所以還有一個工具: DED主頁
安裝方法和一些解釋:安裝。
它被用於一項關於頂級市場應用程序安全性的非常有趣的研究(不是真正相關,只是如果你很好奇): Android 應用程序安全性調查
下載 APK 文件后,您需要執行以下步驟以獲取可編輯的 Java 代碼/文檔。
Android 逆向工程是可能的。 按照以下步驟從 apk 文件中獲取 .java 文件。
第1步 。 使用 dex2jar
dex2jar sampleApp.apk
第2步 。 使用 JD-GUI 反編譯 .jar
最近的 Debian 有 Python 包androguard
:
Description-en: full Python tool to play with Android files
Androguard is a full Python tool to play with Android files.
* DEX, ODEX
* APK
* Android's binary xml
* Android resources
* Disassemble DEX/ODEX bytecodes
* Decompiler for DEX/ODEX files
安裝對應的包:
sudo apt-get install androguard python-networkx
反編譯DEX文件:
$ androdd -i classes.dex -o ./dir-for-output
從 Apk + 反編譯中提取classes.dex
:
$ androdd -i app.apk -o ./dir-for-output
Apk 文件只不過是 Java 存檔 (JAR),您可以通過以下方式從存檔中提取文件:
$ unzip app.apk -d ./dir-for-output
自從發布了這些答案中的大部分以來,已經發生了很多變化。 現在有許多帶有 GUI 的簡單工具,例如:
APK Easy Tool for Windows (GUI tool, friendly)
Bytecode Viewer - APK/Java Reverse Engineering Suite
URET Android Reverser Toolkit
找到它們的最佳位置是在 XDA 開發人員論壇上。
你可以試試 JADX ( https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler ),這是一個完美的 DEX 反編譯工具。
是的,它也可以在 (my :0)) 新網站上在線獲得: http : //www.javadecompilers.com/apk/
這可以通過以下五個步驟來完成:
反編譯 Android 應用程序的最簡單方法是從 playstore 下載名為ShowJava的應用程序。 只需從應用程序列表中選擇需要反編譯的應用程序即可。 您可以使用三種不同的反編譯器來反編譯應用程序 -
CFR 0.110、JaDX 0.6.1 或 FernFlower(分析反編譯器)。
如果您不想下載 dex2jar,那么只需使用apk_grabber
python 腳本將任何 apk 反編譯為 jar 文件。 然后你用 jd-gui 閱讀它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.