Android核心破解原理详解

玩 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个函数与安装包时的校验有关,分别是installPackageAsUsercheckUpgradeKeySetLPverifySignaturesLPcompareSignatures,对它们进行修改即可,不啰嗦直接给代码:

XposedBridge.hookAllMethods(
    clsPackageManagerClass, 
    "installPackageAsUser", 
    object : XC_MethodHook() {
        @Throws(Throwable::class)
        override fun beforeHookedMethod(param: MethodHookParam) {
            val flags = param.args[2] as Int
            if ((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 以上。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容