Unity游戏防破解方法
- 内容介绍
- 文章标签
- 相关推荐
0x0
把市面上的非冷门二游全部肘击了一遍,各种加密方法应该是了解的差不多了
0x1 il2cpp
最经典的肯定是往il2cpp::vm::MetadataLoader::LoadMetadataFile加料了,拿到fileBuffer以后进行一些额外的解密操作,比如xor,解压,AES解密等等
global-metadata.dat自己也可以藏某个文件里面,比如藏PE的资源段里面,或者藏mscorlib.dll-resources.dat尾部,方法挺多的
PixPin2026-04-2711-56-171613×863 148 KB
更进一步的话可以把文件头魔术字抹掉,版本号乱写一个,把全部的Size写0,运行时不依赖这些东西,global-metadata.dat字符串也能加密混淆一下
PixPin2026-04-2711-57-381728×680 229 KB
Il2CppGlobalMetadataHeader也可以打乱顺序,建议打乱Il2CppGlobalMetadataHeader结构体后往里面塞入垃圾数据干扰分析,数据段也需要打乱顺序
PixPin2026-04-2712-12-241009×1609 356 KB
正常的长这样
PixPin2026-04-2712-15-571646×516 263 KB
打乱Il2CppGlobalMetadataHeader+打乱数据段顺序长这样
PixPin2026-04-2712-16-291786×491 320 KB
打乱Il2CppMetadataRegistration,Il2CppCodeRegistration,Il2CppCodeGenModule的结构体,改一下还是能狠狠恶心一下逆向的,AI不太能正确恢复出来
PixPin2026-04-2712-02-441051×1470 320 KB
在二进制层面看大概长这样,
PixPin2026-04-2712-05-361171×551 160 KB
PixPin2026-04-2712-05-451145×578 163 KB
FieldInfo,PropertyInfo,EventInfo,Il2CppClass等等也可以打乱顺序,有些字段运行时完全不依赖,但是静态dump需要用到
PixPin2026-04-2712-18-08844×688 66.6 KB
C#函数的命名也可以用Bee尽可能混淆以后再编译成native
0x2 il2cpp API
如果买了Unity的源代码,可以直接把launcher,UnityPlayer,Gameassembly全部静态链接成一个主程序,直接解决il2cppAPI暴露的问题
或者参考某三字厂商的方法:
这是原版Unity调用Gameassembly内il2cpp函数的流程,UnityPlayer加载Gameassembly以后用LookupSymbol从导入表里面取到每个il2cppapi的地址,然后放入UnityPlayer内的全局变量里面以供使用
Untitled Diagram.drawio1863×1201 39.6 KB
PixPin2026-04-2712-33-481433×933 224 KB
加密il2cpp可以这样加密,Gameassembly的导入表只暴露il2cpp_get_table函数,该函数会返回一个固定长度的数组,里面有些是真的il2cppapi地址,有些则是完全没用的垃圾地址,LoadIl2cpp函数不再通过LookupSymbol一个一个解析il2cppapi,而是改成解析il2cpp_get_table传过来的数组,然后逐个填充到对应的全局变量里面(垃圾地址也要填充到全局变量里面,但是这些全局变量没有任何函数会使用它)
image1863×1201 78.6 KB
0x3 InitializeRuntimeMetadata
metadataPointer可以进行一下额外的解密操作,GetStringLiteralFromIndex整个函数里面可以加点xor等额外解密,然后用vmp全部vm掉
PixPin2026-04-2712-44-581641×1429 308 KB
混淆过的差不多长这样
PixPin2026-04-2712-48-401920×1201 182 KB
PixPin2026-04-2712-48-481659×738 97 KB
0x4 AssetBundle
最基础的玩法肯定是先把ab包读进来,然后进行解密操作,最后用LoadFromStream或者LoadFromStreamAsync把解密好的ab包交给UnityPlayer
如果有源代码,可以根据下面的图进行魔改,解压缩部分可以增加一个魔改过的lz4或者zstd,ReadHeader部分可以把文件头打乱一下顺序,随机xor一些字段等等(我这没源代码,只能从二进制层面提供建议)
image1920×979 241 KB
甚至可以完全丢掉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的结构顺序
PixPin2026-04-2713-04-07879×813 70.4 KB
opcode的顺序也可以进行打乱
PixPin2026-04-2713-05-25866×1755 247 KB
PixPin2026-04-2713-05-511069×1771 214 KB
vm解释器部分也可以加点料
PixPin2026-04-2713-06-241065×1749 178 KB
js好像没见到有人编译成jsc的,这里不讨论
hybridCLR可以往TransformBodyImpl里面加点料,给il字节码xor一下阻止ilspy的反编译
PixPin2026-04-2713-10-111738×1802 223 KB
0x6 网络
proto可以用flatbuffers,flatbuffers的二进制文件内完全没有类型定义,不像protobuf能猜定义,然后可以把flatc生成出来的代码混淆一下
通信也可以魔改KCP,请求也加上ssl pinning
这部分研究的不算多
0xF
感觉加密的玩法也就那几种,以前没AI/AI性能不行的时候,简单的加密一下还是有用的,现在怕是不太行了(
网友解答:--【壹】--:
主流多数游戏的加密都不强,搞逆向作弊的基本都轻车熟路,但因为要考虑运行时性能,再太多地方做加密会拖慢效率,所以还是理性看待,加密方法还是很多的。
--【贰】--:
Unreal无非就是那几个东西,GName,Gworld,namepool,封包的话可以自己造个VFS,现有的UE基本上都是这种玩法(
--【叁】--:
那就不清楚了,我们公司是去hook了编译器去做的,魔改的强度也是很大
--【肆】--:
太强啦,有ai确实难度下来了,很公式化,感觉以后加密会专门针对ai
--【伍】--:
不是有开源项目专门支持的il2cpp的吗,做mod也挺方便的,我记得是叫MelonLoader,直接用c#去开发 和开发Unity游戏一样的体验,还是挺不错的
--【陆】--:
学习了学习了,感谢佬友分享,最近除了unity还在研究UE的破解和防破解,有时间探讨下。
--【柒】--:
是这样的,只能说各有各的有点,il2cpp性能更好,而且也是官方主推的,如果需要做mod,确实mono更加方便快捷,大部分游戏都是会选择主流的编译方式 提升游戏的性能和体验,而且官方也不推荐mono的编译方式,所以大概率都会选择il2cpp,不过好在一些开源作者出的写mod工具 就比如我上面提到的MelonLoader,其实已经很大程度的优化mod的开发了
--【捌】--:
2cpp其实最大的麻烦不是不能开发缺少对应开发框架,cpp引擎也能强行做mod,主要是开发体验有一点是,对于modder其实首要问题是先看一遍屎山代码,理清逻辑找到需要patch的位置和函数,然后再编写代码,所以出现了有些开发者为了工坊甚至专门提供mono分支,n网modder吐糟2cpp也是这点,你把代码防住了,我想要阅读你整个代码逻辑定位我需要的地方就十分困难,毕竟你把IL字节码转化为cpp再编译,就不能很轻松的使用dnspy打开和修改调试了。
--【玖】--:
666学习了精华!!!好用,而且某个玩法在某四字游戏看过.
--【拾】--:
emmmm,基本上客户端这块默认都是只能防防君子,稍微提升下破解的难度。。。
--【拾壹】--:
学到了老哥, 以后用吧。 目前的大部分游戏可以直接解出来。 只有国产的货才喜欢搞加密。有必要吗?
--【拾贰】--:
il2cpp部分确实不要买源码,但是要改UnityPlayer就要买源代码了,hook似乎是违反TOS的(
--【拾叁】--:
补充一下,其实不购买Unity源码也是可以做到魔改的,比如去hook Unity的编译器去做il2cpp的魔改+混淆,效果和买了Unity源码的效果是一样的(可能自由度没直接有源码那么直接,但是能做到差不多的效果)
--【拾肆】--:
我感觉开发者unity开发不用mono用il2cpp打包基本等于放弃创意工坊了,更折磨的是cpp写的游戏引擎,做mod只能说折磨了,除非作者做一套api带一个lua解释,让mod开发用lua开发,放弃创意工坊,玩家游戏时长游戏体验都会少一大截。
而且话说回来,破解游戏尤其是steam分发的这块,一般改校验就行。
0x0
把市面上的非冷门二游全部肘击了一遍,各种加密方法应该是了解的差不多了
0x1 il2cpp
最经典的肯定是往il2cpp::vm::MetadataLoader::LoadMetadataFile加料了,拿到fileBuffer以后进行一些额外的解密操作,比如xor,解压,AES解密等等
global-metadata.dat自己也可以藏某个文件里面,比如藏PE的资源段里面,或者藏mscorlib.dll-resources.dat尾部,方法挺多的
PixPin2026-04-2711-56-171613×863 148 KB
更进一步的话可以把文件头魔术字抹掉,版本号乱写一个,把全部的Size写0,运行时不依赖这些东西,global-metadata.dat字符串也能加密混淆一下
PixPin2026-04-2711-57-381728×680 229 KB
Il2CppGlobalMetadataHeader也可以打乱顺序,建议打乱Il2CppGlobalMetadataHeader结构体后往里面塞入垃圾数据干扰分析,数据段也需要打乱顺序
PixPin2026-04-2712-12-241009×1609 356 KB
正常的长这样
PixPin2026-04-2712-15-571646×516 263 KB
打乱Il2CppGlobalMetadataHeader+打乱数据段顺序长这样
PixPin2026-04-2712-16-291786×491 320 KB
打乱Il2CppMetadataRegistration,Il2CppCodeRegistration,Il2CppCodeGenModule的结构体,改一下还是能狠狠恶心一下逆向的,AI不太能正确恢复出来
PixPin2026-04-2712-02-441051×1470 320 KB
在二进制层面看大概长这样,
PixPin2026-04-2712-05-361171×551 160 KB
PixPin2026-04-2712-05-451145×578 163 KB
FieldInfo,PropertyInfo,EventInfo,Il2CppClass等等也可以打乱顺序,有些字段运行时完全不依赖,但是静态dump需要用到
PixPin2026-04-2712-18-08844×688 66.6 KB
C#函数的命名也可以用Bee尽可能混淆以后再编译成native
0x2 il2cpp API
如果买了Unity的源代码,可以直接把launcher,UnityPlayer,Gameassembly全部静态链接成一个主程序,直接解决il2cppAPI暴露的问题
或者参考某三字厂商的方法:
这是原版Unity调用Gameassembly内il2cpp函数的流程,UnityPlayer加载Gameassembly以后用LookupSymbol从导入表里面取到每个il2cppapi的地址,然后放入UnityPlayer内的全局变量里面以供使用
Untitled Diagram.drawio1863×1201 39.6 KB
PixPin2026-04-2712-33-481433×933 224 KB
加密il2cpp可以这样加密,Gameassembly的导入表只暴露il2cpp_get_table函数,该函数会返回一个固定长度的数组,里面有些是真的il2cppapi地址,有些则是完全没用的垃圾地址,LoadIl2cpp函数不再通过LookupSymbol一个一个解析il2cppapi,而是改成解析il2cpp_get_table传过来的数组,然后逐个填充到对应的全局变量里面(垃圾地址也要填充到全局变量里面,但是这些全局变量没有任何函数会使用它)
image1863×1201 78.6 KB
0x3 InitializeRuntimeMetadata
metadataPointer可以进行一下额外的解密操作,GetStringLiteralFromIndex整个函数里面可以加点xor等额外解密,然后用vmp全部vm掉
PixPin2026-04-2712-44-581641×1429 308 KB
混淆过的差不多长这样
PixPin2026-04-2712-48-401920×1201 182 KB
PixPin2026-04-2712-48-481659×738 97 KB
0x4 AssetBundle
最基础的玩法肯定是先把ab包读进来,然后进行解密操作,最后用LoadFromStream或者LoadFromStreamAsync把解密好的ab包交给UnityPlayer
如果有源代码,可以根据下面的图进行魔改,解压缩部分可以增加一个魔改过的lz4或者zstd,ReadHeader部分可以把文件头打乱一下顺序,随机xor一些字段等等(我这没源代码,只能从二进制层面提供建议)
image1920×979 241 KB
甚至可以完全丢掉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的结构顺序
PixPin2026-04-2713-04-07879×813 70.4 KB
opcode的顺序也可以进行打乱
PixPin2026-04-2713-05-25866×1755 247 KB
PixPin2026-04-2713-05-511069×1771 214 KB
vm解释器部分也可以加点料
PixPin2026-04-2713-06-241065×1749 178 KB
js好像没见到有人编译成jsc的,这里不讨论
hybridCLR可以往TransformBodyImpl里面加点料,给il字节码xor一下阻止ilspy的反编译
PixPin2026-04-2713-10-111738×1802 223 KB
0x6 网络
proto可以用flatbuffers,flatbuffers的二进制文件内完全没有类型定义,不像protobuf能猜定义,然后可以把flatc生成出来的代码混淆一下
通信也可以魔改KCP,请求也加上ssl pinning
这部分研究的不算多
0xF
感觉加密的玩法也就那几种,以前没AI/AI性能不行的时候,简单的加密一下还是有用的,现在怕是不太行了(
网友解答:--【壹】--:
主流多数游戏的加密都不强,搞逆向作弊的基本都轻车熟路,但因为要考虑运行时性能,再太多地方做加密会拖慢效率,所以还是理性看待,加密方法还是很多的。
--【贰】--:
Unreal无非就是那几个东西,GName,Gworld,namepool,封包的话可以自己造个VFS,现有的UE基本上都是这种玩法(
--【叁】--:
那就不清楚了,我们公司是去hook了编译器去做的,魔改的强度也是很大
--【肆】--:
太强啦,有ai确实难度下来了,很公式化,感觉以后加密会专门针对ai
--【伍】--:
不是有开源项目专门支持的il2cpp的吗,做mod也挺方便的,我记得是叫MelonLoader,直接用c#去开发 和开发Unity游戏一样的体验,还是挺不错的
--【陆】--:
学习了学习了,感谢佬友分享,最近除了unity还在研究UE的破解和防破解,有时间探讨下。
--【柒】--:
是这样的,只能说各有各的有点,il2cpp性能更好,而且也是官方主推的,如果需要做mod,确实mono更加方便快捷,大部分游戏都是会选择主流的编译方式 提升游戏的性能和体验,而且官方也不推荐mono的编译方式,所以大概率都会选择il2cpp,不过好在一些开源作者出的写mod工具 就比如我上面提到的MelonLoader,其实已经很大程度的优化mod的开发了
--【捌】--:
2cpp其实最大的麻烦不是不能开发缺少对应开发框架,cpp引擎也能强行做mod,主要是开发体验有一点是,对于modder其实首要问题是先看一遍屎山代码,理清逻辑找到需要patch的位置和函数,然后再编写代码,所以出现了有些开发者为了工坊甚至专门提供mono分支,n网modder吐糟2cpp也是这点,你把代码防住了,我想要阅读你整个代码逻辑定位我需要的地方就十分困难,毕竟你把IL字节码转化为cpp再编译,就不能很轻松的使用dnspy打开和修改调试了。
--【玖】--:
666学习了精华!!!好用,而且某个玩法在某四字游戏看过.
--【拾】--:
emmmm,基本上客户端这块默认都是只能防防君子,稍微提升下破解的难度。。。
--【拾壹】--:
学到了老哥, 以后用吧。 目前的大部分游戏可以直接解出来。 只有国产的货才喜欢搞加密。有必要吗?
--【拾贰】--:
il2cpp部分确实不要买源码,但是要改UnityPlayer就要买源代码了,hook似乎是违反TOS的(
--【拾叁】--:
补充一下,其实不购买Unity源码也是可以做到魔改的,比如去hook Unity的编译器去做il2cpp的魔改+混淆,效果和买了Unity源码的效果是一样的(可能自由度没直接有源码那么直接,但是能做到差不多的效果)
--【拾肆】--:
我感觉开发者unity开发不用mono用il2cpp打包基本等于放弃创意工坊了,更折磨的是cpp写的游戏引擎,做mod只能说折磨了,除非作者做一套api带一个lua解释,让mod开发用lua开发,放弃创意工坊,玩家游戏时长游戏体验都会少一大截。
而且话说回来,破解游戏尤其是steam分发的这块,一般改校验就行。

