Mac Unity环境使用Obfuscar混淆Dll
使用环境:MacOs Unity Mono
使用方式 c#代码编译dll 导入Unity使用
混淆工具Obfuscar2.0
目标 一键混淆dll导入unity使用
谷歌code及官方网址
https://code.google.com/archive/p/obfuscar
https://www.obfuscar.com/
1.配置环境
1.1.下载Obfuscar
谷歌code及官方网址
https://code.google.com/archive/p/obfuscar
https://www.obfuscar.com/
Obfuscar开源且拥有命令行模式适用于一键编译混淆
1.2.安装Mono
因为目前各种混淆工具均无Mac版本。所以要使用mono来运行obfuscar命令实现混淆
2.使用方式
2.1.配置文件obfuscar.xml
(注:工具下载文档阅读来源均为GoogleCode平台本文所有官方均指GoogleCode)
官方示例中提供了简单配置文件。该文件用于设置混淆的命名方式、跳过混淆的规则等等。以下将简略讲解配置方式以及官方未提及的重点,详细配置可以参考上方的官方网址的文档Configuration.wiki
2.1.1.配置dll路径及混淆后输出路径
<Var name="InPath"value="./Obfuscator_Input" />
<Var name="OutPath"value="./Obfuscator_Output" />
InPath and OutPath分别为dll路径和混淆后输出路径。
Mac环境重点在官方例子中路径为 ”\” 而在Mac环境下使用要使用反斜杠 “/” 否则路径错误无法找到混淆目标及输出路径
2.1.2.目标dll
<Module file="$(InPath)/BasicExampleLibrary.dll" >
Module标签用于指定混淆的dll 可以有多个Module一次混淆多个dll
路径斜杠问题同上
2.1.3.跳过混淆的规则
Obfuscar提供了6种跳过规则标签本文主要使用SkipType SkipMethod SkipField
SkipType用于跳过类名 name可指定类名可用*代表全部
SkipMethod SkipField分别用于跳过函数名及属性名 type可指定所属类(可用*) name可指定具体名称也可使用正则
三种标签均有attrib属性用于指定访问级别可填写public protected或填空
不使用该标签或填空则默认为所有级别均不混淆。
还提供了跳过命名空间跳过event 未曾使用具体可参考官方文档
Unity环境重点 Unity有很多使用反射获取的函数不能够被混淆,如基础的Awake Start Update等函数均不能混淆否则无法执行
例子:
<Module file="$(InPath)/Game.dll" >
<SkipType name="*"attrib=''/>
<SkipMethod type="*"attrib="public"rx=".*" />
<SkipField type="*"attrib="public"rx=".*" />
<SkipMethod type="*" name="Awake" />
<SkipMethod type="*" name="Start" />
<SkipMethod type="*" name="Update" />
<SkipMethod type="*" name="OnDestroy" />
<SkipMethod type="*" name="OnApplicationQuit" />
<SkipMethod type="*" name="OnApplicationFocus" />
<SkipMethod type="*" name="OnMouseDown" />
<SkipMethod type="*" name="OnMouseOver" />
</Module>
2.1.4.其他配置
<Var name="ReuseNames"value="false" />
ReuseNames官方示例中默认为True。该配置为true时会导致不同类型的对象或变量重名,如同一个类中出现“int a; float a;”的情况。这显然是无法通过编译的,该做法具体作用不明(可能是为了增大混淆效果?),但只要设置为false 全局则不会出现重名的情况
<Var name="HideStrings"value="false" />
HideStrings官方示例中未使用该属性即默认为true。该属性用于隐藏字符串,但不知是存在BUG还是什么缘故,混淆后会生成一个错误的类(unity、反编译均无法正常解析) 无法通过解析。故只能将其设为false关闭。
2.1.5.存在依赖其他dll
存在引用若混淆目标dll中有对其他dll的引用(非System) 并且对引用的dll类存在继承实现等则需要将引用的dll一并放入InPath路径下否则混淆会报错无法解析依赖
如存在public class GameClass: MonoBehaviour
则会报错Unable to resolve dependency UnityEngine
2.1.6.执行混淆
做完以上操作终于来到了最后一步执行混淆
mono ./xxxx/obfuscar.exe /xxxx/obfuscar.xml
mono执行指定obfuscar.exe及配置文件路径即可
成功后混淆的dll将会出现在配置的outPath路径下,可通过shell脚本或其他方式一键自动导入到untiy。
一键打包混淆导入untiy完成!
混淆效果可以通过反编译查看 反编译方式可参考我的另一篇 Mac环境反编译dll