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?
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âu trả lờ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.
Và đây là quy trình về cách dịch ngược:
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
.sh
tập lệnh được thay thế bằng.bat
tập lệnhLưu ý 2: Trên linux / mac đừng quên
sh
hoặcbash
. 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.X
thư mục, vdsudo chmod -R +x dex2jar-2.0
Mở tệp jar trong JD-GUI
Để 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 dex2jar và jd-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.
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.
./apktool d myprogram.apk
. Xem câu trả lời của tôi .
Một phiên bản đầy đủ hơn của câu trả lời của fred :
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.
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 .
Đô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
/ .class
trướ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ó!
javac "$(find . -name '*.java')"
nào?
tôi đã sử dụng
Nhưng không có công cụ nào của Google
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
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:
từ dex
đến java sourcecode
, hiện có hai loại giải pháp:
One Step
: trực tiếp chuyển đổi dex
sangjava sourcecode
Two Step
: chuyển đổi đầu tiên dex
sang jar
, chuyển đổi thứ hai jar
thànhjava sourcecode
dex
trực tiếp đếnjava sourcecode
bin
thư mục có thể thấy dòng lệnh jadx
hoặc phiên bản GUI jadx-gui
, nhấp đúp để chạy phiên bản GUI:jadx-gui
dex
tập tinsau đó có thể hiển thị mã nguồn java:
File
-> save as gradle project
sau đó có java sourcecode:
dex
đếnjar
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
jar
đếnjava sourcecode
many
mã sẽ dịch ngược lỗiminor
mã sẽ dịch ngược lỗino
lỗi dịch ngược mã
Procyon
ở đây demo Procyon
chuyể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:
Đú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 : 安卓 应用 的 安全
dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dex
chỉ trừ có:java.io.IOException: the src file not a .dex or zip file
d2j-dex2jar.bat "D:\android\some_dex_file.dex"
được hay không?
>d2j-dex2jar.bat file.dex
nhưng nó không ổn. Có lẽ đó là vì .dex
tập tin của tôi đã được sao chép từ dalvik-cache
?
dex is copied from dalvik-cache
, nên làdex is decompiled from apk
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.
Với Dedexer , bạn có thể phân tách .dex
tệ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 .
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
dex2jar sampleApp.apk
Bước 2 . Dịch ngược .jar bằng JD-GUI
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.dex
từ 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
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.
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/
Điều này có thể được thực hiện trong năm bước sau đây:
Viên ngọc này thực hiện những điều này cho bạn tự động ngay cả việc cài đặt các công cụ cần thiết
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).
Nếu bạn không muốn tải xuống dex2jar, thì chỉ cần sử dụng apk_grabber
tập lệnh python để dịch ngược bất kỳ apk nào thành các tệp jar. Sau đó, bạn đọc chúng với jd-gui.