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
  1. DoNotRenameAttribute

    • 作用于类、字段、方法或其他成员,防止它们的名字被重命名(即不混淆名字)。
    • 示例代码:
      [DoNotRenameAttribute]
      public class MyClass
      {
          [DoNotRenameAttribute]
          public void MyMethod();
      }
      
  2. DoNotObfuscateClassAttribute

    • 应用于类上,防止整个类及其中的所有成员被混淆(除了方法体)。
    • 示例代码:
      [DoNotObfuscateClassAttribute]
      public class MyClass
      {
          public void MyMethod();
      }
      
  3. DoNotObfuscateMethodBodyAttribute

    • 应用于类或具体的方法上,防止方法体内的内容被混淆。
    • 示例代码:
      [DoNotObfuscateMethodBodyAttribute]
      public class MyClass
      {
          [DoNotObfuscateMethodBodyAttribute]
          public void MyMethod()
          {
              var someString = "This string will not be obfuscated";
          }
      }
      
  4. DoNotUseClassForFakeCodeAttribute

    • 防止在类中添加假代码或随机代码,也禁止基于此类生成新的假类。
    • 示例代码:
      [DoNotUseClassForFakeCodeAttribute]
      public class MyClass
      {
          public void MyMethod();
      }
      
  5. ObfuscateAnywayAttribute

    • 强制混淆指定的类成员,即使其他设置阻止混淆。
    • 示例代码:
      [ObfuscateAnywayAttribute("CustomClassName")]
      public class MyClass
      {
          [ObfuscateAnywayAttribute("CustomMethodName")]
          public void MyMethod();
      }
      
  6. ObfuscationAttribute

    • 支持.NET框架内置的System.Diagnostics.ObfuscationAttribute,用于指定是否应将程序集、类型或成员排除在混淆之外。
    • 示例代码:
      [ObfuscationAttribute(Exclude = true, ApplyToMembers = false)]
      public class MyClass
      {
          [ObfuscationAttribute(Exclude = true, ApplyToMembers = false)]
          public void MyMethod();
      }
      

通过这些属性,开发者可以根据需要选择性地保护代码的部分不受混淆影响,或者强制某些部分必须混淆。这样既能保证代码的安全性,也能保持必要的可读性和功能性。

错误堆栈查找

我试了几下,没有找到办法,让显示混淆后的代码的错误堆栈,

https://docs.guardingpearsoftware.com/manual/Obfuscator/Faq.html

恢复设置(没有找到)

是的,要么是没有,要么是没有找到。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部