资讯专栏INFORMATION COLUMN

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

kgbook / 2090人阅读

摘要:作者寻禹阿里聚安全签名校验分析找到类,该类在文件中。绕过签名校验源码修改点一找到方法,下面是部分源码将上面代码块中的语句替换为下面是修改后的代码代码修改完后,当中文件签名校验失败时不会抛出异常,还会继续安装。

作者:寻禹@阿里聚安全 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还会继续安装。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/13029.html

相关文章

  • Android安全开发之通用签名风险

    摘要:通用签名风险简介应用签名机制阿里聚安全漏洞扫描器有一项检测服务是检测的通用签名风险。阿里聚安全对开发者建议上线前用阿里聚安全的漏洞扫描器进行一下检查。阿里聚安全的漏洞扫描器目前已能检查出通用签名风险,未来可能增加检测证书是否泄漏风险。 1 通用签名风险简介 1.1 Android应用签名机制 阿里聚安全漏洞扫描器有一项检测服务是检测APP的通用签名风险。Android系统要求安装的应用...

    BoYang 评论0 收藏0
  • Android apk反编译学习【天天酷跑】

    摘要:微信游戏出来之后,网上出现很多破解教程和攻略,修改最多的有无敌打飞机,无限弹药,刷分数,天天酷跑刷金币等。首先天天酷跑和打飞机两者的插件机制不一样,天天酷跑是一个独立应用,和微信属于间相互跳转关系。 微信游戏出来之后,网上出现很多破解教程和攻略,修改最多的有无敌打飞机,无限弹药,刷分数,天天酷跑刷金币等。看了下破解方法不外乎以下两种: 反编译游戏apk包,修改smali字节码,重新...

    bovenson 评论0 收藏0
  • 爱加密安全分析系列之某打车软件apk

    摘要:最近发现打车软件的非常的火,并听说他们进行了非常严密的防护,防止用户进行二次打包。经过严密的分析发现司机版主要的防护在两个地方。 最近发现打车软件的apk非常的火,并听说他们进行了非常严密的防护,防止用户进行二次打包。今天我们来分析一下他的安全性到底如何(以司机版为例)。 经过严密的分析发现:司机版主要的防护在两个地方。 第一个是:登录过程中,通过传递context对象到so库中的方...

    zhkai 评论0 收藏0
  • 逆向

    摘要:飞龙的安卓逆向系列教程飞龙的安卓逆向系列教程安卓逆向系列教程修改游戏金币安卓逆向系列教程修改游戏金币逆向从未如此简单哈,又标题党了。。安卓逆向系列教程破解内购安卓逆向系列教程破解内购 Android 安全防护之旅 ---Android 应用 反调试 操作的几种方案解析 本文主要介绍了 Android 中应用在进行反调试反破解的几种方案,对于每种方案进行了详细原理分析,代码也给出了下载地...

    Miracle 评论0 收藏0
  • Android防护扫盲篇

    摘要:为了防止这种现象,我们可以对字节码进行混淆。动态链接库是目标文件的集合,目标文件在动态链接库中的组织方式是按照特殊方式形成的。 一、已知防护策略 1.不可或缺的混淆 Java 是一种跨平台、解释型语言,Java 源代码编译成的class文件中有大量包含语义的变量名、方法名的信息,很容易被反编译为Java 源代码。为了防止这种现象,我们可以对Java字节码进行混淆。混淆不仅能将代码中的类...

    CastlePeaK 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<