網(wǎng)站備案導致網(wǎng)站被k百度網(wǎng)盤下載電腦版官方下載
目錄
一、導入工具
二、各種混淆形式介紹
2.1 程序集混淆
2.2 命名空間混淆
2.3 類混淆
2.4 函數(shù)混淆
2.5 參數(shù)混淆
2.6 字段混淆
2.7 屬性混淆
2.8 事件混淆
三、安全混淆
四、兼容性處理
4.1 動畫方法兼容
4.2 GUI方法兼容
4.3 協(xié)程方法兼容
五、選項
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,若網(wǎng)絡不正常請檢查是否開啟了代理,需關閉代理。
導入成功后會看到如下內容?
?
再導入一個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也有版本區(qū)分,上面是是給window系統(tǒng)用的,其他系統(tǒng)對應找對應的版本下載。
創(chuàng)建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(方便觀察區(qū)分)混淆后
?屏蔽TestA_NameSpace混淆
?尚不清楚有何作用的選項,不需要開啟這個。
2.3 類混淆
可能由于是免費版,故有這種黃底顏色的混淆無法使用。
?屏蔽混淆泛型類,例如上面的Space_Generic<T>泛型類,其他類會正常混淆。
2.4 函數(shù)混淆
?屏蔽Public類型函數(shù)
2.5 參數(shù)混淆
正?;煜?/p>
屏蔽混淆函數(shù)參數(shù)后會如下
2.6 字段混淆
?
2.7 屬性混淆
?屏蔽公共屬性混淆
2.8 事件混淆
?屏蔽公共事件混淆
?
三、安全混淆
四、兼容性處理
4.1 動畫方法兼容
動畫幀調用的腳本方法不會被混淆
?
測試取消這個兼容,也一樣會忽略混淆。
4.2 GUI方法兼容
4.3 協(xié)程方法兼容
關閉兼容后
其中CoroutineFunc2和CoroutineFunc3會找不到報錯,所以需要開啟兼容,即不會對協(xié)程方法進行混淆處理。
即使添加傳參,也是沒有對參數(shù)進行混淆的,不過有些局部參數(shù)名有混淆。
因此如果想對協(xié)程方法進行混淆,要保證全部調用協(xié)程方法的形式是
?StartCoroutine(CoroutineFunc1());
并關閉兼容協(xié)程方法處理
五、選項
5.1 調試日志輸出目錄定義
默認日志文件
5.2 標簽屬性設置
參考:Attributes | GuardingPearSoftware documentation
原有[DoNotRename]標簽忽略混淆名稱,現(xiàn)在可以自定義標簽屬性如下:name參數(shù)是非必要的
作為一個忽略混淆名稱使用,例如忽略混淆這個方法名。
5.3 混淆映射文件
如上圖我啟動了映射文件,并設置了一個文本文件路徑作為保存的文件路徑,內容是保存各種映射關系。
測試映射文件作用,可以將錯誤日志反混淆顯示;
案例:故意搞一個錯誤的代碼,如下:
使用Log Viewer調試插件看打包后報錯日志
Log Viewer | Integration | Unity Asset Store
導入后需要創(chuàng)建調試器物體在場景上
打包查看
打包運行 查看報錯日志,發(fā)現(xiàn)是混淆名稱
開啟混淆映射文件
測試發(fā)現(xiàn)依舊沒有變化,即并沒有改動實際運行時的日志輸出,只能通過這個工具查看反混淆后的日志
通過ILSpy查看ErrorStackEditor內容,可以通過如下方法動態(tài)執(zhí)行上面這個過程來加速我們的反混淆日志文件速度。
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 執(zhí)行ErrorStackWindow的662方法,會將ObMapFile.json文件反序列化 準備解析混淆內容文件var method662 = type.GetMethod("662", BindingFlags.Instance | BindingFlags.NonPublic);method662.Invoke(instance, null);//4 執(zhí)行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版本和我不一樣,它的混淆情況也不一樣。