Unity_Obfuscator Pro代码混淆工具_学习日志

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

恢复设置(没有找到)

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

淘宝花钱买的最新版!需要的拿去! This asset obfuscates your code to make it harder for bad guys to reverse engineer your projects. Specifically designed for Unity, it seamlessly links in with its build process. The top priority of this package is to work straight out of the box with no extra steps required. While other obfuscators can stop a game from working, Beebyte's obfuscator looks for specific Unity related code that must be protected. The contents of your source files are unchanged, the obfuscation targets the compiled assembly. Features: - Supports IL2CPP - Supports Assembly Definition Files (Unity 2017.3+) - Removes Namespaces without any conflicts - Recognises Unity related code that must not be changed - Renames Classes (including MonoBehaviours) - Renames Methods - Renames Parameters - Renames Fields - Renames Properties - Renames Events - String literal obfuscation - Adds fake methods - Easy and extensive customisation using the Unity inspector window - Consistent name translations are possible across multiple builds and developers - Semantically secure cryptographic naming convention for renamed members The asset works for both Unity Free and Unity Pro version 4.2.0 onwards (including Unity 5 & 2017 & 2018). Build targets include Standalone, Android, iOS, WebGL, UWP. Other platforms are not guaranteed or supported but may become supported at a future date. IL2CPP builds are much harder to reverse engineer but strings and member information (class, method names etc) are visible in the global-metadata.dat file. Obfuscation will apply to this file adding further security. Why not complement your security with the Anti-Cheat Toolkit - a great third party asset. For more information about the Obfuscator, please see the FAQ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值