BiliRoamingX项目中的NPatch共存版签名获取技术解析

BiliRoamingX项目中的NPatch共存版签名获取技术解析

【免费下载链接】BiliRoamingX-integrations BiliRoamingX integrations powered by revanced. 【免费下载链接】BiliRoamingX-integrations 项目地址: https://gitcode.com/gh_mirrors/bi/BiliRoamingX-integrations

引言:Android应用签名校验的挑战与突破

在Android应用安全领域,应用签名校验是确保应用完整性和来源可信性的重要机制。然而,对于需要修改官方应用功能的模块化项目(如BiliRoamingX),签名校验往往成为技术实现的主要障碍。NPatch作为LSPatch的分支版本,提供了应用共存和签名绕过的高级解决方案。

本文将深入解析BiliRoamingX项目中NPatch共存版签名获取技术的实现原理、技术架构和实际应用,为Android逆向工程和安全研究提供专业参考。

技术架构概览

1. 签名校验绕过机制

BiliRoamingX通过多层次的签名处理机制实现NPatch环境下的正常运作:

mermaid

2. 核心组件交互关系

mermaid

核心技术实现解析

1. PackageInfo.CREATOR Hook机制

BiliRoamingX通过重写PackageInfo.CREATOR来实现签名信息的动态修改:

private static void fakeSignatures(Pair<String, String>... pairs) {
    Parcelable.Creator<PackageInfo> originalCreator = PackageInfo.CREATOR;
    Parcelable.Creator<PackageInfo> newCreator = new Parcelable.Creator<>() {
        @Override
        public PackageInfo createFromParcel(Parcel source) {
            PackageInfo packageInfo = originalCreator.createFromParcel(source);
            // 保存原始签名信息
            if (!originalSignatures.containsKey(packageInfo.packageName) && 
                packageInfo.signatures != null && packageInfo.signatures.length > 0) {
                Signature signature = packageInfo.signatures[0];
                String signatureBase64 = Base64.encodeToString(signature.toByteArray(), Base64.NO_WRAP);
                originalSignatures.put(packageInfo.packageName, signatureBase64);
            }
            // 注入伪造签名
            for (Pair<String, String> pair : pairs) {
                String packageName = pair.first;
                String signatureData = pair.second;
                if (packageInfo.packageName.equals(packageName)) {
                    Signature fakeSignature = new Signature(Base64.decode(signatureData, Base64.DEFAULT));
                    if (packageInfo.signatures != null && packageInfo.signatures.length > 0) {
                        packageInfo.signatures[0] = fakeSignature;
                    }
                    // Android P+ 签名信息处理
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                        if (packageInfo.signingInfo != null) {
                            Signature[] signaturesArray = packageInfo.signingInfo.getApkContentsSigners();
                            if (signaturesArray != null && signaturesArray.length > 0) {
                                signaturesArray[0] = fakeSignature;
                            }
                        }
                    }
                    break;
                }
            }
            return packageInfo;
        }
    };
}

2. 原始签名信息缓存与管理

ApplicationDelegate维护了一个全局的原始签名缓存:

private static final Map<String, String> originalSignatures = new HashMap<>();

public static Map<String, String> originalSignatures() {
    return Collections.unmodifiableMap(originalSignatures);
}

3. NPatch元数据注入机制

AppendSignatureInfoPatch负责在AndroidManifest.xml中注入NPatch配置信息:

override fun execute(context: ResourceContext) {
    context.document["AndroidManifest.xml"].use { dom ->
        dom["application"].apply {
            arrayOf("lspatch", "npatch").forEach {
                insertChild(0, "meta-data") {
                    this["android:name"] = it
                    this["android:value"] = "Base64编码的配置信息"
                }
            }
        }
    }
}

签名验证流程的重定向

1. API请求签名生成

BiliRoamingX在网络请求中需要正确处理签名验证:

fun signQuery(query: Map<String, String>, extraMap: Map<String, String> = emptyMap()): String {
    val queryMap = TreeMap<String, String>()
    queryMap.putAll(query)
    queryMap["appkey"] = Utils.getAppKey()
    queryMap["build"] = versionCode.toString()
    queryMap["device"] = "android"
    queryMap["mobi_app"] = Utils.getMobiApp()
    queryMap["platform"] = "android"
    queryMap.putAll(extraMap)
    queryMap.remove("ts")
    queryMap.remove("sign")
    return Utils.signQuery(queryMap)
}

2. 签名MD5计算策略

根据运行环境动态选择签名源:

fun sigMd5(packageName: String = Utils.getContext().packageName, preferOriginal: Boolean = true): String {
    val signBase64 = if (preferOriginal) {
        val sign = ApplicationDelegate.originalSignatures()[packageName]
        if (sign == null)
            Utils.getContext().packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES)
        ApplicationDelegate.originalSignatures()[packageName]
    } else null
    return if (signBase64 == null) {
        Utils.getContext().packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES)
            .signatures.orEmpty().first().toByteArray().md5Hex
    } else {
        Base64.decode(signBase64, Base64.DEFAULT).md5Hex
    }
}

安全性与兼容性考虑

1. 多版本Android系统适配

Android版本签名机制变化BiliRoamingX适配策略
Android 7.0-传统签名直接修改PackageInfo.signatures
Android 7.0+V2签名同时处理signingInfo中的签名信息
Android 9.0+V3签名全面支持新的签名格式

2. 缓存清理机制

为确保签名修改生效,需要清理系统缓存:

try {
    Object cache = Reflex.getStaticObjectField(PackageManager.class, "sPackageInfoCache");
    Reflex.callMethod(cache, "clear");
} catch (NoSuchFieldError ignored) {
}

try {
    Map<?, ?> mCreators = Reflex.getStaticObjectField(Parcel.class, "mCreators");
    mCreators.clear();
} catch (NoSuchFieldError ignored) {
}

实际应用场景分析

1. NPatch共存环境下的运行流程

mermaid

2. 网络请求签名验证流程

mermaid

技术挑战与解决方案

1. 隐藏API访问绕过

Android P+引入了隐藏API限制,BiliRoamingX使用HiddenApiBypass:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    HiddenApiBypass.addHiddenApiExemptions(
        "Landroid/os/Parcel;", 
        "Landroid/content/pm/PackageManager;", 
        "Landroid/app/PropertyInvalidatedCache;"
    );
}

2. 多进程环境下的签名一致性

通过CrossProcessPreferences确保多进程间的签名信息同步:

CrossProcessPreferences.init(this);

性能优化与稳定性保障

1. 懒加载机制

采用Kotlin的lazy委托实现签名信息的按需加载:

val jsonFormat by lazy {
    Json {
        ignoreUnknownKeys = true
        coerceInputValues = true
        useAlternativeNames = false
    }
}

2. 异常处理与日志记录

完善的错误处理和调试日志系统:

try {
    Reflex.setStaticObjectField(PackageInfo.class, "CREATOR", newCreator);
} catch (Throwable t) {
    Logger.error(t, () -> "Failed to set PackageInfo.CREATOR");
}

总结与展望

BiliRoamingX项目中的NPatch共存版签名获取技术展现了Android逆向工程领域的高水平技术实践。通过巧妙的PackageInfo.CREATOR Hook、原始签名信息缓存、以及NPatch元数据注入等多重技术手段,成功解决了修改版应用在签名验证方面的核心难题。

该技术方案具有以下显著优势:

  1. 全面性:支持从Android 7.0到最新版本的全系统适配
  2. 稳定性:完善的异常处理和缓存管理机制
  3. 兼容性:同时支持LSPatch和NPatch等多种框架
  4. 安全性:保留原始签名信息用于API验证,确保功能完整性

随着Android安全机制的不断演进,签名校验技术也将面临新的挑战。未来可能的发展方向包括对Android 14+新安全特性的适配、基于硬件密钥的签名验证支持,以及更加智能的签名动态管理策略。

通过深入理解BiliRoamingX的签名获取技术,开发者可以更好地应对Android应用修改和功能扩展中的签名验证挑战,为移动应用生态的创新和发展提供技术支撑。

【免费下载链接】BiliRoamingX-integrations BiliRoamingX integrations powered by revanced. 【免费下载链接】BiliRoamingX-integrations 项目地址: https://gitcode.com/gh_mirrors/bi/BiliRoamingX-integrations

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值