เขียน Frida Script สำหรับใช้บน Android Application

Datafarm
4 min readMay 29, 2024

หลายครั้งที่เราใช้งานแอปพลิชัน แอพ Android เราอาจจะเคยสงสัยกันว่า Frida Script ถูกเขียนขึ้นยังไง และบางทีที่เราทำงานผ่าน Frida Script ที่เราโหลดมาใช้ก็ไม่ได้ตอบโจทย์เราขนาดนั้น ดังนั้นในวันนี้ผู้เขียนจะพาไปเขียน Frida Script เอง สำหรับใช้กับ แอปพลิเคชัน Android แบบง่าย ๆ กันครับ ไปเริ่มกันเลยยย

ก่อนอื่นเรามารู้กันก่อนว่า Frida คืออะไร?

Frida คือ เครื่องมือที่ใช้เพื่อทำการ วิเคราะห์, แก้ไขการทำงานของ Process หรือ Application ที่ทำงานอยู่บนระบบใดหนึ่ง เช่น Android หรือ iOS

แล้ว Frida ทำงานยังไง?

Frida ทำงานด้วยการแทรก Code เข้า Process Memory ของแอปพลิเคชันที่กำลังทำงานอยู่ และสามารถทำการแก้ไขค่าต่าง ๆ ในขณะที่ใช้งานได้เลย ซึ่ง Frida ยังมี Built-in function ที่ทำให้เราสามารถคุมแอปพลิเคชันได้ง่ายขึ้น ไม่ว่าจะเป็น อ่าน, เขียน Memory, เรียก Function และแก้ไขการทำงานของ Function ได้ด้วย เช่น แก้ไข return value, เขียน Function ทับ และเปลี่ยนค่าตัวแปรใน Function

ต่อไปเรามาเรียนรู้เขียน Frida Script กันบ้าง โดยการเริ่มเขียน Frida Script ครั้งนี้ผู้เขียนจะขอแบ่งตัวอย่างออกเป็น 3 ส่วนด้วยกัน ดังนี้

  1. Setup environment
  2. Decompile Android apps
  3. Writing frida script

1. Setup environment

1. บนเครื่อง Host

ให้เริ่มจากการ ติดตั้ง python หลังจากนั้นให้ ใช้คำสั่ง

pip install frida-tools

เพื่อติดตั้ง Frida’s CLI tools ซึ่งสามารถทำการติดตั้งได้ทั้งระบบปฐิบัติการ Windows, Linux, MacOS แต่ในบทความนี้ผู้เขียนจะใช้เป็น Linux ในการเขียนนะครับ

2. บนอุปกรณ์ Android

ให้โหลด frida-server-{version}-android-{Architecture}.xz จาก https://github.com/frida/frida/releases มาติดตั้ง และให้เลือก Platform เป็น Android ตาม Architecture มือถือที่เราใช้อยู่ เช่น มือถือส่วนใหญ่ก็จะเป็น arm64 แต่ถ้าเราใช้ emulator บน CPU intel ก็จะเป็น x86_64 ของผู้ใช้จะเป็น arm64 ครับ

หลังจากทำการดาวน์โหลดแล้ว ผู้เขียนจะทำการย้ายไฟล์ frida server ลงเครื่อง Android ด้วย adb ไปที่ /data/local/tmp เพื่อทำการติดตั้ง Frida server แต่ผู้เขียนจะใช้ adb ตามด้วยคำสั่ง

unxz frida-server-{version}-android-{Architecture}.xz
adb push frida-server-{version}-android-{Architecture}.xz /data/local/tmp

จากนั้นให้ทำการแก้ไขสิทธิ์ให้ frida server execute ได้ด้วย command chmod หลังจากนั้นให้ทำการ execute frida server อยู่บน background เพื่อเป็นการเปิดให้ frida server ทำงานบนเครื่อง Android ที่เตรียมไว้ ด้วยคำสั่ง

adb shell
cd /data/local/tmp
chmod +x frida-server-{version}-android-{Architecture}
./frida-server-{version}-android-{Architecture} &

ทั้งนี้การตรวจสอบว่า setup environment บน Host และติดตั้ง Frida server บนมือถือสำเร็จหรือไม่นั้น ให้ทำการพิมพ์ คำสั่ง

frida-ps -Ua

บนเครื่อง Host ซึ่งเป็นคำสั่งที่สามารถตรวจสอบ process ในเครื่องมือถือที่ติดตั้ง Frida server ไว้ครับ

ถ้า List Process ขึ้นแบบภาพด้านบนถือว่าติดตั้ง Frida server สำเร็จครับ

2. Decompile Android apps

ผู้เขียนจะใช้แอปพลิเคชัน Android UnCrackable L1มาเป็นตัวทดลองในครั้งนี้ ซึ่งสามารถดาวน์โหลดได้ที่ https://mas.owasp.org/crackmes/Android/ เลยครับ

หลังจากนั้นให้ทำการติดตั้งและลองเข้าใช้แอปพลิเคชัน ซึ่งจะพบว่าไม่สามารถเปิดแอปพลิเคชันได้เนื่องจากแอปพลิเคชันได้มีการทำ Root detected ไว้ครับ

ดังนั้น ให้เรามาเริ่มทำการนำ apk มาวิเคราะห์ดู ด้วยการนำมา decompile ดู class และ function ต่าง ๆ ว่า function ไหนเป็นตัวทำการ root detect ครับ

หลังจากที่ทำการ decompile APK จะได้โครงสร้างไฟล์ดังรูป ซึ่งเรามาดู MainAcitivicy พบว่าตรง OnCreate มีการเรียกใช้ function จาก Class C สาม function เพื่อตรวจสอบ root detect ครับ

หลังจากนั้นให้เรามาดูที่ class C ที่อยู่ตรง sg.vantagepoint.c จะพบว่าทั้ง a(), b(), c() เป็น function ที่ใช้ตรวจสอบ root ซึ่งแต่ละตัวทำงานดังนี้

  • Function a() ตรวจสอบว่ามี su file ตาม env PATH หรือไม่ ถ้ามีแปลว่าเครื่องได้ทำการ root และจะ return ค่าเป็น true
  • Function b() คือ ตรวจสอบ Build.TAGS ของ rom ว่ามี test-keys หรือเปล่า เพราะเครื่อง root จะมี test-keys ใน Build.TAGS แต่ถ้า official rom จะเป็น release-keys แทน
  • Function c() ตรวจสอบว่ามีไฟล์ตาม list ที่กำหนดไว้หรือเปล่า ถ้ามีแปลว่าเครื่องได้ทำการ root และจะ return ค่าเป็น true

แต่อย่างไรก็ตามถ้าเราสามารถ return false ทุก function ได้ก็ถือว่าทำ root detect bypass ได้

3. Writing frida script

  • หลังจากเราได้พบ function ที่ทำ root detect ได้แล้ว ให้เรามาลองเขียน frida script ที่แก้ค่า return เพื่อ bypass root กันเถอะ
  • ภาษาที่ใช้ครั้งนี้จะเป็น Javascript นะครับ
  • เริ่มจากการไป อ่าน document ที่ https://frida.re/docs/javascript-api/#java แต่บทความนี้จะเน้นไปที่ แอปพลิชันที่เขียนด้วย Java เท่านั้นนะครับ ส่วน Objective-C หรือ Flutter ก็รองรับนะครับแต่อาจะจะใช้วิธีแตกต่างกันไปครับ
  • อย่างเช่นฟังก์ชัน Java.use(‘classname’) ตัวนี้ใช้เพื่อแก้ไข constructure class ของ Java หรือ กระทั่งเปลี่ยนการทำงานของ method หรือ function ได้เลย และยังรวมไปถึงการแก้ค่า return ของ function ด้วย
ตัวย่างการเขียน function ทับ

ผู้เขียนจะเรียกใช้ function Java.use() เพื่อเรียก class และแก้ไข function แต่ละ function ด้วยการเขียน function ใหม่ทับให้แต่ละ function return false ตลอด ซึ่งถือว่าไม่เจอ root แล้วครับ

หลังจากนั้น ให้เรามาลองใช้ script ที่เราเขียนกันว่าจะใช้ได้หรือไม่ ด้วยคำสั่ง

Frida -U -l <script_name>.js -f <process_name>
Frida -U -l script.js -f owasp.mstg.uncrackable1

พบว่าสามาระเข้าแอปพลิเคชันได้โดยไม่เจอ root detected แล้ว นั้นถือว่า Frida script ที่เราเขียนนั้นใช้งานได้แล้วครับบบบ

จบไปแล้วนะครับสำหรับการเขียน Frida script เองแบบง่าย ๆ หวังว่าผู้อ่านจะได้รับความรู้นำไปใช้ได้หรือนำไปลองเขียนกันดูนะครับ สุดท้ายนี้ขอขอบคุณครับที่เข้ามาอ่าน ส่วนตอนต่อไปผมจะมาเขียนอะไรนั้น ไว้ติดตามกันได้ครับ ขอบคุณครับ

--

--

No responses yet