> 技术文档 > 【Unity】代码加密 混淆 防破解 Obfuz dll加固 GF_X代码加固功能用法 Unity代码保护插件 dll二进制加密

【Unity】代码加密 混淆 防破解 Obfuz dll加固 GF_X代码加固功能用法 Unity代码保护插件 dll二进制加密

GF_X自动化通用游戏框架开源地址:https://github.com/sunsvip/GF_X

Obfuz开源地址:https://github.com/focus-creative-games/obfuz

代码加密用法视频教程:

GF

以前在博文中讲解过使用.Net Reactor命令行对dll进行混淆:【Unity】C#热更dll混淆加密 代码加固 dll合并 .NET Reactor_hybridclr 代码混淆-CSDN博客

Obfuz是HybridCLR作者最新发布的针对Unity的代码加固插件,是C#热更项目必不可少的功能。

代码加固的必要性

  • 从代码安全考虑,在单机包中,C#代码通过IL2CPP转换为C++代码,显著提升了安全性。然而,对于热更新(如HybridCLR社区版)场景,热更程序集作为资源直接暴露,AOT dll通常也需要用于值类型泛型元数据补充而打进包里,未经过IL2CPP处理,可轻松通过反编译工具(如ILSpy、dnSpy)获取完整源码。

  • 第三方混淆工具,如.Net Reactor虽然很强大,但收费,并且不是针对Unity开发,需要我们自己将必须跳过混淆的类名、方法名添加到白名单,例如MonoBehavior脚本的生命周期方法Awake、Start、Update等等,一旦有遗漏被混淆,程序就会报错或方法无法回调,且排查不便,会对项目造成巨大隐患。

  • 更容易过审。理论上经过代码混淆后在谷歌商店等应用平台会更容易通过机器审核。

安装Obfuz插件

1. 添加Obfuz插件

在PackageManager中从git url添加插件:

https://gitee.com/focus-creative-games/obfuz.git?path=com.code-philosophy.obfuz

或者直接修改工程Packages/manifest.json文件,手动添加一行:

\"com.code-philosophy.obfuz\": \"https://gitee.com/focus-creative-games/obfuz.git?path=com.code-philosophy.obfuz\",

2. 添加obfuz4hybridclr(如果项目同时使用了HybridCLR)

obfuz4hybridclr是针对使用HybridCLR热更插件额外做了手动对热更dll混淆的功能

在PackageManager中从git url添加插件:

https://gitee.com/GameFrameworks/obfuz.git?path=com.code-philosophy.obfuz4hybridclr

或者直接修改工程Packages/manifest.json文件,手动添加一行:

\"com.code-philosophy.obfuz4hybridclr\": \"https://gitee.com/focus-creative-games/obfuz.git?path=com.code-philosophy.obfuz4hybridclr\",

 配置Obufz

 1. 配置需要混淆的程序集

Unity顶部菜单栏Obfuz/Settings打开设置界面,将需要混淆加密的程序集名称配置到Assemblies To Obfuscate列表,如果没有创建程序集,只需要添加Unity默认程序集Assembly-CSharp即可。

2. 设置静态/动态密钥

也就是相当于加密密钥

3. 设置虚拟机代码生成位置

设置到AOT程序所在位置即可。

4. 更多配置

其它详细设置项非必须,如有需求可参考Obfuz官方文档

详细规则配置见: 手册 | Obfuzhttps://www.obfuz.com/docs/manual

Obfuz代码加固用法

准备工作

1. 通过菜单栏Obfuz/GenerateEncryptionVM生成虚拟机

2. 通过菜单栏Obfuz/GenerateSecretKeyFile生成密钥文件

3. 初始化Obfuz虚拟机

将以下代码加入AOT程序集中,运行时程序集加载后会自动执行,初始化虚拟机

 [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterAssembliesLoaded)] private static void SetUpStaticSecretKey() { Debug.Log(\"Setup Obfuz StaticSecret...\"); Obfuz.EncryptionService.Encryptor = new Obfuz.EncryptionVM.GeneratedEncryptionVirtualMachine(Resources.Load(\"Obfuz/defaultStaticSecretKey\").bytes); }

4. 使用[ObfuzIgnore]标记不需要混淆处理的代码

⚠注意, 通过反射调用的类和方法、以及需要序列化/反序列化的类,被混淆后就会报错或无法执行。因此需要严谨控制忽略混淆,否则会造成很大隐患。

Obfuz默认会忽略[SerializeField]标记的变量名,但如果是public类型,也必须标记[SerializeField]防止变量名被混淆导致无法反序列化。

[Obfuz.ObfuzIgnore][Serializable]public class ECSLODRender{ [SerializeField] public Mesh Mesh; [SerializeField] public Material Material;}

也可以控制忽略混淆的作用域:

[Obfuz.ObfuzIgnore(Obfuz.ObfuzScope.TypeName | Obfuz.ObfuzScope.MethodName)]

单机包(无热更)

对于单机包,直接构建项目Obfuz会自动对Assemblies To Obfuscate列表中配置的程序集进行混淆加密处理。

热更包(HybridCLR)

①构建App

构建App之前需要为混淆后的程序集生成link.xml文件(执行如下命令)

[MenuItem(\"HybridCLR/Obfuz GenerateLinkXml[混淆后代码裁剪配置]\", false, 5)]public static void GenerateLinkXml(){ CompileDllCommand.CompileDllActiveBuildTarget(); BuildTarget target = EditorUserBuildSettings.activeBuildTarget; var obfuzSettings = ObfuzSettings.Instance; var assemblySearchDirs = new List{ SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target),}; ObfuscatorBuilder builder = ObfuscatorBuilder.FromObfuzSettings(obfuzSettings, target, true); builder.InsertTopPriorityAssemblySearchPaths(assemblySearchDirs); Obfuscator obfuz = builder.Build(); obfuz.Run(); List hotfixAssemblies = SettingsUtil.HotUpdateAssemblyNamesExcludePreserved; var analyzer = new HybridCLR.Editor.Link.Analyzer(new HybridCLR.Editor.Meta.PathAssemblyResolver(builder.CoreSettingsFacade.obfuscatedAssemblyOutputPath)); var refTypes = analyzer.CollectRefs(hotfixAssemblies); // HyridCLR中 LinkXmlWritter不是public的,在其他程序集无法访问,只能通过反射操作 var linkXmlWriter = typeof(SettingsUtil).Assembly.GetType(\"HybridCLR.Editor.Link.LinkXmlWriter\"); var writeMethod = linkXmlWriter.GetMethod(\"Write\", BindingFlags.Public | BindingFlags.Instance); var instance = Activator.CreateInstance(linkXmlWriter); string linkXmlOutputPath = $\"{Application.dataPath}/Plugins/Obfuz/link.xml\"; writeMethod.Invoke(instance, new object[] { linkXmlOutputPath, refTypes }); Debug.Log($\"[GenerateLinkXmlForObfuscatedAssembly] output:{linkXmlOutputPath}\"); AssetDatabase.Refresh();}

使用HybridCLR->ObfuzExtension->GenerateAll命令替代HybridCLR->Generate->All命令

 ②打包热更

使用HybridCLR->ObfuzExtension->CompileAndObfuscateDll命令替代HybridCLR->CompileDll命令编译生成热更dll

使用GF_X自动化通用游戏框架

GF_X已经将Obfuz功能集成到一键打包工具,只需勾选Enable Obfuz即可启用代码混淆加密功能。无需手动执行任何命令行,BuildApp或Build Resources会自动根据ResourceMode(单机或热更)执行Obfuz相关流程。