Unity游戏防破解方法

bfloat16 2026-04-27 13:16 1

0x0


把市面上的非冷门二游全部肘击了一遍,各种加密方法应该是了解的差不多了


0x1 il2cpp


最经典的肯定是往il2cpp::vm::MetadataLoader::LoadMetadataFile加料了,拿到fileBuffer以后进行一些额外的解密操作,比如xor,解压,AES解密等等

global-metadata.dat自己也可以藏某个文件里面,比如藏PE的资源段里面,或者藏mscorlib.dll-resources.dat尾部,方法挺多的



更进一步的话可以把文件头魔术字抹掉,版本号乱写一个,把全部的Size写0,运行时不依赖这些东西,global-metadata.dat字符串也能加密混淆一下



Il2CppGlobalMetadataHeader也可以打乱顺序,建议打乱Il2CppGlobalMetadataHeader结构体后往里面塞入垃圾数据干扰分析,数据段也需要打乱顺序



正常的长这样



打乱Il2CppGlobalMetadataHeader+打乱数据段顺序长这样


打乱Il2CppMetadataRegistrationIl2CppCodeRegistrationIl2CppCodeGenModule的结构体,改一下还是能狠狠恶心一下逆向的,AI不太能正确恢复出来



在二进制层面看大概长这样,




FieldInfoPropertyInfoEventInfoIl2CppClass等等也可以打乱顺序,有些字段运行时完全不依赖,但是静态dump需要用到


C#函数的命名也可以用Bee尽可能混淆以后再编译成native


0x2 il2cpp API


如果买了Unity的源代码,可以直接把launcher,UnityPlayer,Gameassembly全部静态链接成一个主程序,直接解决il2cppAPI暴露的问题

或者参考某三字厂商的方法:

这是原版Unity调用Gameassembly内il2cpp函数的流程,UnityPlayer加载Gameassembly以后用LookupSymbol从导入表里面取到每个il2cppapi的地址,然后放入UnityPlayer内的全局变量里面以供使用





加密il2cpp可以这样加密,Gameassembly的导入表只暴露il2cpp_get_table函数,该函数会返回一个固定长度的数组,里面有些是真的il2cppapi地址,有些则是完全没用的垃圾地址,LoadIl2cpp函数不再通过LookupSymbol一个一个解析il2cppapi,而是改成解析il2cpp_get_table传过来的数组,然后逐个填充到对应的全局变量里面(垃圾地址也要填充到全局变量里面,但是这些全局变量没有任何函数会使用它)


0x3 InitializeRuntimeMetadata


metadataPointer可以进行一下额外的解密操作,GetStringLiteralFromIndex整个函数里面可以加点xor等额外解密,然后用vmp全部vm掉



混淆过的差不多长这样




0x4 AssetBundle


最基础的玩法肯定是先把ab包读进来,然后进行解密操作,最后用LoadFromStream或者LoadFromStreamAsync把解密好的ab包交给UnityPlayer

如果有源代码,可以根据下面的图进行魔改,解压缩部分可以增加一个魔改过的lz4或者zstd,ReadHeader部分可以把文件头打乱一下顺序,随机xor一些字段等等(我这没源代码,只能从二进制层面提供建议)


甚至可以完全丢掉AssetBundle,自己造个VFS,例如一个文件存index,一个文件存data。取对应的文件先对VFS内的路径名称计算hash,然后根据算出来的hash取index里面取到offset和size,然后再去data内拿到需要的部分,这样VFS里面完全没有任何可读的文件名,只有hash


自定义VFS的处理解密可以用Unity插件搞一个dll去处理,也可以写UnityPlayer里面,通过icall调用


0x5 lua字节码/js/hybridCLR


Unity基本上用的是藤子的Xlua

可以改字节码proto的结构顺序



opcode的顺序也可以进行打乱





vm解释器部分也可以加点料


js好像没见到有人编译成jsc的,这里不讨论


hybridCLR可以往TransformBodyImpl里面加点料,给il字节码xor一下阻止ilspy的反编译


0x6 网络


proto可以用flatbuffers,flatbuffers的二进制文件内完全没有类型定义,不像protobuf能猜定义,然后可以把flatc生成出来的代码混淆一下

通信也可以魔改KCP,请求也加上ssl pinning

这部分研究的不算多


0xF


感觉加密的玩法也就那几种,以前没AI/AI性能不行的时候,简单的加密一下还是有用的,现在怕是不太行了(

最新回复 (19)
  • Will 04-27 13:45
    1

    学到了老哥, 以后用吧。 目前的大部分游戏可以直接解出来。 只有国产的货才喜欢搞加密。有必要吗?

  • zhangzhong 04-27 14:27
    2

    emmmm,基本上客户端这块默认都是只能防防君子,稍微提升下破解的难度。。。

  • 伞兵一号卢本伟 04-27 14:32
    3

    666学习了精华!!!好用,而且某个玩法在某四字游戏看过.

  • 且听风吟 04-27 14:58
    4

    主流多数游戏的加密都不强,搞逆向作弊的基本都轻车熟路,但因为要考虑运行时性能,再太多地方做加密会拖慢效率,所以还是理性看待,加密方法还是很多的。

  • nishidoubi 04-27 15:01
    5

    学习了学习了,感谢佬友分享,最近除了unity还在研究UE的破解和防破解,有时间探讨下。

  • Jiang_Night 04-27 16:07
    6

    补充一下,其实不购买Unity源码也是可以做到魔改的,比如去hook Unity的编译器去做il2cpp的魔改+混淆,效果和买了Unity源码的效果是一样的(可能自由度没直接有源码那么直接,但是能做到差不多的效果)

  • bfloat16 楼主 04-27 16:16
    7

    il2cpp部分确实不要买源码,但是要改UnityPlayer就要买源代码了,hook似乎是违反TOS的(

  • bfloat16 楼主 04-27 16:18
    8

    Unreal无非就是那几个东西,GName,Gworld,namepool,封包的话可以自己造个VFS,现有的UE基本上都是这种玩法(

  • Jiang_Night 04-27 16:19
    9

    那就不清楚了,我们公司是去hook了编译器去做的,魔改的强度也是很大

  • kise_tyxml 04-27 16:26
    10

    我感觉开发者unity开发不用mono用il2cpp打包基本等于放弃创意工坊了,更折磨的是cpp写的游戏引擎,做mod只能说折磨了,除非作者做一套api带一个lua解释,让mod开发用lua开发,放弃创意工坊,玩家游戏时长游戏体验都会少一大截。

    而且话说回来,破解游戏尤其是steam分发的这块,一般改校验就行。

  • Jiang_Night 04-27 16:33
    11

    不是有开源项目专门支持的il2cpp的吗,做mod也挺方便的,我记得是叫MelonLoader,直接用c#去开发 和开发Unity游戏一样的体验,还是挺不错的

  • kise_tyxml 04-27 16:46
    12

    2cpp其实最大的麻烦不是不能开发缺少对应开发框架,cpp引擎也能强行做mod,主要是开发体验有一点是,对于modder其实首要问题是先看一遍屎山代码,理清逻辑找到需要patch的位置和函数,然后再编写代码,所以出现了有些开发者为了工坊甚至专门提供mono分支,n网modder吐糟2cpp也是这点,你把代码防住了,我想要阅读你整个代码逻辑定位我需要的地方就十分困难,毕竟你把IL字节码转化为cpp再编译,就不能很轻松的使用dnspy打开和修改调试了。

  • Jiang_Night 04-27 16:51
    13

    是这样的,只能说各有各的有点,il2cpp性能更好,而且也是官方主推的,如果需要做mod,确实mono更加方便快捷,大部分游戏都是会选择主流的编译方式 提升游戏的性能和体验,而且官方也不推荐mono的编译方式,所以大概率都会选择il2cpp,不过好在一些开源作者出的写mod工具 就比如我上面提到的MelonLoader,其实已经很大程度的优化mod的开发了

  • 阿巴阿巴巴 04-27 16:54
    14

    太强啦,有ai确实难度下来了,很公式化,感觉以后加密会专门针对ai ^-^

  • HZBHZB1234 05-13 23:53
    15

    最近在尝试逆向某个韩国二游。global-metadata的加密方式已经完全破解了,同时使用了自定义的头部,自定义头部的修复也基本理清楚思路了。但是每周四游戏更新时都会完全更新gameassembly和global-metadata,感觉每次都手动破一遍很浪费时间,佬有没有什么半自动化头部修复流程的思路啊

  • bfloat16 楼主 05-15 04:57
    16

    有预算可以让Agent自己根据旧版本的二进制去分析新版本的二进制,没预算那就只能自己写特征码然后扫描匹配+人力修复了(

  • dunNaNa 05-15 09:07
    17

    要想死磕安全,厂商能一天重打包一次,还是要和性能、兼容性一起考虑

  • hide955 06-11 11:25
    18

    大佬我学到了 ^-^

    发现这个操作基本上大家都这样干

  • miler 06-23 21:19
    19

    那么应该怎么去针对ai ^-^,大量无意义的顺更迭和混淆+不走常规路还是直接提示词注入反向误导ai()

* 帖子来源Linux.do
返回