玩 Android 时,我们经常会听到核心破解这个词,在部分第三方 ROM 里,也有一些作者会直接完成核心破解,以使 Android 拥有更大的可玩性。那么倒底什么是核心破解,它又对系统产生什么样的影响?

首先让我们看一下核心破解后可以做什么:

功能点 破解前 破解后
应用降级 只能由高版本应用覆盖低版本 无视版本号随意覆盖
覆盖安装 签名不一致不能覆盖 无视签名直接覆盖
无签名安装 不允许 允许

从这些功能点上也可以知道,这些限制的破解,对于使用破解版的软件是有极大的影响的,正常情况下,软件被破解后,无法签回原始签名,因此也无法直接覆盖安装,甚至是有的时候觉得低版本更好用也无法盖回去。那么核心破解对于这样的用户是非常有价值的。

但是从另一方面看,核心破解的实质就是绕开签名的校验,绕开版本的校验,其实是直接降低了 Android 的安全性,它使得盗版软件得已生存,破坏 Android 本身的生态。当然这一切都不在讨论范围内,我们还是要实现核心破解的,那么知道了原理之后,就需要写代码了。

核心破解的时机

由于签名的机制贯穿整个 Android,因此要从源头就进行破解,也就是我们常说的,在zygote初始化的时候,就要下勾子了。在zygote初始化时,签名相关的库,如java.security已经被加载,在这个时机对 security 相关的类进行挂勾:

XposedBridge.hookAllMethods(XposedHelpers.findClass("com.android.org.conscrypt.OpenSSLSignature", null),"engineVerify",object : XC_MethodHook() {@Throws(Throwable::class)override fun beforeHookedMethod(param: MethodHookParam) {param.result = true}}
)XpUtils.findAndHookMethod("java.security.MessageDigest",null,"isEqual", ByteArray::class.java, ByteArray::class.java,object : XC_MethodHook() {@Throws(Throwable::class)override fun beforeHookedMethod(param: MethodHookParam) {param.result = true}}
)XpUtils.findAndHookMethod("java.security.Signature",null,"verify", ByteArray::class.java,object : XC_MethodHook() { @Throws(Throwable::class)override fun beforeHookedMethod(param: MethodHookParam) {val alg = (param.thisObject as Signature).algorithm.toLowerCase()val state = XposedHelpers.getIntField(param.thisObject, "state")if ((alg == "sha1withrsa" || alg == "rsa-sha1" || alg == "1.3.14.3.2.26with1.2.840.113549.1.1.1") && state == 3) {param.result = true}}}
)XpUtils.findAndHookMethod("java.security.Signature", null, "verify", ByteArray::class.java, Integer.TYPE, Integer.TYPE, object : XC_MethodHook() {@Throws(Throwable::class)override fun beforeHookedMethod(param: MethodHookParam) {val alg = (param.thisObject as Signature).algorithm.toLowerCase()val state = XposedHelpers.getIntField(param.thisObject, "state")if ((alg == "sha1withrsa" || alg == "rsa-sha1" || alg == "1.3.14.3.2.26with1.2.840.113549.1.1.1") && state == 3) {param.result = true}}}
)

关于参数取值的问题,通常的做法是先反编译 jar 包,找到类似verify之类的函数,然后打出 log,跟据 log 所显示的参数来进行取值的确定。当然如果做得粗暴,也可以不判断取值直接返回 true,这样系统就会变得更加不安全。

破解安装包的过程

破解完上面这些之后,依然不够,还要针对 Android 的安装过程进行破解。与安装包校验相关的类,位于com.android.server.pm.PackageManagerService,当然这个时候你的手里若是有一份 Android 源码自然是最好,否则的话是很难进行分析的,当然直接看这篇文章也是个不错的选择。

在PackageManagerService内,共有4个函数与安装包时的校验有关,分别是installPackageAsUser,checkUpgradeKeySetLP,verifySignaturesLP,compareSignatures,对它们进行修改即可,不啰嗦直接给代码:

XposedBridge.hookAllMethods(clsPackageManagerClass, "installPackageAsUser", object : XC_MethodHook() {@Throws(Throwable::class)override fun beforeHookedMethod(param: MethodHookParam) {val flags = param.args[2] as Intif ((flags and INSTALL_ALLOW_DOWNGRADE) == 0) {param.args[2] = (flags or INSTALL_ALLOW_DOWNGRADE)}}}
)XposedBridge.hookAllMethods(clsPackageManagerClass, "checkUpgradeKeySetLP", object : XC_MethodHook() {@Throws(Throwable::class)override fun afterHookedMethod(param: MethodHookParam) {param.result = true}}
)XposedBridge.hookAllMethods(clsPackageManagerClass, "verifySignaturesLP", object : XC_MethodHook() {@Throws(Throwable::class)override fun afterHookedMethod(param: MethodHookParam) {param.result = true}}
)XposedBridge.hookAllMethods(clsPackageManagerClass, "compareSignatures", object : XC_MethodHook() {@Throws(Throwable::class)override fun afterHookedMethod(param: MethodHookParam) {param.result = PackageManager.SIGNATURE_MATCH}}
)

关于核心破解的失效

就目前所发现的,还没有任何手段可以阻止核心破解,那么为什么核心破解有时会失效呢,这个问题通常是由于 Android 版本更新引起的。整理了一下到目前为止的 Android 版本变化,大致能看出点问题,核心破解也是要跟随 Android 版本升级,而并非一劳逸。

时机 SDK 关键类 关键方法
zygote > 18 com.android.org.conscrypt.OpenSSLSignature engineVerify
zygote > 14 && <=18 org.apache.harmony.xnet.provider.jsse.OpenSSLSignature engineVerify
zygote = 10 org.bouncycastle.jce.provider.JDKDigestSignature engineVerify
zygote 全部 java.security.MessageDigest isEqual
zygote 全部 java.security.Signature verify
package > 21 com.android.server.pm.PackageManagerService installPackageAsUser
package > 21 com.android.server.pm.PackageManagerService checkUpgradeKeySetLP
package > 17 && <=21 com.android.server.pm.PackageManagerService installPackageWithVerificationAndEncryption
package <= 17 com.android.server.pm.PackageManagerService installPackageWithVerification
package 全部 com.android.server.pm.PackageManagerService verifySignaturesLP
package 全部 com.android.server.pm.PackageManagerService compareSignatures

可以看到,不同版本的 Android 对于安装包的处理也是不一样的,需要按实际情况进行处理。本文所提供的代码全部基于 SDK 21 以上。

Android核心破解原理详解相关推荐

  1. Android面试Hash原理详解二

    Hash系列目录 Android面试Hash原理详解一 Android面试Hash原理详解二 Android面试Hash常见算法 Android面试Hash算法案例 Android面试Hash原理详解 ...

  2. Android涂鸦画板原理详解——从初级到高级(二)

    前言 前面写了<Android涂鸦画板原理详解--从初级到高级(一)>,讲了涂鸦原理初级和中级的应用,现在讲解高级应用.如果没有看过前面一篇文章的同学,建议先去看看哈. 准备 高级涂鸦涉及 ...

  3. Android 中malloc_debug 原理详解

    版本基于:Android R 关联博文: Android 中malloc_debug 使用详解 0. 前言 最近上项目中遇到一个native 可能内存泄漏的问题,曾考虑使用HWASAN,但这个工具是针 ...

  4. XGBoost核心算法原理详解

    XGBoost算法原理详解 前言 boosting和bagging的区别 bagging boosting 提升树-基于残差的训练 学习路径 构造目标函数 Additive Training(叠加式的 ...

  5. docker核心网络原理详解

    docker清空所有容器: 删除所有镜像: ip addr docker是如何处理容器网路访问的? 跑一个tomcat容器并使用ip addr查看ip地址: linux是可以ping通容器内部的ip的 ...

  6. kafka专题:kafka的总控制器Controller、消费者重分配策略等核心设计原理详解

    文章目录 1. Kafka核心总控制器Controller 1.1 核心总控制器Controller的Leader选举 1.2 Partition副本选举Leader机制 2. 消费者消费偏移量off ...

  7. Android分包MultiDex原理详解

    MultiDex的产生背景 当Android系统安装一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt.DexOpt的执行过程是在第一次加载Dex文件的时候执行的 ...

  8. Android视频直播原理详解

    最近一段时间,视频直播可谓大火.在视频直播领域,有不同的商家提供各种的商业解决方案,包括软硬件设备,摄像机,编码器,流媒体服务器等.本文要讲解的是如何使用一系列免费工具,打造一套视频直播方案. 视频直 ...

  9. Android线程池原理详解

    简介 但凡有点开发经验的同学都知道,频繁的创建和销毁线程是会给系统带来比较大的性能开销的.所以线程池就营运而生了.那么使用线程池有什么好处呢? 降低资源消耗 可以重复利用已创建的线程降低线程创建和销毁 ...

最新文章

  1. spark streaming 接收 kafka 数据java代码WordCount示例
  2. Linux常用端口查询命令及常见端口和端口分类
  3. gg oracle tjs 同步_配置Goldengate从Oracle到PostgreSQL的同步复制
  4. centos7.x redhat7.x 升级openssh8.7
  5. Angular4+AdminLTE+Jeecg 前后端分离框架实战-张代浩-专题视频课程
  6. C语言 socket
  7. sql server 2008安装图解
  8. 程序员必备英语单词册
  9. python - super 寻找继承关系
  10. 承认吧,你就是不行!
  11. 柒微自动发卡系统源码
  12. 图像的峰值信噪比(PSNR)的计算方法
  13. java 创建txt_JAVA读取TXT文件、新建TXT文件、写入TXT文件
  14. 密码战争,区块链技术之路
  15. MTK 6589充电模块分析
  16. UVA - 11137 Ingenuous Cubrency
  17. Mac共享主机网络给虚拟机
  18. 《机器学习基石》第12节课学习笔记
  19. 窗口置顶工具v2.1.0
  20. esri默认底图的加载

热门文章

  1. Macbook使用过程遇到的问题及解决方法
  2. mysql英文怎么发音_mysql5.5安装教程:mysql下载与安装
  3. 西北农林科技大学与陕西师范大学计算机,陕西西安的两所双大学,陕西师范大学和西北大学怎么选择?...
  4. 图文详解YUV420数据格式YUV444数据格式YUV422数据格式
  5. Android 壁纸应用之动态壁纸
  6. 【编程题】已知树洞的数目、至少两只鸟进同一个树洞的概率,求鸟的数量
  7. 2016版GB28181检测《国家标准GB/T28181符合性测试规范》征求意见稿
  8. 简单实现一个关系图View
  9. 阿里p9年薪300万哭穷!打工人挣多少钱,也跳不出“工薪阶层陷阱”
  10. 2017回顾优米网历年定位