《Android攻防實戰》——實踐App安全

app證書

原理

Android app的簽名實際上是對JAR簽名的重新利用。用一個密碼學意義上的hash函數計算app的內容,這個hash會與一張表示開發者身份的證書綁定在一起併發布出來,將hash與開發者的公鑰,也就是和私鑰聯繫在一起,證書通常是由開發者的私鑰加密的,是一種自簽名證書

  • app證書是一個app在推送到app市場中,表示開發者身份的。它是以把開發者的id和他們的app以密碼學的方式關聯起來的方式實現的。
  • 所有的app在被安裝之前,都必須經過簽名,Android app的簽名實際上是對JAR簽名的重新利用
  • 每一個app的簽名都是唯一的

獲取app簽名方法

  • 解壓apk安裝包後的文件夾META-INF中含有簽名文件和公鑰證書的自簽名——CERT.RSA,可使用Java jdk 的keytool來查看
  • 使用命令 keytool -printcert -file CERT.RSA 查看簽名內容
所有者: EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android,
ountain View, ST=California, C=US
發佈者: EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android,
ountain View, ST=California, C=US
序列號: 936eacbe07f201df
有效期開始日期: Fri Feb 29 09:33:46 CST 2008, 截止日期: Tue Jul 17 09:33:46 C
2035
證書指紋:
         MD5: E8:9B:15:8E:4B:CF:98:8E:BD:09:EB:83:F5:37:8E:87
         SHA1: 61:ED:37:7E:85:D3:86:A8:DF:EE:6B:86:4B:D8:5B:0B:FA:A5:AF:81
         SHA256: A4:0D:A8:0A:59:D1:70:CA:A9:50:CF:15:C1:8C:45:4D:47:A3:9B:26:
9D:8B:64:0E:CD:74:5B:A7:1B:F5:DC
         簽名算法名稱: SHA1withRSA
         版本: 3

擴展:

#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 48 59 00 56 3D 27 2C 46   AE 11 86 05 A4 74 19 AC  HY.V=',F.....t..
0010: 09 CA 8C 11                                        ....
]
[[email protected], CN=Android, OU=Android, O=Android, L=Mount
 View, ST=California, C=US]
SerialNumber: [    936eacbe 07f201df]
]

#2: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
  CA:true
  PathLen:2147483647
]

#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 48 59 00 56 3D 27 2C 46   AE 11 86 05 A4 74 19 AC  HY.V=',F.....t..
0010: 09 CA 8C 11                                        ....
]
]

  • 以上顯示的是證書的內容,其中聲明瞭公鑰的持有者

  • 而真正的與app相關的簽名,在META-INF文件夾中找到CERT.SF的文件,該文件中包含了app中各個資源的密碼學意義上的hash

工作原理

  • “META-INF” 文件夾有助於確立app的完整性。該目錄下的個信息內容:
  • MANIFEST.MF:這個文件聲明瞭資源,與CERT.SF文件非常相似
  • CERT.RSA 公鑰證書 這是一個X.509 V3證書,其內容由keytool工具的以下5個域組成的:

1.Owner(擁有者)用來聲明公鑰的持有者。其中包含與該個體相關的國家和組織的基本信息

2.Issuer(頒發者) 這個域用於聲明X.509證書的頒發者,用來把公鑰和聲明的持有者關聯。

3.Serial number:用作頒發者證書的一個標示符

4.Valid from…util 這個域指定了證書的有效期

5.Certificate fingerprints:證書的數字校驗和

  • CERT.SF 包含app中的所有資源文件,負責對app進行簽名

Android app簽名

  • Android app中的簽名實際上就是JAR的簽名機制,主要用於驗證Java class 文件的開發者,Android app的簽名和JAR簽名的不同使得Android app 中這些額外的內容也參與到簽名和驗證的過程中

對一個app進行簽名

  • 創建密鑰存儲器(keystore)
keytool -genkey -v -keystore[keystore的名稱] -alias[密鑰的別名] -keyalgRSA -keysize 2048 -validity[有效天數]
  • 創建了一個帶口令保護的密鑰存儲器後,將會提示輸入一些在創建證書的過程中需要提供的信息
  • 使用已經創建的密鑰存儲器對一個app進行簽名
jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore[keystore名字][.apk文件][密鑰別名]

參數解釋:
* -verbose 輸出詳細信息
* -sigalg 用來指定簽名過程中使用的算法
* -digestalg 用來指定應該用什麼算法來計算.apk文件中各個資源的hash
* -keystore 用來指定想要使用哪個密鑰存儲器

keytool支持的參數

  • -genkey: 告訴keytool要生成一些密鑰
  • -v 輸出詳細信息參數
  • -keystore 用來指定用以存儲生成的密鑰的密鑰存儲器的存放位置
  • -alias 用於指定生成的密鑰對的別名
  • -keyalg 用來指定生成密鑰時所使用的密碼學算法,可以選擇使用RSA或DSA
  • -keysize 將要生成的密鑰長度
  • validity 規定了生成的密鑰的有效天數

keytool對公鑰和私鑰的實際處理方式:把公鑰放在X.509.v3證書中,該證書用來聲明公鑰持有者,並能驗證相關公鑰是否屬於聲明持有者的

驗證app簽名

  • 該命令可以驗證jar簽名字符串
jarsigner -verify -verbose [apk路徑]

AndroidMenifest.xml文件

  • Manifest中含有與app的權限以及組成app的各個部分的組件相關的所有信息

從一個給定的app的apk包裏取出AndroidManifest.xml文件

1. 將apktool運用在目標apk上
```
apktool d -f -s [apk文件] decoded-data/
```
2.查看提取出來的AndroidManifest.xml 文件

通過ADB與Activity管理器交互

  • ADB可以讓開發者直接與Android系統使用的原生Service和資源(package Manager,Activity manager)以及十分重要的守護進程進行交互。

使用ADB與設備交互

adb shell 
運行包管理器,可以得到一張設備中已安裝的activity的列表
pm list packages
啓動activity
am start [包名]
  • 在運行Activity之前,需要通過Start命令接受的“intent”參數,來指定傳遞給activity的intent
am start <INTENT><--user UID|current>
* -a 指定要使用的action的標籤字符串,指定intent的action
* -d 數據uri 這個參數指定了附加到intent的數據URI
* -t mime類型
* -c intent category
* -n 組件 指定了創建intent使用的組件名

通過ADB提取app裏的資源

  • 查看app的所有資源和元數據
ls -alR */ 
  • 查看數據庫
ls -alR */databases/
  • 顯示每個app保存在/files/目錄中的東西
ls -alr */files/
  • 搜索指定類型的文件
ls -al */*/*.xml
ls -al */*/*.png
ls -al */*/*.mp3
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章