DrFlower / Unity-Obfuscator

Unity代码混淆插件
332 stars 84 forks source link

Unity-Obfuscator

目录

简介

主要功能:

  1. 对命名空间、类、属性、字段的命名混淆
  2. 插入垃圾代码
  3. 在原代码中插入对垃圾代码的调用

特色功能:

  1. 命名混淆支持随机字符串或从词库抽取名字
  2. 支持随机种子,可实现重复Build后混淆结果一致
  3. 支持黑白名单,排除部分在混淆后不能正常工作的代码,确保项目正常运行
  4. 混淆后输出混淆前后的名字对应关系文件
  5. 支持多DLL

使用方法:

使用时请把UnityObfuscator文件夹放置到Unity工程Assets目录下,在Unity Editor中对Assets\UnityObfuscator\Editor\ObfuscatorConfig.asset文件进行配置,并针对项目具体情况对黑白名单进行配置,配置完后直接Build程序即可生效。

插件配置:

ObfuscatorConfig图片

  • 命名混淆中Name Source的Word Library的词库文件路径为UnityObfuscator/Editor/Res/NameList.txt,可自行替换词库,按每个名字一行的格式即可,注意词库中的名字不能重复
  • 若需要使用代码注入功能,请自行准备垃圾代码库,本插件提供了默认的垃圾代码库模版,只作演示

黑白名单配置:

模式说明

提供黑名单、白名单、黑白名单混用3种模式。

  • 黑名单模式为只混淆黑名单中的内容;
  • 白名单模式为除了白名单内其他全部混淆;
  • 两者混用模式是在黑名单范围内进行混淆,但会把其中的白名单内容排除在外。

配置文件

配置文件位于Assets\UnityObfuscator\Editor\Res目录下

配置文件以A-B-C方式命名
AObfuscateList/WhiteList表示 黑名单/白名单
BCodeInject/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类里的任意成员,当某一个类没有命名空间时也可以用*表示。

配置规则

  1. Unity的生命周期方法和回调方法不能混淆(插件内部已排除绝大部分Unity生命周期方法和回调方法)。
  2. 直接挂在Prefab上或场景GameObject上的组件类名不能混淆(动态添加组件的可以)。
  3. 诸如UGUI的Button组件的OnClick事件等直接在Inspector面板挂载的方法不能混淆。
  4. 诸如Unity的Invoke、StartCoroutine等通过字符串调用方法的方法名不能混淆。
  5. Lua直接访问C#的不能混淆(通过Wrap注册了映射关系的成员可以)。
  6. 部分涉及反射的代码不能混淆。
  7. 移动平台Native层里直接调用C#或通过Unity内置API发送事件到C#的不能混。
  8. :kissing_heart:期待您的发现...

垃圾代码库配置:

插件提供了默认的垃圾代码库模版,文件位于Assets/UnityObfuscator/GarbageCode/GarbageCode.dll,里面包含了几个简单的方法,仅作功能演示用,建议需要代码注入功能的请自行准备垃圾代码库。
垃圾代码库建立应遵循以下规则:

混淆结果的验证:

ILSpy图片 可通过ILSpy等反编译软件验证混淆后的程序集
以PC平台为例,Unity Build后的程序集位于目标目录/XX_Data/Managed文件夹中,Unity默认程序集为Assembly-CSharp

Demo

Demo链接:https://github.com/DrFlower/Unity-Obfuscator-demo