- Русские Блоги
- Замена подписи Android
- Опасности вторичной упаковки
- Механизм подписи APK
- Нужно знать фон
- 1. Просмотр файла META-INF
- 2. Сначала посмотрите на первый файл MANIFEST.MF
- 3. Глядя на второй файл CERT.SF
- 4. Наконец, посмотрите на третий файл CERT.SF
- резюме
- Проверьте, можно ли заменить подпись
- Заменить шаги подписи
- updater-script как правильно составить
- Как должен выглядеть ZIP -обновление (структура)
- Инструменты редактирования update-script
- Команды updater-script
- Внимание! Программа Android +1 Updater Script
- Как узнать как задать правильные symlink в updater-script
- Узнать список всех папок в System
- Узнать все права, uid, gid и список файлов и папок
- Пример updater-script
- Бонус: Полезные команды в конце скрипта
Русские Блоги
Замена подписи Android
Опасности вторичной упаковки
Проблема вторичной упаковки является лишь частью угрозы безопасности приложений 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, который имеет функцию компиляции, вы можете выполнить вторичную упаковку, принцип состоит в том, чтобы заменить значение подписи.
Источник
updater-script как правильно составить
Необходимо создать updater-script для вашей кастомной прошивки или мода? Не знаете какие команды писать и что они означают? На все эти ответы можно узнать из данной статьи.
Как должен выглядеть ZIP -обновление (структура)
В корне архива-обновления «должны» находится такие файлы и папки:
- Папка META-INF — обязательно;
- system или data или cache или другие, в зависимости от того, для чего готовилось обновление (не обязательно, так как возможно прошиваете модем или ядро);
- boot.img или recovery.img или zImage (не обязательно, так как возможно обновляете файл в system или data).
Режим сжатия архива должен быть «нормальный» или «обычный» более сильное сжатие Android не поддерживает.
Папка META-INF состоит:
- Папка com
- Файлы подписи обновления
Папка com должна содержать в себе такие файлы и папки:
- Папку android
Папка google должна содержать папку android в которой должны быть файлы
1. updater-script — текстовый файл с набором инструкций для обновления;
2. update-binary — бинарный файл, необходимый для установки обновления.
Инструменты редактирования update-script
Для редактирования updater-script вам понадобится программа NotePad ++
важное условие при работе это кодировка, она должна быть UNIX
Команды updater-script
- assert -задается для каких моделей создано обновление;
- mount — монтирование (присоединение) разделов;
- umount — отсоединить раздел;
- package_extract_dir — копирует выбраню папку и заменяет собой аналогичную вместе с файлами;
- package_extract_file — копирует выбранный файл и заменяет собой аналогичный;
- format — форматирует прописанный раздел;
- delete — удаляет файл;
- delete_recursive — рекурсивное удаление, необходимо для удаления папок и их содержимого;
- run_program — запускает программу;
- set_perm — задает права для файла;
- set_perm_recursive — задает права для папки;
- symlink — создает жесткую ссылку — «симлинк» (ярлык для запуска);
- ui_print — вывод сообщения на экран.
Внимание! Программа Android +1 Updater Script
Вашему внимание проект сайта Android +1 — Android +1 Updater Script позволит правильно и очень быстро составить правильный скрипт, даже для пользователей с маленьким опытом!
Как узнать как задать правильные symlink в updater-script
Довольно популярный вопрос о том как узнать какие необходимо создать symlink в updater-script? Все очень просто для этого вам нужно либо компьютер с ADB или установленный терминал на Android. Перейдите в папки:
В каждой из этих папок наберите команду ls -l и вы получите список файлов и symlink.
Узнать список всех папок в System
Для того того чтобы узнать все папки которые есть в разделе /system , понадобиться набрать linux команду:
su
du -a system
После чего вам выдаст весь список папок в разделе.
Узнать все права, uid, gid и список файлов и папок
Для того чтобы узнать все права, uid, gid и список файлов и папок нужно задать следующую команду linux:
ls -alnR /system
Теперь перейдем как это выглядит в живую на примере…
Пример updater-script
(данный пример update-script для модели i9100 прошивка CyanogenMod 10.2)
для каких моделей:
assert(getprop(«ro.product.device») == «galaxys2» || getprop(«ro.build.product») == «galaxys2» ||
getprop(«ro.product.device») == «i9100» || getprop(«ro.build.product») == «i9100» ||
getprop(«ro.product.device») == «GT-I9100» || getprop(«ro.build.product») == «GT-I9100» ||
getprop(«ro.product.device») == «GT-I9100M» || getprop(«ro.build.product») == «GT-I9100M» ||
getprop(«ro.product.device») == «GT-I9100P» || getprop(«ro.build.product») == «GT-I9100P» ||
getprop(«ro.product.device») == «GT-I9100T» || getprop(«ro.build.product») == «GT-I9100T»);
монтирование раздела
mount(«ext4», «EMMC», «/dev/block/mmcblk0p9», «/system»);
копирование файла
package_extract_file(«system/bin/backuptool.sh», «/tmp/backuptool.sh»);
package_extract_file(«system/bin/backuptool.functions», «/tmp/backuptool.functions»);
задание прав для файла
set_perm(0, 0, 0777, «/tmp/backuptool.sh»);
set_perm(0, 0, 0644, «/tmp/backuptool.functions»);
запуск программы
run_program(«/tmp/backuptool.sh», «backup»);
отсоединить раздел
unmount(«/system»);
прогрессбар
show_progress(0.500000, 0);
форматирование заданного раздела
format(«ext4», «EMMC», «/dev/block/mmcblk0p9», «0», «/system»);
подсоединение раздела
mount(«ext4», «EMMC», «/dev/block/mmcblk0p9», «/system»);
копирование папки в выбранный раздел
package_extract_dir(«recovery», «/system»);
package_extract_dir(«system», «/system»);
создание симилнка
symlink(«/system/xbin/su», «/system/bin/su»);
symlink(«Roboto-Bold.ttf», «/system/fonts/DroidSans-Bold.ttf»);
symlink(«Roboto-Regular.ttf», «/system/fonts/DroidSans.ttf»);
symlink(«busybox», «/system/xbin/[«, «/system/xbin/[[«,
«/system/xbin/adjtimex», «/system/xbin/arp», «/system/xbin/ash»,
«/system/xbin/awk», «/system/xbin/base64», «/system/xbin/basename»,
«/system/xbin/bbconfig», «/system/xbin/blkid», «/system/xbin/blockdev»,
«/system/xbin/brctl», «/system/xbin/bunzip2», «/system/xbin/bzcat»,
«/system/xbin/bzip2», «/system/xbin/cal», «/system/xbin/cat»,
«/system/xbin/catv», «/system/xbin/chattr», «/system/xbin/chgrp»,
«/system/xbin/chmod», «/system/xbin/chown», «/system/xbin/chroot»,
«/system/xbin/clear», «/system/xbin/cmp», «/system/xbin/comm»,
«/system/xbin/cp», «/system/xbin/cpio», «/system/xbin/crond»,
«/system/xbin/crontab», «/system/xbin/cut», «/system/xbin/date»,
«/system/xbin/dc», «/system/xbin/dd», «/system/xbin/depmod»,
«/system/xbin/devmem», «/system/xbin/df», «/system/xbin/diff»,
«/system/xbin/dirname», «/system/xbin/dmesg», «/system/xbin/dnsd»,
«/system/xbin/dos2unix», «/system/xbin/du», «/system/xbin/echo»,
«/system/xbin/ed», «/system/xbin/egrep», «/system/xbin/env»,
«/system/xbin/expand», «/system/xbin/expr», «/system/xbin/false»,
«/system/xbin/fbsplash», «/system/xbin/fdisk», «/system/xbin/fgrep»,
«/system/xbin/find», «/system/xbin/flash_lock»,
«/system/xbin/flash_unlock», «/system/xbin/flashcp»,
«/system/xbin/flock», «/system/xbin/fold», «/system/xbin/free»,
«/system/xbin/freeramdisk», «/system/xbin/fstrim», «/system/xbin/fsync»,
«/system/xbin/ftpget», «/system/xbin/ftpput», «/system/xbin/fuser»,
«/system/xbin/getopt», «/system/xbin/grep», «/system/xbin/groups»,
«/system/xbin/gunzip», «/system/xbin/gzip», «/system/xbin/halt»,
«/system/xbin/head», «/system/xbin/hexdump», «/system/xbin/id»,
«/system/xbin/ifconfig», «/system/xbin/inetd», «/system/xbin/insmod»,
«/system/xbin/install», «/system/xbin/ionice», «/system/xbin/iostat»,
«/system/xbin/ip», «/system/xbin/kill», «/system/xbin/killall»,
«/system/xbin/killall5», «/system/xbin/less», «/system/xbin/ln»,
«/system/xbin/losetup», «/system/xbin/ls», «/system/xbin/lsattr»,
«/system/xbin/lsmod», «/system/xbin/lsusb», «/system/xbin/lzcat»,
«/system/xbin/lzma», «/system/xbin/lzop», «/system/xbin/lzopcat»,
«/system/xbin/man», «/system/xbin/md5sum», «/system/xbin/mesg»,
«/system/xbin/mkdir», «/system/xbin/mke2fs», «/system/xbin/mkfifo»,
«/system/xbin/mkfs.ext2», «/system/xbin/mkfs.vfat»,
«/system/xbin/mknod», «/system/xbin/mkswap», «/system/xbin/mktemp»,
«/system/xbin/modinfo», «/system/xbin/modprobe», «/system/xbin/more»,
«/system/xbin/mount», «/system/xbin/mountpoint», «/system/xbin/mpstat»,
«/system/xbin/mv», «/system/xbin/nanddump», «/system/xbin/nandwrite»,
«/system/xbin/nbd-client», «/system/xbin/netstat», «/system/xbin/nice»,
«/system/xbin/nohup», «/system/xbin/nslookup», «/system/xbin/ntpd»,
«/system/xbin/od», «/system/xbin/patch», «/system/xbin/pgrep»,
«/system/xbin/pidof», «/system/xbin/ping», «/system/xbin/pipe_progress»,
«/system/xbin/pkill», «/system/xbin/pmap», «/system/xbin/poweroff»,
«/system/xbin/printenv», «/system/xbin/printf», «/system/xbin/ps»,
«/system/xbin/pstree», «/system/xbin/pwd», «/system/xbin/pwdx»,
«/system/xbin/rdev», «/system/xbin/readlink», «/system/xbin/realpath»,
«/system/xbin/renice», «/system/xbin/reset», «/system/xbin/resize»,
«/system/xbin/rev», «/system/xbin/rm», «/system/xbin/rmdir»,
«/system/xbin/rmmod», «/system/xbin/route», «/system/xbin/run-parts»,
«/system/xbin/rx», «/system/xbin/sed», «/system/xbin/seq»,
«/system/xbin/setconsole», «/system/xbin/setserial»,
«/system/xbin/setsid», «/system/xbin/sh», «/system/xbin/sha1sum»,
«/system/xbin/sha256sum», «/system/xbin/sha3sum»,
«/system/xbin/sha512sum», «/system/xbin/sleep», «/system/xbin/sort»,
«/system/xbin/split», «/system/xbin/stat», «/system/xbin/strings»,
«/system/xbin/stty», «/system/xbin/sum», «/system/xbin/swapoff»,
«/system/xbin/swapon», «/system/xbin/sync», «/system/xbin/sysctl»,
«/system/xbin/tac», «/system/xbin/tail», «/system/xbin/tar»,
«/system/xbin/taskset», «/system/xbin/tee», «/system/xbin/telnet»,
«/system/xbin/telnetd», «/system/xbin/test», «/system/xbin/tftp»,
«/system/xbin/tftpd», «/system/xbin/time», «/system/xbin/timeout»,
«/system/xbin/top», «/system/xbin/touch», «/system/xbin/tr»,
«/system/xbin/traceroute», «/system/xbin/true», «/system/xbin/ttysize»,
«/system/xbin/tune2fs», «/system/xbin/umount», «/system/xbin/uname»,
«/system/xbin/uncompress», «/system/xbin/unexpand», «/system/xbin/uniq»,
«/system/xbin/unix2dos», «/system/xbin/unlzma», «/system/xbin/unlzop»,
«/system/xbin/unxz», «/system/xbin/unzip», «/system/xbin/uptime»,
«/system/xbin/usleep», «/system/xbin/uudecode», «/system/xbin/uuencode»,
«/system/xbin/vi», «/system/xbin/watch», «/system/xbin/wc»,
«/system/xbin/wget», «/system/xbin/which», «/system/xbin/whoami»,
«/system/xbin/xargs», «/system/xbin/xz», «/system/xbin/xzcat»,
«/system/xbin/yes»,
«/system/xbin/zcat»);
symlink(«libGLESv2.so», «/system/lib/libGLESv3.so»);
symlink(«logcat», «/system/bin/lolcat»);
symlink(«mksh», «/system/bin/sh»);
symlink(«mount.exfat», «/system/bin/fsck.exfat»,
«/system/bin/mkfs.exfat»);
symlink(«pigz», «/system/xbin/unpigz»);
symlink(«toolbox», «/system/bin/cat», «/system/bin/chcon»,
«/system/bin/chmod», «/system/bin/chown», «/system/bin/clear»,
«/system/bin/cmp», «/system/bin/cp», «/system/bin/date»,
«/system/bin/dd», «/system/bin/df», «/system/bin/dmesg»,
«/system/bin/du», «/system/bin/getenforce», «/system/bin/getevent»,
«/system/bin/getprop», «/system/bin/getsebool», «/system/bin/grep»,
«/system/bin/hd», «/system/bin/id», «/system/bin/ifconfig»,
«/system/bin/iftop», «/system/bin/insmod», «/system/bin/ioctl»,
«/system/bin/ionice», «/system/bin/kill», «/system/bin/ln»,
«/system/bin/load_policy», «/system/bin/log», «/system/bin/ls»,
«/system/bin/lsmod», «/system/bin/lsof», «/system/bin/md5»,
«/system/bin/mkdir», «/system/bin/mount», «/system/bin/mv»,
«/system/bin/nandread», «/system/bin/netstat»,
«/system/bin/newfs_msdos», «/system/bin/notify», «/system/bin/printenv»,
«/system/bin/ps», «/system/bin/r», «/system/bin/reboot»,
«/system/bin/renice», «/system/bin/restart», «/system/bin/restorecon»,
«/system/bin/rm», «/system/bin/rmdir», «/system/bin/rmmod»,
«/system/bin/route», «/system/bin/runcon», «/system/bin/schedtop»,
«/system/bin/sendevent», «/system/bin/setconsole»,
«/system/bin/setenforce», «/system/bin/setprop»,
«/system/bin/setsebool», «/system/bin/sleep», «/system/bin/smd»,
«/system/bin/start», «/system/bin/stop», «/system/bin/sync»,
«/system/bin/top», «/system/bin/touch», «/system/bin/umount»,
«/system/bin/uptime», «/system/bin/vmstat», «/system/bin/watchprops»,
«/system/bin/wipe»);
рекурсивное выставление прав папкам
set_perm_recursive(0, 0, 0755, 0644, «/system»);
set_perm_recursive(0, 0, 0755, 0755, «/system/addon.d»);
set_perm_recursive(0, 2000, 0755, 0755, «/system/bin»);
рекурсивное выставление прав файлам
set_perm(0, 3003, 02750, «/system/bin/netcfg»);
set_perm(0, 0, 0755, «/system/bin/ping»);
set_perm(0, 2000, 0750, «/system/bin/run-as»);
set_perm(1014, 2000, 0550, «/system/etc/dhcpcd/dhcpcd-run-hooks»);
set_perm_recursive(0, 2000, 0755, 0755, «/system/etc/init.d»);
set_perm(0, 0, 0755, «/system/etc/init.d»);
set_perm(0, 2000, 0550, «/system/etc/init.goldfish.sh»);
set_perm_recursive(0, 0, 0755, 0555, «/system/etc/ppp»);
set_perm(0, 2000, 0755, «/system/vendor»);
set_perm_recursive(0, 2000, 0755, 0644, «/system/vendor/etc»);
set_perm(0, 0, 0644, «/system/vendor/etc/audio_effects.conf»);
set_perm(0, 2000, 0755, «/system/vendor/firmware»);
set_perm(0, 2000, 0755, «/system/vendor/lib»);
set_perm_recursive(0, 2000, 0755, 0644, «/system/vendor/lib/drm»);
set_perm(0, 0, 0644, «/system/vendor/lib/drm/libdrmwvmplugin.so»);
set_perm_recursive(0, 2000, 0755, 0755, «/system/xbin»);
set_perm(0, 0, 06755, «/system/xbin/librank»);
set_perm(0, 0, 06755, «/system/xbin/procmem»);
set_perm(0, 0, 06755, «/system/xbin/procrank»);
set_perm(0, 0, 06755, «/system/xbin/su»);
прогреccбар
show_progress(0.200000, 0);
show_progress(0.200000, 10);
копирование файла
package_extract_file(«system/bin/backuptool.sh», «/tmp/backuptool.sh»);
package_extract_file(«system/bin/backuptool.functions», «/tmp/backuptool.functions»);
задание прав для файла
set_perm(0, 0, 0777, «/tmp/backuptool.sh»);
set_perm(0, 0, 0644, «/tmp/backuptool.functions»);
запуск программы
run_program(«/tmp/backuptool.sh», «restore»);
удаление файла
delete(«/system/bin/backuptool.sh»);
delete(«/system/bin/backuptool.functions»);
прогрессбар
show_progress(0.200000, 10);
установка ядра
assert(package_extract_file(«boot.img», «/tmp/boot.img»),
write_raw_image(«/tmp/boot.img», «/dev/block/mmcblk0p5»),
delete(«/tmp/boot.img»));
прогрессбар
show_progress(0.100000, 0);
отсоединение раздела
unmount(«/system»);
Бонус: Полезные команды в конце скрипта
Выполнить wipe Dalvik cache, для во избежания сбоев в системе (ставить до umount в конце):
delete_recursive(«/data/dalvik-cache»)
автоматическая перезагрузка (ставить после umount в конце)
run_program(«/sbin/reboot»);
На этом все! Статья updater-script как правильно составить окончена!
Источник