【Unity3D】Unity混淆工具Obfuscator使用

目录

一、导入工具

二、各种混淆形式介绍

2.1 程序集混淆

2.2 命名空间混淆

2.3 类混淆

2.4 函数混淆

2.5 参数混淆

2.6 字段混淆

2.7 属性混淆

2.8 事件混淆

三、安全混淆

四、兼容性处理

4.1 动画方法兼容

4.2 GUI方法兼容

4.3 协程方法兼容

五、选项

5.1 调试日志输出目录定义

5.2 标签属性设置

5.3 混淆映射文件


一、导入工具

收费版:Obfuscator Pro | Utilities Tools | Unity Asset Store 

免费版:Obfuscator Free | Utilities Tools | Unity Asset Store 

Unity 2019.4.0f1 使用免费版

注意AssetStore点击添加到的是5.0版本,实际可能会不兼容你所在的Unity版本,故需要重启Unity,再次打开My Assets找到Obfuscator Free再Import,若网络不正常请检查是否开启了代理,需关闭代理。

导入成功后会看到如下内容 

 

再导入一个NewtonsoftJson插件:com.unity.nuget.newtonsoft-json

准备一个查看dll的工具 ILSky(本次测试只看Window平台打包后的混淆代码)

https://sourceforge.net/projects/ilspy.mirror/files/v9.0/ILSpy_Installer_9.0.0.7889-x64.msi/download

注意这个ILSky也有版本区分,上面是是给window系统用的,其他系统对应找对应的版本下载。

创建Test.cs脚本添加如下常用代码,TestA是一个程序集文件

using Newtonsoft.Json;
using UnityEngine;
namespace TestA
{public class Space{public int width;public int height;public int depth;}public class Test : MonoBehaviour{string json = "{\"width\":666,\"height\":777,\"depth\":1000}";void Start(){Space space = JsonConvert.DeserializeObject<Space>(json);PrintSpace(space);}void PrintSpace(Space space){Debug.Log(space.width);Debug.Log(space.height);Debug.Log(space.depth);}}
}

二、各种混淆形式介绍

2.1 程序集混淆

 混淆后

屏蔽TestA.dll混淆

2.2 命名空间混淆

将Test.cs脚本的命名空间从Test改为TestA_NameSpace(方便观察区分)混淆后

 屏蔽TestA_NameSpace混淆

 尚不清楚有何作用的选项,不需要开启这个。

2.3 类混淆

可能由于是免费版,故有这种黄底颜色的混淆无法使用。

 屏蔽混淆泛型类,例如上面的Space_Generic<T>泛型类,其他类会正常混淆。

2.4 函数混淆

 屏蔽Public类型函数

2.5 参数混淆

正常混淆

屏蔽混淆函数参数后会如下

2.6 字段混淆

 

2.7 属性混淆

 屏蔽公共属性混淆

2.8 事件混淆

 屏蔽公共事件混淆

 

三、安全混淆

四、兼容性处理

4.1 动画方法兼容

动画帧调用的脚本方法不会被混淆

 

测试取消这个兼容,也一样会忽略混淆。

4.2 GUI方法兼容

4.3 协程方法兼容

关闭兼容后

其中CoroutineFunc2和CoroutineFunc3会找不到报错,所以需要开启兼容,即不会对协程方法进行混淆处理。

即使添加传参,也是没有对参数进行混淆的,不过有些局部参数名有混淆。

因此如果想对协程方法进行混淆,要保证全部调用协程方法的形式是

 StartCoroutine(CoroutineFunc1());

并关闭兼容协程方法处理

五、选项

5.1 调试日志输出目录定义

默认日志文件

5.2 标签属性设置

参考:Attributes | GuardingPearSoftware documentation

原有[DoNotRename]标签忽略混淆名称,现在可以自定义标签属性如下:name参数是非必要的

作为一个忽略混淆名称使用,例如忽略混淆这个方法名。

5.3 混淆映射文件

如上图我启动了映射文件,并设置了一个文本文件路径作为保存的文件路径,内容是保存各种映射关系。

测试映射文件作用,可以将错误日志反混淆显示;

案例:故意搞一个错误的代码,如下:

使用Log Viewer调试插件看打包后报错日志

Log Viewer | Integration | Unity Asset Store

导入后需要创建调试器物体在场景上

打包查看

打包运行 查看报错日志,发现是混淆名称

开启混淆映射文件

测试发现依旧没有变化,即并没有改动实际运行时的日志输出,只能通过这个工具查看反混淆后的日志

通过ILSpy查看ErrorStackEditor内容,可以通过如下方法动态执行上面这个过程来加速我们的反混淆日志文件速度。

public string Deobfuscate(string obfuscatorText)
{//OPS.Obfuscator.Editor.dll是ErrorStackWindow所在的程序集文件Assembly assembly1 = Assembly.LoadFile("Assets/OPS/Obfuscator/Editor/Plugins/OPS.Obfuscator.Editor.dll");Type type = assembly1.GetType("OPS.Obfuscator.Editor.Gui.ErrorStackWindow");var instance = EditorWindow.GetWindow(type);//1、填写 File Path 字符串对象,如果想了解可以打开ILSky查看 可能不同版本的混淆情况不同//1.1 从程序集找到232类型(相当于Text组件)Type type232 = assembly1.GetType("232");//1.2 找到232类型的1550属性(相当于Text.text属性)var property232_1550 = type232.GetProperty("1550", BindingFlags.Instance | BindingFlags.Public);//1.3 获取ErrorStackWindow类的名为1382的私有字段(相当于Text组件字段)var field1382Info = type.GetField("1382", BindingFlags.Instance | BindingFlags.NonPublic);//1.4 获取instance实例的1382字段(相当于获取ErrorStackWindow对象里的名为1382字段,它是一个Text组件对象)var v1382 = field1382Info.GetValue(instance);//1.5 将映射文件路径填充到v1382.text字段,v1382是一个Text对象property232_1550.SetValue(v1382, @"E:\UnityProject\UnityHunXiaoObfuscatorProDemo\Assets\Scripts\TestA\ObMapFile.json");//2 填写输入文本(混淆内容文本)//2.1 获取程序集的221类型(相当于Area组件)Type type221 = assembly1.GetType("221");//2.2 获取221类型的1550属性(相当于Area.text属性)var property221_1550 = type221.GetProperty("1550", BindingFlags.Instance | BindingFlags.Public);//2.3 获取ErrorStackWindow类的名为1383的私有字段(相当于Area组件类型名为1383的字段)var field1383Info = type.GetField("1383", BindingFlags.Instance | BindingFlags.NonPublic);//2.4 获取instance实例的1383字段var v1383 = field1383Info.GetValue(instance);//2.5 将混淆内容文本填充到v1383.text字段,v1383是一个Area对象property221_1550.SetValue(v1383, obfuscatorText);//3 执行ErrorStackWindow的662方法,会将ObMapFile.json文件反序列化 准备解析混淆内容文件var method662 = type.GetMethod("662", BindingFlags.Instance | BindingFlags.NonPublic);method662.Invoke(instance, null);//4 执行ErrorStackWindow的667方法,会将混淆内容文本解析完成输出到1384(Area组件)var method667 = type.GetMethod("667", BindingFlags.Instance | BindingFlags.NonPublic);method667.Invoke(instance, null);//5 将Area组件的文本获取并返回//获取1384(Area组件)的1550字段内容(Area.text) var field1384Info = type.GetField("1384", BindingFlags.Instance | BindingFlags.NonPublic);var v1384 = field1384Info.GetValue(instance);return (string)property221_1550.GetValue(v1384);
}

 使用方法:

Debug.LogError(Deobfuscate(@"NullReferenceException: Object reference not set to an instance of an object
at TestA_NameSpace.Test.cl (TestA_NameSpace.h`1[a] a) [0x00003] in <7a98e657ea8f45a0ac3ccc399b375f23>:0 
at TestA_NameSpace.Test.Start () [0x00026] in <7a98e657ea8f45a0ac3ccc399b375f23>:0 "));

若无法正常使用,说明你的Obfuscator Free版本和我不一样,它的混淆情况也不一样。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript学习笔记(3)

一.BOM对象 BOM的全称是Browser Object Model,翻译过来是浏览器对象模型。也就 是JavaScript将浏览器的各个组成部分封装成了对象。我们要操作浏览器的部分功能&#xff0c;可以通过操作 BOM对象的相关属性或者函数来完成。例如&#xff1a;我们想要将浏览器的地址改为 http:/…

Hive之加载csv格式数据到hive

场景&#xff1a; 今天接了一个需求&#xff0c;将测试环境的hive数据导入到正式环境中。但是不需要整个流程的迁移&#xff0c;只需要迁移ads表 解决方案&#xff1a; 拿到这个需求首先想到两个方案&#xff1a; 1、将数据通过insert into语句导出&#xff0c;然后运行脚本 …

stm32f103 单片机(一)第一个工程

先看一个简单的 系统上已经安装好了keil5 与ARM包&#xff0c;也下载好了STM32固件库 新建一个工程&#xff0c;添加三个组 加入如下文件 在options 里作如下配置 准备在main.c 中写下第一个实验&#xff0c;点亮一个小灯。 像51单片机一样直接对引脚赋值是行不通的 在…

ChromeOS 132 版本更新

ChromeOS 132 版本更新 1. 企业定制化 Chrome Web Store 管理员现在可以使用新设置定制 Chrome Web Store 以适应他们管理的用户&#xff0c;包括以下功能&#xff1a; 添加公司标志添加首页横幅和自定义公告策划扩展集合实施基于类别的控制 这些设置可以通过管理员控制台进…

绘制决策树的尝试1

代码复制 import pydotplus 复制 - 这一行代码用于导入pydotplus模块&#xff0c;这是一个用来在Python中创建图形的工具。2. python from IPython.display import Image 这一行代码用于从IPython显示模块中导入Image类&#xff0c;它允许我们在Jupyter笔记本中显示图像。…

知识图谱结合大模型用于聊天分析

知识图谱结合大模型在聊天分析中的应用主要体现在以下几个方面&#xff1a; 1. 提升对话理解和生成能力 知识图谱&#xff08;KG&#xff09;与大模型&#xff08;LLM&#xff09;的结合能够显著增强对话系统的语义理解能力和生成能力。例如&#xff0c;通过知识图谱的结构化…

堆的补充--Top-K问题

我们今天来学习二叉树的链式存储&#xff0c;但是在我们学习之前我们先来看一下我们昨天学习的顺序存储&#xff1a;二叉树&#xff1b; 我们之前说堆有两种方法&#xff1a; 1.向下调整建堆&#xff1a; 我们找到最后一个非叶子结点&#xff0c;把他作为起始下标&#xff1…

放大器版图绘制全流程

版图的构成主要分为四部分。对于一般的电路来说&#xff0c;重点关注前三部分第一部分是电路中所对应的mos管电容电阻这些基本器件&#xff0c;一般都是由工艺产商提供标准的元件版图&#xff0c;这部分是我们不需要太关心的。第二部分是对器件进行连线第三部分是衬底的连接&am…

我谈概率论与数理统计的知识体系

学习概率统计二十多年后&#xff0c;在廖老师的指导下&#xff0c;厘清了各章之间的关系。本来就是一条线两个分支&#xff0c;脉络很清晰。 分支一&#xff1a;从随机现象到样本空间到随机事件再到概率。 从随机事件到随机变量&#xff1a;为了进行定量的数学处理&#xff0…

群晖Cloud Sync如何实现一键同步备份让数据更安全高效

文章目录 前言1. 群晖NAS安装Cloud Sync1.1 安装和配置 Cloud Sync 2. 功能演示3. 群晖安装cpolar内网穿透3.1 配置Cloud Sync公网访问地址 4. 配置固定公网地址 前言 在数字化时代&#xff0c;数据的管理和备份成为了我们日常生活中的一个关键任务。无论是个人还是企业&#…

探索Linux中的进程控制:从启动到退出的背后原理

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 进程控制是操作系统对进程的创建、运行、调度、中止等活动进行管理和协调的行为。它是操作系统中至关重要的一部分&#xff0c;保证多任务处理环境下的资源分配和系统稳定性。 进程创建 fork( ) fork() 调…

密码无关认证:金融机构如何解决密码问题

密码安全问题&#xff0c;依然是金融行业面临的重大挑战。尽管密码简单易用&#xff0c;但许多金融机构仍然依赖这种方式进行身份认证。幸运的是&#xff0c;随着技术的发展&#xff0c;密码无关认证已经成为一种更加安全、便捷的选择&#xff0c;它能够为数字银行带来更好的用…

HarmonyOS基于ArkTS卡片服务

卡片服务 前言 Form Kit&#xff08;卡片开发框架&#xff09;提供了一种在桌面、锁屏等系统入口嵌入显示应用信息的开发框架和API&#xff0c;可以将应用内用户关注的重要信息或常用操作抽取到服务卡片&#xff08;以下简称“卡片”&#xff09;上&#xff0c;通过将卡片添加…

运算放大器应用电路设计笔记(六)

6.1输出失调电压发生的原因与计算 6.1.1用噪声增益进行评价 若运算放大器两个输入端接地&#xff0c;则理想运放输出为零&#xff0c;但实际的运放输出不为零&#xff0c;有一定的直流输出电压。这种直流电压称为输出失调电压。发生的原因是&#xff0c;运算放大器内部元件尤…

【Vim Masterclass 笔记25】S10L45:Vim 多窗口的常用操作方法及相关注意事项

文章目录 S10L45 Working with Multiple Windows1 水平分割窗口2 在水平分割的新窗口中显示其它文件内容3 垂直分割窗口4 窗口的关闭5 在同一窗口水平拆分出多个窗口6 关闭其余窗口7 让四个文件呈田字形排列8 光标在多窗口中的定位9 调节子窗口的尺寸大小10 变换子窗口的位置11…

【算法】经典博弈论问题——巴什博弈 python

目录 前言巴什博弈(Bash Game)小试牛刀PN分析实战检验总结 前言 博弈类问题大致分为&#xff1a; 公平组合游戏、非公平组合游戏&#xff08;绝大多数的棋类游戏&#xff09;和 反常游戏 巴什博弈(Bash Game) 一共有n颗石子&#xff0c;两个人轮流拿&#xff0c;每次可以拿1~m颗…

电脑如何访问手机文件?

手机和电脑已经深深融入了我们的日常生活&#xff0c;无时无刻不在为我们提供服务。除了电脑远程操控电脑外&#xff0c;我们还可以在电脑上轻松地访问Android或iPhone手机上的文件。那么&#xff0c;如何使用电脑远程访问手机上的文件呢&#xff1f; 如何使用电脑访问手机文件…

CTF随题思路—简单的base编码

打开是一大段base64编码&#xff0c;多次解码后再用base92解码

顺序表和链表(详解)

线性表 线性表&#xff08; linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线。…

vxe-table和element表尾合计行

1、vxe-table vxe-table的表尾合计&#xff0c;需要show-footer和footer-method搭配使用。 <vxe-table:data"tableData"ref"vxeRef"border resizable :footer-method"footerMethod":show-footer"true" >…