《Android攻防实战》——实践App安全

来源:互联网 发布:mysql community 编辑:程序博客网 时间:2024/06/05 06:17

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 C2035证书指纹:         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=falseAuthorityKeyIdentifier [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                                        ....][EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android, L=Mount View, ST=California, C=US]SerialNumber: [    936eacbe 07f201df]]#2: ObjectId: 2.5.29.19 Criticality=falseBasicConstraints:[  CA:true  PathLen:2147483647]#3: ObjectId: 2.5.29.14 Criticality=falseSubjectKeyIdentifier [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启动activityam 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 */*/*.xmlls -al */*/*.pngls -al */*/*.mp3
0 0
原创粉丝点击