2017-06-02 1 views
2

APKファイルをマルウェアアプリケーションを検出するために分析するプロジェクトに取り組んでいます。パッケージ化時間ではなく署名時間を抽出する方法がわかります。これは私が論文から読んだ一つの特徴であり、それは驚くほど役に立つと思われます。APKファイルに基づいてアプリの署名時間を取得する方法

+0

[APKからの署名証明書の確認](https://stackoverflow.com/a/24225807/608639)。証明書を取得したら、時間を取るようなことができると信じています。 – jww

答えて

1

私が署名時間のようなものを得るために知っている少なくとも3つの方法があります。最初keytoolを使用することがあります:Thu Dec 17 04:12:27 PST 2015:これはあなたの証明書が作成された可能性が高い時刻を取得します

$ 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^ 
] 
] 

目は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 

これがAPK内のすべてのエントリの最終更新時刻のように見える何を取得します。このAPKではすべて同じですが、時々違います。最終変更時刻は、「有効開始日」よりも大きい必要があります。

番目のオプションは、プログラムJavaでJarFileを使用している:

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()); 
} 

あなたがandroidManifestEntry.getCodeSigners()[0].getTimestamp()を使用できると思うかもしれないが、それは常にnullだと私はそれが何であるかわかりません。上記のコードでは、次の出力が得られます。

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 ** 
関連する問題