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

posted @ 2020-12-31 16:02  FlamedWORA  阅读(728)  评论(0编辑  收藏  举报