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

恢复设置(没有找到)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/887950.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker面试-24年

1、Docker 是什么&#xff1f; Docker一个开源的应用容器引擎&#xff0c;是实现容器技术的一种工具&#xff0c;让开发者可以打包他们的应用以及环境到一个镜像中&#xff0c;可以快速的发布到任何流行的操作系统上。 2、Docker的三大核心是什么? 镜像&#xff1a;Docker的…

fiddler抓包17_简单接口测试(Composer请求编辑)

课程大纲 ① 进入“Composer”&#xff08;请求编辑&#xff09;界面&#xff1a; Fiddler右侧标签菜单选择“Composer”&#xff0c;中文“请求编辑” 。 ② 编辑、发送请求&#xff1a; 填写接口请求信息&#xff08;或从左侧列表直接拖拽填充&#xff09;&#xff0c;点击“…

如果您忘记了 Apple ID 和密码,按照指南可重新进入您的设备

即使您的 iPhone 或 iPad 由于各种原因被锁定或禁用&#xff0c;也可以使用 iTunes、“查找我的”、Apple 支持和 iCloud 解锁您的设备。但是&#xff0c;此过程需要您的 Apple ID 和密码来验证所有权并移除激活锁。如果您忘记了 Apple ID 和密码&#xff0c;请按照我们的指南重…

问题系列---Android Studio调试services源码不显示参数值

戳蓝字“牛晓伟”关注我哦&#xff01; 用心坚持输出易读、有趣、有深度、高质量、体系化的技术文章&#xff0c;技术文章也可以有温度。 前言 问题系列主要的作用是把我在研究Android源码过程中遇到的各种问题集合起来&#xff0c;当然这些问题在Stack Overflow、google是没…

初识Linux · 自主Shell编写

目录 前言&#xff1a; 1 命令行解释器部分 2 获取用户命令行参数 3 命令行参数进行分割 4 执行命令 5 判断命令是否为内建命令 前言&#xff1a; 本文介绍是自主Shell编写&#xff0c;对于shell&#xff0c;即外壳解释程序&#xff0c;我们目前接触到的命令行解释器&am…

【CKA】一、基于角色的访问控制-RBAC

1、基于角色的访问控制-RBAC 1. 考题内容&#xff1a; 2. 答题思路&#xff1a; 这道题就三条命令&#xff0c;建议直接背熟就行。 也可以查看帮助 kubectl create clusterrole -h kubectl create serviceaccount -h kubectl create rolebinding -h 注意&#xff1a; 1、资…

VirtualBox虚拟机连接宿主机并能够上网(小白向)

现存问题 windows系统主要使用vmare和virtualbox两种虚拟机&#xff0c;virtualbox相对于vmare更加轻便&#xff0c;但少有博客能够详细说明使用virtualbox的教程。踩了网上的坑后&#xff0c;决定写一篇文章介绍virtualbox虚拟机上网的流程。 需求 1. virtualbox虚拟机与宿主机…

Android SystemUI组件(10)禁用/重启锁屏流程分析

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节的思维导图&#xff0c;主要关注左侧上方锁屏分析部分 应用入口处理流程解读 即可。 在 Android 系统中&#xff0c;禁用锁屏…

AI学习记录 - L2正则化详细解释(权重衰减)

大白话&#xff1a; 通过让反向传播的损失值变得比原来更大&#xff0c;并且加入的损失值关联到神经网络全部权重的大小&#xff0c;当出现权重的平方变大的时候&#xff0c;也就是网络权重往更加负或者更加正的方向走的时候&#xff0c;损失就越大&#xff0c;从而控制极大正…

【PostgreSQL】PG数据库表“膨胀”粗浅学习

文章目录 1 为什么需要关注表膨胀&#xff1f;2 如何确定是否发生了表膨胀&#xff1f;2.1 通过查询表的死亡元组占比情况来判断膨胀率2.1.1 指定数据库和表名2.1.2 查询数据库里面所有表的膨胀情况 3 膨胀的原理3.1 什么是膨胀&#xff1f;膨胀率&#xff1f;3.2 哪些数据库元…

Unity Asset Store的默认下载位置及更改下载路径的方法

修改Unity Asset Store的默认下载路径 Unity Asset Store默认下载位置 Unity Asset Store里下载资源&#xff0c;默认是下载到C盘里的&#xff0c;如果你不想做C盘战士的话&#xff0c;记得将下载的资源转移到其他盘。 Unity商城默认下载路径是C:\用户\用户名&#xff08;一般…

晶体管最佳效率区域随频率逆时针旋转原因分析

晶体管最佳效率区域随频率逆时针旋转原因分析 在功率放大器的设计时&#xff0c;晶体管最佳区域随频率逆时针旋转。但是&#xff0c;对于一般的微带电路&#xff0c;匹配阻抗区域是随着频率顺时针旋转的&#xff08;也有称这个特性是Foster特性&#xff09;&#xff0c;因此功…

UE5学习笔记23-给角色添加血量,添加收到伤害的功能

零、一些游戏框架知识 1.UE5中包含游戏模式类(Game Mode)、游戏状态类(Game State)、玩家状态类(Player State)、玩家控制器类(Player Controller)、所有的可以被控制的实体或角色类(Pawn)、窗口类(HUD/Widget) Game Mode&#xff1a;存在在服务器上&#xff0c;当我们在客户端…

Redis实现每日签到(大数据量)

PHP语言使用Redis NoSQL服务器二进制数据类型实现大数据情况下签到功能 目录 问题 解决方式 封装签到类 功能调用 总结 问题 实现用户每日签到功能不难&#xff0c;但随着用户量上升之后&#xff0c;不论是存储还是判断对数据量来说都很麻烦&#xff1b;假如每天有100万用…

【STM32开发环境搭建】-4-在STM32CubeMX中新增Keil(MDK-ARM) 5的工程目录(包含指定路径的C和H文件)

案例背景&#xff1a; 由于Keil(MDK-ARM)5工程&#xff1a;DEMO_STM32F030C8T6.uvprojx是由STM32CubeMX工具生成的&#xff0c;如果我们在Keil工程中手动添加了一些c文件和h文件的Include Path包含路径&#xff0c;会在STM32CubeMX下一次生成uvprojx文件时&#xff0c;被删除&…

C语言复习概要(四)

本文 1. 操作符的分类算术操作符关系操作符逻辑操作符 2. 二进制制和进制转换二进制与十六进制的表示进制转换算法 3. 原码、反码和补码原码反码补码 1. 操作符的分类 C语言中的操作符种类繁多&#xff0c;常用的主要操作符可以按照其功能进行如下分类&#xff1a; 算术操作符…

Emergency Stop (ES)

文章目录 1. 介绍2. Feature List3. 紧急停止信号触发方式3.1 Port触发紧急停止信号3.2 SMU事件触发紧急停止信号3.3 软件触发紧急停止信号 4. 应用场景4.1 Port4.2 MSC 1. 介绍 Emergency Stop (ES)是Ifx System Control Units (SCU)六大模块之一。详细信息可以参考Infineon-…

毕设 大数据抖音短视频数据分析与可视化(源码)

文章目录 0 前言1 课题背景2 数据清洗3 数据可视化地区-用户观看时间分界线每周观看观看路径发布地点视频时长整体点赞、完播 4 进阶分析相关性分析留存率 5 深度分析客户价值判断 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕…

以太网交换安全:MAC地址表安全

一、MAC地址表安全 MAC地址表安全是网络安全中的一个重要方面&#xff0c;它涉及到网络设备的MAC地址表的管理和保护。以下是对MAC地址表安全的详细介绍&#xff1a; &#xff08;1&#xff09;基本概念 定义&#xff1a;MAC地址表是网络设备&#xff08;如交换机&#xff0…

阿里云域名注册购买和备案

文章目录 1、阿里云首页搜索 域名注册2、点击 控制台3、域名控制台 1、阿里云首页搜索 域名注册 2、点击 控制台 3、域名控制台