从 APK 篡改看破解包和渠道包风险

游戏重打包这个事,麻烦就麻烦在门槛不高,但扩散很快,影响还大。
有些包甚至不需要把代码完全看懂,拆开 APK,改几个配置,塞一个广告 SDK 或别的模块,再签名重打包,一个“破解包”就出来了。然后往网站、论坛或 Telegram 群里一丢,很快就传开了。
内容也是改的五花八门,如:替换广告 SDK 截走广告收入、塞恶意代码收集账号密码、去掉内购校验让道具免费、内置外挂模块直接发布……

ChatGPT Image 2026年6月11日 10_20_02

那有办法防吗?有是有的,Android 的签名机制本来就是用来防这个的,但有个前提:玩家是从正规渠道第一次安装的。
如果玩家直接下载了重打包的 APK,系统并不知道这个签名是假的,照样装上去。所以光靠系统签名不够,需要在游戏启动时自己做签名校验,网上教程很多这里不赘述。
除了签名校验,还有几个维度可以加:

  1. 包名校验
    重打包有时会改包名以规避检测,启动时把 Application.identifier 和预期值比对一下:
if (Application.identifier != "com.yourcompany.yourgame") {
    Application.Quit();
}
  1. 文件完整性校验
    对关键文件在打包时记录 hash,启动时重新算一遍比对。被篡改的文件 hash 会变:
string filePath = Application.dataPath + "/your_critical.bundle";
using (var md5 = MD5.Create())
using (var stream = File.OpenRead(filePath)) {
    byte[] hash = md5.ComputeHash(stream);
    string fileHash = BitConverter.ToString(hash).Replace("-", "").ToLower();
    if (fileHash != EXPECTED_HASH) {
        // 文件被篡改,上报并退出
    }
}
  1. 服务端上报
    本地校验被绕过了还有最后一道——把设备信息、包签名、包版本在登录时上报服务端,发现不在合法签名列表里的包直接拒绝登录,同时记录下来方便分析传播链路。

但只做上面这些是不够的,笔者曾遇到过一个非常狡猾的绕过方式,做法是这样的:
在破解包里同时塞了一份完整的正版 APK。游戏启动、执行签名校验的时候,通过 Hook 框架或 IO 重定向、系统 API 覆写等手段,把签名获取的调用劫持掉——让它去读嵌套在里面的正版包,返回正版签名,就能通过校验。但游戏实际运行的,是破解包里的内容。
这类破解包有一个比较明显的特征:包体大小异常,因为塞了个正版包进去。如果下载到的包体大小异常,基本可以判断是动过手脚的。

ChatGPT Image 2026年6月11日 10_20_09

这个攻击针对的不是签名本身,而是在获取签名上做手脚。对应的防御思路是让签名校验更难被 Hook:

  1. 在 native 层做校验,不在 C# 层
    Hook 框架在 Java / C# 层操作成本低,切到 native 层之后难度大幅上升。把签名获取和比对的逻辑下沉到 C++ 里,用 JNI 调用:
// native 层直接调用 Android API 获取签名
// 比 C# 层通过 AndroidJavaObject 调用更难被 Hook
jclass pmClass = env->FindClass("android/content/pm/PackageManager");
jmethodID getPackageInfo = env->GetMethodID(pmClass, "getPackageInfo", ...);
// 获取签名后在 native 层直接比对,不把结果返回给托管层
  1. 校验时机不要只在启动时
    只在启动时校验,绕过一次就永久通过。可以在关键业务节点(登录、支付、关卡加载)随机插入校验,让攻击者不知道下一次校验会在哪里触发。
  2. 服务端做包体大小异常检测
    破解包包体大小异常这个特征,可以在登录时上报客户端包体大小,明显偏大的打标记,结合其他行为异常一起判断。

渠道包相关

国内 Android 市场碎片化,很多游戏要上几十个渠道:华为、小米、OPPO、vivo、应用宝……每个渠道有自己的 SDK,要求用渠道签名重新打包。
每个渠道包的签名不一样,上面那套校验逻辑就不能硬编码一个值了,需要每个渠道包里存对应渠道的预期签名。管理不好,签名校验逻辑变成摆设。
更麻烦的是,渠道包本身也是攻击面。假设某个渠道包泄露出去,破解者拿到的是一个已经做好渠道集成的完整包,在这基础上重打包,门槛更低。
处理渠道包的几个建议:

  1. 渠道包构建流程自动化
    手动管理几十个渠道包很容易出错,也容易泄露中间产物。用 CI/CD 统一构建,签名在构建时注入,构建产物加访问控制,别在群里传来传去。
  2. 每个渠道包单独记录签名指纹
    打包时把各渠道包的签名指纹存档,服务端也留一份,启动时联网校验,不只靠本地硬编码值。
  3. 渠道包也要做加固
    很多团队主包做了加固,渠道包忘了加。加固在重签名之后做,每个渠道包分别加固,不要偷懒。
posted @ 2026-06-11 16:30  字节暗面  阅读(0)  评论(0)    收藏  举报