有一天看到老皮在玩 Steam 上免費的遊戲 Bakso Simulator,想說免費就載來玩玩,到後面一直重複動作有點無聊,就順手開了個 dnSpy 想加速一下遊戲進度。

打開 Assembly-CSharp.dll 發現全裸,連個混淆壓縮都沒有。

只有重要數值用 CodeStage.AntiCheat 的 XOR 加密,看下 XOR key 怎麼產的?

internal static char[] GetCryptoKey(string dynamicSuffix = null, string prefsKey = "9978e9f39c218d674463dab9dc728bd6")
{
    if (ObscuredPrefs.generatedCryptoKey == null)
    {
        string @string = PlayerPrefs.GetString(prefsKey);
        if (!string.IsNullOrEmpty(@string))
        {
            ObscuredPrefs.generatedCryptoKey = Base64Utils.FromBase64ToChars(@string);
        }
        else
        {
            ObscuredPrefs.generatedCryptoKey = ObscuredString.GenerateKey();
            string text = Base64Utils.ToBase64(ObscuredPrefs.generatedCryptoKey);
            PlayerPrefs.SetString(prefsKey, text);
            PlayerPrefs.Save();
        }
    }
    if (string.IsNullOrEmpty(dynamicSuffix))
    {
        return ObscuredPrefs.generatedCryptoKey;
    }
    char[] array = dynamicSuffix.ToCharArray();
    char[] array2 = new char[ObscuredPrefs.generatedCryptoKey.Length + array.Length];
    Buffer.BlockCopy(ObscuredPrefs.generatedCryptoKey, 0, array2, 0, ObscuredPrefs.generatedCryptoKey.Length);
    Buffer.BlockCopy(array, 0, array2, ObscuredPrefs.generatedCryptoKey.Length + 1, array.Length);
    return array2;
}

好傢伙,這函式庫作者連 BlockCopy 都不會用! C# char 是 2 bytes 長,BlockCopy 傳入的位移與複製長度都是 byte 為單位,array2 只有前半段的 key + 前半段的 suffix。

回頭在網路上翻一下 CodeStage.AntiCheat 是從哪裡抄來的,結果這玩意兒是 Anti-Cheat Toolkit 的一部分

https://assetstore.unity.com/packages/tools/utilities/anti-cheat-toolkit-2023-202695

功能陽春不打緊,重點還不是免費,隨便一個腳本小子都能逆出來的東西要 80 美元??