不正行為を防ぐ方法でレベルを「完了」としてマークするにはどうすればよいですか?


8

レベルを完了とマークすることについての最初の考えは、レベルの完了時に情報をファイルに書き込み、アプリが再度開かれたときにそれをロードすることです。しかし、これを改ざんから安全に保ち、不正行為を防ぐにはどうすればよいですか?


「Candy Crushの方法」はここでは取り上げられていないため、質問のその側面を削除し、代わりに「不正行為の防止」の側面に焦点を合わせました。

特にCandy Crushがこの問題をどのように処理するかに興味がある場合は、gaming.stackexchange.comで
Kevin

回答:


19

ローカルファイルに完了情報を格納することは、単純で完全に許容できる方法です。基本的に、これはすべてのゲームが進行状況を追跡するために行うことです(データとストレージメカニズムに使用される特定の形式は異なりますが、ある方法で)。

ファイルを改ざんから保護することはより困難です。やむを得ない理由がない場合(プレイヤーが得る利点がない、報酬がないなど)場合は、通常、気にしないで逃げることができます。

しかし、あなたがた場合に行うケアを、あなたとあなたが合理的に(例えば、コンソールや非ジェイルブレイク- iOSデバイス)をご使用のプラットフォームが閉じていることを期待することができれば、あなたもあまり心配する必要はありません。ユーザーは通常、ファイルに物理的にアクセスして改ざんすることはできません(適切なOS APIを使用してデータを「プライベートな」場所とパブリックな場所に保存する場合(たとえば、このファイルをiOS上のユーザーのiCloudドライブに保存する場合)おそらく素晴らしいアイデアではありません)。

発生してはならないポイント(たとえば、より多くのレベルを完了したプレイヤーが得られる利点があるところ)への改ざんについて完全に懸念がある場合は、データをサーバー側に保存する必要があります。クライアント側に保存されたものはすべて最終的に危険にさらされる可能性があるため、信頼すべきではありません。それは、ユーザーの手にあるユーザーのマシンです。動的な制御は、あなたの好みではありません。

もちろん、サーバーサイドに保存されているファイルをハッキングすることも厳密に不可能ではありませんが、妥当な会計システムを持っている場合は、はるかに困難です。


ありがとう、progresファイルを簡単に調整できないようにしたいだけです。を読んでいて、Preference特定のクラスLibGDXが私を助けることができるかどうか疑問に思っています。レベルの単純なブール値を格納でき、おそらく単一のハイスコアも格納できます。
Madmenyo 2015年

@MennoGouw:ここでアンドロイドについて話している場合、デバイスがルート化されていない限り、アプリ専用のファイルにはアクセスできません。おそらくlibGDXはそのようなファイルを設定に使用します。
njzk2

暗号化を使用することもできます。キーはサーバーに保存されますが、データ自体はローカルに保存されます。次に、ゲームの開始時にキーを要求し、保存ファイルを復号化します。
Kroltan、2015年

1
@Kroltanしかし、使用中にデバイスをRAMダンプし、キーを取得して、ファイルを改ざんすることができます。(エミュレータでは、必要に応じて。)
wchargin '11年

1
接続が暗号化されている場合でも、ユーザーのコンピューターがそれを復号化するためのキーを持っているため、ユーザーはWebサーバーからのストリームを変更することもできます。それから彼はちょうどそのための値を変更する必要があるだけ{"finalLevelCompleted":true}です。できました。
Kroltan、2015年

9

プレーヤーの再生中に、作業の証拠として再生ファイルを作成できます。ゲームを開始し、レベルの名前と疑似ランダムシードを含む開始条件を保存し、ゲームの入力レイヤーがロジックレイヤーに渡す正確なタイムスタンプ付きの入力状態(マウスの動き、キーまたはボタンの押下など)を記録し、停止します目的が達成されたら記録する。入力ログをランレングスエンコーディング(RLE)で圧縮して、ボタンの状態(押す、離すなど)の変化のみがログイベントを発生させるようにすることができます。初期条件と入力ログから、ゲームの物理とAIへの入力を再生することにより、目標の完了を確認できます。

このようなログには、いくつかのアプリケーションがあります は、ビデオゲームのプレイヤー使い慣れた、特にエミュレートされたゲーム。プレーヤーはログからローカルでゲームを再視聴して、戦略の欠陥を探したり、地元の友達に自慢したりできます。ゲームのアトラクトモードは、選択したレベルのログで構成できます。GGPOエンジンを使用するゲームのネットプレイも同様に構成されています。他のプレイヤーの入力がインターネット経由で届くまでの時間を確保するために、入力とゲームエンジンの間には数フレームの遅延があります。また、リーダーボードの参加者にログのアップロードを要求すると、サーバーは、グラフィックエンジンのないゲームの縮小コピーで早送りでログを実行します。あるプレーヤーが別のプレーヤーのログをアップロードするリプレイ攻撃を防ぐために、ゲームの疑似乱数ジェネレーターをシードするために使用される情報には、プレーヤーのリーダーボードユーザーIDを含めることができます。このようにサーバーはそれらを比較できます

一部の非常に熱心なプレーヤーは、作業の証明となる入力ログを手動で作成します。これは「ツール支援スピードラン」と呼ばれます。パブリックリーダーボードでTASを使用したくない場合は、インターネットに接続している最中に、最高の競争レベルでのプレーを要求することができます。サーバーは数秒ごとにキー値を送信し、クライアントはあたかもそのキーで暗号化されたネットプレイであるかのようにリアルタイムで入力ログを送信します。このキーは数秒ごとに変化し、ある種のランダム要素を使用するゲームでは、疑似乱数ジェネレータを再シードする場合があります。キーを送信してから対応する入力パケットを受信するまでの持続的な遅延が数秒を超える場合、ユーザーが何か「面白い」ことを試みていると考えられます。


TASは、再生するログを手動で作成するだけではありません。つまり、状態を保存し、フレームごとに再生して、毎回完璧なアクションを実行できるようにゲームを操作しています。それはあなたのポイントではありませんが、言及する価値があります。en.wikipedia.org/wiki/Tool-assisted_speedrun
TankorSmash

3

これを完全にクライアント側で行い、プラットフォームによって提供されるプライベートストレージが十分に安全であると考えない場合(たとえば、レベルの完了に実際のお金がある場合)、必要なのは作業の証明です。保存ファイルには、関連するレベルを完了しない限り情報の作成を計算するのは難しいが、特定のレベルを必ずしも完了していない第三者が簡単に確認できるように設計された情報が含まれている必要があります(できれば、ソリューション自体を知っている)。レベルを完了する前後の作業証明の計算の難易度の差が大きいほど、作業証明はより安全になります。

残念ながら、この作業証明はゲームプレイに結び付けられている必要があるため、任意のゲームに対してこれを行う一般的な方法はなく、ゲームの実行可能ファイルにはゲームのソリューションが含まれていてはなりません。実行可能ファイルから作業証明を簡単に抽出できます。ほとんどの場合、ほとんどの場合、この特定の要件に基づいてゲームプレイを特別に設計して、作業証明を不正防止できるようにする必要があるため、創造的な自由も失われます。

たとえば、数独のゲームの場合、作業の証明は完成した数独ボードである可能性があります(ボードは信頼できるサードパーティによって生成される必要があることに注意してください。ほとんどの数独ボード生成アルゴリズムはソリューションを事前計算する必要があるため、これによりクライアントで行われた場合は機能します)。または、大きな合成数を因数分解するゲームの場合、作業の証明は主要な要因です(私はそのようなゲームをRSA対NSAと呼びます)。

ただし、本当に安全であるためには、ゲームにランダムな要素が含まれている必要があります。ゲームが完全に確定的である場合、レベルを完了した他の誰かから作業証明をコピーして不正行為を行うことができるためです(これはリプレイ攻撃です)。

作業の証明の目的は、不正行為を少なくともゲーム用のボットを作成するのと同じくらい難しくすることです。したがって、数独ゲームでカンニングするには、数独ソルバーなどが必要になります。

これは非常に難しいです。シングルプレイヤーゲームの場合は、クリエイティブな自由を保ち、不正行為を心配する必要はありません。それは彼らのゲームであり、彼らはそれを購入しました、そして彼らが不正行為をした場合、それはあなたの収益に影響を与えません。または、サーバーベースのゲームに切り替えて、サーバーですべての重要なゲームロジックを実行します。


1

保存情報を保持するために外部ファイルを使用することを好み、それがユーザーによって改ざんされる可能性がある場所にある場合は、暗号化のしくみを確認し、それを使用して誰もが意味のある変更を行うことができないようにすることができます。ファイル。Feistel Cipherのようなものが出発点として適切であり、多くの時間とノウハウなしで誰かが保存ファイルを変更するのを止めるのに十分でしょう。 http://en.wikipedia.org/wiki/Feistel_cipher

それとは別に、クライアントとサーバー側のストレージに関しては、ジョシュは頭に釘を打ちました。


0

誰かがバイナリを選択してアルゴリズムを見つけることができる場合-あなたは本当にそれを防ぐことができないので、気にしないでください。

停止するには、暗号化ハッシュを使用してください!

これがあるとします:

function computeHash(levels) {
    code = "";
    for(level in levels) {
       code = hash(code+level+level.isComplete()+"MAGICSALT")
    }
}

とてもシンプルですが、ファイルの最後にコードを記述し、そのファイルをいつものように解析して、 computeHash(levelListReadFromFile);

そのハッシュ=コードがファイルで読み取られた場合、それは非常におそらく「legit」です。つまり、16進エディタを持っている人はそれを解読せず、自分のことを知っている人が必要になります。

常にローカルストレージのBTWを優先します。明らかにMMOでない限り、人々はあなたがデータを使用することを望んでおらず、電車に乗り、あらゆる種類のことを行いません。正当な理由もなくインターネットアクセスを必要とするプログラムは嫌いです。


なぜダウンボーター???
Alec Teal 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.