変数の値を操作する基本的なチートエンジンハックを防ぐには、それらの値を非表示にする必要があります。通常、チートエンジンは、変数の既知の値を検索し、より多くのゲームをプレイして値を変化させることにより、興味深い変数(たとえば、アビリティのゴールドやライフ、アップグレードレベルなど)のメモリロケーションを特定するために使用されます。変更すると、Cheat Engineは以前の新しい値の検索結果から新しい検索を実行します。これにより、不正行為者は値のメモリ位置を拡大でき、チートエンジンを使用してそのメモリ位置の値を変更できます。
たとえば、245 GOLDがあります。チートエンジンを使用して、245を検索し、多くのメモリロケーションを見つけます。次に、さらにプレイしてゴールドを314まで上げます。次に、以前の検索出力で値314を検索し、GOLDが格納されているメモリの場所を簡単に見つけます。
これを防ぐ方法は、実際の値をメモリの場所に保存しないことです。たとえば、必要なときにオンデマンドで実際の値を計算する必要があるオブジェクトに値を格納します。プレーヤーが245ゴールドを持っているとしましょう。値245のメモリロケーションを検索すると、多くの値が見つかるかもしれませんが、ゴールドの値が実際に格納されているメモリロケーションにはなりません。これは、ゴールドの値245を格納しないためです。ゲームが金の量を知る必要がある場合、それはその値を保持するオブジェクトに尋ね、要求に応じてそれを計算します。
したがって、ここでの質問は次のとおりです。値を明らかにしない方法でどのように正確に値を格納しますか?これは少しトリッキーで醜いものになり、それを行う方法はたくさんあると私は確信しています。私がしたいことは、ブール配列(またはバイト配列)を格納することです。配列の長さは何でもかまいませんが、13だとしましょう。その場合、実際の値に13が入る回数を表すカウンターがあります。したがって、245を表す場合、カウンターの値は18になります。これで、配列はすべてのブール値を245/13の残りに対してtrueに設定します。基本的には係数です。この場合は11なので、配列の最初の11のブール値はtrueに設定され、残りはfalseに設定されます。値を取得するために必要なことは、カウンターに配列の長さを乗算してから、真に設定されたブール値ごとに1を追加することです(最初の偽で停止)。これで、245はどこにも保存されず、金の量を変更するために操作する必要があるメモリの場所を見つけるのが難しくなります。このオブジェクトが作成されるときに、配列の長さを異なるサイズに設定することもできます(おそらく、妥当な範囲内の数値をランダムに選択します)。
編集:これはマルチプレイヤーとシングルプレイヤーに役立ちます。パケットの値が変更される可能性があるマルチプレーヤーでも実行できる不正行為があります。これには、各パケットに署名するなど、防止するためのさまざまな手法が必要になります。