簡體   English   中英

將 DEX 反編譯為 Java 源代碼

[英]decompiling DEX into Java sourcecode

如何將Android DEX(VM字節碼)文件反編譯成對應的Java源代碼?

這簡單

獲取這些工具:

  1. dex2jar將 dex 文件轉換為 jar 文件

  2. jd-gui查看jar中的java文件

源代碼非常易讀,因為 dex2jar 做了一些優化。

程序:

這是有關如何反編譯的過程:

第1步:

將 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 上不要忘記shbash 完整的命令應該是:

sh d2j-dex2jar.sh -f -o output_jar.jar apk_to_decompile.apk 

注意 3:另外,記得給dex2jar-XX目錄添加執行權限,例如sudo chmod -R +x dex2jar-2.0

dex2jar 文檔

第2步:

在 JD-GUI 中打開 jar

反編譯的源碼

為了稍微澄清一下,根據您要完成的任務,您可以在此處采用兩條主要路徑:

將 Dalvik 字節碼 (dex) 反編譯為可讀的 Java 源代碼。 正如 fred 所提到的,您可以使用dex2jarjd-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。

fred答案的更完整版本:

手動方式

首先,您需要一個工具將 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 年)回答:

主要邏輯

dexjava sourcecode ,目前有兩種解決方案:

  • One Step :直接將dexjava sourcecode
  • Two Step :首先將dex轉換為jar ,然后將jar轉換為java sourcecode

一步解決: dex直接轉java sourcecode

工具

過程

  1. 下載jadx-0.9.0.zip ,解壓,在bin文件夾中可以看到命令行jadx或者GUI版本jadx-gui ,雙擊運行GUI版本: jadx-gui

  1. 打開dex文件

然后可以顯示java源代碼:

  1. File -> save as gradle project

然后得到java源代碼:


兩步解決方案

第一步: dexjar

工具

過程

下載dex2jar zip ,解壓得到d2j-dex2jar.sh ,然后:

  • apkjar : sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
  • dexjar : 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

Step2: jarjava 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。 嘗試一下!

我用過了

  1. dex2jar + jd-gui
  2. javadecompilers.com
  3. 美化
  4. 應用工具

但沒有人能打敗谷歌自己的工具

1) Android Studio 2.x:構建>分析apk 在此處輸入圖片說明

2) Android Studio 3.0:配置文件或調試 APK 在此處輸入圖片說明 在此處輸入圖片說明

由於沒有人提到這一點,所以還有一個工具: DED主頁

安裝方法和一些解釋:安裝

它被用於一項關於頂級市場應用程序安全性的非常有趣的研究(不是真正相關,只是如果你很好奇): Android 應用程序安全性調查

下載 APK 文件后,您需要執行以下步驟以獲取可編輯的 Java 代碼/文檔。

  1. 將您的 apk 文件轉換為 zip(在開始下載時不要使用“保存”選項,只需使用“另存為”並將您的擴展名提及為 .zip),這樣做您可以避免使用 APKTOOL...
  2. 解壓 zip 文件,在那里你可以找到 somefilename.dex。 所以現在我們需要轉換 dex -> .class
  3. 要做到這一點,你需要“dex2jar”(你可以從http://code.google.com/p/dex2jar/下載它,解壓后,在命令提示符下你必須提到, [D:\\dex2jar-0.09> dex2jar somefilename.dex] (請記住,您的 somefilename.dex 必須位於保存 dex2jar 的同一文件夾中。)
  4. http://www.viralpatel.net/blogs/download/jad/jad.zip下載 jad 並解壓。 解壓后,您可以看到兩個文件,例如“jad.exe”和“Readme.txt”(有時可能是“jad.txt”而不是“jad.exe”,因此只需將其擴展名重命名為.exe 即可運行)
  5. 最后,在命令提示符中你必須提到像[D:\\jad>jad -sjava yourfilename.class]它將把你的類文件解析成可編輯的 java 文檔。

使用Dedexer ,您可以將.dex文件反匯編為 dalvik 字節碼 ( .ddx )。

據我所知,對 Java 進行反編譯是不可能的。
您可以在此處閱讀有關 dalvik 字節碼的信息

Android 逆向工程是可能的 按照以下步驟從 apk 文件中獲取 .java 文件。

第1步 。 使用 dex2jar

  • 從 .apk 文件生成 .jar 文件
  • 命令: dex2jar sampleApp.apk

第2步 。 使用 JD-GUI 反編譯 .jar

  • 它反編譯 .class 文件,即我們將從 apk 中得到混淆的.java。

最近的 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/

這可以通過以下五個步驟來完成:

即使安裝了所需的工具,這個 gem 也會自動為你做這些事情

  1. 將 apk 文件轉換為 zip
  2. 解壓文件
  3. 從中提取classes.dex
  4. 使用dex to jar將classes.dex轉成jar文件
  5. 使用jadx gui打開jar文件作為java源代碼

反編譯 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM