关于游戏加密

本贴最后更新于 1505 天前,其中的信息可能已经物是人非

说白了

本文主要讨论关于包体相关的加密,内存相关加密不在讨论,归根结底,游戏的加密,都只是仅仅提高了被破解的门槛而已,阻挡了一些新朋友使用各种工具提取游戏资源,修改游戏配置乃至代码,并寄希望于大神对我们的游戏没那么有兴趣,仅此而已

脚本加密

以 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

未完待续

  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 158 关注
1 操作
kyochow 在 2020-11-07 15:41:50 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...