這個問題的目的是更好地了解我的 Unity 腳本如何可能被黑客入侵,尤其是在運行時。我正在閱讀這篇文章:https : //www.gamedeveloper.com/programming/game-development-protect-your-game-from-getting-hacked并想知道在哪里可以找到有關“記憶體注入”黑客攻擊的潛在資源根據文章。
我的問題的第二部分與在運行時攔截變數所涉及的風險有關。例如,將純文本密碼傳遞給方法并獲得如下回傳值:
public class CryptoTest : MonoBehaviour
{
private readonly CryptoService cryptoService = new CryptoService();
private void Start()
{
string plainPassword = "This is a potential password";
string encryptedPassword = cryptoService.EncryptedString(plainPassword);
string decryptedPassword = cryptoService.DecryptedString(encryptedPassword);
Debug.Log("Encrypted Password: " encryptedPassword);
Debug.Log("Decrypted Password: " decryptedPassword);
}
}
這是負責加密/解密的類:
public class CryptoService
{
public string EncryptedString(string targetString)
{
string containerName = Application.productName Application.version;
CspParameters cspParams = new CspParameters { KeyContainerName = containerName };
RSACryptoServiceProvider cryptoService = new RSACryptoServiceProvider(cspParams);
byte[] tempBytes = cryptoService.Encrypt(Encoding.UTF8.GetBytes(targetString), true);
string encryptedString = Convert.ToBase64String(tempBytes);
return encryptedString;
}
public string DecryptedString(string targetString)
{
string containerName = Application.productName Application.version;
CspParameters cspParams = new CspParameters { KeyContainerName = containerName };
RSACryptoServiceProvider cryptoService = new RSACryptoServiceProvider(cspParams);
string decryptedString = Encoding.UTF8.GetString(cryptoService.Decrypt(Convert.FromBase64String(targetString), true));
return decryptedString;
}
}
我想一個很大的因素與我如何使用這些輸入/輸出值有關,但是,除了 CryptoService 類之外,訪問器在類中始終是私有的。任何人都可以看到該實作被黑客入侵/攔截的可能性嗎?
非常感謝任何資訊以及我可能會忽略的任何資源鏈接!謝謝 :)
uj5u.com熱心網友回復:
請注意 - 當邏輯在客戶端上時,沒有任何解決方案可以 100% 有效-理論上總是可以繞過您將在客戶端上放置的任何保護。
這是我一直在使用的簡單方法來解決這個問題,此外,如果您愿意,您還可以與被您發現作弊的玩家搞得一團糟。
基本上創建一個ObfuscatedValue類,它看起來像這樣(半偽代碼):
public class MemoryObfuscatedInt
{
private int _secret;
private int _obfuscatedValue;
// This value will always have the real, visual number - only here to catch potential cheaters
private int _honeyPotValue;
public MemoryObfuscatedInt()
{
_secret = Random.Range(100, 1000);
}
public MemoryObfuscatedInt(int secret)
{
_secret = secret;
}
public bool DidPlayerCheat()
{
return _honeyPotValue != Value;
}
public int Value
{
get
{
return _obfuscatedValue / _secret;
}
set
{
_obfuscatedValue = value * _secret;
_honeyPotValue = value;
}
}
public static implicit operator int(MemoryObfuscatedInt i) => i.Value;
public static explicit operator MemoryObfuscatedInt(int toObfuscate) => new MemoryObfuscatedInt { Value = toObfuscate };
}
所以如果有人用CheatEngine之類的東西來修改變數,他們會尋找_honeyPot值并改變它們,之后你可以手動呼叫DidPlayerCheat()并看到蜜罐值已經改變,這基本上意味著玩家被騙了。
這種方法絕不是完美的,但它足以防止 99.99% 的腳本小子試圖“破解”您的游戲。
您當然也可以加密或使用您希望的任何形式的混淆,我以簡單的乘法為例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/368938.html
