高中生

- 金币
- 357
- 好评
- 11
- 信誉
- 96
|
本帖最后由 尧. 于 2026-9-23 00:00 编辑
游戏在 libgame.so(两个ABI)中内置了一套自研反篡改
与签名相关的核心校验如下:
【1】签名校验A(反射路径)
通过 JNI 反射调用链读取自身证书:
ActivityThread → mBoundApplication → createAppContext
→ PackageManager.getPackageInfo → signingInfo/signatures
→ Signature.toByteArray() → X509Certificate.getInstance()
→ getEncoded() → MessageDigest("SHA1").digest() → 转hex
把计算出的证书SHA1十六进制串与以下白名单逐一比对:
22151ad7979067d48df6adb1597c32c81c1342be ← 官方证书
ae7bf976516ad3ef95308e499b7a7de87456f4dc
f60f8ca67b3d19e0e38356bbcbc624ebc6113f4a
【2】签名校验B(APK文件路径)
直接读取自身APK文件:
检查文件倒数16字节是否为 "APK Sig Block 42"(v2签名块魔数)
→ 解析 v2 签名块 → 提取签名者证书 → SHA1 → 转hex
与6个白名单比对:
22151ad7979067d48df6adb1597c32c81c1342be(同A)
ae7bf976516ad3ef95308e499b7a7de87456f4dc
f60f8ca67b3d19e0e38356bbcbc624ebc6113f4a
900981af8a387d9dfa06cdb7d9c49ffa90fced7c
2beb869ca094db18789055bcc52d7ba55030d8cc
17d9465f606faa97a706782099abf14d7c7c1aea
我的去签方案是把签名比对强制走"通过"分支
原理:每处比对相等时会跳转到"成功继续"地址(cbz 指令),
我把它改写为无条件跳转,使比对结果被忽略、永远走成功路径。
arm64-v8a/libgame.so(28,150,184 字节)
[签名校验A] 3处 cbz w0 → b 跳转目标 0xad11a4:
0xad1084 / 0xad1104 / 0xad1190 (cbz w0,xxx → b xxx)
[签名校验B] 6处 cbz w0 → b 跳转目标 0xacfb04:
0xacf8a4 / 0xacf918 / 0xacf98c / 0xacfa00 / 0xacfa74 / 0xacfae8
[v2魔数守卫] 1处 cbz w0 → b 跳转目标 0xacf4bc:
0xacf4a0
[文件校验错误位] 3处 str(标志位写入) → nop:
0xace2dc / 0xace30c / 0xace328
armeabi-v7a/libgame.so(16,145,444 字节)
[签名校验-6证书链] 6处 cbz r0 → b.n 跳转目标 0x59c304:
0x59c2a6 / 0x59c2b6 / 0x59c2c6 / 0x59c2d6 / 0x59c2e6 / 0x59c2f6
[签名校验-3证书链] 3处 cbz r0 → b.n 跳转目标 0x59cebc:
0x59ce42 / 0x59ce52 / 0x59ce64
成品
带MOD功能的版本
|
-
查看全部评分
总评分:好评 +1
金币 +1
|