如何在Unity项目中隐藏StringConst

最终效果

  • 在GUI界面中编辑StringConst

  • 自动生成StringConst.cs文件

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

目的

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

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

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

比如

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

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

具体实现

思路

  • (编辑阶段)通过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

http://www.li0rtal.com/code-generation-fun-with-unity/

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;
}

以下代码与本文无关,请自行跳过

<P><A href="http://xzmobile.zztj120.com/"><FONT color=#ffffff>郑州同济妇科医院</FONT>
<P><A href="http://wapyyk.39.net/zz3/zonghe/1d426.html"><FONT color=#ffffff>郑州妇科医院</FONT>
<P><A href="http://wapyyk.39.net/zz3/zonghe/1d426.html"><FONT color=#ffffff>郑州妇科医院</FONT>
<P><A href="http://www.lnljyy.com/"><FONT color=#ffffff>郑州做人流价格是多少钱</FONT>
<P><A href="http://yiyuan.120ask.com/zzfck/"><FONT color=#ffffff>郑州妇科医院哪家好</FONT></A></P>

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

二进制加密

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

注意

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

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

猜你喜欢

转载自blog.csdn.net/qq_42564846/article/details/81141051