Как я могу проверить подлинность скачанного APK-файла?

62

Последнее обновление Карт Google недоступно в моей стране, поэтому я скачал версию, найдя «Google Maps 5.4.0 apk». Я действительно нашел это, но теперь мне интересно, как я могу определить, действительно ли это та же версия, что и на рынке.

Как я могу быть уверен, что это не было подделано? Подписаны ли приложения каким-либо образом? Есть ли способ проверить подписи?

Натан Феллман
источник
Если вы посещаете со своего мобильного телефона страницу: m.google.com/mapsпредлагает ли она ссылку для скачивания или что-то в этом роде?
Николас
@ Николас: Это ссылки на рынок, с которого я не могу его скачать.
Натан Феллман
Не удивительно, что от Google. Кстати, и я знаю, что я не отвечаю на ваш первоначальный вопрос, но вы тестировали MapDroyd ?
Николас
@ Николас: у меня нет, и я на самом деле использую Waze для повседневной навигации. Карты Google - только пример. Google Книги - это еще один пример, Google Streetview - еще один пример (на самом деле, похоже, что только приложения Google доставляют мне эту неприятность ...)
Натан Феллман,
1
Если у вас есть второе «подлинное» приложение, созданное одним и тем же поставщиком, вы можете сравнить, подписаны ли оба приложения с использованием одних и тех же ключей / идентификаторов: android.stackexchange.com/a/208326/2241
Роберт,

Ответы:

71

В дополнение к дискуссии о легитимности установки этого приложения на ваш телефон, вопрос проверки является тем, который я хотел понять некоторое время, и вы предложили мне попытаться выяснить возможный способ проверки того, кто подписал апк.

Приложения Android подписываются обычным образом .jar-файлами (на самом деле .apk - это просто специальный .jar, который является просто специальным .zip), однако проследить подлинность сертификатов, если у вас есть что-то хорошее по сравнению с. Это в основном то, что делает сам телефон - проверяет, что то, что, как утверждают, принадлежит той же стороне, что и то, что уже есть на телефоне, - телефон не отказывается устанавливать вещи с неизвестными подписчиками, он может только (возражать против / очищать приложение данные о) очевидных подделках, когда что-то новое не соответствует старому, на которое оно претендует.

Вам понадобится jarsigner и keytool. Я считаю, что они исходят от JDK, который является предпосылкой для Android SDK, а не сам SDK.

Сначала вы хотите проверить открытый ключ, содержащийся в .apk. Обычно это в META-INF / CERTS.RSA, но это может быть в другом файле - unzip -l скажет вам. Вы хотите увидеть, что вы можете узнать об этом:

unzip -p suspect.apk META-INF/CERT.RSA | keytool -printcert

Это даст много информации о том, кем подписчик утверждает. Некоторые сертификаты, очевидно, сами подписаны известными сторонами, но, не зная, как это отследить, я подозреваю, что вы могли бы сделать что-то вроде этого:

unzip -p suspect.apk META-INF/CERT.RSA | keytool -printcert | grep MD5
unzip -p knowngood.apk META-INF/CERT.RSA | keytool -printcert | grep MD5

Если у вас есть известный доверенный apk от того же автора, который использовал тот же сертификат. Я предполагаю, что сертификатов с одинаковой суммой MD5 достаточно.

Предполагая, что вы решили доверять сертификату, вы сможете увидеть, использовался ли он для подписи каждого из файлов в .apk.

jarsigner -verbose -verify suspect.apk

(Если в архиве более одного файла .RSA, вы должны добавить флаг -certs, чтобы указать, какие сертификаты использовались для подписи каждого файла, чтобы вы могли быть уверены, что это сертификат, который вы проверяли)

Крис Страттон
источник
9
Есть ли способ убедиться, что данный apk совпадает с официальным в магазине Google Play?
Брайс
@ Брайс, у меня такой же вопрос. Вы нашли ответ?
Кайзер Созай
@Chris Stratton Можно ли скопировать apk Google Maps с устройства? Тогда можно проверить сертификаты, как вы сказали.
Кайзер Созай
Кроме того, вы можете извлечь APK из устройства с помощью следующего приложения: play.google.com/store/apps/details?id=com.ext.ui&hl=ru Best, Paul. [Под редакцией модератора Firelord]
Спипау
4

Существует (сейчас) apksignerинструмент, build-toolsкоторый делает то, что вы хотите. Из документов :

Убедитесь, что подписи APK будут подтверждены как действительные на всех платформах Android, которые поддерживает APK:

apksigner verify [options] app-name.apk
kahbou
источник
1

Вы также можете попробовать загрузить APK в бесплатную программу проверки на вирусы VirusTotal.com . Он сгенерирует уникальный хеш для APK, и если другие уже загрузили его для тестирования (очень вероятно), у вас будет больше идеи о том, что APK действителен.

Служба также будет сканировать APK с помощью более 60 антивирусных сканеров и сообщит, считает ли он, что он имеет сигнатуры, аналогичные уже обнаруженным вирусам.

raddevus
источник
0

Чтобы сравнить сертификаты из подозрительного apk-файла, возможно, одна из идей заключается в том, чтобы скачать его версию в официальном Play Store на вашем телефоне, сделать резервную копию на вашем компьютере и зайти в каталог резервных копий, выбрать соответствующий apk-файл и выполнить те же проверки. Вы также можете просмотреть сертификаты Google, выполнив проверку в приложении по умолчанию для устройства (как и любой com.google.android. * Apk).

Nozalys
источник
0

Правильный способ проверить файл APK - использовать apksigner.

apksigner является частью инструментов сборки Android, поэтому вы можете найти несколько установленных версий, по одной для каждой установленной версии инструментов сборки.

Одним из примеров пути в Android SDK apksignerявляется:

android-sdk/build-tools/29.0.2/apksigner

Выполните apksigner следующим образом:

apksigner verify --verbose --print-certs "Signal-website-universal-release-4.49.13.apk"

Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): true
Number of signers: 1
Signer #1 certificate DN: CN=Whisper Systems, OU=Research and Development, O=Whisper Systems, L=Pittsburgh, ST=PA, C=US
Signer #1 certificate SHA-256 digest: 29f34e5f27f211b424bc5bf9d67162c0eafba2da35af35c16416fc446276ba26
Signer #1 certificate SHA-1 digest: 45989dc9ad8728c2aa9a82fa55503e34a8879374
Signer #1 certificate MD5 digest: d90db364e32fa3a7bda4c290fb65e310
Signer #1 key algorithm: RSA
Signer #1 key size (bits): 1024
Signer #1 public key SHA-256 digest: 75336a3cc9edb64202cd77cd4caa6396a9b5fc3c78c58660313c7098ea248a55
Signer #1 public key SHA-1 digest: b46cbed18d6fbbe42045fdb93f5032c943d80266
Signer #1 public key MD5 digest: 0f9c33bbd45db0218c86ac378067538d
<skipped a lot of warnings>

Теперь вы проверили APK, но вы все еще не знаете, можете ли вы доверять человеку / организации, подписавшим APK-файл. Это потому, что на Android APK подписи используют по определению самозаверяющие сертификаты. Если вы можете доверять сертификату, это сложный вопрос. Единственный способ - проверить другие приложения, которые были подписаны с использованием того же сертификата.

Единственный способ, которым я знаю, - это использовать сервис сканирования PlayStore androidobservatory.org. Он имеет API для проверки того, какие приложения были подписаны тем же сертификатом с использованием дайджеста сертификата SHA-1:

Изменить: apkmirror.com также позволяет искать дайджест сертификата. Просто введите простой дайджест сертификата SHA-1 или SHA-256 (без двоеточий и пробелов) в поле поиска:

На этой странице вы можете увидеть все другие APK-файлы в Google Play Store, которые подписаны тем же сертификатом.

Роберт
источник