Je travaille sur un projet qui analyse les fichiers APK pour détecter les applications malveillantes, et je me demande comment extraire le temps de SIGNING plutôt que le temps de conditionnement. C'est une caractéristique que j'ai lue sur un papier et cela semble surprenant utile.Comment obtenir l'heure de signature de l'application basée sur le fichier APK
Répondre
Il y a au moins trois façons dont je connais pour obtenir quelque chose comme l'heure de signature. Il est d'abord d'utiliser keytool
:
$ keytool -printcert -jarfile sample.apk
Signer #1:
Signature:
Owner: CN=GService inc, OU=G Service inc, O=G, L=New York, ST=New York, C=US
Issuer: CN=GService inc, OU=G Service inc, O=G, L=New York, ST=New York, C=US
Serial number: 6f30f864
Valid from: Thu Dec 17 04:12:27 PST 2015 until: Wed Dec 12 04:12:27 PST 2035
Certificate fingerprints:
MD5: 4D:36:65:14:59:5B:74:8F:2C:9D:92:30:F6:1D:90:8A
SHA1: A8:85:7B:72:4C:EE:55:83:09:D5:AC:5D:1A:02:80:C5:F6:83:2B:40
SHA256: 04:A7:24:9F:35:D5:8D:7E:F6:0F:73:81:35:5D:23:16:0D:FC:EA:61:C4:15:61:CC:06:8D:36:D9:C6:55:12:B7
Signature algorithm name: SHA256withRSA
Version: 3
Extensions:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: C1 C5 19 32 72 47 46 C5 01 CC 4B AF 12 40 3D D2 [email protected]=.
0010: B5 52 45 5E .RE^
]
]
Cela vous obtient le temps probable que le certificat a été créé: Thu Dec 17 04:12:27 PST 2015
.
La seconde est d'utiliser jarsigner
:
$ jarsigner -verify -verbose sample.apk
sm 4284 Wed Apr 13 11:03:18 PDT 2016 AndroidManifest.xml
sm 9193 Wed Apr 13 11:03:18 PDT 2016 res/drawable-hdpi-v4/ic_launcher.png
sm 5057 Wed Apr 13 11:03:18 PDT 2016 res/drawable-mdpi-v4/ic_launcher.png
sm 14068 Wed Apr 13 11:03:18 PDT 2016 res/drawable-xhdpi-v4/ic_launcher.png
sm 1408 Wed Apr 13 11:03:18 PDT 2016 resources.arsc
sm 20388 Wed Apr 13 11:03:18 PDT 2016 classes.dex
s 523 Wed Apr 13 11:03:18 PDT 2016 META-INF/MANIFEST.MF
576 Wed Apr 13 11:03:18 PDT 2016 META-INF/CERT.SF
1368 Wed Apr 13 11:03:18 PDT 2016 META-INF/CERT.RSA
s = signature was verified
m = entry is listed in manifest
k = at least one certificate was found in keystore
i = at least one certificate was found in identity scope
Cela vous obtient ce qui semble être les derniers temps modifiés de toutes les entrées de l'APK. Ils sont tous les mêmes dans ce fichier APK, mais ils sont parfois différents. Tous les derniers temps modifiés doivent probablement être supérieurs à la date "valide à partir de".
La troisième option est programme utilise JarFile
en Java:
private static void printCertInfo(String jarPath) throws Exception {
// verify = true is key here
JarFile apkFile = new JarFile(jarPath, true);
JarEntry androidManifestEntry = apkFile.getJarEntry("AndroidManifest.xml");
if (androidManifestEntry == null) {
System.err.println("APK has no AndroidManifest.xml");
System.exit(-1);
}
// Need to fully read stream to verify cert
System.out.println("Android manifest probably signed: " + androidManifestEntry.getLastModifiedTime());
ByteStreams.copy(apkFile.getInputStream(androidManifestEntry), ByteStreams.nullOutputStream());
// Assuming only signed with a single cert (not always true, but you get the idea)
X509Certificate cert = (X509Certificate) androidManifestEntry.getCertificates()[0];
System.out.println("Android manifest cert probably created: " + cert.getNotBefore());
System.out.println("Full cert: " + cert.toString());
}
Vous pourriez penser que vous pouvez utiliser androidManifestEntry.getCodeSigners()[0].getTimestamp()
mais il est toujours null
et je ne suis pas sûr de ce qu'il est. Le code ci-dessus donne cette sortie:
Android manifest probably signed: 2016-04-13T18:03:18Z
Android manifest cert probably created: Thu Dec 17 04:12:27 PST 2015
Full cert: [
[
Version: V3
Subject: CN=GService inc, OU=G Service inc, O=G, L=New York, ST=New York, C=US
Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11
// ** SNIP -- you get the idea **
[Déterminer le certificat de signature à partir d'un fichier APK] (https://stackoverflow.com/a/24225807/608639). Une fois que vous avez le certificat, je crois que vous pouvez faire des choses comme extraire l'heure. – jww