2017-06-02 1 views
2

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

+0

[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

Répondre

1

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 **