Русский · English
·
Патченый Frida для Android: с бинарника снимаются известные строки-отпечатки (gum-js-loop, frida-agent-*.so, frida_agent_main, порт 27042, ggbond, /memfd:jit-cache и другие).
Каждый прогон CI даёт новый набор имён и новый порт. Значения лежат в florida-identities-<version>.json рядом с артефактами релиза.
| Репозиторий | Роль |
|---|---|
| Florida (этот) | сборка florida-server / gadget / inject |
| MagiskHluda | Magisk / KernelSU / APatch-модуль, старт на boot |
| Ylarod/Florida | исходный форк |
Два пути. hluda из MagiskHluda сюда не копируется: там порт берётся из module.cfg модуля, здесь — из identities.json.
Поставьте MagiskHluda. Сервер поднимается на boot, порт в module.cfg. С хоста:
hluda ps
hluda -f com.example.apphluda живёт в репозитории MagiskHluda: scripts/hluda.
- Скачайте с Releases
florida-server-*-android-<arch>.gzи тот жеflorida-identities-<version>.json. - Распакуйте сервер и поставьте скриптом — он пушит бинарник, ставит
chmodи печатает команды с портом из JSON:
gunzip -k florida-server-*-android-arm64.gz
python3 install.py \
--server florida-server-*-android-arm64 \
--identities florida-identities-*.json- Дальше выполните то, что скрипт напечатал: старт на устройстве и
adb forward. Бинарник кладётся в/data/local/tmp/app_process(неfrida-server— это строка для детекта).
Без скрипта то же самое руками — см. Подключение.
Всё для сборки лежит в scripts/. Для установки на девайс нужен корневой install.py.
| Скрипт | Зачем |
|---|---|
install.py |
Установка на телефон или эмулятор: adb push + chmod, печать adb forward / frida-ps -H с портом из identities |
identities.py |
Сгенерировать identities.json (имена, порт, XOR для RPC) |
rewrite.py |
Вписать identities в checkout Frida. --check только проверяет якоря, дерево не трогает |
strip-fingerprints.py |
Замена gmain / gdbus той же длины в ELF. CI вешает его на post-process.py, руками обычно не вызывают |
scan_binary.py |
Проверка, что в бинарнике не осталось gum-js-loop, 27042, frida:rpc и т.п. |
rewrite.py работает по рабочей копии Frida. Не гоняйте его по дереву, которое хотите оставить нетронутым.
Сервер слушает не 27042, а control_port из identities. После install.py (или ручного пуша):
adb shell su -c '/data/local/tmp/app_process -l 127.0.0.1:<control_port>'
adb forward tcp:<control_port> tcp:<control_port>
frida-ps -H 127.0.0.1:<control_port>
frida -H 127.0.0.1:<control_port> -f com.example.appПолностью вручную, без скрипта:
adb push florida-server /data/local/tmp/app_process
adb shell su -c 'chmod 755 /data/local/tmp/app_process'
adb shell su -c '/data/local/tmp/app_process'Если нужен стоковый frida -U (он всегда открывает tcp:27042 на устройстве):
adb shell su -c '/data/local/tmp/app_process -l 127.0.0.1:27042'Приложения, которые только тыкают 27042, кастомный порт не увидят. Те, что сканируют все localhost-порты, по-прежнему видят handshake Frida — без смены протокола (и клиента) это не убрать.
| Было | Стало |
|---|---|
ggbond / jit-cache / экспорт main |
случайные значения на каждую сборку |
double-Base64 frida:rpc (известный блоб) |
XOR в рантайме; по проводу по-прежнему frida:rpc, чтобы работал стоковый frida CLI |
sed по ELF |
правки исходников + замена той же длины для gmain/gdbus в post-process.py |
git am, который ломается на каждом бампе Frida |
scripts/rewrite.py с подсчётом якорей |
strip только у agent .so |
тот же strip у server, gadget, inject |
| TCP 27042 | порт сборки (см. identities JSON) |
Намеренно не переименовывается: D-Bus re.frida.* (его ждёт официальный клиент). Имена GObject вроде frida_agent_message_transmitter_* тоже остаются — детекторы обычно ищут не их, а gum-js-loop, frida-agent-*.so, порт 27042.
Нужен checkout Frida с сабмодулями frida-core и frida-gum.
python3 scripts/identities.py -o identities.json
python3 scripts/rewrite.py --frida-dir /path/to/frida --identities identities.json
# проверка якорей на чистом дереве (дерево не меняется)
python3 scripts/rewrite.py --frida-dir /path/to/frida --check --seed ciДальше обычная сборка Frida (./configure --host=android-arm64 && make).
На устройство из локальной сборки:
python3 install.py \
--server build-android-arm64/subprojects/frida-core/server/frida-server \
--identities identities.jsonТолько stdlib unittest, без pytest:
python3 -m unittest discover -s tests -vCI: эти тесты, затем rewrite.py --check на свежем клоне Frida, затем scripts/scan_binary.py по собранным frida-server / gadget / inject.
Правки исходников не прячут inline-хуки и проверку .text против диска. Это уже инструментация, а не строка. Если Florida всё ещё ловят, можно смотреть в сторону ZygiskFrida.