Unity_Obfuscator Pro代码混淆工具_学习日志
切勿将密码或 API 密钥存储在您附带的应用程序内。
混淆后的热更新暂时没有想到怎么办
Obfuscator 文档
https://docs.guardingpearsoftware.com/manual/Obfuscator/Description.html
商店链接Obfuscator Pro(大约$70)
https://assetstore.unity.com/packages/tools/utilities/obfuscator-pro-89589
商店链接Obfuscator Free(免费版本)
https://assetstore.unity.com/packages/tools/utilities/obfuscator-free-89420
在github上开源的另外一个混淆工具
https://github.com/DrFlower/Unity-Obfuscator
反编译工具
https://github.com/icsharpcode/ILSpy
生成
https://github.com/icsharpcode/ILSpy/releases
插件版本v5.3.0
警告
如果有代码热更新,使用使用混淆的时候请进行详细的测试,避免找不到方法名
(启用/禁用)string类型混淆
启用之后的代码
if (num == 666935005)
{
_gameObject = base.gameObject.transform.Find(<PrivateImplementationDetails>{E1D950B9-0A02-402B-8227-E55CD61234BF}.a.h()).gameObject;
num = -138089121;
}
禁用之后的代码
if (num == -844616100)
{
_gameObject = base.gameObject.transform.Find("hello12311").gameObject;
num = -81965731;
}
源码:
void Start()
{
GameObject _gameObject = gameObject.transform.Find("hello12311").gameObject;
Debug.Log(_gameObject==null);
}
如果有地方依赖于string类型,可以考虑把string类型混淆关掉
json数据读取
序列化为json需要添加:[System.Serializable] [DoNotRename]
这两个特性,一个是序列化的特性,一个是禁止混淆的特性。
向https://jsonplaceholder.typicode.com/todos/1
发送请求会获取到json:{ "userId": 1, "id": 1, "title": "delectus aut autem", "completed": false }
,然后继续序列化的时候,序列化为 TodoItem
,进行字段匹配的时候,因为TodoItem 已经被混淆了 ,json中的字段和TodoItem 中的字段就不匹配了,就找不到了,就会报错!
添加了
没有添加
看起来一样,插件会自己添加特性,但是插件添加的,不能运行,运行就崩溃了。
private IEnumerator SendRequest()
{
UnityWebRequest webre = UnityWebRequest.Get("https://jsonplaceholder.typicode.com/todos/1");
yield return webre.SendWebRequest();
if (webre.result != UnityWebRequest.Result.Success)
{
Debug.LogError(webre.error);
}
else
{
Debug.Log(webre.downloadHandler.text);
var tmp_data = JsonUtility.FromJson<TodoItem>(webre.downloadHandler.text);
Debug.Log(tmp_data.id);
}
}
[System.Serializable]
[DoNotRename]
public class TodoItem
{
public int userId;
public int id;
public string title;
public bool completed;
}
协程方法名混淆
其中IeCreateLanch1
IeCreateLanch3
IeCreateLanch4
不会被混淆方法名, IeCreateLanch2
会被混淆方法名称
void Start()
{
StartCoroutine(nameof(IeCreateLanch1));
StartCoroutine(IeCreateLanch2());
StartCoroutine("IeCreateLanch3");
StartCoroutine("IeCreateLanch4");
}
private IEnumerator IeCreateLanch1()
{
GameObject.CreatePrimitive(PrimitiveType.Cube);
Debug.Log(" StartCoroutine(nameof(IeCreateLanch1));");
yield return null;
}
private IEnumerator IeCreateLanch2()
{
GameObject.CreatePrimitive(PrimitiveType.Capsule);
Debug.Log(" StartCoroutine(IeCreateLanch2());");
yield return null;
}
private IEnumerator IeCreateLanch3()
{
GameObject.CreatePrimitive(PrimitiveType.Cylinder);
Debug.Log(" StartCoroutine(\"IeCreateLanch3\");");
yield return null;
}
[DoNotRename]
private IEnumerator IeCreateLanch4()
{
GameObject.CreatePrimitive(PrimitiveType.Sphere);
Debug.Log("StartCoroutine(\"IeCreateLanch4\");");
yield return null;
}
在动画组件上使用公开的方法
动画事件,在这里被调用的方法建议加上[DoNotRenameAttribute] 放置被混淆
快速上手
启动插件
发布即可
详细教程
混淆器是一种软件工具,旨在将游戏、应用程序或程序的源代码转换为人类更难理解的版本,同时仍保持其原始功能。它通过将变量、方法和类重命名为无意义或误导性的名称,并以掩盖其逻辑和流程的方式更改代码结构来实现这一点。
使用 Obfuscator 的主要目的是保护软件的知识产权。通过使代码更难阅读和分析,未经授权的个人对软件进行逆向工程、复制或修改变得更具挑战性。这一额外的安全层有助于防止软件盗版、知识产权盗窃和未经授权的篡改,从而保护开发人员的工作和投资。
混淆_Obfuscation:代码混淆的常规设置。这包括要对哪些程序集进行模糊处理的规范,以及对它们各自的类和成员进行模糊处理的详细说明。
安全性_Security:包含高级安全设置,如“字符串混淆”、“随机代码生成”等。
兼容性_Compatibility:由于 Unity 的独特运行方式,某些第三方资源需要特定配置以确保与混淆兼容。
选项_Optional:包含可选的集成设置。例如,‘Custom Obfuscation Pattern’、‘Logging’、‘Name Mapping’ 等。
省流
下面是https://docs.guardingpearsoftware.com/manual/Obfuscator/Description.html
的电子翻译版本。
如果插件不能正确序列化?修改:Obfuscation 里的Assembly-Settings 的依赖项
。
添加随机代码:安全性_Security 下找 Add Random Code - Settings 关闭即可。
不混淆字符串:安全性_Security 下找 String - Settings 关闭即可。
混淆_Obfuscation
Assembly-Settings
管理需要混淆的程序集:
- 混淆 Assembly-CSharp:混淆默认的 Unity 程序集
Assembly-CSharp.dll
。该程序集包含未通过 Assembly Definition File 添加到子程序集中的代码。 - 混淆 Assembly-CSharp-firstpass:混淆默认的 Unity 插件程序集
Assembly-CSharp-firstpass.dll
。该程序集包含未通过 Assembly Definition File 添加到子程序集中的代码,并且可以在 Plugins 目录中找到。 - 混淆位于‘Assets’目录中的 Assembly Definition File:混淆通过 Assembly Definition File 在
[Root]/Assets
目录及其子目录中定义的子程序集中的代码。 - 混淆位于‘Packages’目录中的 Assembly Definition File:混淆通过 Assembly Definition File 在
[Root]/Packages
目录及其子目录中定义的子程序集中的代码。 - 混淆外部程序集:如果只想混淆特定程序集或第三方程序集,请在此处添加。
- 依赖项:如果混淆器无法解析第三方依赖,则需在这里添加其完整路径。
NameSpace-Settings
管理命名空间及其类的混淆:
- 混淆命名空间:混淆类的命名空间。此选项必须启用才能混淆 MonoBehaviour 类。
- 跳过以下命名空间:在此处添加希望忽略混淆的命名空间。这将跳过这些命名空间内所有类及其成员的混淆。输入的命名空间被视为前缀,因此输入 GoogleSdk 也会跳过 GoogleSdk.Lib。
- 反转命名空间忽略:反转命名空间忽略。启用后,只有那些指定命名空间内的类和它们的成员会被混淆。
Class - Settings
管理类的混淆:
- 基于访问级别混淆(内部/私有/受保护/公共):根据访问级别混淆类名。
- 混淆抽象类:混淆抽象类的名字。
- 混淆泛型类:混淆泛型类的名字。
- 混淆可序列化类:混淆可序列化类的名字及字段。仅建议在数据在运行时序列化并在混淆之后使用时使用。否则,序列化类内的名称将不匹配并导致错误。
- 混淆 MonoBehaviour 子类:混淆 MonoBehaviour 类的名字。需要混淆命名空间。
- 混淆外部程序集中 MonoBehaviour 子类:混淆第三方或预编译程序集中的 MonoBehaviour 类的名字。需要混淆命名空间。
- 混淆 ScriptableObject 子类:混淆 ScriptableObject 类的名字及其字段。仅建议不在序列化 ScriptableObject 到 .assets 文件或通过 Unity 检查器赋值的情况下使用。否则保存的已混淆数据名称将不匹配并产生错误。
- 混淆 Playable 子类:混淆 Playable 类的名字。
Method - Settings
管理方法的混淆:
- 基于访问级别混淆(内部/私有/受保护/公共):根据访问级别混淆方法名。
Parameter - Settings
管理参数的混淆:
- 混淆方法参数:混淆通用方法参数。普通参数在构建代码中没有“名称”,只有 ID,所以不需要或不可能混淆。
- 混淆类参数:混淆通用类参数。
Field - Settings
管理字段的混淆:
- 基于访问级别混淆(内部/私有/受保护/公共):根据访问级别混淆字段名。
- 混淆序列化字段:混淆
MonoBehaviour/ScriptableObject
类中序列化字段的名称。这些字段带有SerializeField
属性。仅推荐在数据在运行时序列化并在混淆后使用,并且不通过 Unity 检查器分配的情况下使用。否则序列化类中的名称将不匹配并产生错误。 - 混淆 Unity 公开字段:混淆
MonoBehaviour/ScriptableObject
类中公开字段的名称。同样仅推荐在数据在运行时序列化并在混淆后使用,并且不通过 Unity 检查器分配的情况下使用。 - 混淆枚举值:混淆枚举中的字段名称。
Property - Settings
管理属性的混淆:
- 基于访问级别混淆(内部/私有/受保护/公共):根据访问级别混淆属性名。
Event - Settings
Event - Settings
管理事件的混淆:
- 基于访问级别混淆(内部/私有/受保护/公共):根据访问级别混淆事件名。
安全性_Security
Add Random Code - Settings 随机代码 - 设置
添加随机代码:
激活 以根据现有和新生成的方法注入随机代码。
Method Control Flow - Settings 方法控制流程 - 设置
方法中的控制流是指执行单个语句、指令或函数调用的顺序。控制流的混淆会导致分布式顺序,而不是默认的自上而下的顺序,因此很难理解该方法的实际作用。
String - Settings 字符串 - 设置
Supress ILDasm - Settings Supress ILDasm - 设置
将 SuppressILDasmAttribute 添加到程序集中。阻止 Visual Studio 等 IDE 调试代码。
Anti Tampering - Settings 防篡改 - 设置
在运行时执行微检查以防止程序集操作。一旦检测到篡改,应用程序将中止并出现 BadImageFormatException。
兼容性_Compatibility
建议自己看看,一般不需要处理,如果插件不能正常工作,则在Addressable 添加插件的地址,unity插件的地址
https://docs.guardingpearsoftware.com/manual/Obfuscator/Settings/Compatibility.html#common---settings
选项_Optional
日志记录 (Logging)
Obfuscator 包含一个内部的日志系统来记录其所有操作。默认情况下,日志将存储在 Assets/OPS/Obfuscator/Log/{BuildTarget}.txt
路径下。如果遇到任何问题,请将日志文件连同问题描述一起发送给Obfuscator团队以帮助诊断和解决问题。
设置选项
- 使用自定义日志文件 (Use a custom log file): 激活此设置以定义自定义日志文件位置。
- 自定义日志文件路径 (Custom log file path): 自定义日志文件的路径。
属性管理 (Attributes)
Obfuscator 提供了一系列属性来微调源代码级别的混淆过程。在此部分可以管理和自定义这些附加属性。
设置选项
- 自定义 ‘DoNotRename’ 属性 (Custom ‘DoNotRename’ Attributes):
DoNotRename
属性可以跳过类或成员的混淆。有时使用具有相同行为的自定义属性会更方便。在此处添加名称。
名称重命名 (Renaming)
您可以在此处自定义Obfuscator用于混淆源代码的字符集。还可以启用混淆映射文件的保存和加载功能。该文件记录了类、方法、字段等的原始名称及其对应的混淆名称。
设置选项
- 活动重命名模式 (Active renaming pattern): 使用预定义的字符集进行混淆或定义自己的字符集。根据构建目标,并非所有字符都受支持,但默认模式始终适用。
- 自定义重命名模式 (Custom renaming pattern): 如果选择使用自定义字符集,则在这里添加您想要使用的字符,无需任何分隔符。
- 加载混淆映射文件 (Load an obfuscation mapping file): 激活此设置以加载混淆映射文件。
- 加载映射文件路径 (Load mapping file path): 输入加载混淆映射文件的路径。
- 保存混淆映射文件 (Save an obfuscation mapping file): 激活此设置以保存混淆映射文件。
- 保存映射文件路径 (Save mapping file path): 输入保存混淆映射文件的路径。
映射文件的好处
- 一致的混淆: 确保相同的元素总是用相同的名称混淆,保持不同构建之间的一致性。
- 错误调试: 通过提供混淆元素的原始名称来帮助解析错误堆栈跟踪,使识别和解决问题更加容易。
特性
特性文档
https://docs.guardingpearsoftware.com/manual/Obfuscator/Attributes.html
-
DoNotRenameAttribute:
- 作用于类、字段、方法或其他成员,防止它们的名字被重命名(即不混淆名字)。
- 示例代码:
[DoNotRenameAttribute] public class MyClass { [DoNotRenameAttribute] public void MyMethod(); }
-
DoNotObfuscateClassAttribute:
- 应用于类上,防止整个类及其中的所有成员被混淆(除了方法体)。
- 示例代码:
[DoNotObfuscateClassAttribute] public class MyClass { public void MyMethod(); }
-
DoNotObfuscateMethodBodyAttribute:
- 应用于类或具体的方法上,防止方法体内的内容被混淆。
- 示例代码:
[DoNotObfuscateMethodBodyAttribute] public class MyClass { [DoNotObfuscateMethodBodyAttribute] public void MyMethod() { var someString = "This string will not be obfuscated"; } }
-
DoNotUseClassForFakeCodeAttribute:
- 防止在类中添加假代码或随机代码,也禁止基于此类生成新的假类。
- 示例代码:
[DoNotUseClassForFakeCodeAttribute] public class MyClass { public void MyMethod(); }
-
ObfuscateAnywayAttribute:
- 强制混淆指定的类成员,即使其他设置阻止混淆。
- 示例代码:
[ObfuscateAnywayAttribute("CustomClassName")] public class MyClass { [ObfuscateAnywayAttribute("CustomMethodName")] public void MyMethod(); }
-
ObfuscationAttribute:
- 支持.NET框架内置的
System.Diagnostics.ObfuscationAttribute
,用于指定是否应将程序集、类型或成员排除在混淆之外。 - 示例代码:
[ObfuscationAttribute(Exclude = true, ApplyToMembers = false)] public class MyClass { [ObfuscationAttribute(Exclude = true, ApplyToMembers = false)] public void MyMethod(); }
- 支持.NET框架内置的
通过这些属性,开发者可以根据需要选择性地保护代码的部分不受混淆影响,或者强制某些部分必须混淆。这样既能保证代码的安全性,也能保持必要的可读性和功能性。
错误堆栈查找
我试了几下,没有找到办法,让显示混淆后的代码的错误堆栈,
https://docs.guardingpearsoftware.com/manual/Obfuscator/Faq.html
恢复设置(没有找到)
是的,要么是没有,要么是没有找到。