Блокада хакера: android под замком
Наблюдаю рынок мобильного взлома пятнадцать лет и ни разу не видел, чтобы утечка простила забывчивость разработчика. В каждом релизе держу в голове три аксиомы: код обязан путать злоумышленника, секреты живут отдельно от бинаря, канал связи не допускает чужих. Остальная архитектура строится вокруг этих столпов.

Код без швов
R8 и ProGuard переваривают исходники, оставляя хакеру бесплотный туман вместо привычных имён классов. Метафорически — лабиринт без нитей Ариадны. При желании добиться большего применяю DexGuard: инструмент внедряетDummyReferencer, шифрует строки, дробит методы, расставляет ловушки проверки подписи. Дополнительно собираю критичные участки в .so модули поверх NDK, подключая Control Flow Guard. Такой двойной барьер сокращает поверхность для Frida, Objection и других крючков.
Укротители ключей
Секретное семя живёт в Android Keystore, привязанном к StrongBox TPM. В коде присутствует лишь handle, поэтому дамп памяти не пригоден для подмены. Для симметричных операций использую Keymaster 4 с режимом AES-GCM, включая параметр noAuthPerBoot — каждая перезагрузка обнуляет окно атаки. При генерации асимметричного ключа выбираю Elliptic Curve 25519: компактность повышает шанс уместить расчёт в аппаратный слот. Дополнительный слой — white-box контейнер с переносом логики шифрования внутрь таблиц T-Box, даже полный дамп не раскрывает математическую модель.
Битвы в сети
TLS 1.3 с жёстким спиннингом SPKI исключает поддельные корни доверия. Вместо устаревшего TrustManager регистрирую Conscript, а пины храню в build-time шаблоне Catalog. Отзыв сертификата отслеживаю через Signed Tree Head, при несовпадении версия блокирует авторизацию. Для рантайм-аттестации запускаю Safety Net API, переходящий к Play Integrity API в новых сборках, не валидация протокола приносит блюр экрана и стирает пользовательский сеанс. Стек дополняет HSTS Preload, чтобы внезапный downgrade не обманул клиента.
Анти-тампер слой проверяет sha256 всей DES секции прямо из /proc/self/mem, гарантируя целостность даже после relocation. При обнаружении патча вызываю сигнатуру sigkill(getpid(), SIGKILL). Образ приложения подписываю независимым офлайн-ключом, а Jenkins запускает apk signer verifier на каждом билд-номере. В конце CI перемещаю артефакт в закрытое хранилище Artifactory с односторонним пуш-токеном, чтобы цепочка поставки не превратилась в троянского коня.
Ни одна стена не вечна, однако мультислой защищает достаточное время, позволяя отозвать скомпрометированный ключ и выкрутить новый build-gradle, пока злоумышленник бродит по ложным коридорам.