zoukankan      html  css  js  c++  java
  • APK签名替换检测

    APK二次打包的危害

    APK二次打包是Android应用安全风险中的一部分, 一般是通过反编译工具向应用中插入广告代码与相关配置,再在第三方应用市场、论坛发布。打包党对移动App带来的危害有以下几种:

    1. 插入自己广告或者删除原来广告;
    2. 恶意代码, 恶意扣费、木马等;
    3. 修改原来支付逻辑;

    上述恶意行为危害了APK出品方和用户的利益,同时也影响企业口碑。


    APK的签名机制

    Google设计APK的签名机制就是防止两个问题:

    • 不让别人修改APK包,防止反编译后二次打包;
      怎么做到不让别人二次打包呢?Android系统在安装APK时,会先去确认是否有签名、签名是否能对上;
    • Android系统在安装APK包时,不允许安装同一个包名但是签名不一样的APK;

    下面开始分析APK打签名的流程:

    需要了解的背景知识

    自行去百度,了解概念即可;

    • 数据摘要(数据指纹)、MD5SHA-1对称加密算法
    • 非对称加密算法
    • 数字签名、数字证书
    • 手动签名APK包

    1.查看META-INF文件

    将.apk包修改后缀成.zip,解压之后打开该文件夹,找到META-INF目录。

    签名就是围绕这三个文件开始的。

    2.先看第一个文件MANIFEST.MF

    这个文件里面包括了APK文件中所有文件的数据摘要值。相当于对每个单独(除了这三个)的文件都做了数据指纹。

    3.在看第二个文件CERT.SF

    和MANIFEST.MF文件差不多,唯一的差别在于,多了一行SHA1-Digest-Manifest: KDerPmANkkB5mxceo/t5oXRGApg=,这行就是MANIFEST.MF的数据摘要。

    4.最后看第三个文件CERT.SF

    把之前的CERT.SF文件用私钥计算出一个加密值,这个加密值称为签名,所以这个文件包含了签名和公钥;

    如果是在Windows系统下,推荐使用cmder.exe软件使用如下命令。

    D:ProgramFilescmder>openssl pkcs7 -inform DER -in "C:app-debug - 副本META-INFCERT.RSA" -noout -print_certs -text
    WARNING: can't open config file: /usr/local/ssl/openssl.cnf
    Certificate:
        Data:
            Version: 1 (0x0)
            Serial Number: 1 (0x1)
        Signature Algorithm: sha1WithRSAEncryption
            Issuer: CN=Android Debug, O=Android, C=US
            Validity
                Not Before: Dec 27 09:26:22 2018 GMT
                Not After : Dec 19 09:26:22 2048 GMT
            Subject: CN=Android Debug, O=Android, C=US
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
                    Public-Key: (1024 bit)
                    Modulus:
                        00:89:e0:b4:29:a9:62:b1:44:48:b8:35:f2:8a:06:
                        91:c7:36:44:1a:d2:b3:97:fd:58:b5:84:35:fc:83:
                        09:50:f5:85:83:d9:bc:12:a8:da:da:cf:f0:10:d0:
                        4d:9f:a5:9d:7f:de:b6:4e:1e:94:36:c4:f4:44:45:
                        4e:44:f5:97:9f:f3:62:3f:5f:9d:ce:a6:18:73:22:
                        62:28:79:f7:46:f8:d6:f7:ca:46:e3:3f:dd:a8:ac:
                        b7:aa:cb:77:7c:47:16:89:d1:d5:f8:47:e5:21:28:
                        87:f8:a6:dd:ee:ed:01:da:b5:06:49:04:19:49:46:
                        d8:0a:a6:bb:b4:b5:c9:56:79
                    Exponent: 65537 (0x10001)
        Signature Algorithm: sha1WithRSAEncryption
             79:3c:29:c5:3c:e7:d8:28:e1:5c:2a:1d:ce:31:cb:e6:a5:09:
             d0:10:d8:e5:74:e9:b5:80:4a:63:76:f4:67:ee:8c:f1:eb:04:
             8f:23:f4:f6:c2:f7:a5:99:af:c5:be:8f:70:6d:dc:3e:b3:db:
             ca:b2:64:e1:0c:ca:ce:fe:16:1f:3b:00:83:b5:f8:be:8a:b4:
             7e:a9:94:fe:77:1f:67:ff:4f:54:87:66:f4:97:be:ce:38:54:
             51:b4:ce:a8:23:60:92:e3:bf:5d:21:11:50:c9:c2:40:b4:69:
             89:fe:4f:66:84:17:42:91:af:af:bd:e9:47:24:f8:db:74:70:
             d0:87
    

    证书内容概况:

    用来管理私钥仓库的命令:

    D:ProgramFilescmder>keytool -printcert -file "C:app-debug - 副本META-INFCERT.RSA"
    所有者: C=US, O=Android, CN=Android Debug
    发布者: C=US, O=Android, CN=Android Debug
    序列号: 1
    有效期为 Thu Dec 27 17:26:22 CST 2018 至 Sat Dec 19 17:26:22 CST 2048
    证书指纹:
             MD5:  41:41:89:25:4C:9B:91:6D:16:91:20:6C:1D:D7:61:2F
             SHA1: 73:FC:5A:9F:5D:7A:CC:93:14:8D:F1:13:37:E6:11:C2:86:A4:3D:34
             SHA256: 32:33:24:4F:1C:4E:6E:78:3F:F2:C4:59:CD:19:9F:43:BC:AC:1A:23:CB:78:72:9A:0E:61:C9:B3:5D:4C:B9:C1
    签名算法名称: SHA1withRSA
    主体公共密钥算法: 1024 位 RSA 密钥
    版本: 1
    

    总结

    APK生成后签名不能更改,因为没有私钥。但能替换签名,因为Android系统在安装APK的时候只校验签名的正确性。

    一个apk文件,通过使用AndroidKiller二次编译,我对比了原APK和编译后的APK的./META-INF/CERT.RSA文件,发现确实是被替换了。

    签名的过程可以想象成发件人和收件人的处理流程,也是一个双向的动作,可以大致理解成下图流程:

    可以把上图的客户1替换成打包APK的过程,把服务器替换成Android手机安装APK的过程,当系统拿着CERT.RSA里面的公钥和apk原文解密出的Hash值和CERT.SF文件里面的Hash值不一致时,就不会去安装。


    检测是否能替换签名

    二次打包成功的前提是能替换签名,并且APK没做签名校验。而签名验证的方式有三种:

    • APK包没有做签名校验
      直接替换签名即可,下面将介绍替换签名的步骤;

    • APK包做了签名校验

      • java代码校验
        难点在于找到校验的JAVA代码,注释掉即可;
      • .so文件校验
        难点在于看懂汇编,找到校验的C代码,注释掉即可;
      • 加壳
        难点在于得先脱壳;

    替换签名步骤

    工具:
    AndroidKiller_v1.3.1 (下载地址:https://www.52pojie.cn/thread-319641-1-1.html)

    步骤:
    使用AndroidKiller_v1.3.1工具,里面有个编译功能,就能做到二次打包,原理就是替换签名值。

    执行步骤中有报错,建议看我之前的文章:https://www.cnblogs.com/mysticbinary/p/11609825.html

    我一般修改版本号来证明能二次打包:
    反编译后在AndroidManifest.xml 里直接修改版本号,如果在AndroidManifest.xml文件中无法看到 versionCode和versionName字段,则在apktool.yml文件中打开找到,对应修改versionName字段的数字大小即可。


    修复方式

    1. SO层校验签名
    2. 网络校验签名
    3. APK加固
  • 相关阅读:
    拓扑排序
    Frame Stacking 框架堆叠
    第二课 欧几里德算法与扩展欧几里德算法
    欧拉回路
    第一课 快速幂取模
    cookie使用汇总 c设置ookie的生命周期
    .net ArrayList的用法简介
    关于C#的partial修饰符
    sql server修改表结构的sql语句
    Web MVC模式中的基本表单提交
  • 原文地址:https://www.cnblogs.com/mysticbinary/p/12107666.html
Copyright © 2011-2022 走看看