说白了
本文主要讨论关于包体相关的加密,内存相关加密不在讨论,归根结底,游戏的加密,都只是仅仅提高了被破解的门槛而已,阻挡了一些新朋友使用各种工具提取游戏资源,修改游戏配置乃至代码,并寄希望于大神对我们的游戏没那么有兴趣,仅此而已
脚本加密
以 Lua 为例,很多游戏使用 Lua 作为逻辑开发语言,将 lua 打入 AssetBundle 或者 zip 包,进行热更,但这种情况真的太容易被破解了,常见的解决思路分如下几步
1. 使用 luac 对脚本进行编译
生成字节码,天然丧失阅读性,还带着一点点加速属性,这是入门级"加密",算是一举两得,但是破解难度也是最低的,因为 github 上 unluac 之类的工具太多了,对于有一点编程基础的都可以反编译回来,通过修改再封包,就可以达到破解目的
2. 在 luac 的基础上,对编译出来的字节码进行二次加密
一般兼顾解码速度的话,会使用异或算法,这时候已经可以拦截大多数专业程序员了
3. 在 1+2 的基础上,强化加密工具库
将异或算法的工具,使用 c 来写 native 库,Key 写在 native 库里,增加破解难度,好处是可以进一步速度加成,破解更难,但是通过汇编级别的静态代码调试还是可以的,但需要更牛的编程水平
4. 在 1+2+3 的基础上,异或的 KEY,由外部传入
这时候,只能通过汇编级别的动态代码调试,而且两边既有底层语言,又有高级语言,会更加增加分析难度,即便是技术大牛,绝大多数也会在这中间疲于奔命
5,再想更多的话,就是加密的增强了
上面只说了最基本的对称加密,好处就是最快速
如果使用非对称加密呢?RSA 么?虽然强悍,但也容易造成效率大幅度下降,需要权衡
AssetBundle 加密
上文说到 lua 加密,我们的 bundle 也是需要加密的,这样可以提高被提取美术资源的难度,同时,因为 lua 会被打包进 AssetBundle 里,所以可以进一步增加破解门槛
1.使用 offset + 伪造 AssetBundle 头部
根据 AssetBundle.LoadFromFile 的第三个参数,bundle 可以在 build 的时候,根据一定的规则,指定一个 offset,读取的时候,再次从这个 offset 读取,这个空白的部分,可以填任意东西来混淆视听,达到让网上那些读取工具崩溃或不工作的目的
2.对 AssetBundle 再次异或
或许有人会担心,对 AssetBundle 再次异或会不会导致 trunk_base 被破坏掉,其实并不会,Unity 提供了一个新的 API AssetBundle.LoadFromStream 可以很好的解决这个问题
关于异或(抄自百度百科)
异或,英文为 exclusive OR,缩写成 xor
异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
如果 a、b 两个值不相同,则异或结果为 1。如果 a、b 两个值相同,异或结果为 0。
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用 1 表示真,0 表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为 0,异为 1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。
异或略称为 XOR、EOR、EX-OR
程序中有三种演算子:XOR、xor、⊕。
使用方法如下
z = x ⊕ y
z = x xor y
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于