สวัสดีผู้ติดตามเพจดาต้าฟาร์มทุกท่านครับ กลับมาพบกับบทความแอนดรอยด์กันอีกครั้งนะครับ หลังจากที่ห่างหายกันไปนาน ในบทความนี้จะเป็นเรื่องของการ Reversing Android Package นะครับ ซึ่งการ Reverse แอปพลิเคชันแอนดรอยด์เป็นพื้นฐานที่สำคัญมากสำหรับการทดสอบความปลอดภัยของแอปพลิเคชันบนแอนดรอยด์ครับ
การ Reverse แอปพลิเคชันบนแอนดรอยด์เป็นการแปลงตัวแอปพลิเคชันให้กลับไปอยู่ในรูปของ Source Code ต้นฉบับหรือไม่ก็ใกล้เคียงกับต้นฉบับ ซึ่งจะทำให้เราเห็นภาพรวมของแอปพลิเคชันมากขึ้นตั้งแต่ขั้นตอนของการ Build แอปพลิเคชันรวมไปถึง Library ต่าง ๆ ที่แอปพลิเคชันเรียกใช้งาน
บทความนี้มีเนื้อหาที่เกี่ยวข้องกับการใช้ Tools ต่าง ๆ ในการ Reversing Android Package นะครับ แต่ก่อนที่จะเข้าเนื้อหาของบทความแอดต้องบอกก่อนว่า Tools ที่กล่าวถึงในบทความนี้เป็น Tools ที่แอดใช้งานนะครับ ซึ่งในปัจจุบันมี Tools มากมายให้เลือกใช้งาน ดังนั้นแล้วผู้อ่านสามารถเลือกใช้ Tools ได้ตามความถนัดของตัวเองเลยนะครับ นอกจากนี้แล้วตัวแอปพลิเคชันที่เราจะใช้ในการทดสอบสามารถดาวน์โหลดได้จาก GitHub ที่ลิงค์ https://github.com/dineshshetty/Android-InsecureBankv2
APKTool
เริ่มต้นที่ Tool ตัวแรกนะครับ APKTool เป็น Open-source ซึ่งสามารถใช้งานได้ฟรีโดยไม่มีค่าใช้จ่าย ใช้สำหรับการ Reversing Android Package โดยผู้อ่านสามารถดาวน์โหลด Tool ดังกล่าวมาใช้งานได้ที่ https://ibotpeaches.github.io/Apktool/
สำหรับการติดตั้งในกรณีนี้แอดใช้งานบน Linux นะครับ เราสามารถติดตั้ง APKTool โดยพิมพ์คำสั่ง
apt install apktool
หลังจากติดตั้ง Tool เรียบร้อยแล้วเราก็สามารถ Decompile Android Package ได้แล้วครับโดยใช้คำสั่ง
apktool d <file.apk>
ซึ่ง file.apk เป็นไฟล์แอนดรอยด์ที่เราได้ดาวน์โหลดจาก GitHub นะครับ
ผลลัพธ์ที่ได้จากการ Decode ด้วย APKTool จะเป็น Directory ที่มีชื่อเหมือนกันกับตัวแอปพลิเคชัน โดยจากภาพด้านล่างจะประกอบไปด้วยไฟล์และโฟลเดอร์ที่เป็นส่วนประกอบของแอปพลิเคชัน ซึ่งไฟล์ที่สำคัญรวมไปถึงรูปภาพ, layout รวมไปถึงข้อความต่าง ๆ จะถูกแปลงให้กลับไปอยู่ในรูปแบบที่ใกล้เคียงกับ Original Form ซึ่งในที่นี้รวมไปถึงไฟล์ AndroidManifest.xml ที่มนุษย์สามารถอ่านได้
จากภาพด้านบนเป็นไฟล์ AndroidManifest.xml ที่ได้จากการ Decode แอปพลิเคชันแล้ว ซึ่งไฟล์ดังกล่าวมีข้อมูลที่สำคัญที่เกี่ยวข้องกับแอปพลิเคชันรวมไปถึง Component ของแอปพลิเคชันด้วยเช่น Activities, Services, Broadcast Receivers, Content Provider เป็นต้น ดังนั้น AndroidManifest จึงเป็นไฟล์ที่ทำให้เราเห็นภาพโดยรวมของแอปพลิเคชันนั่นเองครับ
Dex2jar
Dex2jar เป็น Tool Open-source เช่นเดียวกันกับ APKTool ซึ่งเราสามารถดาวน์โหลดมาใช้งานได้โดยไม่มีค่าใช้จ่าย ซึ่ง Tool ดังกล่าวจะทำงานกับไฟล์ .dex และ .class โดยการแปลงไฟล์ classes.dex ให้เป็นไฟล์ .jar สามารถดาวน์โหลด Dex2jar ได้ที่ https://sourceforge.net/projects/dex2jar/
สำหรับการใช้งาน Dex2jar สามารถทำได้โดยพิมพ์คำสั่ง
d2j-dex2jar <file.apk> — o <output_file.jar>
ดังภาพด้านล่าง
ขั้นตอนการแปลงไฟล์ .dex ให้เป็นไฟล์ .jar เป็นขั้นตอนที่สำคัญเพราะเป็นขั้นตอนการแปลงแอปพลิเคชันให้อยู่ในรูปของ Source Code ในภาษา Java หรือใกล้เคียงกับ Code ต้นฉบับที่ทางผู้พัฒนาได้สร้างขึ้นเพื่อให้เราสามารถเห็นการทำงานของแอปพลิเคชันในภาพรวมได้
JD-GUI
JD-GUI เป็น Tool ที่สามารถอ่าน Source Code Java ที่อยู่ในรูปของไฟล์ .jar ที่ได้จากการ decompile ด้วย Dex2jar จากขั้นตอนก่อนหน้า โดยสามารถดาวน์โหลดมาใช้งานได้ที่ http://java-decompiler.github.io/
ในส่วนของการใช้งานเราสามารถเปิดไฟล์ .jar ที่ได้จากการ decompile ในขั้นตอนก่อนหน้าเพื่ออ่าน Source Code ซึ่ง JD-GUI จะแสดงลำดับชั้นของ Class ต่างๆที่เกี่ยวข้องกับแอปพลิเคชันทางด้านซ้าย เราสามารถคลิกเพื่อเรียกดู Code ได้ตามต้องการดังภาพ
อย่างไรก็ตามไฟล์ Java .jar ที่เราได้จากการ Decompile ก็ไม่ได้เหมือนกับ Source Code ต้นฉบับเสียทีเดียว ซึ่งในค่าของตัวแปรหรือข้อมูลบางส่วนเราต้องนำมาเปรียบเทียบกับ R.class ดังภาพ
นอกจากนี้แล้วเรายังสามารถเลือกเมนู File จากนั้นเลือก Save All Sources เพื่อสามารถ Save ไฟล์ให้เป็น .zip เพื่อสามารถเรียกดู Source Code .jar ได้โดยไม่ต้องใช้ JD-GUI
Smali/Baksmali
Smali และ Baksmali คือโปรแกรมซึ่งโดยทั่วไปเรียกว่า assembler และ disassembler ซึ่งใกล้เคียงกับภาษา assembly โดยปกติภาษาระดับสูงเช่น C, C++ หรือ Java จะไม่สามารถทำงานได้บนคอมพิวเตอร์ตรงๆ แต่จะถูกแปลงเป็น bytecode โดย Compiler ของภาษานั้นๆซึ่งคอมพิวเตอร์สามารถเข้าใจและประมวลผลได้
เพื่อให้ง่ายต่อการทำความเข้าใจ bytecode สามารถแปลงหรือที่เรียกว่า disassembled เพื่อให้เราสามารถอ่านและทำความเข้าใจได้ง่ายขึ้น โดยแอปพลิเคชันแอนดรอยด์มี bytecode ที่อยู่ในรูปของ .dex ซึ่งเราสามารถ disassembled ได้ด้วย baksmali เพื่อให้อยู่ในรูปแบบของภาษาที่อ่านเข้าใจง่ายที่เรียกว่า smali code
อธิบายมาถึงตรงนี้อาจจะมีผู้อ่านบางท่านนึกภาพไม่ออก ดังนั้นแล้วเรามาดู bytecode ของแอปพลิเคชันที่เราดาวน์โหลดมากันครับ
เป็นอย่างไรกันบ้างครับสำหรับไฟล์ classes.dex ที่เป็น bytecode เอาจริงๆแล้วคือเราอ่านไม่รู้เรื่องเลย ต่อไปเราลองมาเทียบกับ smali code ที่ได้จากการ disassembled กันครับ
จากภาพด้านบนเป็น smali code ที่ได้จากการ disassembled จากแอปพลิเคชันตัวเดียวกันซึ่งแอดก็อ่านไม่รู้เรื่องอยู่ดี แฮ่ฮฮฮฮ แต่ถึงอย่างไรเราก็ยังพอทำความเข้าใจได้ง่ายกว่าเมื่อเทียบกับ bytecode ใช่มั้ยครับ สำหรับ smali code หากผู้อ่านท่านใดสนใจศึกษาเพิ่มเติมก็สามารถตามไปอ่านได้จากลิงค์ใน Reference ท้ายบทความละกันนะครับ
ต่อไปเราลองมา convert ไฟล์ .dex เป็น smali code กันครับ ซึ่งในที่นี้แอดใช้ Dex2jar นะครับ ในที่นี้แอดใช้งานบน Linux นะครับซึ่งเราสามารถติดตั้ง Tool ดังกล่าวได้โดยพิมพ์ apt install dex2jar หลังจากที่ติดตั้งเสร็จเราก็สามารถใช้งาน d2j-smali และ d2j-baksmali ได้แล้วครับ
หลังจากที่ติดตั้ง Tool เรียบร้อยแล้วเราลองมาใช้งานกันเลยครับ โดยพิมพ์คำสั่ง
d2j-baksmali <classes.dex>
เมื่อเสร็จเรียบร้อยแล้วเราจะได้โฟลเดอร์นึงมาที่ชื่อ classes-out ครับ ซึ่งภายในโฟลเดอร์นี้จะมีไฟล์ที่เป็น smali code ทั้งหมดของแอปพลิเคชันที่ได้จากการ disassembled ด้วย baksmali ครับ
เอาละครับสำหรับบทความตอนที่ 4 นี้แอดคิดว่าเรื่องของการ Reverse Android มีอีกค่อนข้างมาก ดังนั้นแล้วแอดคิดว่าจะนำเนื้อหาส่วนที่เหลือไว้ในตอนที่ 4.2 แล้วกันนะครับ ดังนั้นโปรดติดตามต่อในบทความ Mobile Application Security ในตอน 4.2 ต่อไปนะครับ สำหรับวันนี้สวัสดีครับ
Reference
- Android application — https://github.com/dineshshetty/Android-InsecureBankv2
- APKTool — https://ibotpeaches.github.io/Apktool/
- Dex2jar — https://sourceforge.net/projects/dex2jar/
- JD-GUI — http://java-decompiler.github.io/
- Dalvik opcodes — http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html