
أداة لأتمتة التفاعلات مع أجهزة Android - بما في ذلك ADB و Androguard و Frida التفاعلية.
Autodroid هي أداة Python لتكنولوجيا البرمجة النصية برمجة برمجة برمجة مع جهاز Android واحد أو أكثر. تشمل الاستخدامات الممكنة:
لاستخدام التبعية ، ستحتاج إلى تثبيت التبعيات ، يتم تحديدها في ملف المتطلبات ويمكن تثبيتها باتباع الأمر أدناه.
pip install -r REQUIREMENTS.txtيجب توفير ملف تكوين JSON صالح كوسيطة سطر الأوامر. يوضح أدناه مثال ملف تكوين بسيط من شأنه أن يسترجع جميع التطبيقات من جميع الأجهزة المتصلة واحدة في وقت واحد واستخراج APKs إلى ZIPS باستخدام Androguard.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb pull !app_path !app_id.apk " , " reverse: !app_id.apk " ]
} بمجرد إنشاء ملف تكوين تلقائي صالح ، يمكنك بدء تشغيل تفاعل الجهاز عن طريق تشغيل ملف Python AutoDroid.py مع ملف التكوين كمعلمة سطر الأوامر.
python AutoDroid.py example_config.json يمكن توفير ملف تكوين التلقائي لسلسلة من الأوامر التي يتم تنفيذها على الأجهزة المستهدفة ، ويتم تشغيل هذه الأوامر محليًا على جهازك ، وبالتالي يجب أن تكون البرامج والملفات التي يتم استدعاؤها موجودة. يمكن أن تكون هذه الأوامر إما بتنسيق قائمة (كما يمكن رؤيته في المثال أعلاه) أو كخريطة/ 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 " ]
}
} حقلان إضافيان مفيدة للقطعة الذاتية هما devices apps . تحدد هذه الحقول معرف جهاز 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 لهذا التطبيق.
لتوفير الوقت ، يسمح التلقائي بتعيين كمية لا حصر لها من المتغيرات في البرنامج النصي. يتم إنشاء هذه المتغيرات بتنسيق زوج القيمة الرئيسي. عندما يوجد مفتاح المتغير في أمر ، سيتم استبداله بالقيمة. يمكن رؤية تكوين مثال يستخدم المتغيرات أدناه ، في ملف التكوين هذا ، تمت إضافة !test كيد قصيرة لأمر ADB monkey ويتم استخدام المتغير المدمج !app_id أيضًا.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"variables" : { "!test" : " adb -s !device_id shell monkey -v 500 -p " },
"commands" : [ " !test !app_id " ]
} المعيار المفضل لاستخدام المتغيرات هو أن يسبقها مع ! واستخدام _ بدلاً من المساحات.
يمكن تعيين المتغيرات في وقت التشغيل باستخدام ? المشغل. عندما يتم تعيين المشغل متبوعًا باسم متغير على إما إخراج الأوامر التالية أو إذا لم يكن للأمر أي إخراج الأمر نفسه. يمكن رؤية مثال أدناه:
{
"devices" : [],
"apps" : [],
"commands" : [ " ?!files dir " , " print: !files " ]
}فيما يلي قائمة بالمتغيرات المحجوزة التي يتم استخدامها بالفعل في التلقائي ، ويجب تجنبها من الإضافة إلى ملف التكوين الخاص بك. إذا تمت إضافة هذه المتغيرات ، فسيتم كتابةها في وقت التشغيل.
!device_id - عند توفير جهاز واحد أو أكثر في التكوين ، يتم ملء هذا المتغير في وقت التشغيل. ويتم تعيينه كمعرف جهاز ADB للجهاز الحالي. يتم حلق كل جهاز بدوره مع تشغيل الأوامر التي تم تكوينها لكل جهاز.!adb_connect -هذا متغير مختصر يترجم إلى adb -s !device_id ، باستخدام هذا بدلاً من adb سيؤمن أن جميع أوامر ADB يتم تشغيلها على الجهاز الصحيح.!app_id - عند توفير تطبيق واحد أو أكثر في التكوين ، يتم ملء هذا المتغير في وقت التشغيل. ويتم تعيينه كاسم تدوين للتطبيق العكسي للمجال (أي com.example.myapplication ) للتطبيق الحالي. يتم حلق كل تطبيق بدوره مع تشغيل الأوامر التي تم تكوينها لكل تطبيق.!app_path - مشابه لما ورد أعلاه. عندما يتم توفير تطبيق واحد أو أكثر في التكوين ، يتم ملء هذا المتغير في وقت التشغيل. ويتم تعيينه كمسار إلى ملف APK للتطبيق الحالي على الجهاز الهدف. يتم حلق كل تطبيق بدوره مع تشغيل الأوامر التي تم تكوينها لكل تطبيق. الثوابت هي أوامر خاصة بالقطعة الذاتية وترتبط بوظائف محددة. عادةً ما يتم تقسيمها إلى كلمة رئيسية متبوعة بـ A : ثم معلمة أو أكثر مفصولة بواسطة A ; . يجب استخدام هذه الثوابت في بداية الأمر ويجب أن تكون دائمًا في الحالة السفلية. سيتم إعطاء أمثلة في الأقسام الفردية.
قامت Autodroid بإنشاء وظائف لتشغيل ملفات Frida JavaScript كجزء من تشغيل التلقائي. يتم تعريف هذا الثابت على أنه frida: ويجب توفير المسار إلى ملف JavaScript المستخدم ، يليه A ; ثم اسم الترميز العكسي للتطبيق الذي يتم استهدافه. بالإضافة إلى تطبيق المتغيرات على الأمر ، يتم تطبيق المتغيرات أيضًا على محتويات الملف المتوفرة.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " frida:myJavascript.js;!app_id " ]
}ملاحظة أثناء تنفيذ تكامل Frida ، فهو حاليًا لم يتم اختباره.
يدعم Autodroid APKs الهندسة العكسية عبر Androguard. يتم تنظيم هذا الثابت على أنه reverse: ويأخذ طريقًا إلى APK المخزنة محليًا. سيؤدي استخدام هذا إلى حفظ نسخة غير مدفوعة من APK باعتبارها ZIP مع اسم <application name>.apk .
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb -s !device_id pull !app_path !app_id.apk " , " reverse: !app_id.apk " ]
} عند استخدام الثابت العكسي ، يمكن تتبع مسار APK أي عدد من المعلمات (منفصلة بواسطة A ; ) ، هذه بما في ذلك info (والتي ستحفظ ملف JSON من معلومات التطبيق ، decompile (والتي ستحفظ على Linux ملخصًا txt للأساليب التي يتم حلها) ، والتي يتم manifest (والتي ستحفظ ملف XML ، و 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: يليه اسم كتلة الأوامر المراد تنفيذه. إذا لم يتم توفير كتل (تم توفير أوامر IE بتنسيق قائمة) ، فسيتم إضافة الأوامر إلى كتلة تسمى 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: سلسلة متبوعة بالملف للكتابة إليها ، تليها أ ; ، ثم الأمر أو المتغير للكتابة إلى الملف.
{
"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: يتم توفير مسار ثابت إلى ملف للقراءة ، يليه أ ; ، ثم المتغير لحفظ الإخراج إلى. يمكن أن يكون هذا المتغير متغيرًا معلنًا حديثًا أو موجودًا.
{
"devices" : [],
"apps" : [],
"commands" : [ " read:test.txt;!data " , " print: !data " ]
} على غرار الكتابة. يسمح ثابت الإلحاح بمتغير أو أمر يتم كتابة أمر إلى ملف. يستخدم مع append: سلسلة متبوعة بالملف للكتابة إليه ، متبوعًا بـ A ; ، ثم الأمر أو المتغير للكتابة إلى الملف. على عكس الكتابة التي ستنشئ أو الكتابة عبر ملف موجود ، ستضيف إلحاق فقط إلى ملف موجود. إذا لم يكن الملف موجودًا ، فسيتم خطأ.
{
"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 التلقائي لعكس هندسة APK من جهاز واسترداد مجموعة من المعلومات حول التطبيق ، وملخص مفكك للأساليب ، وملف XML البيان ، وملف zip غير مدفوع من APK.
{
"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