¿Cómo detectar si un apk es de Play Store o Sideloaded?

Entiendo que las aplicaciones están firmadas tanto por Google como por el desarrollador.

¿Cómo puedo detectar si un correo electrónico apkes de Play Store o si está descargado?

Preferiría que el método funcionara en todas las plataformas principales solo si es posible, incluido el propio Android.

Incluso si se carga lateralmente, me gustaría saber la fuente de la aplicación. Como es de Play Store.

Estoy pensando en usar una aplicación o un método que utilice la detección de firmas.

La detección de firmas no ayuda mucho a detectar cómo se instaló una aplicación. Pero existe la propiedad "installerPackageName" que le dice que al usar adb dumpsys package(lleva el nombre del paquete de la aplicación que lo instaló, que sería el de la tienda de juegos cuando se usó, o F-Droids, etc., o "fuente desconocida" cuando completamente cargado lateralmente.
@Izzy Estoy más preocupado por tratar con el apk en sí. Si usa un capturador de apk o adb, es irrelevante si el apk está descargado. Quiero verificación de que es de Play Store.

Respuestas (1)

No puede saber si el .apkoriginal vino de Playstore, pero puede saber si coincide con el disponible en Playstore. Esto es lo que necesitas:

  • el .apken cuestión
  • la .apkde la misma aplicación en la misma versión de Playstore
  • abressl

Descomprima ambos .apk(cada uno en su propio directorio) y compare sus certificados (almacenados en el META-INF/directorio. Los detalles sobre una comparación completa, por ejemplo, se pueden encontrar aquí . El comando que necesitaría es:

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

Alternativamente, si no tiene Openssl instalado pero Oracle JDK:

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

o

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

Si los certificados coinciden, ambos archivos APK se firmaron con la misma clave. A menos que la clave del desarrollador se vea comprometida, eso debería significar que el APK potencialmente transferido debería estar bien (no hay garantías de que el propio desarrollador no haya jugado, pero si el tamaño y el MD5 del APK también coinciden, diría que es seguro).

Si bien la parte sobre la comparación de la firma en el META-INF es útil, la única forma de asegurarse de que un APK sea el mismo que el de Play Store es comparar sus sumas de verificación MD5, como dijiste. De hecho, la herramienta llamada apktool contiene una configuración alfa para intentar recompilar un APK y conservar la firma original en el proceso, por lo que verificar solo el RSA puede resultar poco confiable en el futuro.
@DeathMaskSalesman es por eso que usé esa "conjuntivitis" (debería... debería). Otro punto es: una discrepancia MD5 no necesariamente debe apuntar a una clave comprometida. Algunos desarrolladores tienen sus aplicaciones en diferentes variantes con el mismo número de versión (piense, por ejemplo, en Tasker): debido a las restricciones en Playstore, ofrecen una "versión completa" (con opciones que Playstore rechazaría) a través de un canal diferente.
Correcto. Entonces, la única forma de estar casi seguro sería verificar tanto la firma como la suma de verificación, como ya dijiste.