使用时请把UnityObfuscator文件夹放置到Unity工程Assets目录下,在Unity Editor中对Assets\UnityObfuscator\Editor\ObfuscatorConfig.asset文件进行配置,并针对项目具体情况对黑白名单进行配置,配置完后直接Build程序即可生效。
(注意垃圾代码生成不受黑白名单影响,只要开启了代码注入,就会根据这个参数在所有类中插入垃圾代码)
(若无特殊需求,谨慎使用,可填0。调用垃圾方法可能会对程序运行性能产生明显影响,具体影响大小由插入数量和垃圾代码库中方法复杂度决定,受黑白名单控制,建议用黑名单模式,仅在性能不敏感的地方插入调用)
(若项目存在多个DLL,且存在情况:A.dll被混淆,B.dll需要调用A.dll的代码,则B.dll也必须添加到混淆列表中,以修改掉调用的名字,若B.dll本身不需要被混淆则可通过黑白名单来控制)
- 命名混淆中Name Source的Word Library的词库文件路径为UnityObfuscator/Editor/Res/NameList.txt,可自行替换词库,按每个名字一行的格式即可,注意词库中的名字不能重复
- 若需要使用代码注入功能,请自行准备垃圾代码库,本插件提供了默认的垃圾代码库模版,只作演示
提供黑名单、白名单、黑白名单混用3种模式。
- 黑名单模式为只混淆黑名单中的内容;
- 白名单模式为除了白名单内其他全部混淆;
- 两者混用模式是在黑名单范围内进行混淆,但会把其中的白名单内容排除在外。
配置文件位于Assets\UnityObfuscator\Editor\Res目录下
配置文件以A-B-C方式命名
A为ObfuscateList/WhiteList表示 黑名单/白名单
B为CodeInject/NameObfuscate表示该名单是控制 代码插入/名字混淆
C则表示此配置控制的 具体范围
ObfuscateList
//黑名单
ObfuscateList-CodeInject-Class.txt
//名单内的类都会调用垃圾代码
ObfuscateList-CodeInject-Method.txt//名单内的方法都会调用垃圾代码
ObfuscateList-CodeInject-Namespace.txt//名单内的命名空间里的内容包括(命名空间名、类名、类成员名)都会调用垃圾代码
ObfuscateList-NameObfuscate-Class.txt
//名单内的类(包括类名和类成员名)都会被混淆
ObfuscateList-NameObfuscate-ClassExceptClassName.txt//名单内的类的类成员名会被混淆,但类名不混淆
ObfuscateList-NameObfuscate-ClassMember.txt//名单内的类成员名会被混淆
ObfuscateList-NameObfuscate-Method.txt//名单内的方法名会被混淆
ObfuscateList-NameObfuscate-Namespace.txt//名单内命名空间里内容包括(命名空间名、类名、类成员名)都会被混淆
ObfuscateList-NameObfuscate-NamespaceExceptNamespaceName.txt//名单内命名空间内容(包括类名、类成员名)都会被混淆,但命名空间名不混淆
WhiteList
//白名单
WhiteList-CodeInject-Class.txt
//名单内的类不调用垃圾代码
WhiteList-CodeInject-Method.txt//名单内的方法不调用垃圾代码
WhiteList-CodeInject-Namespace.txt//名单内的命名空间里内容(包括命名空间名、类名、类成员名)都不调用垃圾代码
WhiteList-NameObfuscate-Class.txt
//名单内的类(包括类名和类成员)不混淆
WhiteList-NameObfuscate-ClassMember.txt//名单内的类成员不混淆
WhiteList-NameObfuscate-ClassNameOnly.txt//名单内的类的类名不混淆,但类成员混淆
WhiteList-NameObfuscate-Method.txt//名单内的方法名不混淆
WhiteList-NameObfuscate-NameSpace.txt//名单内的命名空间里内容(包括命名空间名、类名、类成员名)都不混淆
WhiteList-NameObfuscate-NamespaceNameOnly.txt//名单内的命名空间的名字不混淆
以上类成员包括字段、属性、方法
优先级:两者混用模式下白名单比黑名单优先级高
例如:两者混用模式下,黑名单填写了A命名空间,白名单填写了A命名空间下的B类,那么A命名空间除了B类外其他类都会被混淆。
命名空间配置格式:
UnityEngine
UnityEngine.UI
类配置格式:
UnityEngine|GameObject
*|GameObject
类成员配置格式:
UnityEngine|GameObject|name
UnityEngine|GameObject|AddComponent
*|GameObject|active
*|*|active
*|*|Start
UnityEngine|GameObject|*
以上仅为示例,Unity自身库不做混淆
总体格式为 命名空间|类名|成员名 ,以|符号分割,其中*可以表示任意成员,如 *||Start 表示任意明明空间下的任意类的Start成员,UnityEngine|GameObject| 表示UnityEngine命名空间下的GameObject类里的任意成员,当某一个类没有命名空间时也可以用*表示。
- Unity的生命周期方法和回调方法不能混淆(插件内部已排除绝大部分Unity生命周期方法和回调方法)。
- 直接挂在Prefab上或场景GameObject上的组件类名不能混淆(动态添加组件的可以)。
- 诸如UGUI的Button组件的OnClick事件等直接在Inspector面板挂载的方法不能混淆。
- 诸如Unity的Invoke、StartCoroutine等通过字符串调用方法的方法名不能混淆。
- Lua直接访问C#的不能混淆(通过Wrap注册了映射关系的成员可以)。
- 部分涉及反射的代码不能混淆。
- 移动平台Native层里直接调用C#或通过Unity内置API发送事件到C#的不能混。
- :kissing_heart:
期待您的发现...
插件提供了默认的垃圾代码库模版,文件位于Assets/UnityObfuscator/GarbageCode/GarbageCode.dll,里面包含了几个简单的方法,仅作功能演示用,建议需要代码注入功能的请自行准备垃圾代码库。
垃圾代码库建立应遵循以下规则:
可通过ILSpy
等反编译软件验证混淆后的程序集
以PC平台为例,Unity Build后的程序集位于目标目录/XX_Data/Managed文件夹中,Unity默认程序集为Assembly-CSharp