Как определить, является ли apk из Play Store или загруженным?

Я понимаю, что приложения подписаны как Google, так и разработчиком.

Как определить, apkнаходится ли файл в Play Маркете или загружен неопубликованным.

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

Даже если загружено, я хотел бы знать источник приложения. Вроде из Play Маркета.

Я думаю об использовании приложения или метода, использующего обнаружение подписи.

Обнаружение подписи не очень помогает определить, как было установлено приложение. Но есть свойство «installerPackageName», которое сообщает вам, что при использовании adb dumpsys package(оно содержит имя пакета приложения, установившего его, которое будет плеймаркетом, когда оно используется, или F-Droids и т. д., или «неизвестный источник», когда полностью с боковой загрузкой.
@Izzy Меня больше беспокоит сам apk. Если вы используете apk-граббер или adb, не имеет значения, загружен ли apk. Я хочу подтвердить, что это из магазина Play.

Ответы (1)

Вы не можете сказать, .apkисходно ли оно было из Playstore, но вы можете сказать, соответствует ли оно тому, что доступно в Playstore. Вот что вам нужно:

  • рассматриваемый .apk_
  • того .apkже приложения в той же версии из Playstore
  • openssl

Разархивируйте оба .apk(каждый в свой собственный каталог) и сравните их сертификаты (хранящиеся в META-INF/каталоге. Подробности о тщательном сравнении можно найти, например, здесь . Вам понадобится команда:

openssl pkcs7 -inform DER -in META-INF/CERT.RSA -noout -print_certs -text

В качестве альтернативы, если вы установили не openssl, а Oracle JDK:

keytool -printcert -file META-INF/CERT.RSA

или

jarsigner -verify -certs -verbose ../Example.apk

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

Хотя часть о сравнении подписи в META-INF полезна, единственный способ убедиться, что APK такой же, как в Play Store, - это сравнить их контрольные суммы MD5, как вы сказали. На самом деле, инструмент с именем apktool содержит альфа-параметр для попытки перекомпилировать APK и сохранения исходной подписи в процессе, поэтому проверка только RSA может оказаться ненадежной в будущем.
@DeathMaskSalesman, вот почему я использовал этот «конъюнктивит» (должен… должен). Еще один момент: несоответствие MD5 не обязательно должно указывать на скомпрометированный ключ. Некоторые разработчики имеют свои приложения в разных вариантах с одним и тем же номером версии (вспомните, например, Tasker): из-за ограничений в Playstore они предлагают «полноценную версию» (с опциями, которые Playstore отклонит) через другой канал.
Правильный. Итак, единственный способ быть почти уверенным - проверить и подпись, и контрольную сумму, как вы уже сказали.