Android5.1.1 - APK签名校验分析和修改源码绕过签名校验
作者:寻禹@阿里聚安全
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签名校验分析和修改源码绕过签名校验相关推荐
- Cesium可视域分析 不用修改源码
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一.先看效果? 二.实现步骤 1.实现原理 2.用到的核心接口说明<
- 【Android 插件化】VirtualApp 源码分析 ( 安装应用源码分析 | HomePresenterImpl 添加应用 | AppRepository.addVirtualApp )
文章目录 一.安装应用源码分析 1.HomePresenterImpl 添加应用 2.AppRepository.addVirtualApp 安装 SD 卡 APK 应用 一.安装应用源码分析 1.H ...
- 分析开源项目源码,我们该如何入手分析?(授人以渔)
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:牛人 20000 字的 Spring Cloud 总结,太硬核了~ 1 前言 本文接上篇文章跟大家聊聊我们为什么 ...
- spring源码分析第一天------源码分析知识储备
spring源码分析第一天------源码分析知识储备 Spring源码分析怎么学? 1.环境准备: 2.思路 看:是什么? 能干啥 想:为什么? 实践:怎么做? ...
- Proxy Server源码及分析(TCP Proxy源码 Socket实现端口映射)
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u014530704/article/d ...
- 鸿蒙OS内核分析|解读鸿蒙源码
操作系统(Operating System): 操作系统的功能是负责管理各种硬件设备,同时对底层硬件设备进行抽象,为上层软件提供高效的系统接口.操作系统设计和实现的优劣直接决定了系统栈的各个方面,比如 ...
- 常用的数据校验方式(奇偶,CRC,异或校验, LRC校验,累加和,MD5等校验)概念及源码
数据校验概念 数据在传输的过程中,会受到各种干扰的影响,如脉冲干扰,随机噪声干扰和人为干扰等,这会使数据产生差错.为了能够控制传输过程的差错,通信系统必须采用有效的检错方案.因此产生了数据校验. 数据 ...
- k8s client-go源码分析 informer源码分析(3)-Reflector源码分析
k8s client-go源码分析 informer源码分析(3)-Reflector源码分析 1.Reflector概述 Reflector从kube-apiserver中list&watc ...
- python开心麻花影视作品分析的程序源码加文档加说明
在PyCharm中运行<开心麻花影视作品分析>即可进入如图1所示的系统主界面.在该界面中,选择要分析的电影名称,然后单击"分析"按钮即可. 图1 系统主界面 具体的操 ...
最新文章
- [JS]正则式的使用示例:替换字符串中所有指定内容
- 伯克利大神一人投中16篇:ICLR 2021论文接收统计出炉
- SAP系统中凭证涉及日期
- linux查看ibmmq进程,ibm-mq – 如何检查IBM MQ for Linux中是否存在队列名称?
- C# 约瑟夫环 用数组实现
- python基本输入与格式化_Python导学基础(三)输入、格式化输出、基本运算符
- Java 8中的并行和异步编程
- linux(2):linux命令查看开放哪些端口
- linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析
- python 内存管理
- 2016蓝桥杯java试题_2016年第七届蓝桥杯JavaB组省赛试题解析
- 《机器学习系统设计:Python语言实现》一2.1 Python与机器学习
- 爱豆被“调包”?周杰伦:说好不哭
- canvas系列 — canvas常用API介绍
- 链游和元宇宙大热,互联网游戏从业者们如何看待它们? |链捕手
- Android P+通过反射调用系统API实现高级功能
- (称重问题)假设你有8个球,其中一个略微重一些,但是找出这个球的惟一方法是将两个球放在天平上对比
- 机器视觉领域的牛人们的博客
- Mybatis(黑马程序员)
- 比in效率更高的sql查询语句