Mobile Application Security [ตอนที่ 4.1]

Datafarm
4 min readMar 3, 2021

สวัสดีผู้ติดตามเพจดาต้าฟาร์มทุกท่านครับ กลับมาพบกับบทความแอนดรอยด์กันอีกครั้งนะครับ หลังจากที่ห่างหายกันไปนาน ในบทความนี้จะเป็นเรื่องของการ 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 ต่อไปนะครับ สำหรับวันนี้สวัสดีครับ

--

--

No responses yet