จะแยกไฟล์ Android DEX (VM bytecode) หนึ่งไฟล์ลงในซอร์สโค้ด Java ที่สอดคล้องได้อย่างไร
จะแยกไฟล์ Android DEX (VM bytecode) หนึ่งไฟล์ลงในซอร์สโค้ด Java ที่สอดคล้องได้อย่างไร
คำตอบ:
รับเครื่องมือเหล่านี้:
1) dex2jarเพื่อแปลไฟล์ dex เป็นไฟล์ jar
2) jd-guiเพื่อดูไฟล์ java ใน jar
ซอร์สโค้ดค่อนข้างอ่านได้เนื่องจาก dex2jar ทำการเพิ่มประสิทธิภาพบางอย่าง
และนี่คือขั้นตอนในการแปลความหมาย:
แปลง classes.dex ใน test_apk-debug.apk เป็น 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-X.X
ไดเรกทอรีเช่นsudo chmod -R +x dex2jar-2.0
เปิด jar ใน JD-GUI
เพื่อชี้แจงค่อนข้างมีสองเส้นทางหลักที่คุณอาจใช้ที่นี่ขึ้นอยู่กับสิ่งที่คุณต้องการที่จะบรรลุ:
แยกส่วน Dalvik bytecode (dex) ลงในซอร์ส Java ที่อ่านได้ คุณสามารถทำได้อย่างง่ายดายด้วยdex2jarและjd-guiตามที่กล่าวถึง fred แหล่งผลลัพธ์มีประโยชน์ในการอ่านและทำความเข้าใจการทำงานของแอพ แต่มีแนวโน้มว่าจะไม่สามารถใช้งานโค้ดได้ 100% กล่าวอีกนัยหนึ่งคุณสามารถอ่านแหล่งที่มา แต่คุณไม่สามารถแก้ไขและบรรจุใหม่ได้ โปรดทราบว่าหากแหล่งที่มานั้นมีปัญหากับ proguard รหัสแหล่งผลลัพธ์จะยากต่อการทำให้ยุ่งเหยิง
ทางเลือกที่สำคัญอื่น ๆ คือการแยก bytecode เป็นsmaliภาษาแอสเซมบลีที่ออกแบบมาเพื่อจุดประสงค์นี้อย่างแม่นยำ ฉันได้พบว่าวิธีที่ง่ายที่สุดในการทำเช่นนี้คือมีapktool เมื่อคุณติดตั้ง apktool แล้วคุณสามารถชี้ไปที่ไฟล์ apk และคุณจะได้รับไฟล์ smali สำหรับแต่ละคลาสที่อยู่ในแอปพลิเคชัน คุณสามารถอ่านและแก้ไข smali หรือแทนที่คลาสทั้งหมดด้วยการสร้าง smali จากแหล่ง Java ใหม่ (ในการทำเช่นนี้คุณสามารถรวบรวม. java source ของคุณเป็นไฟล์. class ด้วย javac จากนั้นแปลงไฟล์. class ของคุณเป็นไฟล์. doc ด้วย Android คอมไพเลอร์ dx แล้วใช้ baksmali (smali disassembler) เพื่อแปลง. dex เป็นไฟล์. smali ตามที่อธิบายในคำถามนี้. อาจมีทางลัดที่นี่) เมื่อเสร็จแล้วคุณสามารถจัดเก็บ apk สำรองด้วย apktool อีกครั้งได้อย่างง่ายดาย โปรดทราบว่า apktool ไม่ได้ลงนาม apk ที่เกิดขึ้นเพื่อให้คุณจะต้องดูแลเช่นเดียวกับการประยุกต์ใช้ Android อื่น ๆ
หากคุณไปเส้นทาง smali คุณอาจต้องการลองAPK Studioซึ่งเป็น IDE ที่ดำเนินการตามขั้นตอนข้างต้นโดยอัตโนมัติเพื่อช่วยคุณในการแยกข้อมูลและคอมไพล์ apk ใหม่และติดตั้งบนอุปกรณ์
กล่าวโดยย่อตัวเลือกของคุณนั้นค่อนข้างง่ายมากในการแยกออกเป็น Java ซึ่งสามารถอ่านได้ แต่กลับไม่ได้หรือน่าจะถอดประกอบไปด้วย Smali ซึ่งยากต่อการอ่าน แต่มีความยืดหยุ่นมากกว่าในการเปลี่ยนแปลง วิธีการที่คุณเลือกจะขึ้นอยู่กับสิ่งที่คุณต้องการบรรลุ
สุดท้ายข้อเสนอแนะของความกล้าก็เป็นที่ทราบ เป็นเครื่องมือการกำหนดเป้าหมายใหม่เพื่อแปลงไฟล์. doc และ. apk ไปเป็นไฟล์ java .class เพื่อให้สามารถวิเคราะห์ได้โดยใช้เครื่องมือการวิเคราะห์สแตติก Java ทั่วไป
ฉันอยากจะแนะนำให้ไปที่นี่: https://github.com/JesusFreke/smali
มันให้ BAKSMALI ซึ่งเป็นเครื่องมือวิศวกรรมย้อนกลับที่ยอดเยี่ยมที่สุดสำหรับไฟล์ DEX มันทำโดย JesusFreke คนที่สร้าง ROM ที่มีชื่อเสียงสำหรับ Android
./apktool d myprogram.apk
และมันก็เป็นธรรมดาที่ ดูคำตอบของฉัน
รุ่นที่สมบูรณ์มากขึ้นของเฟร็ด 's คำตอบ :
ก่อนอื่นคุณต้องมีเครื่องมือเพื่อแยกคลาส (คอมไพล์) ทั้งหมดบน DEX ไปยัง JAR
มีหนึ่งชื่อdex2jarซึ่งทำโดยนักเรียนจีน
จากนั้นคุณสามารถใช้jd-guiเพื่อถอดรหัสคลาสบน JAR ไปยังซอร์สโค้ด
แหล่งผลลัพธ์ควรอ่านได้ค่อนข้างดีเนื่องจาก dex2jar ใช้การปรับให้เหมาะสมที่สุด
คุณสามารถใช้APKTool มันจะโดยอัตโนมัติดึงทุกชั้นเรียน ( .dex
) ทรัพยากร ( .asrc
) แล้วมันจะแปลงXML ไบนารีเพื่อXML มนุษย์สามารถอ่านได้และก็ยังจะ dissassembleเรียนสำหรับคุณ
การถอดประกอบจะมีประสิทธิภาพมากกว่าการถอดประกอบโดยเฉพาะกับ
JAR ที่สับสนกับ Pro Guard!
เพียงบอก APKTool ให้ถอดรหัส APK ลงในไดเรกทอรีจากนั้นแก้ไขสิ่งที่คุณต้องการ
และในที่สุดก็เข้ารหัสกลับเป็น APK นั่นคือทั้งหมดที่
สำคัญ: APKTool dissassembles มันไม่ได้แยก
รหัสที่สร้างขึ้นจะไม่เป็นแหล่ง Java
แต่คุณควรจะสามารถอ่านและแก้ไขได้หากคุณคุ้นเคยกับจัสมิน
หากคุณต้องการแหล่ง Java โปรดไปกว่าวิธีคู่มือการใช้งาน
บางครั้งคุณได้รับรหัสที่เสียหายเมื่อใช้dex2jar
/ apktool
โดยเฉพาะอย่างยิ่งในลูป เพื่อหลีกเลี่ยงปัญหานี้ให้ใช้jadxซึ่ง decompiles dalvik bytecode เป็นซอร์สโค้ดจาวาโดยไม่ต้องสร้าง a .jar
/ .class
file ก่อนเช่นเดียวกับdex2jar
(apktool ใช้ dex2jar ฉันคิดว่า) นอกจากนี้ยังเป็นโอเพ่นซอร์สและในการพัฒนาที่ใช้งานอยู่ มันยังมี GUI สำหรับ GUI-fanatics ลองมัน!
javac "$(find . -name '*.java')"
อย่างไร
ฉันได้ใช้
แต่ไม่มีใครเต้นเครื่องมือของ Google
เนื่องจากไม่มีใครพูดถึงเรื่องนี้มีอีกหนึ่งเครื่องมือ: หน้าแรก DED
ติดตั้งวิธีการและคำอธิบายบางส่วน: การติดตั้ง
มันถูกใช้ในการศึกษาที่น่าสนใจมากเกี่ยวกับความปลอดภัยของแอพพลิเคชั่นตลาดชั้นนำ (ไม่เกี่ยวข้องกันจริงๆถ้าคุณอยากรู้): การสำรวจความปลอดภัยของแอปพลิเคชัน Android
เนื่องจาก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 , unzip ได้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
many
โค้ดจะถอดรหัสข้อผิดพลาดminor
รหัสยอดนิยมจะถอดรหัสข้อผิดพลาดno
ข้อผิดพลาดในการถอดรหัสรหัส
Procyon
นี่สาธิตการProcyon
แปลง jar เป็นซอร์สโค้ดจาวา:
ดาวน์โหลด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
สำหรับคำอธิบายโดยละเอียดเพิ่มเติมโปรดอ่านebook ภาษาจีนออนไลน์ของฉัน: 安卓应用的安全和破解
dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dex
เป็นเพียงข้อยกเว้นได้:java.io.IOException: the src file not a .dex or zip file
d2j-dex2jar.bat "D:\android\some_dex_file.dex"
ได้ไหม: ตกลงหรือไม่?
>d2j-dex2jar.bat file.dex
แต่ก็ไม่เป็นไร อาจเป็นเพราะ.dex
ไฟล์ของฉันถูกคัดลอกมาจากdalvik-cache
ไหน?
dex is copied from dalvik-cache
ควรจะเป็นdex is decompiled from apk
เมื่อคุณดาวน์โหลดไฟล์ APK คุณต้องทำตามขั้นตอนต่อไปนี้เพื่อรับรหัส java / เอกสารที่แก้ไขได้
ด้วยDedexerคุณสามารถแยก.dex
ไฟล์ออกเป็น dalvik bytecode ( .ddx
)
การถอดรหัสเกี่ยวกับ Java นั้นเป็นไปไม่ได้เท่าที่ฉันรู้
คุณสามารถอ่านเกี่ยว bytecode Dalvik ที่นี่
Android วิศวกรรมย้อนรอยความเป็นไปได้ ทำตามขั้นตอนเหล่านี้เพื่อรับไฟล์. java จากไฟล์ apk
ขั้นตอนที่ 1 . ใช้ dex2jar
dex2jar sampleApp.apk
ขั้นตอนที่ 2 . Decompiling .jar โดยใช้ JD-GUI
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
สารสกัดclasses.dex
จาก Apk + Decompile:
$ 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 Developers
คุณอาจลอง JADX ( https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler ) นี่เป็นเครื่องมือที่สมบูรณ์แบบสำหรับการถอดรหัส DEX
และใช่มันยังมีออนไลน์อยู่บน (เว็บไซต์ของฉัน: 0)): http://www.javadecompilers.com/apk/
ซึ่งสามารถทำได้ในห้าขั้นตอนดังต่อไปนี้:
อัญมณีนี้ทำสิ่งเหล่านี้ให้คุณโดยอัตโนมัติแม้กระทั่งการติดตั้งเครื่องมือที่จำเป็น
วิธีที่ง่ายที่สุดในการแยกแอป Android คือดาวน์โหลดแอปชื่อShowJavaจาก playstore เพียงเลือกแอปพลิเคชั่นที่จำเป็นต้องแยกส่วนจากรายการแอพพลิเคชั่น มีตัวถอดรหัสที่แตกต่างกันสามตัวที่คุณสามารถใช้เพื่อถอดรหัสแอปคือ -
CFR 0.110, JaDX 0.6.1 หรือ FernFlower (ตัวแยกวิเคราะห์)
หากคุณไม่ต้องการดาวน์โหลด dex2jar ให้ใช้apk_grabber
สคริปต์ pythonเพื่อแปล apk ใด ๆ ลงในไฟล์ jar จากนั้นคุณอ่านด้วย jd-gui