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签名校验分析和修改源码绕过签名校验的更多相关文章

  1. Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)

    Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码) 来源 https://blog.csdn.net/jiangwei0910410003/article/details/51 ...

  2. 动态方式破解apk进阶篇(IDA调试so源码)

    动态方式破解apk进阶篇(IDA调试so源码) 来源 https://blog.csdn.net/qq_21051503/article/details/74907449 下面就说关于在IDA中And ...

  3. NIO 源码分析(05) Channel 源码分析

    目录 一.Channel 类图 二.begin 和 close 是什么 2.1 AbstractInterruptibleChannel 中的 begin 和 close 2.2 Selector 中 ...

  4. Spring Ioc源码分析系列--Ioc源码入口分析

    Spring Ioc源码分析系列--Ioc源码入口分析 本系列文章代码基于Spring Framework 5.2.x 前言 上一篇文章Spring Ioc源码分析系列--Ioc的基础知识准备介绍了I ...

  5. Android 签名(6)编译时源码的签名

    1,使用源码中的默认签名 在源码中编译一般都使用默认签名的,在某源码目录中用运行下面命令能看到签名命令. $ mm showcommands Android提供了签名的程序signapk.jar,用法 ...

  6. JPEG概述和头分析(C源码)

    原创文章,转载请注明:JPEG概述和头分析(C源码)  By Lucio.Yang 部分内容来自:w285868925,JPEG压缩标准 1.JPEG概述 JPEG是一个压缩标准,又可分为标准 JPE ...

  7. Cesium专栏-填挖方分析(附源码下载)

    Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精度,渲染质量以 ...

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

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

  9. 智能指针分析及auto_ptr源码

    简介 C++没有内存自动回收机制,对堆内存的管理就是简单的new和delete,每次new出来的内存都需要手动delete释放.但由于忘记.流程复杂或者异常退出等,都有可能导致没有执行delete释放 ...

随机推荐

  1. javase-排序

    public class sort { public static void main(String[] args) { String[] arr = {"aa","bb ...

  2. Javascript中数组的基本操作

    删除数组指定的某个元素 via首先可以给JS的数组对象定义一个函数,用于查找指定的元素在数组中的位置,即索引,代码为: Array.prototype.indexOf = function(val) ...

  3. IIS与Apache共用80端口

    Windows server 2003服务器上安装有默认 IIS 6和Apache两个服务器,IIS运行的一个.net程序,apache运行php程序,现在想让它们同时都能通过80端口访问,设置起来还 ...

  4. TP5.0源生Excel导出

    PHPExcel类在TP5里边并不能很好的兼容,使用起来很麻烦. 不像是tp3.2那样直接import()加进来就能new,因为它里边的命名空间找不到.总是说undefined class. 如果是使 ...

  5. 安装Hive(独立模式 使用mysql连接)

    安装Hive(独立模式 使用mysql连接) 1.默认安装了java+hadoop 2.下载对应hadoop版本的安装包 3.解压安装包 tar zxvf apache-hive-1.2.1-bin. ...

  6. d3 中exit() remove()正确工作的方式

    在官网中给出的代码[1]是有问题的,如下的代码并不能正常工作: // Update… var p = d3.select("body").selectAll("p&quo ...

  7. SQL Server 递归

    SQL Server 没有类似于Oracle START WITH NAME='xx' CONNECT BY PRIOR ID=PARENT_ID这样的语句,但是可以通过自定义标准函数+With语句实 ...

  8. LINUX 忘记root密码如何修改

    重启linux系统 3 秒之内要按一下回车,出现如下界面 然后输入e 在 第二行最后边输入 single,有一个空格.具体方法为按向下尖头移动到第二行,按"e"进入编辑模式 在后边 ...

  9. java function retry wrapper

    import java.util.concurrent.Callable; /** * Created by huahui.yang on 1/29/16. */ public class Retry ...

  10. 将库打包到nuget服务器

     前言 由于目前.net core无法引用本地的 assembly ,所以尝试将项目的依赖库打包到nuget服务器.  相关的工具 Nuget Package Explorer 参考文档 dotnet ...