
Делает реверс-инжиниринг Android-приложений проще, автоматизируя повторяющиеся задачи, такие как извлечение, декодирование, пересборка и патчинг APK.
apk.sh — это Bash-скрипт, упрощающий обратную разработку Android-приложений и автоматизирующий некоторые повторяющиеся задачи, такие как извлечение, декодирование, пересборка и патчинг APK.
apk.sh в основном использует apktool для дизассемблирования, декодирования и пересборки ресурсов, а также bash для автоматизации процесса внедрения frida gadget. Также поддерживаются app bundles/split APK.
⬅️ Извлечение APK с устройства происходит простым запуском ./apk.sh pull <package_name>
🔧 Декодирование APK — простым запуском ./apk.sh decode <apk_name>
🔩 Пересборка APK — простым запуском ./apk.sh build <apk_dir>
apk.sh pull извлекает APK с устройства.
Поддерживаются app bundles/split APK, то есть разделённые APK объединяются в один APK (это удобно для патчинга).
Если пакет является app bundle или split APK, apk.sh объединит APK в один, исправляя все идентификаторы публичных ресурсов.
apk.sh patch применяет патч к APK для загрузки frida-gadget.so при запуске.
frida-gadget.so — это общая библиотека Frida, предназначенная для загрузки инструментируемыми программами (когда инжектируемый режим работы не подходит). Простая загрузка библиотеки позволяет взаимодействовать с ней с помощью существующих инструментов на базе Frida, например frida-trace. Также поддерживается полностью автономный подход, когда скрипты выполняются из файловой системы без внешней связи.
Патчинг APK выполняется простым запуском ./apk.sh patch <apk_name> --arch arm.
Также можно указать конфигурацию Frida gadget в JSON: ./apk.sh patch <apk_name> --arch arm --gadget-conf <config.json>
Если вы столкнулись с ошибками apktool d вида "already interned", как в #30, можно передать флаг --only-main-classes, который будет передан apktool при декодировании APK.
В режиме взаимодействия по умолчанию Frida Gadget предоставляет совместимый с frida-server интерфейс, прослушивающий localhost:27042. Для ранней инструментации Frida позволяет функции-конструктору Gadget блокироваться до тех пор, пока вы либо не выполните attach() к процессу, либо не вызовете resume() после стандартных шагов spawn() -> attach() -> ...применение инструментации....
Если такое блокирующее поведение нежелательно и вы хотите, чтобы программа запускалась сразу, или хотите, чтобы прослушивание велось на другом интерфейсе или порту, это можно настроить через JSON-файл конфигурации.
Конфигурация по умолчанию:
{
"interaction": {
"type": "listen",
"address": "127.0.0.1",
"port": 27042,
"on_port_conflict": "fail",
"on_load": "wait"
}
}
Вы можете передать файл конфигурации gadget в 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
Добавьте следующий код для вывода в logcat результатов console.log любого скрипта из frida codeshare при использовании типа взаимодействия Script.
// 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 Извлечение APK с устройства/эмулятора.
decode Декодирование APK.
build Пересборка APK.
patch Патчинг APK.
rename Переименование пакета APK.
-a, --arch <arch> Укажите целевую архитектуру, обязательно при патчинге.
-g, --gadget-conf <json_file> Укажите файл конфигурации frida-gadget, опционально при патчинге.
-n, --net Добавить разрешающую конфигурацию сетевой безопасности при сборке, опционально. Можно использовать также с patch, pull и rename.
-r, --no-res Не декодировать ресурсы при декодировании (т.е. apktool -r), опционально. Можно использовать при патчинге.
-s, --no-src Не дизассемблировать dex при декодировании (т.е. apktool -s), опционально. Можно использовать при патчинге.
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/objection/
https://github.com/NickstaDB/patch-apk/
https://neo-geo2.gitbook.io/adventures-on-security/frida-scripting-guide/frida-scripting-guide