ขั้นตอนทั้งหมดที่กล่าวถึงด้านล่างนี้อยู่ใน macOS Mojave
ติดตั้ง frida-tools
ด้วย pip3
รันคำสั่ง $ pip --version
และ $ pip3 --version
เพื่อตรวจสอบว่า pip มาจาก Python 3x ใด เช่น คุณควรเห็นข้อมูลเวอร์ชันดังนี้:
$ pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
จากนั้นรันคำสั่ง pip ที่ถูกต้องเพื่อติดตั้ง frida-tools
เช่น pip3
$ pip3 install frida-tools
ผลลัพธ์ความสำเร็จ:
....
Successfully built frida-tools frida
Installing collected packages: colorama, frida, six, wcwidth, prompt-toolkit, pygments, frida-tools
Successfully installed colorama-0.4.1 frida-12.4.7 frida-tools-1.3.2 prompt-toolkit-2.0.9 pygments-2.3.1 six-1.12.0 wcwidth-0.1.7
การทดสอบการติดตั้งของคุณ
คัดลอก cat
binary ไปยังโฟลเดอร์ชั่วคราว เช่น /tmp/cat
จากนั้นเรียกใช้ cat
จากไดเร็กทอรีนั้น:
$ mkdir ~ /frida
$ cp /bin/cat /frida/cat
$ /frida/cat
ในเทอร์มินัลอื่น ให้สร้างไฟล์ example.py
โดยมีเนื้อหาดังต่อไปนี้:
import frida
def on_message ( message , data ):
print ( "[on_message] message:" , message , "data:" , data )
session = frida . attach ( "cat" )
script = session . create_script ( """'use strict';
rpc.exports.enumerateModules = function () {
return Process.enumerateModulesSync();
};
""" )
script . on ( "message" , on_message )
script . load ()
print ([ m [ "name" ] for m in script . exports . enumerate_modules ()])
จากนั้นรันสคริปต์ example.py
ด้วยคำสั่งด้านล่าง
$ python3 example.py
ผลลัพธ์ควรเป็นสิ่งที่คล้ายกับสิ่งนี้ (ขึ้นอยู่กับแพลตฟอร์มและเวอร์ชันไลบรารีของคุณ):
[ u'cat' , …, u'ld-2.15.so' ]
คำสั่ง adb
ของ Android
ตรวจสอบให้แน่ใจว่า adb
สามารถดูอุปกรณ์ของคุณได้:
$ adb devices -l
นอกจากนี้ยังช่วยให้แน่ใจว่า adb daemon ทำงานบนเดสก์ท็อปของคุณ ซึ่งช่วยให้ Frida สามารถค้นพบและสื่อสารกับอุปกรณ์ของคุณได้ ไม่ว่าคุณจะเชื่อมต่ออุปกรณ์ผ่าน USB หรือ WiFi ก็ตาม
frida-server
บน Emulator (หรืออุปกรณ์จริง)ขั้นตอนด้านล่างนี้อิงตาม Android Emulator Nexus 6P (x86) api 23 บน macOS Majave
ก่อนอื่น ให้ดาวน์โหลด frida-server
ล่าสุดสำหรับ Android จากหน้าเผยแพร่ frida-server เช่น สำหรับโปรแกรมจำลอง Android x86
คุณควรดาวน์โหลด frida-server-12.4.7-android-x86.xz และเรียกใช้งานบนโปรแกรมจำลองของคุณ:
$ adb root # might be required
$ adb push frida-server /data/local/tmp/
$ adb shell " chmod 755 /data/local/tmp/frida-server "
$ adb shell " /data/local/tmp/frida-server & "
สำหรับขั้นตอนสุดท้าย หากคุณเห็นข้อผิดพลาดด้านล่าง:
Unable to load SELinux policy from the kernel: Failed to open file “/sys/fs/selinux/policy”: Permission denied
จากนั้นคุณต้องรัน frida-server
โดยใช้รูทเชลล์เช่น
$ adb shell
angler:/ $ su
angler:/ # /data/local/tmp/frida-server &
[1] 12089
angler:/ #
[1] 12089
เป็นรหัสกระบวนการของ frida-server
ตอนนี้ บนเดสก์ท็อปของคุณ ถึงเวลาที่ต้องแน่ใจว่าพื้นฐานใช้งานได้แล้ว วิ่ง:
frida-ps -U
นี่ควรให้รายการกระบวนการแก่คุณตามบรรทัดของ:
PID Name
----- ---------------------------------------------------
721 ATFWD-daemon
4450 adbd
730 [email protected]
407 [email protected]
408 [email protected]
409 [email protected]
410 [email protected]
406 [email protected]
หากต้องการแก้ไขค่า Boolean
ภายในซอร์สโค้ด Java เช่น Boolean bTamperingSucces = false;
หรือรหัสอื่น ๆ ที่คุณสนใจ
apktool
สามารถดึงได้จากเว็บไซต์ Apktool เพียงทำตามขั้นตอนในหน้านี้เพื่อติดตั้ง apktool
adb
มาพร้อมกับ Android SDK ซึ่งสามารถพบได้จากไดเรกทอรี <your-some-path>/Android/sdk/platform-tools/adb
apksigner
คือการลงนาม APK ของคุณด้วยไฟล์ที่เก็บคีย์ เครื่องมือนี้สามารถพบได้ที่ไดเรกทอรี <ANDROID_HOME>/Android/sdk/build-tools/28.0.3/apksigner
และการใช้งานได้รับการบันทึกไว้ที่ apksigner บรรทัดคำสั่ง
โคลนโครงการตัวอย่างจาก DecompileApk
ค้นหาไฟล์ APK ที่คอมไพล์แล้ว DecompileApk/app/release/app-release.apk
ถอดรหัสโดยใช้ apktool
$ cd < your-path > /DecompileApk/app/release/
$ apktool d --no-res -f app-release.apk
คุณจะเห็นผลลัพธ์ด้านล่าง
I: Using Apktool 2.4.0 on app-release.apk
I: Copying raw resources...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
ค้นหา DecompileApk/app/release/app-release/smali/com/arophix/decompileapk/MainActivity.smali
ใต้ไดเรกทอรีรหัส smali และค้นหาโค้ดด้านล่าง
const / 4 p1 , 0x0
เพียงเปลี่ยน 0x0
(หมายถึง false
) เป็น 0x1
(หมายถึง true
) แล้วบันทึกไฟล์
การใช้ apktool เพื่อสร้าง apk ที่ถูกดัดแปลง
apktool b app - release
คุณควรเห็นผลลัพธ์ด้านล่าง
I: Using Apktool 2.4.0
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
I: Checking whether resources has changed...
I: Copying raw resources...
I: Copying libs... (/lib)
I: Building apk file...
I: Copying unknown files/dir...
I: Built apk...
ค้นหา apk ที่สร้างขึ้นใหม่จากไดเร็กทอรี dist
DecompileApk/app/release/app-release/dist/app-release.apk
ลงนาม apk โดยใช้ apksigner และ keystore ซึ่งอยู่ที่ DecompileApk/app/decompileapk.jks
(โปรดแก้ไขพาธสำหรับ keystore และ apk ตามกรณีของคุณเอง)
$ < ANDROID_HOME > /sdk/build-tools/28.0.3/apksigner sign --ks ../decompileapk.jks app-release.apk
คุณควรเห็นผลลัพธ์ด้านล่างและป้อนรหัสผ่าน 123456
Keystore password for signer # 1:
ติดตั้ง apk ที่ลงนามแล้วโดยใช้คำสั่ง adb
$ adb install < path-to-the-tampered-apk > /app-release.apk
แทนที่จะเห็น "Hello from C++"
จากหน้าจอ ตอนนี้คุณควรเห็น "Hello, Android reverse engineer!"
-
เชื่อมต่อซอร์สโค้ด Android Java โดยใช้ Frida
ค้นหาสคริปต์จาก hook_java_methods.py และเรียกใช้โดยใช้คำสั่งด้านล่าง จากนั้นคลิกที่ปุ่มของแอป Android ที่เริ่มต้นแล้ว
$ python3 hook_java_methods.py
[ * ] Running CTF
[ * ] onClick
[ * ] Called - isPhoneRooted ()
[ * ] onClick
[ * ] Called - isPhoneRooted ()
หากคุณเห็นข้อผิดพลาดดังนี้:
$ frida.ServerNotRunningError: unable to connect to remote frida-server: closed
โปรดจำไว้ว่าคุณได้เริ่ม frida-server
บนเครื่องจำลองของคุณ
ในขณะเดียวกัน บนหน้าจอโปรแกรมจำลองของคุณ คุณควรเห็นข้อความขนมปังปิ้งเปลี่ยนเป็น Device not rooted
หากสำเร็จ
เชื่อมต่อซอร์สโค้ด Android C โดยใช้ Frida
ถอดรหัส APK
ขั้นแรก ถอดรหัส apk โดยใช้ apktool เพื่อแยกไลบรารีที่แบ่งใช้ เช่น libnative-lib.so
$ cd DecompileApk/app/release
$ apktool d --no-res app-release.apk
ค้นหาวิธี JNI เป้าหมาย
ประการที่สอง ใช้คำสั่งด้านล่างเพื่อค้นหาฟังก์ชัน JNI ที่จะเชื่อมต่อ
$ nm --demangle --dynamic app-release/lib/x86/libnative-lib.so
คุณควรเห็นผลลัพธ์ด้านล่าง:
00004d80 T Java_com_arophix_decompileapk_MainActivity_stringFromJNI
000090b0 T std::bad_typeid::what () const
00005cf0 T std::bad_exception::what () const
00005e70 T std::bad_array_length::what () const
00005df0 T std::bad_array_new_length::what () const
00008ff0 T std::bad_cast::what () const
...
ฟังก์ชัน Hook C ตามชื่อ
ค้นหาสคริปต์จาก hooknative-by-function-name.py และเรียกใช้โดยใช้คำสั่งด้านล่าง จากนั้นคลิกที่ปุ่มของแอป Android ที่คุณเริ่มต้น
$ python3 hooknative-by-function-name.py
[ * ] Running Arophix Hook Test ...
Java_com_arophix_decompileapk_MainActivity_stringFromJNI called with:
ret: 0x200019
หากคุณเห็นข้อผิดพลาดดังนี้:
$ frida.ServerNotRunningError: unable to connect to remote frida-server: closed
โปรดจำไว้ว่าคุณได้เริ่ม frida-server
บนเครื่องจำลองของคุณ
ในขณะเดียวกัน บนหน้าจอโปรแกรมจำลองของคุณ คุณควรเห็นข้อความที่เปลี่ยนเป็น Frida is hooking this displayed text from Native layer by function name.
ถ้าประสบความสำเร็จ
ฟังก์ชั่น Hook C ตามที่อยู่
ค้นหาสคริปต์จาก hooknative-by-function-address.py และเรียกใช้โดยใช้คำสั่งด้านล่าง จากนั้นคลิกที่ปุ่มของแอพ Android ที่คุณเริ่มต้น
$ python3 hooknative-by-function-address.py
[ * ] Running Arophix Hook Test ...
[+] membase: 0xb2acd000
[+] addressOfStringFromJni: 0xb2ad1d80
[++] addressOfStringFromJni: 0xb2ad1d80
ret: 0x19
หากคุณเห็นข้อผิดพลาดดังนี้:
$ frida.ServerNotRunningError: unable to connect to remote frida-server: closed
โปรดจำไว้ว่าคุณได้เริ่ม frida-server
บนเครื่องจำลองของคุณ
ในขณะเดียวกัน บนหน้าจอโปรแกรมจำลองของคุณ คุณควรเห็นข้อความที่เปลี่ยนเป็น Frida is hooking this displayed text from Native layer by function address.
ถ้าประสบความสำเร็จ