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.xdnf.cn/news/1557142.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

sqli-labs靶场第三关less-3

sqli-labs靶场第三关less-3 1、确定注入点 http://192.168.128.3/sq/Less-3/?id1 http://192.168.128.3/sq/Less-3/?id2 有不同回显&#xff0c;判断可能存在注入&#xff0c; 2、判断注入类型 输入 http://192.168.128.3/sq/Less-3/?id1 and 11 http://192.168.128.3/sq/L…

Nginx07-静态资源访问

零、文章目录 Nginx07-静态资源访问 1、Nginx解决跨域问题 &#xff08;1&#xff09;同源策略 同源策略&#xff08;Same-Origin Policy&#xff09;是一个关键的网络安全概念&#xff0c;由Netscape公司在1995年引入&#xff0c;现在被所有现代浏览器所采用。它限制了从一…

每日一题|871. 最低加油次数|动态规划、内层逆序遍历

题目分析&#xff1a;找到第一个能够实现当前油量能够行驶的最大距离大于等于目标距离&#xff0c;且加油次数最小的加油站和加油次数。 每次加油之后能够行驶的最大距离都是由上一次加油的距离决定的&#xff0c;因此使用dp。 1、dp数组定义 dp[i]是一个一维数组&#xff0…

毕业设计项目 深度学习安全帽佩戴检测(源码+论文)

文章目录 0 前言1 项目运行效果2 设计概要3 最后 0 前言 &#x1f525;这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师…

keras yolo8目标检测

是从coco数据集提取其中的veh_ids[3,6,8,10] labels[car,bus,truck,traffic light]来做目标检测,分别表示汽车,公交车&#xff0c;卡车&#xff0c;交通灯,用的backbone keras_cv.models.YOLOV8Backbone.from_preset( "yolo_v8_m_backbone_coco" ),不用预训练…

JVM 内存区域 堆

堆是JVM中相当核心的内容&#xff0c;因为堆是JVM中管理的最大一块内存区域&#xff0c;大部分的GC也发生在堆区&#xff0c;那接下来就让深入地探究一下JVM中的堆结构。 需要明确&#xff0c;一个JVM实例只存在一个堆内存&#xff0c;堆区在JVM启动的时候就被创建&#xff0c…

(贪心) 反悔贪心之反悔堆

文章目录 ⭐例题&#x1f6a9;题意与思路 ⭐返回贪心&#x1f6a9;原理&#xff08;反悔池&#xff09;&#x1f6a9;落实到题&#x1f6a9;AC code ⭐练习题⭐END&#x1f31f;交流方式 ⭐例题 经典例题&#xff1a; 871. 最低加油次数 &#x1f6a9;题意与思路 题意&#xf…

MATLAB与R语言在建模中的合作与应用(下篇)

目录 目录 模型训练的协同使用 1. 使用 R 语言进行统计建模 2. 使用 MATLAB 进行机器学习建模 模型评估与调优 1. 在 R 中评估模型性能 2. 在 MATLAB 中进行模型优化 实战示例&#xff1a;MATLAB 与 R 的协同建模 总结 在上篇文章中&#xff0c;我们介绍了 MATLAB 和 R…

2024兴国专转本长期集训产品发布!

9月13日&#xff0c;兴国教育2024长期集训产品发布会在江苏南京顺利召开。 成立于2002年的兴国品牌&#xff0c;时至今日&#xff0c;已经走过了二十二年。兴国新媒体发言人祁老师在发布会上&#xff0c;为大家介绍了兴国这二十年来的变化。 截至2024年8月&#xff0c;兴国在全…

论文阅读:Split-Aperture 2-in-1 Computational Cameras (二)

Split-Aperture 2-in-1 Computational Cameras (一) Coded Optics for High Dynamic Range Imaging 接下来&#xff0c;文章介绍了二合一相机在几种场景下的应用&#xff0c;首先是高动态范围成像&#xff0c;现有的快照高动态范围&#xff08;HDR&#xff09;成像工作已经证…

ctf.bugku - 本地管理员

题目来源&#xff1a;本地管理员 - Bugku CTF 访问页面 页面的最后返回一个字符串&#xff1b; 结尾 应该是base64 编码&#xff1b; 解码得到 test123 同时&#xff0c;提示信息还有 IP禁止访问&#xff0c;本地管理员登陆&#xff1b; 所以&#xff0c;请求头添加&#x…

【AI知识点】残差网络(ResNet,Residual Networks)

残差网络&#xff08;ResNet&#xff0c;Residual Networks&#xff09; 是由微软研究院的何凯明等人在 2015 年提出的一种深度神经网络架构&#xff0c;在深度学习领域取得了巨大的成功。它通过引入残差连接&#xff08;Residual Connection&#xff09; 解决了深层神经网络中…

基于图像的3D动物重建与生成

一、背景与目标 3D-Fauna 是一款用于基于图像和视频进行四足动物3D重建与生成的开源方案。自然界展示了复杂的相似性与多样性,该方法通过学习来自网上图片的四足动物的3D形态,能够从单张图片生成可动画化的带有纹理的3D网格模型。其最终目标是通过大量扩展现有的解决方案,实…

【网络篇】计算机网络——运输层详述(笔记)

目录 一、运输层 1. 概述 2. 运输层和网络层的关系 3. 运输层协议概述 二、多路复用和多路分解 1. 综述 2. 无连接的多路复用与多路分解&#xff08;UDP&#xff09; 3. 面向连接的多路复用与多路分解&#xff08;TCP&#xff09; 4. Web 服务器与TCP 三、UDP&#x…

Django学习笔记十三:优秀案例学习

Django CMS 是一个基于 Django 框架的开源内容管理系统&#xff0c;它允许开发者轻松地创建和管理网站内容。Django CMS 提供了一个易于使用的界面来实现动态网站的快速开发&#xff0c;并且具有丰富的内容管理功能和多种插件扩展。以下是 Django CMS 的一些核心特性和如何开始…

力扣之1336.每次访问的交易次数

题目&#xff1a; sql建表语句&#xff1a; Create table If Not Exists Visits (user_id int, visit_date date); Create table If Not Exists Transactions (user_id int, transaction_date date, amount int); Truncate table Visits; insert into Visits (user_id,…

Unity3d使用JsonUtility.FromJson读取json文件

使用JsonUtility.FromJson方法不需要额外引用第三方库。该方法只能读取json对象&#xff0c;而不能读取json数组。 假如我们有如下的json数组&#xff1a; [ {"id":1, "name":"first2021", "level":5, "score":100, "…

The 2024 ICPC Kunming Invitational Contest F. Collect the Coins(二分)

在知乎内查看 题目 思路来源 官方题解 题解 一旦某个速度v满足&#xff0c;那么大于速度v的都满足&#xff0c;所以可以被二分&#xff0c;但是二分的check不好想&#xff0c;卡住了 最后去看了题解&#xff0c;其实维护的是&#xff0c;一个机器人在目标点收集硬币时&…

UGUI(三大现成UI控件)

Rawimage 可以是任意类型的图&#xff0c;所以这里的泛型就更宽泛&#xff0c;不止sprite 相比Image唯二的不同 uvrect有点像平铺 Text suddenly come to a Free island. best fit开启后会有范围选择 Image image 组件是挂在RectTransform的ui下的&#xff0c;换句话说&…

windows C++-创建数据流代理(二)

完整的数据流演示 下图显示了 dataflow_agent 类的完整数据流网络&#xff1a; 由于 run 方法是在一个单独的线程上调用的&#xff0c;因此在完全连接网络之前&#xff0c;其他线程可以将消息发送到网络。 _source 数据成员是一个 unbounded_buffer 对象&#xff0c;用于缓冲…