
Ein Werkzeug zur Automatisierung von Interaktionen mit Android -Geräten - einschließlich ADB, Androguard und Frida Interaktivität.
Autodroid ist ein Python -Tool für programmgesteuertes Skriptmasseninteraktionen mit einem oder mehreren Android -Geräten. Mögliche Verwendungen umfassen:
Um Autodroid zu verwenden, müssen Sie die Abhängigkeiten installieren. Diese werden in der Anforderungsdatei angegeben und können durch Befolgen des folgenden Befehls installiert werden.
pip install -r REQUIREMENTS.txtAutodroid muss eine gültige JSON -Konfigurationsdatei als Befehlszeilenargument bereitstellen. Im Folgenden wird ein einfaches Beispiel für die Konfigurationsdatei angezeigt, mit dem alle Anwendungen von allen verbundenen Geräten einzeln abgerufen werden und die APKs mit Androguard an Reißverschlüsse extrahiert werden.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb pull !app_path !app_id.apk " , " reverse: !app_id.apk " ]
} Sobald Sie eine gültige Autodroid -Konfigurationsdatei erstellt haben, können Sie die Geräteinteraktion beginnen, indem Sie die Python -Datei AutoDroid.py mit der Konfigurationsdatei im Befehlszeilenparameter ausführen.
python AutoDroid.py example_config.json Die Autodroid -Konfigurationsdatei kann eine Reihe von Befehlen zur Ausführung auf den Zielgeräten erhalten. Diese Befehle werden lokal auf Ihrem Computer ausgeführt, und so müssen die aufgerufenen Programme und Dateien vorhanden sein. Diese Befehle können entweder in einem Listenformat (wie im obigen Beispiel angezeigt werden) oder als Schlüsselwertpaar -Karte/ -diktat vorliegen. Diese Schlüsselwertpaare werden als Befehlblöcke definiert, wobei der Schlüssel der Blockname ist und der Wert eine Liste von Befehlen ist. Der konstante (unten beschrieben) block:<block name> kann zum Ausführen eines Blocks verwendet werden und bietet eine einfache Funktion für Schleifen/ Aufruf-Back. Ein Beispiel für die Verwendung von Blöcken ist unten zu sehen.
{
"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 " ]
}
} Zwei weitere Felder, die für Autodroid maßgeblich sind, sind die devices und apps Felder. Diese Felder definieren die ADB -Geräte -ID für die zugeschnittenen Geräte (eine Liste von Zeichenfolgen) und den Namen der Anwendungs -Reverse -Domänennotationsname (dh com.example.application ) für die auf das Gerät abzielten Anwendungen (eine Liste von Strings). Beide Felder können leer sein, eine Liste von Zeichenfolgen oder definiert als * , bei dem alle verfügbaren Geräte und Apps gezielt werden. Im Backend funktioniert dies, wenn ein Wert in diesen Feldern bereitgestellt wird. Das Programm wird alle Befehle für jede Anwendung auf jedem Gerät durchlaufen. Ein Beispiel für die Angabe eines bestimmten Geräts und einer speziellen App ist unten zu sehen:
{
"devices" : [ " 09261JEC216934 " ],
"apps" : [ " com.google.android.networkstack.tethering " ],
"commands" : [ " adb -s !device_id pull !app_path !app_id.apk " ]
} Wenn das Feld Geräte nicht leer ist (dh keine "devices":[], ) wird eine Variable (siehe unten) von !device_id erstellt. Diese Variable kann in Ihren Befehlen verwendet werden, um die ADB -Geräte -ID für das aktuelle gezielte Gerät zu kennzeichnen. In ähnlicher Weise werden die Variablen !app_id und !app_path hinzugefügt, wenn das App -Feld nicht leer ist und in Befehlen verwendet werden kann, um den Namen der App Reverse Domain Notation und den Pfad zur APK -Datei dieser Anwendung zu definieren.
Um Zeit zu sparen, ermöglicht Autodroid, dass eine unendliche Menge an Variablen in ein Skript festgelegt werden kann. Diese Variablen sind in einem Schlüsselwertpaarformat konstruiert. Wenn sich der Schlüssel einer Variablen in einem Befehl befindet, wird er für den Wert ersetzt. Eine beispielhafte Konfiguration, die Variablen verwendet, ist unten angezeigt. In dieser Konfigurationsdatei wurde der Variable !test als kurze Hand für einen monkey ADB-Befehl hinzugefügt, und die integrierte Variable !app_id wird ebenfalls verwendet.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"variables" : { "!test" : " adb -s !device_id shell monkey -v 500 -p " },
"commands" : [ " !test !app_id " ]
} Der bevorzugte Standard für die Verwendung von Variablen besteht darin, ihnen mit einem ! und _ anstelle von Leerzeichen zu verwenden.
Variablen können zur Laufzeit mit dem festgelegt werden ? Operator. Wobei der Bediener gefolgt von einem Variablennamen auf die Ausgabe der folgenden Befehle festgelegt wird oder wenn der Befehl den Befehl selbst nicht ausgibt. Ein Beispiel ist unten zu sehen:
{
"devices" : [],
"apps" : [],
"commands" : [ " ?!files dir " , " print: !files " ]
}Das folgende finden Sie eine Liste reservierter Variablen, die bereits in Autodroid verwendet werden und durch das Hinzufügen zu Ihrer Konfigurationsdatei vermieden werden sollten. Wenn diese Variablen hinzugefügt werden, werden sie zur Laufzeit überschrieben.
!device_id - Wenn in der Konfiguration ein oder mehrere Geräte bereitgestellt werden, wird diese Variable zur Laufzeit besiedelt. Und wird als ADB -Geräte -ID für das aktuelle Gerät eingestellt. Jedes Gerät wird wiederum mit den für jedes Gerät ausgeführten konfigurierten Befehle durchlaufen.!adb_connect -Dies ist eine Kurzvariable, die sich in adb -s !device_id übersetzt. Verwenden Sie diese anstelle von adb , dass alle ADB -Befehle auf dem richtigen Gerät ausgeführt werden.!app_id - Wenn in der Konfiguration ein oder mehrere Apps bereitgestellt werden, wird diese Variable zur Laufzeit besiedelt. Und wird als Anwendungsnotationsname (dh com.example.myapplication ) für die aktuelle Anwendung festgelegt. Jede Anwendung wird wiederum mit den für jede App ausgeführten konfigurierten Befehle durchgesetzt.!app_path - ähnlich wie oben. Wenn in der Konfiguration ein oder mehrere Apps bereitgestellt werden, wird diese Variable zur Laufzeit besiedelt. Und wird als Pfad zur aktuellen Anwendungs -APK -Datei auf dem Zielgerät eingestellt. Jede Anwendung wird wiederum mit den für jede App ausgeführten konfigurierten Befehle durchgesetzt. Konstanten sind für Autodroid spezifische Befehle und beziehen sich auf bestimmte Funktionen. Normalerweise unterteilt sich in ein Schlüsselwort, gefolgt von a : und dann eine oder mehrere Parameter, die durch a getrennt sind ; . Diese Konstanten müssen zu Beginn eines Befehls verwendet werden und sollten immer in niedrigerer Fall sein. Beispiele werden in den einzelnen Abschnitten angegeben.
Autodroid hat die Funktionalität integriert, um Frida JavaScript -Dateien als Teil eines Autodroid -Laufs auszuführen. Diese Konstante wird als frida: und muss den Pfad zur verwendeten JavaScript -Datei zur Verfügung gestellt werden, gefolgt von a ; und dann der Anwendungsnotationsname der Anwendung. Zusätzlich zur Anwendung von Variablen auf den Befehl werden auch Variablen auf den Inhalt der bereitgestellten Datei angewendet.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " frida:myJavascript.js;!app_id " ]
}Beachten Sie , dass die Frida -Integration implementiert ist, sondern derzeit nicht getestet wird.
Autodroid unterstützt Reverse Engineering APKs über Androguard. Diese Konstante ist als reverse: und nimmt einen Pfad zu einer lokal gespeicherten APK. Wenn Sie dies verwenden, speichern Sie eine ungebundende Version des APK als Reißverschluss mit dem Namen <application name>.apk .
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb -s !device_id pull !app_path !app_id.apk " , " reverse: !app_id.apk " ]
} Bei der Verwendung der umgekehrten Konstante kann der APK -Pfad eine beliebige Anzahl von Paramitern (separat durch a ; ) folgen, wobei diese einschließlich info (die eine JSON -Datei mit Anwendungsinformationen speichern, decompile (die unter Linux eine TXT -Zusammenfassung der zersetzten Methoden speichert), manifest (die die XML -Manifestdatei zip , die die gleiche Aktion ausführen. Parameter sind unten zu sehen:
{
"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 " ]
}
} Diese Konstante bietet einfache Funktionen für die Ausführung des Werkzeugs für eine bestimmte Zeitspanne. Diese Konstante ist als sleep: gefolgt von der Wartezeit der Sekunden.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb pull !app_path !app_id.apk " , " sleep:5 " ]
} Die Blockkonstante bietet einfache Funktionen für Schleifen und Rückrufe. Diese Konstante ist als block: gefolgt vom Namen des ausführenden Befehlsblocks. Wenn keine Blöcke bereitgestellt wurden (IE -Befehle wurden in einem Listenformat bereitgestellt), werden Befehle zu einem Block namens main hinzugefügt.
{
"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 " ]
}
}Das Schlüsselwort "Find" gefolgt von einem Pfad zu einem APK und einer Regex -String, die sowohl zum Konsolen den Pfad zum APK gedruckt werden als auch die Zeichenfolge, die gefunden wird, wenn sie in einem APK vorhanden sind. Dies kann in Verbindung mit anderen Befehlen verwendet werden, um die Find -Zeichenfolgen in allen verarbeiteten Apps auszuführen. Ein Beispiel hierfür ist unten zu sehen:
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb pull !app_path !app_id.apk " , " find: !app_id.apk;my_string " ]
} Eine weitere einfache Konstante. Der print: Konstante kann verwendet werden, um eine Nachricht an die Konsole zu drucken. Ein Beispiel dafür ist nachstehend zu sehen:
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " print: device id !device_id, app id !app_id, app path !app_path " ]
} Die Schreibkonstante ermöglicht es, eine Variable oder einen Befehl in eine Datei zu schreiben. Verwendet mit der write: Zeichenfolge, gefolgt von der Datei zum Schreiben, gefolgt von a ; und dann der Befehl oder die Variable, um in die Datei zu schreiben.
{
"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 " ]
}
} Das read: Konstante wird einen Pfad zu einer Datei zum Lesen bereitgestellt, gefolgt von a ; und dann die Variable, um die Ausgabe auf zu speichern. Diese Variable kann eine neu deklarierte oder vorhandene Variable sein.
{
"devices" : [],
"apps" : [],
"commands" : [ " read:test.txt;!data " , " print: !data " ]
} Ähnlich wie Schreiben. Mit der Anhangkonstante können eine Variable oder einen Befehl in eine Datei geschrieben werden. Verwendet mit der append: Zeichenfolge, gefolgt von der Datei zum Schreiben, gefolgt von a ; und dann der Befehl oder die Variable, um in die Datei zu schreiben. Im Gegensatz zum Schreiben, das eine vorhandene Datei erstellt oder überschreitet, fügt Append nur eine vorhandene Datei hinzu. Wenn die Datei nicht vorhanden ist, wird autodroid fehlerhaft.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " append:test.txt;!app_id !app_path " ]
}Das folgende ist ein Beispiel für die Verwendung von Autodroid zum Testen potenzieller Malware auf Android -Geräten. Diese Konfiguration installiert die potenzielle Malware, zeichnet den Bildschirm auf, ruft die Bildschirmaufnahme ab und deinstalliert die Anwendung.
{
"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 " ]
}
}Das Folgende ist ein Beispiel für die Verwendung von Autodroid -Implementierung von Androguard, um das Engineering ein APK aus einem Gerät zu reversen und einen JSON von Informationen über die App, eine dekompilierte Zusammenfassung der Methoden, die XML -Manifestdatei und eine ungebundene Zip -Datei der APK abzurufen.
{
"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 General Public Lizenz v3.0