APKファイルをマルウェアアプリケーションを検出するために分析するプロジェクトに取り組んでいます。パッケージ化時間ではなく署名時間を抽出する方法がわかります。これは私が論文から読んだ一つの特徴であり、それは驚くほど役に立つと思われます。APKファイルに基づいてアプリの署名時間を取得する方法
2
A
答えて
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 **
関連する問題
- 1. apk署名に基づいて情報を取得する
- 2. 実行時にapkの署名を取得する
- 3. 署名入りapkからキーストアファイルを取得する方法
- 4. 値に基づいてラジオボタン名を取得する方法
- 5. 署名付きファイルから署名者の名前を取得する方法
- 6. 時間間隔に基づいてレコードのリストを取得する(PHP/MySQL)
- 7. 署名された.apkファイルと署名されていない.apkファイルのAndroidの違いは?
- 8. ASP.netの列名に基づいてListItemを取得する方法は?
- 9. Macでの作成時間に基づいてディレクトリ内のファイルの名前を変更する方法
- 10. 時間、分、秒のユーザー入力に基づいてレコードを取得するSQLクエリを変更する方法
- 11. DateTimeの時間に基づいて平均値を取得するSQL
- 12. luceneのURLに基づいてレコードを取得する方法
- 13. 挿入時間に基づいてMarkLogicからドキュメントを取得するには
- 14. datestampに基づいてファイルの再取得を自動化する方法
- 15. Angular2アプリに基づいてAndroidアプリを作成する方法
- 16. フラッターのアプリに署名する方法
- 17. 時間範囲に基づいてカウントを取得するためのMySQLクエリの記述方法
- 18. GUIDに基づいてSharepointサイト名を取得するには?
- 19. Odoo - company_idに基づいてレポートデータを取得する方法
- 20. Qt OpenGL-マウスクリックに基づいてオブジェクトを取得する方法
- 21. グループIDに基づいてリストを取得する方法
- 22. 座標に基づいて要素を取得する方法
- 23. OBJECT_IDに基づいてデータベースオブジェクトを取得する方法は?
- 24. IDに基づいて開始月を取得する方法
- 25. 色に基づいてサブジェクト名を取得する
- 26. カラム名に基づいてSQLカラムインデックスを取得する
- 27. 値を取得する名前に基づいて
- 28. 日付とユーザーに基づいて名前を取得する
- 29. 一時ファイル名の取得方法は?
- 30. PHP - ユーザーに基づいて単一のファイルを取得する
[APKからの署名証明書の確認](https://stackoverflow.com/a/24225807/608639)。証明書を取得したら、時間を取るようなことができると信じています。 – jww