有一天看到老皮在玩 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 美元??