
เครื่องมือสำหรับการโต้ตอบโดยอัตโนมัติกับอุปกรณ์ Android - รวมถึง ADB, Androguard และการโต้ตอบ Frida
Autodroid เป็นเครื่องมือ Python สำหรับการเขียนสคริปต์แบบโปรแกรมการโต้ตอบจำนวนมากกับอุปกรณ์ Android หนึ่งตัวขึ้นไป การใช้งานที่เป็นไปได้รวมถึง:
ในการใช้ Autodroid คุณจะต้องติดตั้งการพึ่งพาสิ่งเหล่านี้จะระบุไว้ในไฟล์ข้อกำหนดและสามารถติดตั้งได้โดยทำตามคำสั่งด้านล่าง
pip install -r REQUIREMENTS.txtAutodroid จะต้องจัดเตรียมไฟล์การกำหนดค่า JSON ที่ถูกต้องเป็นอาร์กิวเมนต์บรรทัดคำสั่ง ด้านล่างแสดงตัวอย่างไฟล์การกำหนดค่าอย่างง่ายที่จะดึงแอปพลิเคชันทั้งหมดจากอุปกรณ์ที่เชื่อมต่อทั้งหมดทีละครั้งและแยก APKs ไปยัง ZIPS โดยใช้ Androguard
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb pull !app_path !app_id.apk " , " reverse: !app_id.apk " ]
} เมื่อคุณสร้างไฟล์การกำหนดค่า autodroid ที่ถูกต้องแล้วคุณสามารถเริ่มการโต้ตอบกับอุปกรณ์ได้โดยเรียกใช้ไฟล์ AutoDroid.py Python ด้วยไฟล์การกำหนดค่าเป็นพารามิเตอร์บรรทัดคำสั่ง
python AutoDroid.py example_config.json ไฟล์การกำหนดค่า autodroid สามารถให้คำสั่งชุดเพื่อเรียกใช้งานบนอุปกรณ์เป้าหมายคำสั่งเหล่านี้จะทำงานในเครื่องบนเครื่องของคุณดังนั้นโปรแกรมและไฟล์ที่ถูกเรียกจะต้องอยู่ คำสั่งเหล่านี้สามารถอยู่ในรูปแบบรายการ (ดังที่เห็นได้ในตัวอย่างด้านบน) หรือเป็นแผนที่ค่าคู่/ dict คู่ค่าคีย์เหล่านี้ถูกกำหนดเป็นบล็อกของคำสั่งโดยที่คีย์คือชื่อบล็อกและค่าเป็นรายการของคำสั่ง block:<block name> สามารถใช้เพื่อเรียกใช้บล็อกและให้คุณสมบัติการวนซ้ำ/ การโทรกลับอย่างง่าย ตัวอย่างของการใช้บล็อกสามารถดูได้ด้านล่าง
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : {
"test_user_input" :[ " adb -s !device_id shell monkey -v 5 -p !app_id " ],
"retrieve_apk" :[ " adb -s !device_id pull !app_path !app_id.apk " , " sleep:5 " ]
}
} สองฟิลด์เพิ่มเติมที่เป็นเครื่องมือสำหรับ autodroid คือฟิลด์ devices และ apps ฟิลด์เหล่านี้กำหนด ID อุปกรณ์ ADB สำหรับอุปกรณ์ที่กำหนดเป้าหมาย (รายการสตริง) และชื่อสัญกรณ์โดเมนย้อนกลับของแอปพลิเคชัน (เช่น com.example.application ) สำหรับแอปพลิเคชันที่กำหนดเป้าหมายบนอุปกรณ์ (รายการสตริง) ทั้งสองฟิลด์นี้สามารถว่างเปล่ารายการสตริงหรือกำหนดเป็น * ที่อุปกรณ์และแอพที่มีอยู่ทั้งหมดจะถูกกำหนดเป้าหมาย ในแบ็กเอนด์วิธีการทำงานนี้คือเมื่อมีการให้ค่าในฟิลด์เหล่านี้โปรแกรมจะวนซ้ำผ่านคำสั่งทั้งหมดเพื่อให้แต่ละแอปพลิเคชันในแต่ละอุปกรณ์ ตัวอย่างของการระบุอุปกรณ์และแอพเฉพาะสามารถดูได้ด้านล่าง:
{
"devices" : [ " 09261JEC216934 " ],
"apps" : [ " com.google.android.networkstack.tethering " ],
"commands" : [ " adb -s !device_id pull !app_path !app_id.apk " ]
} เมื่อฟิลด์อุปกรณ์ไม่ว่างเปล่า (เช่นไม่ใช่ "devices":[], ) ตัวแปร (ดูด้านล่าง) ของ !device_id ถูกสร้างขึ้น ตัวแปรนี้สามารถใช้ในคำสั่งของคุณเพื่อแสดงรหัสอุปกรณ์ ADB สำหรับอุปกรณ์เป้าหมายปัจจุบัน ในทำนองเดียวกันตัวแปร !app_id และ !app_path จะถูกเพิ่มเมื่อฟิลด์แอปไม่ว่างเปล่าและสามารถใช้ในคำสั่งเพื่อกำหนดชื่อโน้ตโดเมนย้อนกลับแอปและเส้นทางไปยังไฟล์ APK ของแอปพลิเคชันนั้น
ในการประหยัดเวลา Autodroid อนุญาตให้ตั้งค่าตัวแปรจำนวนที่ไม่มีที่สิ้นสุดในสคริปต์ ตัวแปรเหล่านี้สร้างขึ้นในรูปแบบคู่ค่าคีย์ เมื่อคีย์ของตัวแปรอยู่ในคำสั่งมันจะถูกแทนที่สำหรับค่า ตัวอย่างการกำหนดค่าที่ใช้ตัวแปรสามารถดูได้ด้านล่างในไฟล์กำหนดค่านี้ตัวแปร !test ได้รับการเพิ่มเป็นมือสั้นสำหรับคำสั่ง monkey ADB และตัวแปรในตัว !app_id ยังใช้
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"variables" : { "!test" : " adb -s !device_id shell monkey -v 500 -p " },
"commands" : [ " !test !app_id " ]
} มาตรฐานที่ต้องการสำหรับการใช้ตัวแปรคือนำหน้าด้วย A ! และใช้ _ แทนช่องว่าง
ตัวแปรสามารถตั้งค่าได้ที่รันไทม์โดยใช้ ? ผู้ประกอบการ ในกรณีที่ตัวดำเนินการตามด้วยชื่อตัวแปรถูกตั้งค่าเป็นทั้งคำสั่งเอาต์พุตต่อไปนี้หรือถ้าคำสั่งไม่มีเอาต์พุตคำสั่งเอง ตัวอย่างสามารถดูได้ด้านล่าง:
{
"devices" : [],
"apps" : [],
"commands" : [ " ?!files dir " , " print: !files " ]
}ด้านล่างนี้เป็นรายการของตัวแปรที่สงวนไว้ซึ่งใช้ใน autodroid แล้วและควรหลีกเลี่ยงจากการเพิ่มไฟล์กำหนดค่าของคุณ หากมีการเพิ่มตัวแปรเหล่านี้พวกเขาจะถูกเขียนทับที่รันไทม์
!device_id - เมื่อมีอุปกรณ์หนึ่งตัวขึ้นไปในการกำหนดค่าตัวแปรนี้จะถูกเติมเมื่อรันไทม์ และถูกตั้งค่าเป็น ID อุปกรณ์ ADB สำหรับอุปกรณ์ปัจจุบัน อุปกรณ์แต่ละตัวจะวนซ้ำผ่านคำสั่งที่กำหนดค่าที่กำลังเรียกใช้สำหรับแต่ละอุปกรณ์!adb_connect -นี่คือตัวแปรชวเลขที่แปลเป็น adb -s !device_id การใช้สิ่งนี้แทน adb จะประกันว่าคำสั่ง ADB ทั้งหมดจะทำงานบนอุปกรณ์ที่ถูกต้อง!app_id - เมื่อมีแอพหนึ่งตัวขึ้นไปในการกำหนดค่าตัวแปรนี้จะถูกเติมเมื่อรันไทม์ และถูกตั้งค่าเป็นชื่อสัญกรณ์โดเมนย้อนกลับของแอปพลิเคชัน (เช่น com.example.myapplication ) สำหรับแอปพลิเคชันปัจจุบัน แต่ละแอปพลิเคชันจะวนซ้ำผ่านคำสั่งที่กำหนดค่าที่กำลังเรียกใช้สำหรับแต่ละแอป!app_path - คล้ายกับข้างต้น เมื่อมีแอพหนึ่งตัวขึ้นไปในการกำหนดค่าตัวแปรนี้จะถูกเติมที่รันไทม์ และถูกตั้งค่าเป็นพา ธ ไปยังไฟล์แอปพลิเคชัน APK ปัจจุบันบนอุปกรณ์เป้าหมาย แต่ละแอปพลิเคชันจะวนซ้ำผ่านคำสั่งที่กำหนดค่าที่กำลังเรียกใช้สำหรับแต่ละแอป ค่าคงที่เป็นคำสั่งเฉพาะกับ autodroid และเกี่ยวข้องกับฟังก์ชั่นเฉพาะ โดยปกติจะแบ่งออกเป็นคำหลักตามด้วย : จากนั้นพารามิเตอร์หนึ่งตัวขึ้นไปคั่นด้วย A ; - ค่าคงที่เหล่านี้จะต้องใช้ในช่วงเริ่มต้นของคำสั่งและควรอยู่ในกรณีที่ต่ำกว่าเสมอ ตัวอย่างจะได้รับในแต่ละส่วน
Autodroid ได้สร้างฟังก์ชันการทำงานเพื่อเรียกใช้ไฟล์ Frida JavaScript ซึ่งเป็นส่วนหนึ่งของการรัน autodroid ค่าคงที่นี้ถูกกำหนดให้เป็น frida: และจะต้องจัดเตรียมเส้นทางไปยังไฟล์ JavaScript ที่ใช้ตามด้วย A ; จากนั้นแอปพลิเคชันย้อนกลับชื่อสัญกรณ์ของแอปพลิเคชันที่ถูกกำหนดเป้าหมาย นอกเหนือจากการใช้ตัวแปรกับคำสั่งแล้วตัวแปรจะถูกนำไปใช้กับเนื้อหาของไฟล์ที่มีให้
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " frida:myJavascript.js;!app_id " ]
}หมายเหตุ ในขณะที่การรวม FRIDA ถูกนำมาใช้ แต่ปัจจุบันยังไม่ได้ทดสอบ
Autodroid รองรับ apks วิศวกรรมย้อนกลับผ่าน Androguard ค่าคงที่นี้มีโครงสร้างเป็น reverse: และใช้เส้นทางไปยัง APK ที่เก็บไว้ในพื้นที่ การใช้สิ่งนี้จะบันทึก APK เวอร์ชันที่ไม่รวมเป็นซิปที่มีชื่อ <application name>.apk
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb -s !device_id pull !app_path !app_id.apk " , " reverse: !app_id.apk " ]
} เมื่อใช้ค่าคงที่ย้อนกลับพา ธ APK สามารถตามด้วยจำนวนผู้กำหนดจำนวน (แยก manifest a ; ) สิ่งเหล่านี้รวมถึง info (ซึ่งจะบันทึกไฟล์ JSON ของข้อมูลแอปพลิเคชัน decompile (ซึ่งบน linux จะบันทึก zip สรุปวิธีการที่ไม่ได้รับ การใช้พารามิเตอร์เหล่านี้สามารถดูได้ด้านล่าง:
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : {
"get_app" : [ " adb -s !device_id pull !app_path !app_id.apk " ],
"reverse_app" :[ " reverse: !app_id.apk;info " ,
" reverse: !app_id.apk;manifest;decompile " ]
}
} ค่าคงที่นี้ให้ฟังก์ชั่นง่ายๆสำหรับการหยุดการทำงานของเครื่องมือในระยะเวลาที่กำหนด ค่าคงที่นี้ได้รับการจัดโครงสร้างเป็นการ sleep: ตามด้วยจำนวนวินาทีที่จะรอ
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb pull !app_path !app_id.apk " , " sleep:5 " ]
} ค่าคงที่ของบล็อกให้ฟังก์ชั่นการวนรอบและการโทรกลับอย่างง่าย ค่าคงที่นี้มีโครงสร้างเป็น block: ตามด้วยชื่อของบล็อกของคำสั่งที่จะดำเนินการ หากไม่มีการให้บล็อก (เช่นคำสั่งได้รับการระบุไว้ในรูปแบบรายการ) คำสั่งจะถูกเพิ่มลงในบล็อกที่เรียกว่า main
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : {
"test_user_input" :[ " adb shell monkey -v 5 -p !app_id " ],
"retrieve_apk" :[ " adb pull !app_path !app_id.apk " ],
"test_again" : [ " block: test_user_input " , " sleep:5 " ]
}
}คำหลัก 'ค้นหา' ตามด้วยเส้นทางไปยัง APK และสตริง Regex เพื่อค้นหาจะพิมพ์ไปยังคอนโซลเส้นทางไปยัง APK และสตริงที่พบหากมีอยู่ใน APK สิ่งนี้สามารถใช้ร่วมกับคำสั่งอื่น ๆ เพื่อเรียกใช้สายค้นหาในแอพที่ประมวลผลทั้งหมด ตัวอย่างนี้สามารถดูได้ด้านล่าง:
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb pull !app_path !app_id.apk " , " find: !app_id.apk;my_string " ]
} อีกค่าคงที่ง่าย ๆ print: ค่าคงที่สามารถใช้ในการพิมพ์ข้อความไปยังคอนโซล ตัวอย่างของการใช้สิ่งนี้สามารถดูได้ด้านล่าง:
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " print: device id !device_id, app id !app_id, app path !app_path " ]
} ค่าคงที่การเขียนอนุญาตให้ตัวแปรหรือคำสั่งที่จะเขียนลงในไฟล์ ใช้กับสตริง write: ตามด้วยไฟล์ที่จะเขียนตามด้วย a ; จากนั้นคำสั่งหรือตัวแปรในการเขียนไปยังไฟล์
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : {
"get_stats" : [ " ?!stats device id !device_id, app id !app_id, app path !app_path " ],
"write_stats" : [ " write: !device_id-!app_id-stats.txt;!stats " ]
}
} read: ค่าคงที่คือเส้นทางไปยังไฟล์ที่จะอ่านตามด้วย a ; จากนั้นตัวแปรเพื่อบันทึกเอาต์พุตไปที่ ตัวแปรนี้สามารถเป็นตัวแปรที่ประกาศใหม่หรือมีอยู่
{
"devices" : [],
"apps" : [],
"commands" : [ " read:test.txt;!data " , " print: !data " ]
} คล้ายกับการเขียน ค่าคงที่ต่อท้ายอนุญาตให้ตัวแปรหรือคำสั่งที่จะเขียนไปยังไฟล์ ใช้กับ append: สตริงตามด้วยไฟล์ที่จะเขียนตามด้วย a ; จากนั้นคำสั่งหรือตัวแปรในการเขียนไปยังไฟล์ ซึ่งแตกต่างจากการเขียนซึ่งจะสร้างหรือเขียนผ่านไฟล์ที่มีอยู่ผนวกจะเพิ่มลงในไฟล์ที่มีอยู่เท่านั้น หากไฟล์ไม่มีอยู่แล้ว autodroid จะเกิดข้อผิดพลาด
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " append:test.txt;!app_id !app_path " ]
}ด้านล่างเป็นตัวอย่างของการใช้ autodroid เพื่อทดสอบมัลแวร์ที่มีศักยภาพบนอุปกรณ์ Android การกำหนดค่านี้ติดตั้งมัลแวร์ที่มีศักยภาพบันทึกหน้าจอดึงการจับภาพหน้าจอและถอนการติดตั้งแอปพลิเคชัน
{
"devices" : [ " * " ],
"apps" : [],
"commands" : {
"record_screen" : [ " adb shell screenrecord /data/local/tmp/test.mp4 --time-limit 120 " ],
"install_eicar" :[ " adb install com.fsecure.eicar.antivirus.test.apk " ],
"user_input" :[ " adb shell monkey -p com.fsecure.eicar.antivirus.test -v 1 " , " sleep: 20 " ],
"uninstall" : [ " adb uninstall com.fsecure.eicar.antivirus.test " ],
"get_video" : [ " adb pull /data/local/tmp/test.mp4 " , " sleep: 20 " , " adb shell rm /data/local/tmp/test.mp4 " ]
}
}ด้านล่างนี้เป็นตัวอย่างของการใช้การใช้งานของ Androguard ของ Autodroid เพื่อย้อนกลับวิศวกรรม APK ออกจากอุปกรณ์และดึงข้อมูล JSON เกี่ยวกับแอปสรุปวิธีการย่อยสลายไฟล์ XML Manifest และไฟล์ซิปที่ไม่ได้ระบุ
{
"devices" : [ " * " ],
"apps" : [ " me.jamesstevenson.onelist " ],
"commands" : {
"get_app" : [ " adb pull !app_path !app_id.apk " ],
"reverse_app" :[ " reverse: !app_id.apk;info;decompile;manifest;zip " ]
}
}GNU ทั่วไปใบอนุญาตสาธารณะ v3.0