作者:寻禹@阿里聚安全

APK签名校验分析

找到PackageParser类,该类在文件“frameworks/base/core/java/android/content/pm/PackageParser.java”中。PackageParser类的collectCertificates方法会对APK进行签名校验,在该方法会遍历APK中的所有文件,并对每个文件进行校验。下面是该方法的部分源码:

APK是一个ZIP格式的文件所以使用ZIP相关的类进行读写。上面代码中调用了loadCertificates方法,这个方法返回一个二维数组,如果APK中的文件签名校验失败那么loadCertificates方法会返回一个空数组(可能是null,可能是数组长度为0),按照上面代码的逻辑如果数组为空则会抛出异常。
loadCertificates方法的代码见下:

上面代码中is是JarFile.JarFileInputStream类的对象。loadCertificates方法中调用了readFullyIgnoringContents方法,在readFullyIgnoringContents方法中会调用JarFile.JarFileInputStream.read方法读取APK中一项的数据,在read方法中会校验读取到的数据项的签名,如果签名校验失败,则会抛出SecurityException类型的异常,即签名校验失败。
JarFile类在“libcore/luni/src/main/java/java/util/jar/JarFile.java”文件中。
上面代码中调用了StrictJarFile.getCertificateChains方法,下面是它的代码:

上面代码中isSigned的值是这么来的:

当证书读取成功,并且当前APK经过了签名,则isSigned为true。
回到StrictJarFile.getCertificateChains方法中,当isSigned为true时会调用JarVerifier.getCertificateChains方法,下面是它的代码:

下面是类成员变量verifiedEntries的声明:

verifiedEntries是一个键值对,键是APK中经过了签名的文件名,如:classes.dex文件,值是证书数组。如果向已经签过名的APK中新添加一个文件然后安装这个APK,当程序逻辑执行到JarVerifier.getCertificateChains方法中时,在verifiedEntries变量中无法找到新添加的文件名(因为这个新文件是在APK签名之后添加),那么JarVerifier.getCertificateChains方法将返回null。


绕过签名校验

源码修改点一

找到PackageParser.loadCertificates方法,下面是部分源码:

将上面代码catch块中的throw语句替换为:return null;
下面是修改后的代码:

代码修改完后,当APK中文件签名校验失败时不会抛出异常,APK还会继续安装。

源码修改点二

找到PackageParser.collectCertificates方法,找到代码中调用loadCertificates方法的地方:

将上面的throw语句替换为:continue;
修改后的代码:

代码修改完后,当遇到APK中没有经过签名的文件时不会抛出异常,APK还会继续安装。

作者:寻禹@阿里聚安全,更多安全技术、资讯文章,请访问阿里聚安全博客

Android5.1.1 - APK签名校验分析和修改源码绕过签名校验相关推荐

  1. Cesium可视域分析 不用修改源码

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一.先看效果? 二.实现步骤 1.实现原理 2.用到的核心接口说明<

  2. 【Android 插件化】VirtualApp 源码分析 ( 安装应用源码分析 | HomePresenterImpl 添加应用 | AppRepository.addVirtualApp )

    文章目录 一.安装应用源码分析 1.HomePresenterImpl 添加应用 2.AppRepository.addVirtualApp 安装 SD 卡 APK 应用 一.安装应用源码分析 1.H ...

  3. 分析开源项目源码,我们该如何入手分析?(授人以渔)

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:牛人 20000 字的 Spring Cloud 总结,太硬核了~ 1 前言 本文接上篇文章跟大家聊聊我们为什么 ...

  4. spring源码分析第一天------源码分析知识储备

    spring源码分析第一天------源码分析知识储备 Spring源码分析怎么学? 1.环境准备: 2.思路    看:是什么? 能干啥    想:为什么?     实践:怎么做?         ...

  5. Proxy Server源码及分析(TCP Proxy源码 Socket实现端口映射)

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u014530704/article/d ...

  6. 鸿蒙OS内核分析|解读鸿蒙源码

    操作系统(Operating System): 操作系统的功能是负责管理各种硬件设备,同时对底层硬件设备进行抽象,为上层软件提供高效的系统接口.操作系统设计和实现的优劣直接决定了系统栈的各个方面,比如 ...

  7. 常用的数据校验方式(奇偶,CRC,异或校验, LRC校验,累加和,MD5等校验)概念及源码

    数据校验概念 数据在传输的过程中,会受到各种干扰的影响,如脉冲干扰,随机噪声干扰和人为干扰等,这会使数据产生差错.为了能够控制传输过程的差错,通信系统必须采用有效的检错方案.因此产生了数据校验. 数据 ...

  8. k8s client-go源码分析 informer源码分析(3)-Reflector源码分析

    k8s client-go源码分析 informer源码分析(3)-Reflector源码分析 1.Reflector概述 Reflector从kube-apiserver中list&watc ...

  9. python开心麻花影视作品分析的程序源码加文档加说明

    在PyCharm中运行<开心麻花影视作品分析>即可进入如图1所示的系统主界面.在该界面中,选择要分析的电影名称,然后单击"分析"按钮即可. 图1  系统主界面 具体的操 ...

最新文章

  1. [JS]正则式的使用示例:替换字符串中所有指定内容
  2. 伯克利大神一人投中16篇:ICLR 2021论文接收统计出炉
  3. SAP系统中凭证涉及日期
  4. linux查看ibmmq进程,ibm-mq – 如何检查IBM MQ for Linux中是否存在队列名称?
  5. C# 约瑟夫环 用数组实现
  6. python基本输入与格式化_Python导学基础(三)输入、格式化输出、基本运算符
  7. Java 8中的并行和异步编程
  8. linux(2):linux命令查看开放哪些端口
  9. linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析
  10. python 内存管理
  11. 2016蓝桥杯java试题_2016年第七届蓝桥杯JavaB组省赛试题解析
  12. 《机器学习系统设计:Python语言实现》一2.1 Python与机器学习
  13. 爱豆被“调包”?周杰伦:说好不哭
  14. canvas系列 — canvas常用API介绍
  15. 链游和元宇宙大热,互联网游戏从业者们如何看待它们? |链捕手
  16. Android P+通过反射调用系统API实现高级功能
  17. (称重问题)假设你有8个球,其中一个略微重一些,但是找出这个球的惟一方法是将两个球放在天平上对比
  18. 机器视觉领域的牛人们的博客
  19. Mybatis(黑马程序员)
  20. 比in效率更高的sql查询语句

热门文章

  1. protobuf导出golang,调整默认tag的方法
  2. golang for 循环中使用协程的问题
  3. Docker常见问题总结
  4. android命名规范阿里,阿里android开发手册 PDF 下载
  5. python设计模式4-建造者模式
  6. 关于DP的一些解题总结
  7. @AspectJ中的切点表达式详解
  8. G1垃圾收集器之SATB
  9. 复杂一点的二叉树递归
  10. Jenkins安装部署篇