在Unity项目中隐藏StringConst

在GUI界面中编辑StringConst

在Unity项目中隐藏StringConst

自动生成StringConst.cs文件

在Unity项目中隐藏StringConst

封装GlobalConst上层逻辑直接当做普通String字符串处理

在Unity项目中隐藏StringConst

目的

目前, 就我所知的Unity反编译. 如果采用静态破解IL2CPP项目 切入点一般都从关键字入手.

比如搜索 money,exp,attack等等.

我主要是采用混淆代码的方式应对这种Hack. 但是混淆代码并不能对 const string进行混淆.

比如

在Unity项目中隐藏StringConst

这是我之前的老项目. 可以看到虽然 变量名全部混淆了. 但是其引用的字符串仍旧是明文的. 并且暴露出许多敏感信息.

所以 目前想出来这种方案.就是为了解决这个问题的.

具体实现 思路

(编辑阶段)通过GUI进行编辑相关的常量信息

(编辑阶段)生成一个cs文件,和一个加密后的二进制文件.

(运行阶段)将二进制文件解析为Key-Value字典.其中Key为混淆后的Key,Value为真实Value

(运行阶段)用生成的cs文件.对Key-Value字典进行访问.从而得到真实的常量值

核心代码

具体实现,每个人会有自己的不同.这里全贴出来没有什么意义. 只列一些我认为比较核心的代码

GUI部分

GUI用的是OdinInspector插件(推荐)

发起弹窗

[MenuItem("常量表")] private static void OpenStringConstWinodw() { var instance = new GlobalStringEditWindow(); var window = OdinEditorWindow.InspectObject(instance); window.position = GUIHelper.GetEditorWindowRect().AlignCenter(500, 700); instance.OnShow(window); }

弹出部分

public class GlobalStringEditWindow { private OdinEditorWindow mSelfWindow; public List<StringConstWrap> stringConstList; public void OnShow(OdinEditorWindow _window) { mSelfWindow = _window; ... ** 此处省略从二进制文件解密出来,然后复写到stringConstList部分代码 ... } [Button("保存并退出", ButtonSizes.Medium), GUIColor(0, 1, 0)] private void SaveAndClose() { var CSharpFileCreater = new ObfuscatorIDMappingHelper(); stringConstList.ForEach(warp => { var meta = new ObfusKeyValueMeta(); meta.comment = warp.comment; meta.realKey = warp.key; meta.value = warp.value; meta.classPropertyName = meta.realKey; CSharpFileCreater.AddObfuscatorRes(meta); }); //生成CS文件和*.byte文件 CSharpFileCreater.GenerateFile("StringConst"); Debug.Log("StringConst 保存成功"); mSelfWindow.Close(); } [Serializable] public struct StringConstWrap { [FoldoutGroup("$Name", false)] public string comment; [FoldoutGroup("$Name", false)] public string key; [FoldoutGroup("$Name", false)] public string value; private string Name => comment ?? "Empty"; } } 代码生成

代码生成部分,就是对应的我CSharpFileCreater部分的内容.

如果想使用模板类生成CS代码,可以参考以下几个Link

https://github.com/Mtihc/Generate-Code-For-Unity

https://www.gamasutra.com/blogs/ByronMayne/20160121/258356/Code_Generation_in_Unity.php

https://forum.unity.com/threads/code-generation-with-unity.233661/

不过我需要生成的代码部分很简单,所以反而直接生写会简单一些.

代码如下:

private string GetFileString(string _className) { var fileString = ""; fileString += "namespace Code.AutoGenerate\n"; fileString += "{\n"; fileString += " public class " + _className + "\n"; fileString += " {\n"; mObfuscatorResList.ForEach(meta => { fileString += $" public const string {meta.classPropertyName} = \"{meta.obfusKey}\";\n"; }); fileString += " }\n"; fileString += "}\n"; return fileString; }

然后将文本直接写入文件,直接用封装好的File.WriteAllText(path, fileString);方法即可.

二进制加密

这部分我是将相应类首先序列化为Json,然后对Json文件进行ASE加密.再以二进制的方式存入本地

注意

不要采用Unity内置的Json,或者说 所有需要使用到[Serializable]标签的序列化方案. 因为设置了这个标签就意味着 变量名 是无法改变的,(应该是反序列化时候都需要反射找到对应的属性?).

变量名无法改变 也就是 无法混淆. 那之前做的一切就相当于白费了 :)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzwxj.html