Anti-Cheating Plug-in 使用文档和注意事项

2022.09.22 13:52:05

    1、插件目标

    增强 Unity 项目中 C# 代码的安全性。

    2、插件功能

    • 混淆Unity项目的C#代码中的符号,可以降低游戏资源被盗的风险。
    • 此功能利用Mono.Cecil修改程序集,可以增强游戏资源的安全性
    • 工具涉及修改命名空间、类名、方法、属性等区域
    • 您可以使用 Inspector 修改操作选项
    • 混淆工具可能适用也可能不适用于特定类

    3、使用步骤

    3.1、打开Unity项目后双击 unitypackage,导入unitypackage

    3.2、在左下方找到ObfuscateConfig,勾选Enable Code Obfuscate,Obfuscate Names后直接Build就可以完成混淆

    3.3、插件配置

    • Enable Code Obfuscator控制总混淆开关
    • 可在Random Seed输入混淆用的随机种子的值,也可以勾选Use Time Stamp使用时间戳作为随机种子
    • 可控制命名混淆(Obfuscate Name) 开关
    • 命名混淆
      • Filter Type: 命名混淆用的黑白名单模式,模式区别具体看下文黑白名单配置
      • Name Source:命名来源,可选Random和Word Library两个模式,Random为随机字符串命名,Word Library为从词库中抽取名字作为命名
    • 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.4、黑白名单配置

    模式说明

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

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

    配置文件

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

    ObfuscateList: 黑名单

    ObfuscateList-Class.txt  //名单内的类(包括类名和类成员名)都会被混淆
    ObfuscateList-ClassExceptClassName.txt  //名单内的类的类成员名会被混淆,但类名不混淆
    ObfuscateList-ClassMember.txt  //名单内的类成员名会被混淆
    ObfuscateList-Method.txt  //名单内的方法名会被混淆
    ObfuscateList-Namespace.txt  //名单内命名空间里内容包括(命名空间名、类名、类成员名)都会被混淆
    ObfuscateList-NamespaceExceptNamespaceName.txt  //名单内命名空间内容(包括类名、类成员名)都会被混淆,但命名空间名不混淆 
    

    ** WhiteList: 白名单**

    WhiteList-Class.txt   //名单内的类(包括类名和类成员)不混淆
    WhiteList-ClassMember.txt   //名单内的类成员不混淆
    WhiteList-ClassNameOnly.txt   //名单内的类的类名不混淆,但类成员混淆
    WhiteList-Method.txt   //名单内的方法名不混淆
    WhiteList-NameSpace.txt   //名单内的命名空间里内容(包括命名空间名、类名、类成员名)都不混淆
    WhiteList-NamespaceNameOnly.txt   //名单内的命名空间的名字不混淆
    

    名单写法:NameSpace|Class|Method

    优先级:两者混用模式下白名单比黑名单优先级高 例如:两者混用模式下,黑名单填写了A命名空间,白名单填写了A命名空间下的B类,那么A命名空间除了B类外其他类都会被混淆。

    配置格式

    命名空间配置格式:

    UnityEngine
    UnityEngine.UI
    

    类配置格式:

    UnityEngine|GameObject
    *|GameObject
    

    命名空间配置格式:

    UnityEngine|GameObject|name
    UnityEngine|GameObject|AddComponent
    *|GameObject|active
    *|*|active
    *|*|Start
    UnityEngine|GameObject|*
    

    总体格式为 命名空间|类名|成员名 ,以 | 符号分割,其中 * 可以表示任意成员,如 *|*|Start 表示任意明明空间下的任意类的Start成员,UnityEngine|GameObject|* 表示UnityEngine命名空间下的GameObject类里的任意成员,当某一个类没有命名空间时也可以用 * 表示。

    配置规则

    如果你使用这个包,那么你的代码中更多的方法名称可能会被混淆。 但是请确保以下方法使用 [WhiteList-Method.txt] 进行标记,否则它们将无法正常使用。

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

    4、效果展示

    使用ILSpy开源软件打开/Library/ScriptAssemblies/Assembly-CSharp.dll ,对比分析混淆效果 -w549

    5、注意事项

    1、Unity支持版本

    • 2018LTS
    • 2019LTS
    • 2020LTS

    2、支持的平台

    • Android
    • iOS

    3、Package 默认生成ObfuscatorConfig配置问题

    若遇因版本兼容的问题导致,ObfuscatorConfig的Inspector面板加载失败,需要删除后再次在Editor文件夹里Create->Obfuscator Config

    4、函数白名单

    //函数白名单
                #region MonoBehaviour Message
                "Awake",
                "FixedUpdate",
                "LateUpdate",
                "OnAnimatorIK",
                "OnAnimatorMove",
                "OnApplicationFocus",
                "OnApplicationPause",
                "OnApplicationQuit",
                "OnAudioFilterRead",
                "OnBecameInvisible",
                "OnBecameVisible",
                "OnCollisionEnter",
                "OnCollisionEnter2D",
                "OnCollisionExit",
                "OnCollisionExit2D",
                "OnCollisionStay",
                "OnCollisionStay2D",
                "OnConnectedToServer",
                "OnControllerColliderHit",
                "OnDestroy",
                "OnDisable",
                "OnDisconnectedFromServer",
                "OnDrawGizmos",
                "OnDrawGizmosSelected",
                "OnEnable",
                "OnFailedToConnect",
                "OnFailedToConnectToMasterServer",
                "OnGUI",
                "OnJointBreak",
                "OnJointBreak2D",
                "OnMasterServerEvent",
                "OnMouseDown",
                "OnMouseDrag",
                "OnMouseEnter",
                "OnMouseExit",
                "OnMouseOver",
                "OnMouseUp",
                "OnMouseUpAsButton",
                "OnNetworkInstantiate",
                "OnParticleCollision",
                "OnParticleTrigger",
                "OnPlayerConnected",
                "OnPlayerDisconnected",
                "OnPostRender",
                "OnPreCull",
                "OnPreRender",
                "OnRenderImage",
                "OnRenderObject",
                "OnSerializeNetworkView",
                "OnServerInitialized",
                "OnTransformChildrenChanged",
                "OnTransformParentChanged",
                "OnTriggerEnter",
                "OnTriggerEnter2D",
                "OnTriggerExit",
                "OnTriggerExit2D",
                "OnTriggerStay",
                "OnTriggerStay2D",
                "OnValidate",
                "OnWillRenderObject",
                "Reset",
                "Start",
                "Update",
                #endregion
            };
    
    Online Chat Tel:95163223