dịch ngược DEX thành mã nguồn Java


706

Làm cách nào để dịch ngược các tệp Android DEX (VM bytecode) thành mã nguồn Java tương ứng?


Có một cái nhìn ở đây . Bạn sẽ nhận được dẫn có thể từ đó để di chuyển trên.
Kevin Boyd

Thông tin cập nhật có sẵn trên blog trung tâm lập trình viên: coders-hub.com/2013/04/how-to-convert-apk-file-into-source.html
Md Mohsin

Nếu bạn có tiền, hãy mua jeb , nếu không hãy sử dụng jadx , xem tại sao
polym

Có một công cụ mã nguồn mở (java) và mã nguồn mở mới, cho phép bạn làm điều đó, chỉ cần kiểm tra bytecodeviewer: stackoverflow.com/a/36557898/795245
Gomino

Câu trả lời:


881

Dễ thôi

Nhận các công cụ này:

1) dex2jar để dịch các tập tin dex sang tập tin jar

2) jd-gui để xem các tệp java trong tệp jar

Mã nguồn khá dễ đọc vì dex2jar thực hiện một số tối ưu hóa.

Thủ tục:

Và đây là quy trình về cách dịch ngược:

Bước 1:

Chuyển đổi class.dex trong test_apk-debug.apk thành 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

Lưu ý 1: Trong các máy Windows, tất cả các .shtập lệnh được thay thế bằng .battập lệnh

Lưu ý 2: Trên linux / mac đừng quên shhoặc bash. Lệnh đầy đủ phải là:

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

Lưu ý 3: Ngoài ra, hãy nhớ thêm quyền thực thi vào dex2jar-X.Xthư mục, vdsudo chmod -R +x dex2jar-2.0

tài liệu dex2jar

Bước 2:

Mở tệp jar trong JD-GUI

Nguồn dịch ngược


57
+1. Tôi đã thử cả Baksmali và Dex2jar. Dex2Jar + JD-Gui chiến thắng vì đã cung cấp cho bạn mã nguồn hoàn toàn dễ đọc cho hầu hết các tệp .dex.
Jonathan Dumaine

xin chào, bạn sẽ vui lòng chia sẻ con đường bạn đang đi chứ? Tôi sẽ rất biết ơn bạn.
Arslan Anwar

2
Câu trên đã rung chuông - có vẻ như là một câu trích dẫn từ đây: geeknizer.com/decompile-reverse-engineer-android-apk (hoặc ngược lại?). Các bài viết được liên kết giải thích ngắn gọn các công cụ được đề cập ở trên cũng như Smali và APKTool.
Đặc vụKnopf

2
@JonathanDumaine mà phụ thuộc. Nếu các JAR bị xáo trộn và bạn muốn thực hiện các sửa đổi nhỏ, Backsmali là cách duy nhất để đi. Tặng kem! Với APKTool, bạn cũng nhận lại tất cả các XML, hình ảnh và các tài nguyên khác. Xem câu trả lời của tôi .
Alba Mendez

3
@JonathanDumaine Tôi đồng ý với jmendeth, apktool cũng là cách để đi nếu bạn muốn dịch ngược apk của mình, sửa đổi nó và sau đó biên dịch lại nó. Trong khi sử dụng dex2jar và jd-gui, nguồn rất dễ đọc nhưng bạn không thể biên dịch lại một số lỗi!
darkheir

138

Để làm rõ phần nào, có hai con đường chính bạn có thể đi ở đây tùy thuộc vào những gì bạn muốn thực hiện:

Dịch ngược mã byte Dalvik (dex) thành nguồn Java có thể đọc được. Bạn có thể làm điều này một cách dễ dàng với dex2jarjd-gui , như đề cập đến fred. Nguồn kết quả rất hữu ích để đọc và hiểu chức năng của một ứng dụng, nhưng có thể sẽ không tạo ra mã có thể sử dụng 100%. Nói cách khác, bạn có thể đọc nguồn, nhưng bạn thực sự không thể sửa đổi và đóng gói lại. Lưu ý rằng nếu nguồn đã bị xáo trộn với proguard, mã nguồn kết quả sẽ khó gỡ rối hơn.

Một lựa chọn chính khác là tháo rời mã byte thành smali , một ngôn ngữ lắp ráp được thiết kế cho mục đích chính xác này. Tôi đã thấy rằng cách dễ nhất để làm điều này là với apktool . Khi bạn đã cài đặt apktool, bạn có thể chỉ vào tệp apk và bạn sẽ nhận lại một tệp smali cho mỗi lớp có trong ứng dụng. Bạn có thể đọc và sửa đổi smali hoặc thậm chí thay thế hoàn toàn các lớp bằng cách tạo smali từ nguồn Java mới (để làm điều này, bạn có thể biên dịch nguồn .java của mình thành các tệp. Class bằng javac, sau đó chuyển đổi các tệp. Class của bạn thành các tệp .dex bằng Android trình biên dịch dx, và sau đó sử dụng baksmali (trình dịch ngược smali) để chuyển đổi các tệp .dex thành .smali, như được mô tả trong câu hỏi này. Có thể có một phím tắt ở đây). Khi bạn đã hoàn tất, bạn có thể dễ dàng đóng gói lại apk với apktool. Lưu ý rằng apktool không ký apk kết quả, vì vậy bạn sẽ cần phải chăm sóc nó giống như bất kỳ ứng dụng Android nào khác .

Nếu bạn đi theo con đường smali, bạn có thể muốn thử APK Studio , một IDE tự động hóa một số bước trên để hỗ trợ bạn dịch ngược và biên dịch lại apk và cài đặt nó trên thiết bị.

Nói tóm lại, các lựa chọn của bạn khá nhiều để dịch ngược sang Java, dễ đọc hơn nhưng có thể không thể đảo ngược hoặc để phân tách thành smali, khó đọc hơn nhưng linh hoạt hơn để thực hiện các thay đổi và đóng gói lại một ứng dụng đã sửa đổi. Phương pháp bạn chọn sẽ phụ thuộc vào những gì bạn đang muốn đạt được.

Cuối cùng, đề nghị của dám cũng là lưu ý. Đây là một công cụ nhắm mục tiêu lại để chuyển đổi các tệp .dex và .apk thành các tệp java. Class, để chúng có thể được phân tích bằng các công cụ phân tích tĩnh java điển hình.


61

Tôi thực sự khuyên bạn nên đến đây: https://github.com/JesusFreke/smali

Nó cung cấp BAKSMALI, một công cụ kỹ thuật đảo ngược tuyệt vời nhất cho các tệp DEX. Nó được tạo bởi JesusFreke, người đã tạo ra các ROM nổi tiếng cho Android.


3
smali là một ngôn ngữ giống như lắp ráp dựa trên dalvik IL, nó không thể được dịch trực tiếp sang Java.
reflog

@endryha Không có công cụ nào có khả năng làm điều đó. Xem câu hỏi này để biết thêm.
Alba Mendez

1
Mã, mã, mã, ... Tại sao chỉ có mã? Nếu bạn sử dụng APKTool, bạn sẽ nhận lại mọi thứ ! Và nó đơn giản như ./apktool d myprogram.apk. Xem câu trả lời của tôi .
Alba Mendez

30

Một phiên bản đầy đủ hơn của câu trả lời của fred :

Cách thủ công

Trước tiên, bạn cần một công cụ để trích xuất tất cả các lớp (đã biên dịch) trên DEX sang JAR.
Có một cái gọi là dex2jar , được tạo bởi một sinh viên Trung Quốc.

Sau đó, bạn có thể sử dụng jd-gui để dịch ngược các lớp trên JAR thành mã nguồn.
Nguồn kết quả phải khá dễ đọc, vì dex2jar áp dụng một số tối ưu hóa.

Cách tự động

Bạn có thể sử dụng APKTool . Nó sẽ tự động trích xuất tất cả các lớp ( .dex), nguồn lực ( .asrc), sau đó nó sẽ chuyển đổi XML nhị phân để XML con người có thể đọc được , và nó cũng sẽ Thao thiêt các lớp học dành cho bạn.
Việc tháo gỡ sẽ luôn mạnh mẽ hơn so với dịch ngược, đặc biệt là với các
JAR bị xáo trộn với Pro Guard!

Chỉ cần yêu cầu APKTool giải mã APK vào một thư mục, sau đó sửa đổi những gì bạn muốn
và cuối cùng mã hóa lại thành APK. Đó là tất cả.

: Quan trọng APKTool dissassembles . Nó không dịch ngược .
Mã được tạo sẽ không phải là nguồn Java.
Nhưng bạn sẽ có thể đọc nó và thậm chí chỉnh sửa nó nếu bạn quen thuộc với jasmin .
Nếu bạn muốn nguồn Java, vui lòng đi qua cách thủ công .


25

Đôi khi bạn nhận được mã bị hỏng, khi sử dụng dex2jar/ apktool, đáng chú ý nhất là trong các vòng lặp. Để tránh điều này, hãy sử dụng jadx , dịch ngược mã hóa dalvik của mã nguồn thành mã nguồn java, mà không tạo tệp .jar/ .classtrước như dex2jar(apktool sử dụng dex2jar tôi nghĩ). Nó cũng là nguồn mở và đang phát triển tích cực. Nó thậm chí còn có GUI, dành cho tín đồ GUI. Thử nó!


Tôi cho rằng jadx không có tùy chọn biên dịch nhưng mã vẫn có thể đọc được
Buddy

@EnesBattal bạn có ý nghĩa như thế javac "$(find . -name '*.java')"nào?
polyme

Làm thế nào về việc hình thành một apk? đặt các lớp học trong apk, zipalign, ký, v.v.
Buddy

@EnesBattal Vâng, bạn có thể giúp thực hiện điều đó - nếu không bạn có thể sử dụng apktool cho rằng .. hoặc / dấu căn chỉnh nén với các công cụ android
polym

1
@lejonl Tử hình cho bạn, bạn quái vật!
Polyme

17

tôi đã sử dụng

  1. dex2jar + jd-gui
  2. javadecompilers.com
  3. tuyên bố
  4. Apktool

Nhưng không có công cụ nào của Google

1) Android Studio 2.x: xây dựng> phân tích apk nhập mô tả hình ảnh ở đây

2) Android Studio 3.0: APK hồ sơ hoặc gỡ lỗi nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây


1
Thêm một cho Enjarify. Theo kinh nghiệm cá nhân của tôi, nó đã được chứng minh là cho kết quả tốt hơn so với d2j
qre0ct

15

Vì không ai đề cập đến điều này, nên có thêm một công cụ: trang chủ DED

Cài đặt cách làm và một số giải thích: Cài đặt .

Nó được sử dụng trong một nghiên cứu khá thú vị về bảo mật của các ứng dụng thị trường hàng đầu (không thực sự liên quan, chỉ khi bạn tò mò): Khảo sát về bảo mật ứng dụng Android


Có vẻ đầy hứa hẹn. Nó có dịch ngược mã Java trực tiếp tạo thành APK không? Điều gì về mã Java bị xáo trộn?
Sandfish

14

Từ Dheeraj Bhaskar câu trả lời tương đối cũ như nhiều năm trước.

Dưới đây là câu trả lời mới nhất (năm 2019) của tôi:

Logic chính

từ dexđến java sourcecode, hiện có hai loại giải pháp:

  • One Step: trực tiếp chuyển đổi dexsangjava sourcecode
  • Two Step: chuyển đổi đầu tiên dexsang jar, chuyển đổi thứ hai jarthànhjava sourcecode

Giải pháp một bước: dextrực tiếp đếnjava sourcecode

Công cụ

Quá trình

  1. tải về jadx-0.9.0.zip , giải nén nó, trong binthư mục có thể thấy dòng lệnh jadxhoặc phiên bản GUI jadx-gui, nhấp đúp để chạy phiên bản GUI:jadx-gui

  1. mở dextập tin

sau đó có thể hiển thị mã nguồn java:

  1. File -> save as gradle project

sau đó có java sourcecode:


Giải pháp hai bước

Bước 1: dexđếnjar

Công cụ

Quá trình

tải xuống zip dex2jar , giải nén đã nhận d2j-dex2jar.sh, sau đó:

  • 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

thí dụ:

  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

Bước 2: jarđếnjava sourcecode

Công cụ

Quá trình

ở đây demo Procyonchuyển đổi jar sang mã nguồn java:

tải xuống procyon-decompiler-0.5.34.jar

sau đó sử dụng cú pháp:

java -jar /path/to/procyon-decompiler-0.5.34.jar -jar your_to_decompile.jar -o outputFolderName

thí dụ:

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

sử dụng trình soạn thảo VSCode để mở mã nguồn đã xuất, trông như thế này:

Phần kết luận

Đúng đắn chuyển đổi: Jadx> Procyon> CRF>JD-GUI

Đề nghị sử dụng: (Một bước giải pháp) Jadx


để được giải thích chi tiết hơn, xin vui lòng tham khảo ebook tiếng Trung trực tuyến của tôi : 安卓 应用 的 安全


lạ, nhưng nếu tôi cố gắng thực hiện 1 bước (dex để jar dịch ngược trên Windows) thông qua lệnh này dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dexchỉ trừ có:java.io.IOException: the src file not a .dex or zip file
Сергей

@ Bạn có thể thử: d2j-dex2jar.bat "D:\android\some_dex_file.dex"được hay không?
crifan

vâng, tôi đã thử chính xác >d2j-dex2jar.bat file.dexnhưng nó không ổn. Có lẽ đó là vì .dextập tin của tôi đã được sao chép từ dalvik-cache?
Сергей

1
@ Tôi nói đúng, lý do có thể nhất là bạn đã nói dex is copied from dalvik-cache, nên làdex is decompiled from apk
crifan

@crifan, cảm ơn vì câu trả lời này. JADX thật ấn tượng. tôi sẽ trở lại làm việc Emmanuel @ JD-Gui
Emmanuel Dupuy

13

Sau khi bạn tải xuống tệp APK của mình, bạn cần thực hiện các bước sau để có được mã java / tài liệu có thể chỉnh sửa.

  1. Chuyển đổi tệp apk của bạn thành zip (trong khi bắt đầu tải xuống, bạn không sử dụng tùy chọn "lưu", chỉ cần đi với "lưu dưới dạng" và đề cập đến tiện ích mở rộng của bạn dưới dạng .zip) bằng cách làm như thế này bạn có thể tránh APKTOOL ...
  2. Giải nén tập tin zip, ở đó bạn có thể tìm thấy somefilename.dex. vì vậy bây giờ chúng ta cần chuyển đổi dex ->. class
  3. Để làm điều đó, bạn cần "dex2jar" (bạn có thể tải xuống từ http://code.google.com.vn/p/dex2jar/ , sau khi giải nén , trong dấu nhắc lệnh, bạn phải đề cập như, [D: \ dex2jar-0.09> dex2jar somefilename.dex] (Hãy nhớ rằng somefilename.dex của bạn phải nằm trong cùng một thư mục mà bạn đã giữ dex2jar của mình.)
  4. Tải xuống jad từ http://www.viruspatel.net/bloss/doad/jad/jad.zip và giải nén nó. Sau khi giải nén, bạn có thể thấy hai tệp như "jad.exe" và "Readme.txt" (đôi khi "jad.txt" có thể ở đó thay vì "jad.exe", vì vậy chỉ cần đổi tên phần mở rộng của nó là as.exe để chạy)
  5. Cuối cùng, trong dấu nhắc lệnh, bạn phải đề cập đến như [D: \ jad> jad -sjava yourfilename. Class] nó sẽ phân tích tệp lớp của bạn thành tài liệu java có thể chỉnh sửa.

8

Với Dedexer , bạn có thể phân tách .dextệp thành mã byte dalvik (.ddx ).

Theo tôi biết, dịch ngược về Java không thể thực hiện được.
Bạn có thể đọc về dalvik bytecode tại đây .


1
được chấp nhận vì bạn là người nói rằng điều đó không (hiện tại) là có thể, điều đó có vẻ đúng.
Sẽ

@ Sẽ mọi thứ đều có thể. Chỉ phụ thuộc vào cách bạn nhìn thấy nó. Dịch ngược có thể, nhưng có thể không phải là cách bạn đang nghĩ đến.
Alba Mendez

8

Kỹ thuật đảo ngược Android là có thể . Thực hiện theo các bước sau để có được tệp .java từ tệp apk.

Bước 1 . Sử dụng dex2jar

  • Tạo tệp .jar từ tệp .apk
  • chỉ huy : dex2jar sampleApp.apk

Bước 2 . Dịch ngược .jar bằng JD-GUI

  • nó dịch ngược các tệp. class tức là chúng ta sẽ lấy lại .java bị xáo trộn từ apk.

Nhưng nếu tôi biên dịch lại tất cả các mã nguồn được dịch ngược, nó sẽ không chạy, trình biên dịch hiển thị rất nhiều lỗi.

Có giải pháp nào khả dụng để dịch ngược mã nguồn java android sẽ chạy trong nhật thực

2
Reverse Engineering nào không nhất thiết có nghĩa dịch ngược . Trên thực tế, các JAR bị che khuất của ProGuard sẽ không dịch ngược chính xác.
Alba Mendez

Nếu bạn đang xử lý mã Obfuscated, tốt hơn hết là chỉ cần tháo rời nó. Bạn sẽ không nhận được nguồn Java, nhưng bạn luôn có thể xem / sửa đổi mã. Xem câu trả lời của tôi .
Alba Mendez

Tôi khuyên bạn nên thực hiện cả dịch ngược và phân tách. Mã dịch ngược kết quả là dễ hiểu hơn nhưng tất cả các sửa đổi cần phải được thực hiện với phiên bản đã tách rời. Đặc biệt đúng nếu proguard đã được sử dụng. Tôi thấy rằng dex2jar kết hợp với jd-gui là tốt nhất để dịch ngược.
Mikko Rantalainen

6

Debian gần đây có gói 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

Cài đặt các gói tương ứng:

sudo apt-get install androguard python-networkx

Dịch ngược tệp DEX:

$ androdd -i classes.dex -o ./dir-for-output

Trích xuất classes.dextừ Apk + dịch ngược:

$ androdd -i app.apk -o ./dir-for-output

Tệp Apk không có gì khác là lưu trữ Java (JAR), bạn có thể trích xuất các tệp từ kho lưu trữ thông qua:

$ unzip app.apk -d ./dir-for-output

5

Rất nhiều điều đã thay đổi vì hầu hết các câu trả lời đã được đăng. Ngày nay, có rất nhiều công cụ dễ dàng với GUI, như sau:

APK Easy Tool for Windows (GUI tool, friendly)
Bytecode Viewer - APK/Java Reverse Engineering Suite
URET Android Reverser Toolkit

Nơi tốt nhất để tìm thấy chúng là trên diễn đàn XDA Developers.


4

Bạn có thể thử JADX ( https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler ), đây là một công cụ hoàn hảo để dịch ngược DEX.

Và vâng, nó cũng có sẵn trực tuyến trên (trang web của tôi: 0)): http://www.javadecompilers.com/apk/


Nói, nó có thể được sử dụng trong mã thay thế? Ý nghĩa ngay cả trong chính Android? Và không phải là trang web ở đây: github.com/skylot/jadx ?
nhà phát triển Android


2

Phương pháp dễ nhất để dịch ngược ứng dụng Android là tải xuống ứng dụng có tên ShowJava từ playstore. Chỉ cần chọn ứng dụng cần dịch ngược từ danh sách các ứng dụng. Có ba trình dịch ngược khác nhau mà bạn có thể sử dụng để dịch ngược ứng dụng là -

CFR 0.110, JaDX 0.6.1 hoặc FernFlower (bộ dịch ngược phân tích).


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.