- Для burp-suite, конвертируем сертификат в PEM:
$ openssl x509 -inform DER -in cert.der -out cert.pem- Ставим PEM сертификат обычными средствами Android.
- Декомпилируем apk файл:
$ apktool d application.apk --out rev-application- В
AndroidManifest.xmlдобавляем в тег<application>атрибутandroid:networkSecurityConfig:
<application android:networkSecurityConfig="@xml/network_security_config" ...etc...>- Создаём файл
res/xml/network_security_config.xmlи добавляем в него разрешение на использованиеuser CA store:
<network-security-config>
<base-config>
<trust-anchors>
<!-- Trust system CAs -->
<certificates src="system" />
<!-- Trust user CAs -->
<certificates src="user" />
</trust-anchors>
</base-config>
</network-security-config>- Пересобираем приложение:
$ apktool b .- Генерируем ключ:
$ keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias android-patch
- Дальше действия отличаются в зависимости от инструмента для подписи:
-
Подпись
V1, поддерживается Android ≤ 10- Подписываем с помощью
jarsigner
$ jarsigner -keystore key.jks dist/package.apk android-patch
- Выравниваем с помощью
zipalign(иногда выравнивание не нужно. Если приложение падает при запуске, пересоберите приложение и пропустите этот шаг)
$ zipalign -p -f 4 dist/package.apk dist/package-align.apk
- Подписываем с помощью
-
Подпись
V2, поддерживается Android ≥ 7- Выравниваем с помощью
zipalign
$ zipalign -p -f 4 dist/package.apk dist/package-align.apk
- Подписываем с помощью
apksigner
$ apksigner sign --ks key.jks --ks-key-alias android-patch dist/package-align.apk
- Выравниваем с помощью
-
- Удаляем старое приложение и устанавливаем новое:
$ adb install dist/package-align.apkПро автоматизированный вариант можно почитать тут: adb-install-cert
Для ручного способа, необходимо сначала подготовить сертификат. 0. Для burp-suite, конвертируем сертификат в PEM:
$ openssl x509 -inform DER -in cert.der -out cert.pem- Высчитываем хеш:
$ openssl x509 -inform PEM -subject_hash_old -noout -in cert.pem
e210c8c4- Создаём копию нашего сертификата, называя его в формате
hash.0, подставляя вместоhashрезультат исполненной ранее команды:
$ cp cert.pem e210c8c4.0- Добавляем развёрнутую информацию о сертификате (опционально, обычно работает и без этого шага):
$ openssl x509 -inform PEM -text -fingerprint -noout -in cert.pem >> e210c8c4.0- Загружаем итоговый сертификат:
$ adb push e210c8c4.0 /data/local/tmp/Note
Эмулятор Android-а необходимо запускать с параметром -writable-system
- Открываем через adb shell с правами рута.
$ adb shell
adb$ su
adb#- Перемонтируем
/systemв режим для чтения и записи.
adb# mount -o rw,remount,rw /system
- Перемещаем загруженный ранее сертификат в каталог
/system/etc/security/cacerts/:
adb# mv /data/local/tmp/e210c8c4.0 /system/etc/security/cacerts/
- Меняем права доступа:
adb# chmod 644 /system/etc/security/cacerts/e210c8c4.0
- Перемонтируем файловую систему обратно в режим только для чтения:
adb# mount -o ro,remount,ro /system
- Для того чтобы изменения вступили в силу, может потребоваться перезагрузка устройства:
adb reboot- Открываем через
adbшелл с правами рута:
$ adb shell
adb$ su
adb#- Создаём временную директорию:
adb# mkdir -p -m 700 /data/local/tmp/cacerts
- Копируем в неё существующие сертификаты:
adb# cp /system/etc/security/cacerts/* /data/local/tmp/cacerts/
- Монтируем
tmpfsповерх исходного каталогаcacerts:
adb# mount -t tmpfs tmpfs /system/etc/security/cacerts/
- Копируем сохранённые ранее сертификаты:
adb# cp /data/local/tmp/cacerts/* /system/etc/security/cacerts/
- Переносим наш сертификат:
adb# mv /data/local/tmp/e210c8c4.0 /system/etc/security/cacerts/
- Меняем ему права доступа:
adb# chmod 644 /system/etc/security/cacerts/e210c8c4.0
- Исправляем метки для SELinux-а:
adb# chcon u:object_r:system_file:s0 /system/etc/security/cacerts/*
- открываем через
adbшелл с правами рута.
$ adb shell
adb$ su
adb#- Создаём временную директорию:
adb# mkdir -p -m 700 /data/local/tmp/cacerts
- Копируем в неё сертификаты из apex-conscrypt:
adb# cp /apex/com.android.conscrypt/cacerts/* /data/local/tmp/cacerts/
- И дальше проделываем такие же действия как и для 10 андроида. Монтируем
tmpfsповерх системного каталогаcacerts:
adb# mount -t tmpfs tmpfs /system/etc/security/cacerts/
- Копируем сохранённые ранее сертификаты:
adb# cp /data/local/tmp/cacerts/* /system/etc/security/cacerts/
- Переносим наш сертификат:
adb# mv /data/local/tmp/e210c8c4.0 /system/etc/security/cacerts/
- Меняем ему права доступа:
adb# chmod 644 /system/etc/security/cacerts/e210c8c4.0
- Исправляем метки для SELinux-а:
adb# chcon u:object_r:system_file:s0 /system/etc/security/cacerts/*
- Выполняем
bind mountв пространствеzygoteпроцессов:
ZYGOTE_PID=$(pidof zygote || true)
ZYGOTE64_PID=$(pidof zygote64 || true)
for Z_PID in "$ZYGOTE_PID" "$ZYGOTE64_PID"; do
if [ -n "$Z_PID" ]; then
nsenter --mount=/proc/$Z_PID/ns/mnt -- \
/bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
fi
done
APP_PIDS=$(
echo "$ZYGOTE_PID $ZYGOTE64_PID" | \
xargs -n1 ps -o 'PID' -P | \
grep -v PID
)
for PID in $APP_PIDS; do
nsenter --mount=/proc/$PID/ns/mnt -- \
/bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts &
done
wait