
与Android设备相互作用的工具,包括ADB,Androguard和Frida交互。
Autodroid是用于编程脚本与一个或多个Android设备进行散装交互的Python工具。可能的用途包括:
要使用Autodroid,您需要安装依赖项,这些内容是在需求文件中指定的,可以按照以下命令安装。
pip install -r REQUIREMENTS.txt需要为命令行参数提供有效的JSON配置文件。下面显示了一个简单的配置文件示例,该示例将一次从所有连接的设备中检索所有应用程序,并使用Androguard将APK提取到ZIPS。
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb pull !app_path !app_id.apk " , " reverse: !app_id.apk " ]
}创建了有效的自动型配置文件后,您可以通过运行AutoDroid.py Python文件与配置文件作为命令行参数开始设备交互。
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字段是对自动体的另外两个字段。这些字段定义了针对的设备(字符串列表)和应用程序反向域符号名称(即com.example.application )定义ADB设备ID,用于针对设备上的应用程序(字符串列表)。这两个字段都可以是空的,字符串列表或定义为*所有可用设备和应用程序的目标。在后端,此操作的方式是,当这些字段中提供一个值时,程序将循环通过所有命令,以便每个设备上的每个应用程序。指定特定设备和应用程序的一个示例如下:
{
"devices" : [ " 09261JEC216934 " ],
"apps" : [ " com.google.android.networkstack.tethering " ],
"commands" : [ " adb -s !device_id pull !app_path !app_id.apk " ]
}当设备字段不是空时(即"devices":[], )一个变量(请参见下文) !device_id 。该变量可以在您的命令中使用,以表示当前目标设备的ADB设备ID。同样,变量!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 " ]
}使用变量的首选标准是用一个!并使用_代替空格。
可以使用?操作员。如果运算符紧随其后,则将变量名设置为以下命令输出是什么,或者命令没有输出命令本身。可以在下面看到一个示例:
{
"devices" : [],
"apps" : [],
"commands" : [ " ?!files dir " , " print: !files " ]
}以下是已在自动体中使用的保留变量的列表,应避免添加到配置文件中。如果添加了这些变量,它们将在运行时被覆盖。
!device_id当配置中提供一个或多个设备时,此变量在运行时填充。并将其设置为当前设备的ADB设备ID。每个设备都依次循环,每个设备的配置命令都为每个设备运行。!adb_connect - 这是一个转换为adb -s !device_id速记变量,使用此代替adb将确保所有ADB命令都在正确的设备上运行。!app_id当配置中提供一个或多个应用程序时,此变量在运行时填充。并将其设置为当前应用程序的应用程序反向域符号名称(即com.example.myapplication )。每个应用程序依次循环,每个应用程序都为每个应用程序运行。!app_path类似于上述。当配置中提供一个或多个应用程序时,该变量在运行时填充。并将其设置为目标设备上当前应用程序APK文件的路径。每个应用程序依次循环,每个应用程序都为每个应用程序运行。常数是特定于自身的命令,并且与特定功能有关。通常将其分解为一个关键字,然后分解为:一个或多个参数被a隔开; 。这些常数必须在命令开始时使用,并且应始终处于较低的情况下。示例将在各个部分中给出。
Autodroid具有内置功能,可以作为自动体运行的一部分运行FRIDA JavaScript文件。该常数定义为frida:并且必须提供使用JavaScript文件的路径,其次是A ;然后,应用程序的应用程序符号名称为目标。除了将变量应用于命令外,变量还应用于提供的文件内容。
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " frida:myJavascript.js;!app_id " ]
}注意在实施FRIDA集成时,目前未经测试。
Autodroid通过Androguard支持逆向工程APK。该常数的结构为reverse:并走向局部存储的APK的路径。使用此功能将将APK的未捆绑版本作为ZIP保存,其中name <application name>.apk 。
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb -s !device_id pull !app_path !app_id.apk " , " reverse: !app_id.apk " ]
} When using the reverse constant the apk path can be followed by any number of paramiters (seperated by a ; ), these including info (which will save a Json file of application information, decompile (which on Linux will save a txt summary of the decompiled methods), manifest (which will save the xml manifest file, and zip which will perform the same action as if no paramiters were provided and saves the unbundled APK to a zip file. An example of using这些参数可以在下面看到:
{
"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 String要查找,将在控制台上打印到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: string一起使用,然后是要写入的文件,然后是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 ; ,然后写入文件的命令或变量。与将在现有文件中创建或写入的写作不同,附录只会添加到现有文件中。如果该文件不存在,则自outodroid将出错。
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " append:test.txt;!app_id !app_path " ]
}以下是使用自动药在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 " ]
}
}以下是使用Autodroid实现Androguard的一个示例,以将APK从设备上进行反向工程,并检索有关该应用程序的信息的JSON,方法的分解摘要,XML清单文件和APK的未捆绑ZIP文件。
{
"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