某手游最新版本加密数据破解教程(截止2026/4/12)
初步分析
解压最新版apk,进入assets\bundle目录下,这里面是该游戏的资源文件。可以看到都是.assetbundle的文件。
那么正常情况下,.assetbundle文件都是可以直接拖入asset studio中直接查看的,但是在这里我们会发现拖入没有反应,底下报错No Unity file can be loaded
那么这时候我们就有理由怀疑这个文件被加密过,让我们拖入010分析一下
此时我们可以看见,文件头是UnityKH1FS,那么这里就要查询相关资料
补充知识:.assetbundle 是 Unity 引擎中的一种资源打包文件。他的标准文件头有以下几种:
UnityFS(最常见)
UnityRaw
UnityWeb
可以看见,他这不是标准文件头,但是和标准文件头很接近,那么第一步思路就是
会不会只是把 `UnityFS` 头改了几个字节,防工具识别?
考虑只改文件头恢复文件。我试过这一步但是失败了。
在这个头这里还能再分析:
如果是 AES / XXTEA 这类真正整包强加密,文件头往往应该接近随机,而不是还保留这么明显的 Unity 家族特征。
接下来就去找加密逻辑
native层分析
最开始我们要判断加密逻辑在 Java 层,还是在 native 层?我的判断是native层,原因如下:
-
Java / dex 里没有明显命中相关字符串。
-
如果真是 Unity archive 的私有分支,最自然的地方就是 Unity 引擎自己的 archive 解析逻辑。
所以重点就应该看:
libunity.so
libil2cpp.so
- 业务 so
而其中最优先的是:
libunity.so
因为 archive 解析、bundle 识别这些事情,本来就是 Unity 引擎自己做的。
那我们直接查壳,发现无壳就拖入ida。搜字符串UnityKH1FS
很明显找到字符串
同时我们们在这得到了很多信息,发现还有其他的魔改头UnityKHFS,UnityKHNFS和标准文件头UnityFS (后面查看其他文件发现,在这个文件夹里确实有三种魔改,分别对应着这三种魔改头)
而且还能发现这里有两串可疑长字符串,看着长度很像64且验证后确实是64,那么他们很有可能是 key / 掩码表 / 置换表 / 常量表
那么就去跟踪谁调用了这串字符串,从我们最开始分析的UnityKH1FS开始跟
这里发现有5个函数调用他了,不多那就一个个看(gpt看)
读了以后发现:sub_50462C / sub_5047D8:识别头和读 header
无需理会
sub_505D54 构造默认头
无需理会
sub_505E8C :
并不是解密函数,而是一个与 archive 布局相关的偏移计算函数。函数先判断当前对象是否属于 UnityFS / UnityKHFS / UnityKHNFS / UnityKH1FS 这一家族,随后读取 flags(位于 a1 + 144)和某个基础偏移/长度字段(位于 a1 + 136)。其中最关键的逻辑是:
if (flags & 0x200)
v4 = (v4 + 15) & 0xFFFFFFF0;
这是一条非常典型的“向上按 16 字节对齐”的代码。它说明对于当前这类 Unity archive,后续关键数据区的起始位置并不一定紧跟 header 末尾,而可能需要先进行 16 字节对齐。
关键加密函数 sub_506D80
代码过长不贴了,很明显看if分支,
off_1858FA8是Unitykhfs
off_1858FB8是Unitykhnfs
off_1858FC0是aUnitykh1fs
if ( v7 )
{
if ( (byte_43E968)(a3, off_1858FA8[0], 0LL) )
{
if ( (byte_43E968)(a3, off_1858FB8[0], 0LL) )
{
v7 = (byte_43E968)(a3, off_1858FC0, 0LL);
if ( !v7 )
{
...
这是部分函数,这里在判断是哪种头,然后不同的头进行不同的加密
加密逻辑抽象出来如下:
UnityKHFS
对缓冲区做一层循环 XOR:
buf[i] ^= KEY_A[i % keyA_len];
UnityKHNFS
对缓冲区做两层 XOR:
buf[i] ^= KEY_B[i % keyB_len];
buf[i] ^= bswap64(len)[i & 7];
UnityKH1FS
最复杂:
- 先做一次
sub_506C78
- 再按条件选择
KEY_A 或 KEY_B
- 再和
bswap64(len) 异或
- 然后分段多次
sub_506C78
- 最后整体再做一次
sub_506C78
跟进去读sub_506C78,内部是一个区间反转 + 重排。我没仔细读,丢给gpt写解密了
至此所有加密逻辑都分析完毕,接下来只要逆着写脚本就好了(这一步依旧gpt)
效果展示(已打码)
结语
在最后发现好像还有挺多文件打不开的。看了下还有别的加密。不过到了汇编层面。就先不处理了。