android apk v1 簽名驗證分析
作者:jafon.tian
Android的應用包格式具有防篡改,防重打包的能力,這是如何做到的?祕密就隱藏在META-INF資料夾中,下面通過QQ安裝包的分析來進行詳細的說明和分析。
1. 準備
1 | 到QQ官網下載Android安裝包mobileqq_android.apk |
2 | 將安裝包字尾由apk改為zip,使用解壓軟體釋放中其中的檔案 |
3 | 將其中的META-INF資料夾拷貝出來,用於後續分析 |
META-INF/
--ANDROIDR.RSA
--ANDROIDR.SF
--MANIFEST.MF
2. 檔案分析
名稱 | 說明 |
---|---|
MANIFEST.MF | 包含了除META-INFO目錄外所有檔案的路徑和hash結果 |
ANDROIDR.SF | 對MF整個檔案和裡面每個條目進行了二次hash |
ANDROIDR.RSA | 包含開發者證書以及使用開發者私鑰對SF檔案的簽名 |
檔案之間的逐層保護關係為 RSA檔案–>SF檔案–>MF檔案–>應用其他檔案
2.1 MANIFEST.MF檔案
下面擷取檔案頭部的片段進行說明,除了檔案頭,其他檔案內容都遵循相同的規則。
Manifest-Version: 1.0 Name: AndroidManifest.xml SHA1-Digest: 8tS1gpP+QbotpYp6jN1PCfulDbU=
名稱 | 說明 |
---|---|
Manifest-Version: 1.0 | Manifest版本資訊,應該是用於日後擴充套件使用 |
Name: AndroidManifest.xml SHA1-Digest: 8tS1gpP+QbotpYp6jN1PCfulDbU= |
Name欄位指明應用檔案全路徑 SHA1-Digest欄位指明使用的hash演算法是SHA1以及計算結果的base64編碼 |
SHA1-Digest計算過程:
- 對檔案AndroidManifest.xml的進行SHA1運算,結果用16進位制字串表示為:
f2d4b58293fe41ba2da58a7a8cdd4f09fba50db5 - 將16進位制字串進行base64編碼的結果為:
8tS1gpP+QbotpYp6jN1PCfulDbU=
2.2 ANDROIDR.SF檔案
下面擷取檔案頭部的片段進行說明,與MF檔案類似,除了檔案頭,其他檔案內容也是遵循相同的規則。
Signature-Version: 1.0
Created-By: 1.0 (Android)
SHA1-Digest-Manifest: ouJT4yGiaaiMea/Wu6708IP44P4=
X-Android-APK-Signed: 2
Name: AndroidManifest.xml
SHA1-Digest: lu99E667G2n1uJJ2nDaMFNZLEmE=
名稱 | 說明 |
---|---|
Signature-Version: 1.0 Created-By: 1.0 (Android) X-Android-APK-Signed: 2 |
版本資訊 |
SHA1-Digest-Manifest: ouJT4yGiaaiMea/Wu6708IP44P4= | 對MANIFEST.MF整個檔案進行hash運算結果的base64編碼形式,hash運算採用SHA1演算法 |
Name: AndroidManifest.xml SHA1-Digest: lu99E667G2n1uJJ2nDaMFNZLEmE= |
Name欄位指明應用檔案全路徑 SHA1-Digest欄位是對SF中對應欄位內容的hash運算結果,詳細見下文說明 |
SHA1-Digest-Manifest計算過程:
- 對檔案MANIFEST.MF進行SHA1運算,結果的16進位制字串表示為:
a2e253e321a269a88c79afd6bbaef4f083f8e0fe - 將16進位制字串進行base64編碼的結果為:
ouJT4yGiaaiMea/Wu6708IP44P4=
SHA1-Digest計算過程:
- 在MANIFEST.MF檔案中找到具有相同Name欄位的內容。
在MANIFEST.MF檔案中找到Name欄位為AndroidManifest.xml的條目
“
Name: AndroidManifest.xml
SHA1-Digest: 8tS1gpP+QbotpYp6jN1PCfulDbU=
”
為了準確,這裡同時給出處理之前16進位制的表示形式
00000000h: 4E 61 6D 65 3A 20 41 6E 64 72 6F 69 64 4D 61 6E ; Name: AndroidMan
00000010h: 69 66 65 73 74 2E 78 6D 6C 0D 0A 53 48 41 31 2D ; ifest.xml…SHA1-
00000020h: 44 69 67 65 73 74 3A 20 38 74 53 31 67 70 50 2B ; Digest: 8tS1gpP+
00000030h: 51 62 6F 74 70 59 70 36 6A 4E 31 50 43 66 75 6C ; QbotpYp6jN1PCful
00000040h: 44 62 55 3D ; DbU=
- 對內容進行格式化處理,每一對Key-Value佔據一行,最後一行新增換行符(\r\n)
“
Name: AndroidManifest.xml
SHA1-Digest: 8tS1gpP+QbotpYp6jN1PCfulDbU=
”
為了準確,這裡也同時給出處理之後16進位制的表示形式
00000000h: 4E 61 6D 65 3A 20 41 6E 64 72 6F 69 64 4D 61 6E ; Name: AndroidMan
00000010h: 69 66 65 73 74 2E 78 6D 6C 0D 0A 53 48 41 31 2D ; ifest.xml…SHA1-
00000020h: 44 69 67 65 73 74 3A 20 38 74 53 31 67 70 50 2B ; Digest: 8tS1gpP+
00000030h: 51 62 6F 74 70 59 70 36 6A 4E 31 50 43 66 75 6C ; QbotpYp6jN1PCful
00000040h: 44 62 55 3D 0D 0A 0D 0A ; DbU=…
- 對格式化之後的資料進行SHA1運算。
結果的16進位制字串為:
96ef7d13aebb1b69f5b892769c368c14d64b1261 - 將16進位制字串進行base64編碼的結果為:
lu99E667G2n1uJJ2nDaMFNZLEmE=
2.3 ANDROIDR.RSA檔案
ANDROIDR.RSA是個DER格式的檔案,可通過openssl對其進行解析(完整解析見文章最後的附錄部分)。
此檔案包含開發者公鑰、開發者私鑰對自身公鑰證書的簽名和對ANDROIDR.SF檔案的簽名。從RSA檔案中提取這三部分資訊。
名稱 | 說明 |
---|---|
開發者公鑰 | n: a15e9756216f694c5915e0b529095254367c4e64faeff07ae13488d946615a58 ddc31a415f717d019edc6d30b9603d3e2a7b3de0ab7e0cf52dfee39373bc472f a997027d798d59f81d525a69ecf156e885fd1e2790924386b2230cc90e3b7adc 95603ddcf4c40bdc72f22db0f216a99c371d3bf89cba6578c60699e8a0d53695 e: 010001 |
對自身公鑰證書的簽名 | 94a9b80e80691645dd42d6611775a855f71bcd4d77cb60a8e29404035a5e00b2 1bcc5d4a562482126bd91b6b0e50709377ceb9ef8c2efd12cc8b16afd9a159f3 50bb270b14204ff065d843832720702e28b41491fbc3a205f5f2f42526d67f17 614d8a974de6487b2c866efede3b4e49a0f916baa3c1336fd2ee1b1629652049 |
對SF檔案的簽名 | 2f5dabb56f826f75600a42cde32ba1886267b2ea7f2f5c05547d64861b5ad8f7 c910e089ec7cdb29c4bf6282899694579770440d2a9cee054833290d15b2d696 9d8e07dd18150948323d8a19f8f3ef6b021a5d58eb36b5fdcde8371e4649e396 8ad1e49ba4c4938488e61a1f994897cc57f401b994534c75b9bae8199ec8298e |
SF檔案驗證
- 使用開發者公鑰對SF檔案簽名進行解密運算,得到SF檔案SHA1的運算結果
52C4960A8D0C5FEFC62039A339C3B4AE7D3BD2D9 - 對ANDROIDR.SF檔案進行hash運算,得到SHA1運算結果
52c4960a8d0c5fefc62039a339c3b4ae7d3bd2d9 - 比對步驟1和步驟2的運算結果相同即可。
附錄:ANDROIDR.RSA完整解析
openssl asn1parse -inform DER -dump -in ANDROIDR.RSA
0:d=0 hl=4 l= 938 cons: SEQUENCE
4:d=1 hl=2 l= 9 prim: OBJECT :pkcs7-signedData
15:d=1 hl=4 l= 923 cons: cont [ 0 ]
19:d=2 hl=4 l= 919 cons: SEQUENCE
23:d=3 hl=2 l= 1 prim: INTEGER :01
26:d=3 hl=2 l= 11 cons: SET
28:d=4 hl=2 l= 9 cons: SEQUENCE
30:d=5 hl=2 l= 5 prim: OBJECT :sha1
37:d=5 hl=2 l= 0 prim: NULL
39:d=3 hl=2 l= 11 cons: SEQUENCE
41:d=4 hl=2 l= 9 prim: OBJECT :pkcs7-data
52:d=3 hl=4 l= 599 cons: cont [ 0 ]
56:d=4 hl=4 l= 595 cons: SEQUENCE
60:d=5 hl=4 l= 444 cons: SEQUENCE
64:d=6 hl=2 l= 3 cons: cont [ 0 ]
66:d=7 hl=2 l= 1 prim: INTEGER :02
69:d=6 hl=2 l= 4 prim: INTEGER :4BBB0361
75:d=6 hl=2 l= 13 cons: SEQUENCE
77:d=7 hl=2 l= 9 prim: OBJECT :sha1WithRSAEncryption
88:d=7 hl=2 l= 0 prim: NULL
90:d=6 hl=2 l= 109 cons: SEQUENCE
92:d=7 hl=2 l= 14 cons: SET
94:d=8 hl=2 l= 12 cons: SEQUENCE
96:d=9 hl=2 l= 3 prim: OBJECT :countryName
101:d=9 hl=2 l= 5 prim: PRINTABLESTRING :China
108:d=7 hl=2 l= 15 cons: SET
110:d=8 hl=2 l= 13 cons: SEQUENCE
112:d=9 hl=2 l= 3 prim: OBJECT :stateOrProvinceName
117:d=9 hl=2 l= 6 prim: UTF8STRING :北京
125:d=7 hl=2 l= 15 cons: SET
127:d=8 hl=2 l= 13 cons: SEQUENCE
129:d=9 hl=2 l= 3 prim: OBJECT :localityName
134:d=9 hl=2 l= 6 prim: UTF8STRING :北京
142:d=7 hl=2 l= 15 cons: SET
144:d=8 hl=2 l= 13 cons: SEQUENCE
146:d=9 hl=2 l= 3 prim: OBJECT :organizationName
151:d=9 hl=2 l= 6 prim: UTF8STRING :騰訊
159:d=7 hl=2 l= 27 cons: SET
161:d=8 hl=2 l= 25 cons: SEQUENCE
163:d=9 hl=2 l= 3 prim: OBJECT :organizationalUnitName
168:d=9 hl=2 l= 18 prim: UTF8STRING :無線業務系統
188:d=7 hl=2 l= 11 cons: SET
190:d=8 hl=2 l= 9 cons: SEQUENCE
192:d=9 hl=2 l= 3 prim: OBJECT :commonName
197:d=9 hl=2 l= 2 prim: PRINTABLESTRING :QQ
201:d=6 hl=2 l= 32 cons: SEQUENCE
203:d=7 hl=2 l= 13 prim: UTCTIME :100406094817Z
218:d=7 hl=2 l= 15 prim: GENERALIZEDTIME :22840120094817Z
235:d=6 hl=2 l= 109 cons: SEQUENCE
237:d=7 hl=2 l= 14 cons: SET
239:d=8 hl=2 l= 12 cons: SEQUENCE
241:d=9 hl=2 l= 3 prim: OBJECT :countryName
246:d=9 hl=2 l= 5 prim: PRINTABLESTRING :China
253:d=7 hl=2 l= 15 cons: SET
255:d=8 hl=2 l= 13 cons: SEQUENCE
257:d=9 hl=2 l= 3 prim: OBJECT :stateOrProvinceName
262:d=9 hl=2 l= 6 prim: UTF8STRING :北京
270:d=7 hl=2 l= 15 cons: SET
272:d=8 hl=2 l= 13 cons: SEQUENCE
274:d=9 hl=2 l= 3 prim: OBJECT :localityName
279:d=9 hl=2 l= 6 prim: UTF8STRING :北京
287:d=7 hl=2 l= 15 cons: SET
289:d=8 hl=2 l= 13 cons: SEQUENCE
291:d=9 hl=2 l= 3 prim: OBJECT :organizationName
296:d=9 hl=2 l= 6 prim: UTF8STRING :騰訊
304:d=7 hl=2 l= 27 cons: SET
306:d=8 hl=2 l= 25 cons: SEQUENCE
308:d=9 hl=2 l= 3 prim: OBJECT :organizationalUnitName
313:d=9 hl=2 l= 18 prim: UTF8STRING :無線業務系統
333:d=7 hl=2 l= 11 cons: SET
335:d=8 hl=2 l= 9 cons: SEQUENCE
337:d=9 hl=2 l= 3 prim: OBJECT :commonName
342:d=9 hl=2 l= 2 prim: PRINTABLESTRING :QQ
346:d=6 hl=3 l= 159 cons: SEQUENCE
349:d=7 hl=2 l= 13 cons: SEQUENCE
351:d=8 hl=2 l= 9 prim: OBJECT :rsaEncryption
362:d=8 hl=2 l= 0 prim: NULL
364:d=7 hl=3 l= 141 prim: BIT STRING
0000 - 00 30 81 89 02 81 81 00-a1 5e 97 56 21 6f 69 4c .0.......^.V!oiL
0010 - 59 15 e0 b5 29 09 52 54-36 7c 4e 64 fa ef f0 7a Y...).RT6|Nd...z
0020 - e1 34 88 d9 46 61 5a 58-dd c3 1a 41 5f 71 7d 01 .4..FaZX...A_q}.
0030 - 9e dc 6d 30 b9 60 3d 3e-2a 7b 3d e0 ab 7e 0c f5 ..m0.`=>*{=..~..
0040 - 2d fe e3 93 73 bc 47 2f-a9 97 02 7d 79 8d 59 f8 -...s.G/...}y.Y.
0050 - 1d 52 5a 69 ec f1 56 e8-85 fd 1e 27 90 92 43 86 .RZi..V....'..C.
0060 - b2 23 0c c9 0e 3b 7a dc-95 60 3d dc f4 c4 0b dc .#...;z..`=.....
0070 - 72 f2 2d b0 f2 16 a9 9c-37 1d 3b f8 9c ba 65 78 r.-.....7.;...ex
0080 - c6 06 99 e8 a0 d5 36 95-02 03 01 00 01 ......6......
508:d=5 hl=2 l= 13 cons: SEQUENCE
510:d=6 hl=2 l= 9 prim: OBJECT :sha1WithRSAEncryption
521:d=6 hl=2 l= 0 prim: NULL
523:d=5 hl=3 l= 129 prim: BIT STRING
0000 - 00 94 a9 b8 0e 80 69 16-45 dd 42 d6 61 17 75 a8 ......i.E.B.a.u.
0010 - 55 f7 1b cd 4d 77 cb 60-a8 e2 94 04 03 5a 5e 00 U...Mw.`.....Z^.
0020 - b2 1b cc 5d 4a 56 24 82-12 6b d9 1b 6b 0e 50 70 ...]JV$..k..k.Pp
0030 - 93 77 ce b9 ef 8c 2e fd-12 cc 8b 16 af d9 a1 59 .w.............Y
0040 - f3 50 bb 27 0b 14 20 4f-f0 65 d8 43 83 27 20 70 .P.'.. O.e.C.' p
0050 - 2e 28 b4 14 91 fb c3 a2-05 f5 f2 f4 25 26 d6 7f .(..........%&..
0060 - 17 61 4d 8a 97 4d e6 48-7b 2c 86 6e fe de 3b 4e .aM..M.H{,.n..;N
0070 - 49 a0 f9 16 ba a3 c1 33-6f d2 ee 1b 16 29 65 20 I......3o....)e
0080 - 49 I
655:d=3 hl=4 l= 283 cons: SET
659:d=4 hl=4 l= 279 cons: SEQUENCE
663:d=5 hl=2 l= 1 prim: INTEGER :01
666:d=5 hl=2 l= 117 cons: SEQUENCE
668:d=6 hl=2 l= 109 cons: SEQUENCE
670:d=7 hl=2 l= 14 cons: SET
672:d=8 hl=2 l= 12 cons: SEQUENCE
674:d=9 hl=2 l= 3 prim: OBJECT :countryName
679:d=9 hl=2 l= 5 prim: PRINTABLESTRING :China
686:d=7 hl=2 l= 15 cons: SET
688:d=8 hl=2 l= 13 cons: SEQUENCE
690:d=9 hl=2 l= 3 prim: OBJECT :stateOrProvinceName
695:d=9 hl=2 l= 6 prim: UTF8STRING :北京
703:d=7 hl=2 l= 15 cons: SET
705:d=8 hl=2 l= 13 cons: SEQUENCE
707:d=9 hl=2 l= 3 prim: OBJECT :localityName
712:d=9 hl=2 l= 6 prim: UTF8STRING :北京
720:d=7 hl=2 l= 15 cons: SET
722:d=8 hl=2 l= 13 cons: SEQUENCE
724:d=9 hl=2 l= 3 prim: OBJECT :organizationName
729:d=9 hl=2 l= 6 prim: UTF8STRING :騰訊
737:d=7 hl=2 l= 27 cons: SET
739:d=8 hl=2 l= 25 cons: SEQUENCE
741:d=9 hl=2 l= 3 prim: OBJECT :organizationalUnitName
746:d=9 hl=2 l= 18 prim: UTF8STRING :無線業務系統
766:d=7 hl=2 l= 11 cons: SET
768:d=8 hl=2 l= 9 cons: SEQUENCE
770:d=9 hl=2 l= 3 prim: OBJECT :commonName
775:d=9 hl=2 l= 2 prim: PRINTABLESTRING :QQ
779:d=6 hl=2 l= 4 prim: INTEGER :4BBB0361
785:d=5 hl=2 l= 9 cons: SEQUENCE
787:d=6 hl=2 l= 5 prim: OBJECT :sha1
794:d=6 hl=2 l= 0 prim: NULL
796:d=5 hl=2 l= 13 cons: SEQUENCE
798:d=6 hl=2 l= 9 prim: OBJECT :rsaEncryption
809:d=6 hl=2 l= 0 prim: NULL
811:d=5 hl=3 l= 128 prim: OCTET STRING
0000 - 2f 5d ab b5 6f 82 6f 75-60 0a 42 cd e3 2b a1 88 /]..o.ou`.B..+..
0010 - 62 67 b2 ea 7f 2f 5c 05-54 7d 64 86 1b 5a d8 f7 bg.../\.T}d..Z..
0020 - c9 10 e0 89 ec 7c db 29-c4 bf 62 82 89 96 94 57 .....|.)..b....W
0030 - 97 70 44 0d 2a 9c ee 05-48 33 29 0d 15 b2 d6 96 .pD.*...H3).....
0040 - 9d 8e 07 dd 18 15 09 48-32 3d 8a 19 f8 f3 ef 6b .......H2=.....k
0050 - 02 1a 5d 58 eb 36 b5 fd-cd e8 37 1e 46 49 e3 96 ..]X.6....7.FI..
0060 - 8a d1 e4 9b a4 c4 93 84-88 e6 1a 1f 99 48 97 cc .............H..
0070 - 57 f4 01 b9 94 53 4c 75-b9 ba e8 19 9e c8 29 8e W....SLu......).