APK.SH เป็นสคริปต์ทุบตีที่ทำให้แอพ Android ย้อนกลับง่ายขึ้นโดยอัตโนมัติงานซ้ำ ๆ บางอย่างเช่นการดึงการถอดรหัสการสร้างใหม่และการแก้ไข APK
APK.SH โดยทั่วไปใช้ APKTOOL เพื่อแยกชิ้นส่วนถอดรหัสและสร้างทรัพยากรใหม่และทุบตีบางอย่างเพื่อทำให้กระบวนการฉีด Frida Gadget เป็นไปโดยอัตโนมัติ นอกจากนี้ยังรองรับแอพพลิเคชั่น/APKS แบบแยก
⬅การดึง APK จากอุปกรณ์นั้นง่ายพอ ./apk.sh pull <package_name>
- การถอดรหัส APK นั้นง่ายพอ ๆ กับการทำงาน ./apk.sh decode <apk_name>
- การ ./apk.sh build <apk_dir> APK ขึ้นมาใหม่นั้นง่ายพอ ๆ
apk.sh pull APK จากอุปกรณ์ รองรับแอพ Bundles/Split Apks ซึ่งหมายความว่า APKs แยกจะเข้าร่วมใน APK เดียว (สิ่งนี้มีประโยชน์สำหรับการแก้ไข) หากแพ็คเกจเป็นแอพ Bundle/Split APK, APK.SH จะรวม APKs ไว้ใน APK เดียวแก้ไขตัวระบุทรัพยากรสาธารณะทั้งหมด
apk.sh patch ทช์ apk เพื่อโหลด frida-gadget.so เมื่อเริ่มต้น
Frida-gadget.so เป็นห้องสมุดที่ใช้ร่วมกันของ Frida ซึ่งหมายถึงการโหลดโดยโปรแกรมที่จะใช้เครื่องมือ (เมื่อโหมดการทำงานที่ฉีดไม่เหมาะสม) เพียงแค่โหลดไลบรารีมันจะช่วยให้คุณสามารถโต้ตอบกับมันโดยใช้เครื่องมือที่ใช้ Frida ที่มีอยู่เช่น Frida-Trace นอกจากนี้ยังรองรับวิธีการอิสระอย่างเต็มที่ซึ่งสามารถเรียกใช้สคริปต์ออกจากระบบไฟล์โดยไม่ต้องมีการสื่อสารภายนอก
การแก้ไข APK นั้นง่ายพอ ๆ กับการทำงาน. ./apk.sh patch <apk_name> --arch arm
คุณสามารถระบุการกำหนดค่า Gadget Frida ใน json ./apk.sh patch <apk_name> --arch arm --gadget-conf <config.json>
หากคุณพบ "ฝึกงานแล้ว" ข้อผิดพลาด apktool d เช่นใน #30 คุณสามารถส่งธง --only-main-classes ซึ่งจะถูกส่งผ่านไปยัง apktool เมื่อถอดรหัส APK ของคุณ
ในการโต้ตอบเริ่มต้น Frida Gadget เปิดเผยอินเทอร์เฟซที่เข้ากันได้กับ Frida-Server โดยฟังบน LocalHost: 27042 โดยค่าเริ่มต้น เพื่อให้ได้เครื่องมือในช่วงต้น Frida ให้บล็อกฟังก์ชั่นตัวสร้างของ Gadget จนกว่าคุณจะ attach() เข้ากับกระบวนการหรือการโทร resume() หลังจากผ่าน spawn() -> attach() -> ...apply instrumentation... ขั้นตอน
หากคุณไม่ต้องการพฤติกรรมการปิดกั้นนี้และต้องการให้โปรแกรมบูตขึ้นหรือไม่หรือคุณต้องการให้ฟังในอินเทอร์เฟซหรือพอร์ตอื่นคุณสามารถปรับแต่งสิ่งนี้ผ่านไฟล์การกำหนดค่า JSON
การกำหนดค่าเริ่มต้นคือ:
{
"interaction" : {
"type" : " listen " ,
"address" : " 127.0.0.1 " ,
"port" : 27042 ,
"on_port_conflict" : " fail " ,
"on_load" : " wait "
}
} คุณสามารถส่งไฟล์การกำหนดค่าแกดเจ็ตไปยัง apk.sh ด้วยตัวเลือก --gadget-conf
การกำหนดค่าที่แนะนำโดยทั่วไปอาจเป็น:
{
"interaction" : {
"type" : " script " ,
"path" : " /data/local/tmp/script.js " ,
"on_change" : " reload "
}
}script.js อาจเป็นเช่น:
var android_log_write = new NativeFunction (
Module . getExportByName ( null , '__android_log_write' ) ,
'int' ,
[ 'int' , 'pointer' , 'pointer' ]
) ;
var tag = Memory . allocUtf8String ( "[frida-script][ax]" ) ;
var work = function ( ) {
setTimeout ( function ( ) {
android_log_write ( 3 , tag , Memory . allocUtf8String ( "ping @ " + Date . now ( ) ) ) ;
work ( ) ;
} , 1000 ) ;
}
work ( ) ;
android_log_write ( 3 , tag , Memory . allocUtf8String ( ">--(O.o)-<" ) ) ; adb push script.js /data/local/tmp
./apk.sh patch <apk_name> --arch arm --gadget-conf <config.json>
adb install file.gadget.apk
เพิ่มรหัสต่อไปนี้เพื่อพิมพ์เพื่อบันทึกเอาต์พุต console.log ของสคริปต์ใด ๆ จาก codeshare Frida เมื่อใช้ประเภทการโต้ตอบสคริปต์
// print to logcat the console.log output
// see: https://github.com/frida/frida/issues/382
var android_log_write = new NativeFunction (
Module . getExportByName ( null , '__android_log_write' ) ,
'int' ,
[ 'int' , 'pointer' , 'pointer' ]
) ;
var tag = Memory . allocUtf8String ( "[frida-script][ax]" ) ;
console . log = function ( str ) {
android_log_write ( 3 , tag , Memory . allocUtf8String ( str ) ) ;
} apk.sh [SUBCOMMAND] [APK FILE|APK DIR|PKG NAME] [FLAGS]
apk.sh pull [PKG NAME] [FLAGS]
apk.sh decode [APK FILE] [FLAGS]
apk.sh build [APK DIR] [FLAGS]
apk.sh patch [APK FILE] [FLAGS]
apk.sh rename [APK FILE] [PKG NAME] [FLAGS]
pull Pull an apk from device/emulator.
decode Decode an apk.
build Re-build an apk.
patch Patch an apk.
rename Rename the apk package.
-a, --arch <arch> ระบุสถาปัตยกรรมเป้าหมายบังคับเมื่อแก้ไข
-g, --gadget-conf <json_file> ระบุไฟล์การกำหนดค่า Frida-Gadget ซึ่งเป็นตัวเลือกเมื่อแก้ไข
-n, --net เพิ่มการกำหนดค่าความปลอดภัยเครือข่ายที่อนุญาตเมื่อสร้างเป็นทางเลือก สามารถใช้กับแพทช์ดึงและเปลี่ยนชื่อได้ด้วย
-s, --safe ไม่ถอดรหัสทรัพยากรเมื่อถอดรหัส (เช่น Apktool -r) ไม่สามารถใช้งานได้เมื่อแก้ไข
-d, --no-dis ไม่ถอดแยกเด็กซ์, เป็นทางเลือกเมื่อถอดรหัส (เช่น apktool -s) ไม่สามารถใช้งานได้เมื่อแก้ไข
https://frida.re/docs/gadget/
https://lief-project.github.io/doc/latest/tutorials/09_frida_lief.html
https://koz.io/using-frida-on-android-without-root/
https://github.com/sensepost/object/
https://github.com/nickstadb/patch-apk/
https://neo-geo2.gitbook.io/adventures-on-security/frida-scripting-guide/frida-scripting-guide