APK二次打包的危害

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

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

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

APK的签名机制

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

  • 不让别人修改APK包,防止反编译后二次打包;

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

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

需要了解的背景知识

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

  • 数据摘要(数据指纹)、MD5\SHA-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软件使用如下命令。

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

证书内容概况:

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

  1. D:\ProgramFiles\cmder>keytool -printcert -file "C:\app-debug - 副本\META-INF\CERT.RSA"
  2. 所有者: C=US, O=Android, CN=Android Debug
  3. 发布者: C=US, O=Android, CN=Android Debug
  4. 序列号: 1
  5. 有效期为 Thu Dec 27 17:26:22 CST 2018 Sat Dec 19 17:26:22 CST 2048
  6. 证书指纹:
  7. MD5: 41:41:89:25:4C:9B:91:6D:16:91:20:6C:1D:D7:61:2F
  8. SHA1: 73:FC:5A:9F:5D:7A:CC:93:14:8D:F1:13:37:E6:11:C2:86:A4:3D:34
  9. 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
  10. 签名算法名称: SHA1withRSA
  11. 主体公共密钥算法: 1024 RSA 密钥
  12. 版本: 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加固

APK签名替换检测的更多相关文章

  1. Android5.1.1 - APK签名校验分析和修改源码绕过签名校验

    Android5.1.1 - APK签名校验分析和修改源码绕过签名校验 作者:寻禹@阿里聚安全 APK签名校验分析 找到PackageParser类,该类在文件“frameworks/base/cor ...

  2. eclipse将android项目生成apk并且给apk签名

    转载:http://www.cnblogs.com/tianguook/archive/2012/09/27/2705724.html 生成apk最懒惰的方法是:只要你运行过android项目,到工作 ...

  3. 为App签名(为apk签名)

    为App签名(为apk签名) 原文地址 这篇文章是Android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商 ...

  4. Android学习系列(1)--为App签名(为apk签名)

    写博客是一种快乐,前提是你有所写,与人分享,是另一种快乐,前提是你有舞台展示,博客园就是这样的舞台.这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 1.签 ...

  5. 【转】Android学习系列(1)--为App签名(为apk签名)

    原文网址:http://www.cnblogs.com/qianxudetianxia/archive/2011/04/09/2010468.html 写博客是一种快乐,前提是你有所写,与人分享,是另 ...

  6. Android 使用Android Studio + Gradle 或 命令行 进行apk签名打包

    官方文档:https://developer.Android.com/tools/publishing/app-signing.html 1. 默认为debug mode,使用的签名文件在: $HOM ...

  7. ionic andorid apk 签名, 查看签名MD5

    ionic cordova build android生成的是带签名的android-debug.apk, 这个是可以在手机上安装的, 但是换个电脑打包这个签名就不一样了, 这样就不能直接替换安装了, ...

  8. Android apk签名的两种方法

    编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! 为了保证 ...

  9. Android APK 签名比对(转)

    Android apk签名的过程 1. 生成MANIFEST.MF文件: 程序遍历update.apk包中的所有文件(entry),对非文件夹非签名文件的文件,逐个生成SHA1的数字签名信息,再用Ba ...

随机推荐

  1. Pyhton 单行、多行注释方法

    一.python单行注释的符号 井号#常被用作单行注释符号,在代码中使用#时,它右边的任何数据都会被忽略,当做是注释.类似c++的// 二.批量.多行注释的符号 多行注释是用三引号: ”’ 注释内容 ...

  2. 【JZOJ4886】【NOIP2016提高A组集训第13场11.11】字符串

    题目描述 某日mhy12345在教同学们写helloworld,要求同学们用程序输出一个给定长度的字符串,然而发现有些人输出了一些"危险"的东西,所以mhy12345想知道对于任意 ...

  3. 易位构词EOJ3451【字符串】【思维题】【模拟】

    http://acm.ecnu.edu.cn/problem/3451/ 官方题解: 我们可以先考虑字符串有序的情况,比如是 aaabcc,我们只要将字符串右移 3 位,变成 bccaaa,就做完了. ...

  4. BZOJ5259/洛谷P4747: [Cerc2017]区间

    BZOJ5259/洛谷P4747: [Cerc2017]区间 2019.8.5 [HZOI]NOIP模拟测试13 C.优美序列 思维好题,然而当成NOIP模拟题↑真的好吗... 洛谷和BZOJ都有,就 ...

  5. POI解决内存溢出问题

    在POI3.8中SXSSF仅仅支持excel2007格式是对XSSF的一种流的扩展.目的在生成excel时候,需要生成大量的数据的时候,通过刷新的方式将excel内存信息刷新到硬盘的方式,提供写入数据 ...

  6. 利用IDEA构建springboot应用-构建好SpringBoot + SSM 框架

    一. 创建项目 选择 Spring Initiallizr 添加最基本的几个依赖 Web,MySQL,MyBatis,其他需求可以后续再添加 ; 数据库选择了 MySQL 二. 配置数据源 数据源中存 ...

  7. tensorflow兼容处理 tensorflow.compat.v1

    https://www.wandouip.com/t5i183316/ 引言 原来引用过一个段子,这里还要再引用一次.是关于苹果的.大意是,苹果发布了新的开发语言Swift,有非常多优秀的特征,于是很 ...

  8. 在springmvc中 @RequestMapping(value={"", "/"})是什么意思

    这个意思是说请求路径 可以为空或者/ 我给你举个例子:比如百度知道的个人中心 访问路径是 http://zhidao.baidu.com/ihome,当然你也可以通过 http://zhidao.ba ...

  9. 微信小程序 mode 的几种模式

    mode="aspectFill" mode 有效值: mode 有 13 种模式,其中 4 种是缩放模式,9 种是裁剪模式. 模式 值 说明缩放 scaleToFill 不保持纵 ...

  10. CSS3表达式calc( )

    CSS3表达式calc( ) 第一次看到calc( )时,不太相信calc()是css中的部分.因为看其外表像个函数,但是CSS里为啥会有表达式我也不太清楚,偶然机会在网页里看到的,自己切片写自适应时 ...