Опасности вторичной упаковки
Проблема вторичной упаковки является лишь частью угрозы безопасности приложений Android. Как правило, инструменты декомпиляции используются для вставки рекламного кода и связанных с ним конфигураций в приложения, а затем выпускаются на сторонних рынках приложений и форумах для ожидания «фишинга». Вред, наносимый упаковщиком мобильным приложениям, заключается в следующем:
- Вставьте свое собственное объявление или удалите оригинальное объявление;
- Вредоносный код, вредоносные отчисления, троянские кони и т.д .;
- Изменить оригинальную логику оплаты;
Вышеуказанное злонамеренное поведение наносит серьезный ущерб интересам мобильных продуктов и пользователей, а также влияет на корпоративную репутацию.
Механизм подписи APK
Механизм подписи APK, разработанный Google, призван предотвратить две проблемы:
- Не позволяйте другим изменять пакет APK, чтобы предотвратить вторичную упаковку после декомпиляции;
Как запретить другим упаковывать его снова? При установке APK в систему Android, он сначала проверит, есть ли подпись и может ли подпись совпадать; - Система Android не может устанавливать APK с тем же именем пакета, но разными сигнатурами при установке пакетов APK;
Следующее начинает анализировать процесс подписи APK:
Нужно знать фон
Пойди в Baidu самостоятельно, чтобы понять концепцию;
- Сводка данных (отпечаток данных), алгоритм симметричного шифрования MD5 \ SHA-1
- Алгоритм асимметричного шифрования
- Цифровая подпись, цифровой сертификат
- Подпишите пакеты APK вручную
1. Просмотр файла META-INF
Измените суффикс пакета .apk на .zip, откройте папку после распаковки и найдите каталог META-INF.
Подпись начинается вокруг этих трех документов.
2. Сначала посмотрите на первый файл MANIFEST.MF
Этот файл содержит сводные значения данных всех файлов в файле APK. Это эквивалентно дактилоскопии каждого отдельного (кроме этих трех) файлов.
3. Глядя на второй файл CERT.SF
Подобно файлу MANIFEST.MF, единственное отличие состоит в том, что есть еще одна строка SHA1-Digest-Manifest: KDerPmANkkB5mxceo/t5oXRGApg= , Эта строка является сводкой данных MANIFEST.MF.
4. Наконец, посмотрите на третий файл CERT.SF
Рассчитайте зашифрованное значение предыдущего файла CERT.SF с закрытым ключом, которое называется подписью, поэтому этот файл содержит подпись и открытый ключ;
Если это в системе Windows, рекомендуется использовать программное обеспечение cmder.exe, чтобы использовать следующую команду.
Обзор содержания сертификата:
Команда, используемая для управления хранилищем закрытого ключа:
резюме
После создания APK подпись не может быть изменена, так как нет закрытого ключа. Но он может заменить подпись, потому что система Android проверяет правильность подписи только при установке APK. (Это всего лишь мое личное предположение, и позже я углублюсь в проверку исходного кода системы, и настоящий молоток — это правда или ложь)
Процесс подписания можно представить как поток обработки отправителя и получателя, и это также двустороннее действие, которое можно грубо понимать как следующий поток:
Вы можете заменить клиента 1 на изображении выше процессом упаковки APK и заменить сервер процессом установки APK на телефонах Android.Если система хранит открытый ключ в CERT.RSA, а значение хеш-функции расшифровывается в исходном apk и файле CERT.SF. Если значение Hash не соответствует, оно не будет установлено.
Проверьте, можно ли заменить подпись
Необходимым условием для успешной вторичной упаковки является то, что подпись может быть заменена, и APK не выполняет проверку подписи. Есть три способа проверить подпись:
Пакет APK не делает проверку подписи
Просто замените подпись. Шаги по замене подписи будут описаны ниже;
- проверка кода Java
Сложность состоит в том, чтобы найти проверенный код JAVA, просто закомментируйте его; - Проверка .so файла
Сложность состоит в том, чтобы найти проверенный код C, просто закомментируйте его; - пак
Трудность заключается в том, чтобы сначала распаковать;
Заменить шаги подписи
шаги:
Используя инструмент AndroidKiller_v1.3.1, который имеет функцию компиляции, вы можете выполнить вторичную упаковку, принцип состоит в том, чтобы заменить значение подписи.
Как изменить подпись приложения android apk
ZipSigner
версия: 3.4
Последнее обновление программы в шапке: 26.05.2019
Краткое описание:
Программа для подписи Zip, Apk прямо на Android-устройстве.
Описание:
Программа для подписания ZIP, APK и/или JAR файлов прямо на Android-аппарате.
Конечный файл проходит zip-aligned. Можно выбрать ключ для подписания: media, platform, shared, testkey или использовать режим автоматического выбора.
Версия 3.9 — фейк, просьба проверять перед выкладыванием!
Сообщение отредактировал SonyCat — 29.03.20, 23:17
Иногда видишь кастомную прошивку и понимаешь — в принципе нравится, но слишком много ненужных прог вставлено! Выкидываешь все ненужное из архива и приходится прошивать как неподписанную! А эта прога позволяет подписать и прошить сразу, плюс насколько я понимаю zip-align уменьшает размер архива!
Сообщение отредактировал G_Technik — 11.01.11, 23:24
Расскажи как сделал я допустим в Dimmer тоже позаменял иконки, и так и так подписываю а он мне синтаксическую ошибку дает
>студент<, 716 котят, я поменял иконки так: открыл арк (не распаковал, а именно открыл), закинул в архив свою графику с заменой, скинул правленный арк на тел.
Потом запустил ZipSigner, в первом поле указал путь и имя до редактированного мной файла, во втором — путь и имя, которое хочу получить на выхода, фильтр выбрал platform и тыц на Sign The File. Итог: получил подписанный арк.
Перед установкой обязательно нужно снести оригинальный, а то свой не встанет.
Подписываем приложение заново
Существует способ удалить подпись из готового APK файла и добавить в него другую. Для этого нужно выполнить следующие шаги:
1. Удаляем старую подпись
Способ для Windows:
- У APK, из которого нужно удалить подпись, меняем расширение с *.apk на *.zip.
- Открываем полученный файл любым архиватором и удаляем папку META-INF.
- Закрываем архиватор.
- Меняем расширение обратно с *.zip на *.apk.
Способ для MacOS/Linux:
- Открываем терминал и переходим в директорию с APK-файлом.
- Прописываем следующие команды:
2. Подписываем новым ключом
Для этого нужно в в терминале (для MacOS/Linux или командной строке (для Windows) ввести следующую команду.
Если всё пройдёт успешно, вы получите сообщение о том, что файл подписан.
3. Выполняем Align
Аналогично в терминале или командной строке нужно ввести следующую команду.
В результате получен APK-файл, подписанный новым ключом.
Подписываем приложение заново : 2 комментария
Что это за alias? что за пароль от него? У меня есть сертификат и пароль от него. Что такой кейсторе? и пароль от него? И прочее тоже думаешь толи слово под замену, толи это коменда какая. НЕПОНЯТНО. Нужен конкретный пример
У меня выдало ошибку при открытии приложения
Error
Failed to extract resources needed by il2CPP
Подделка подписи Android-приложения и её проверка
Несколько лет назад обнаружил, что в интернете появляются свежие версии моих, слегка изменённых (была убрана монетизация), apk буквально спустя пару часов после публикации версии. Был очень заинтересован этим, т. к. в моём приложении были проверки подписи в разных местах, что-то вроде:
Исследовав свои сломанные apk-файлы, я обнаружил, что для обхода проверок подписи был создан класс PmsHookApplication , который наследовал существующий класс Application и в себе хранил набор байт моей оригинальной подписи, реализацию прокси класса PackageManager , который всегда возвращал этот набор байт оригинальной подписи.
В гугле обнаружил исходники инструмента, который вносил все эти изменения автоматически.
Этот инструмент может быть использован пользователями, обладающими минимальными техническими знаниями путём запуска файлов скриптов ‘run.bat’ or ‘run.sh’.
В результате простоты его использования и универсальности обхода всевозможных проверок подписи (избавлял от поиска этих проверок, т. к. все эти проверки считали, что apk не изменялся и не срабатывали), этот инструмент получил широкое распространение в определённых кругах любителей создания модификаций apk.
На рисунке ниже изображен результат работы скрипта:
На рисунке ниже часть манифеста до изменения инструментом обхода проверок подписи:
На рисунке ниже часть манифеста после изменения инструментом обхода проверок подписи (видно указание на внедрённый класс PmsHookApplication):
Сам класс PmsHookApplication , как он выглядит в dex:
Пример того, как выглядит набор байт подписи в этом классе:
Решил реализовать проверку подписи с помощью NDK используя чистый си, т. к. реверс-инженеров, которые могут декомпилировать нативные исполняемые файлы, значительно меньше. Игра в кошки-мышки 🙂
Сама проверка состоит из нескольких стадий: ● получаем путь апк файла; ● извлекаем ‘META-INF/CERT.RSA’ из apk с помощью zlib; ● парсим ‘META-INF/CERT.RSA’; ● проверям набор байт из подписи либо в нативном слое, либо передаем его в Java-слой приложения.
Результат работы проверки можно увидеть ниже:
1) до применения nsktool (инструмент подделки подписи):
2) после применения nsktool (инструмент подделки подписи):
Полную версию кода проверки можно увидеть тут.
На момент написания заметки известен следующий путь обхода: — атакующие подменяют путь к подписи и указывают путь к оригинальной подписи, которая имеет уже какое-нибудь другое имя.
Для предотвращения этого: — скрывайте чувствительные строковые константы в коде; — используйте при компиляции флаг -fvisibility=hidden .