Giter Site home page Giter Site logo

unity-obfuscator's Introduction

Unity-Obfuscator

目录

简介

  • 这是一款基于Mono.Cecil库对C#编译后程序集进行IL代码注入实现的轻量Unity混淆插件
  • 混淆发生在编译后,开发过程无需关心
  • 此插件已在带Lua热更方案的商业MMO手游项目上验证过可行性

主要功能:

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

特色功能:

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

使用方法:

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

插件配置:

ObfuscatorConfig图片

  • Enable Code Obfuscator控制总混淆开关
  • 可在Random Seed输入混淆用的随机种子的值,也可以勾选Use Time Stamp使用时间戳作为随机种子
  • 可分别控制命名混淆(Obfuscate Name) / 代码注入(Inject Code) 的开关
  • 命名混淆
    • Filter Type: 命名混淆用的黑白名单模式,模式区别具体看下文黑白名单配置
    • Name Source:命名来源,可选Random和Word Library两个模式,Random为随机字符串命名,Word Library为从词库中抽取名字作为命名
  • 代码注入
    • Filter Type: 代码注入用的黑白名单模式,模式区别具体看下文黑白名单配置
    • Generate Useless Method Multiple: 生成垃圾方法的倍数。例如填2,A类内原本有3个方法,则会生成6个垃圾方法在此类中(注意垃圾代码生成不受黑白名单影响,只要开启了代码注入,就会根据这个参数在所有类中插入垃圾代码)
    • Call Useless Method Per Method: 在每个方法中插入对垃圾代码的调用的数量。例如填1,则每个方法会随机调用1个垃圾方法(若无特殊需求,谨慎使用,可填0。调用垃圾方法可能会对程序运行性能产生明显影响,具体影响大小由插入数量和垃圾代码库中方法复杂度决定,受黑白名单控制,建议用黑名单模式,仅在性能不敏感的地方插入调用)
  • Useless Code Library Path: 垃圾代码库路径,默认为Assets/UnityObfuscator/GarbageCode/GarbageCode.dll
  • DLL Path Setting: 需要混淆的DLL的路径,Unity默认生成的DLL在工程目录下的Library/ScriptAssemblies路径中,默认程序集为Assembly-CSharp.dll。(若项目存在多个DLL,且存在情况:A.dll被混淆,B.dll需要调用A.dll的代码,则B.dll也必须添加到混淆列表中,以修改掉调用的名字,若B.dll本身不需要被混淆则可通过黑白名单来控制)
  • Test: 提供直接混淆功能,无需Build就可以输出混淆后文件,提高调试效率,混淆后文件输出到Output Path中
  • 命名混淆中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. 😘期待您的发现...

垃圾代码库配置:

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

  • 需要打成DLL文件,且带上.mdb文件在同级目录,若库文件在Unity工程内,应该只勾选Editor平台,避免垃圾库自身被发布出去
  • 垃圾方法应该都处于GarbageCodeLib命名空间下的GarbageCode类下,当然也可以在Define脚本中修改这两个命名
  • 垃圾方法应该声明为public static的,且无参数
  • 垃圾方法内部不能调用方法外任何自定义类、类成员等。

混淆结果的验证:

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

Demo

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

unity-obfuscator's People

Contributors

drflower avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

unity-obfuscator's Issues

Mono.Cecil与Unity.Burst.Cecil冲突

unity 版本2021.3.6f1c1,vs版本2022,安装Burst后
显示Assets\UnityObfuscator\Editor\Scripts\ClassInfo.cs(93,39): error CS0433: The type 'TypeDefinition' exists in both 'Mono.Cecil, Version=0.9.66.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756' and 'Unity.Burst.Cecil, Version=0.10.0.0, Culture=neutral, PublicKeyToken=fc15b93552389f74'
等几十个CS0433同类报错
vs使用别名和extern alias后vs不报错,unity照常报错,并报错Assets\UnityObfuscator\Editor\Scripts\Obfuscator.cs(1,14): error CS0430: The extern alias 'MC' was not specified in a /reference option
(MC是Mono.Cecil的别名)

关于il2CPP包的疑惑

Unity-Obfuscator对c#代码的混淆时机是否在 il to Cpp阶段之前?简单来说是否支持安卓平台的IL2CPP打包模式?

使用.Net4.0生成的portablePDB,需升级Mono.Cecil到0.10.4,并修改使用mdb的部分

使用.Net4.0生成的portablePDB,需升级Mono.Cecil到0.10.4,并修改使用mdb的部分
https://cecil.pe
//引用部分
在引入可移植PDB调试符号格式之前,.NET VM实现与其调试符号格式之间存在1对1的关联。Mono将使用mdb格式,.NET将使用本机pdb格式,这就是Cecil的工作方式。现在,一个平台可以使用不同的格式。

以前,当您写:
ReadAssembly (file, new ReaderParameters { ReadSymbols = true });
Cecil会尝试查找与平台关联的文件,如果找不到则抛出该文件。

现在,在0.10 beta 3中,Cecil将尝试查找不同类型的调试符号。这样,作为Cecil用户,您不必处理试图提交mdb或pdb文件的逻辑,Cecil只会加载可用的文件。

关于白名单配置的一些疑惑

hi.大佬好. 我的需求是这样的
有一个类叫
PersonManager
{
// 这里没返回person是有点奇怪的.我只是一个示例.
public void CreatePerson()
{
Person p = new Person(20, "Min");
// 其他逻辑
}
}

class Person()
{
int age;
string name;
public Person(int age, string name)
{

  }

}


对使用者而言,其实他面对的是PersonManaer 和它的接口.即在这里
PersonManager 和 CreatePerson我是不想混淆的
其他我都是想混淆的.
但现在根据白名单规则
我在
WhiteList-NameObfuscate-Method.txt
WhiteList-NameObfuscate-ClassNameOnly.txt
这里2个地方配置了.
结果就变成Person整个类被混淆.但是 CreatePerson方法没混淆,里面的变量名依然是Person,这就有bug了啊.


我的想法是, 能不能提供一个类似WhiteList-NameObfuscate-ClassNameOnly.txt 这样的.
对于大部分使用者来说,其实他只是想
1, 接口所在的类名
2, 爆出出去的接口
不混淆.其他内容都混淆.
又或者大佬根据我上面的,能否给一个提示,我现在应该怎么配置可以达成期望的效果.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.