0

オンライン ゲームのレガシー コードを拡張して、ゲームに関連付けられたリソース ファイルが最新バージョンであり、改ざんされていないことを合理的に保証しようとしています。DRM なしで、カーネル モードに入らず、ハードウェアの支援なしでこれを実行したいと考えています。私が最終的に決めたのは、理想的には、ユーザー空間が得られるのと同じくらい安全であるべきです. 彼らがこれらのメカニズムを回避できれば、私は彼らがいたずらをする権利を獲得したと思います.少なくともしばらくの間、私たちはそれらを禁止します. :)

当然行うべきことは、各ファイルの暗号化ハッシュを取得し、ハッシュ出力を事前に計算されたハッシュと比較することです。ただし、現在計算されているハッシュとの比較に使用される、事前に計算されたハッシュをユーザーが簡単に改ざんできないように注意する必要があります。アーキテクチャレベルで私が念頭に置いていた対策は次のとおりです。

  1. OS 機能を使用して、プロセスの開始時にすべてのリソース ファイルを書き込み用にロックし、後で他のプロセスがファイルを上書きできないようにします。
  2. 各リソース ファイルの MD5 合計を計算します。
  3. https サーバーに接続し、クライアントの実行可能ファイルに格納されている特定の署名付き証明書に対する検証を要求します。
  4. 「正しい」ハッシュを含むファイルを https 経由でダウンロードし、(ディスクではなく) RAM に保存します。
  5. 計算されたハッシュを https 経由で受信したハッシュと比較します。
  6. ハッシュが一致しない場合は終了します。

これは、ハッシュをクライアント側に保存するよりも安全です。ハッシュがクライアント側に保存されている限り、通常は誰かがハッシュを変更できるからです。このスキームを使用する場合、攻撃者は、組み込みの公開証明書を変更して、実際に攻撃者の証明書が含まれるように実行可能ファイルを変更する方法を見つけ出す必要があります。これにより、攻撃者の証明書と一致する汚染されたハッシュを含む攻撃者の https Web サーバーに対して検証されます。改ざんされたリソース ファイル。これは確かに実現可能ですが、プログラムがクライアントに保存されている事前計算されたキーを使用している場合よりもはるかに困難ですよね?

実行可能ファイルはネイティブ コードであるため、バイナリを編集して公開キーを置き換えることをさらに困難にするパッカーでラップすることが可能になる場合があります。

さて、2 段落前に、私が考案したスキームを潜在的に攻撃する方法を説明したばかりですが、私が説明した方法以外に、このスキームを攻撃する方法はありますか?

2 番目の質問は、これらのタスクを実行するために Win32 C++ (Visual Studio 2010 コンパイラ) から呼び出すことができる無料の (フリーウェアまたはフリーダムのような) ライブラリとは何ですか? 組み込みの Windows API で実行できますか、それともサード パーティのソリューションが必要ですか?

要約すると、質問は次のとおりです。2. それを実装するためにどの依存関係またはライブラリを使用しますか?

これは単なるゲームであり、国家安全保障や金銭的リスクの問題ではありません (ゲームは 100% フリーウェアであり、ゲーム内経済はありません)。 -力。

私の質問の一方または両方の部分に自由に答えてください。そもそも私が間違った質問をしていると思われる場合は、訂正してください。

ありがとう!

4

1 に答える 1

2

私はあなたのソリューションが好きです。よく考えられています。あなたは本質的にあなた自身の質問に答えます。指摘すべきいくつかの提案があります。

タスクに最も適した Win32 ライブラリは、ハッシュ用のWindows Crypto APIです。また、私が推奨する SHA-1 もサポートしています (最近では MD5 は脆弱でクラック可能と見なされているため)。計算されたハッシュに秘密鍵 (コードに埋め込まれた) が含まれるように、SHA1 で HMAC を使用することも検討してください。

Wininetは、ダウンロードに適したライブラリです。証明書の検証で HTTPS をサポートしていると思います。

ファイルを開くための Windows API CreateFileは、基本的にコンテンツ ファイルをロックできます。FILE_SHARE_* フラグを指定せずにすべてのファイルを開くだけです。

ゲーム業界での短い時間の間に私が学んだ他のいくつかのアイデアを捨てさせてください.

ほとんどのゲームは、詐欺師が次の楽しいゲームに移るまでの寿命が短い (数か月から 1 年) だけです。このように、決心したハッカーを阻止するための完璧な解決策が他にないことを考えると、基本的には時間を稼ぐことができる解決策を探していることになります。つまり、ゲームに追加する保護ハックが多いほど、断固たるハッカーがソリューションを破るのに時間がかかります。すべての保護が暗号的に安全でなくても、時間は稼げます。

ゲームの EXE を逆アセンブルして変更しようとするハッカーに関心がない場合は、提案された解決策が与えられた可能性があります。しかし、次のことを考慮してください。

1) これはより単純な攻撃です。コードのどこかに、説明したハッシュ検証ソリューションに基づいてゲームを続行できるかどうかを決定する関数が含まれている可能性があります。ハッカーがしなければならないことは、最終的な検証が終了する場所を見つけて、検証コードが常に成功するように強制することだけです。つまり、コードに次のような関数がある場合:

bool IsContentValid()
{
   // compare the local hash with the hash returned from the https response
   return (0 == memcmp(local_hash, network_hash, sizeof(HASH)));
}

その後、決心したハッカーが自分の EXE を変更して、このコード パスが常に成功するようにすることは、信じられないほど簡単になります。ハッカーは、コードが最終チェックを行うポイントに到達するのを待つだけで、アセンブリを置き換えて false ビットを true に反転します。

明らかな回避策の 1 つは、この関数のさまざまなバリエーションをゲーム コードのさまざまな領域にリンクし、ゲーム プレイ中に定期的に呼び出されるようにすることです。関数の代わりに #define C マクロを使用して、このチェックを実装します。コードの 10 の異なるバリエーションを 10 の異なるマクロとして実装します。コードの 50 の異なる場所でこれらのマクロを呼び出します。ハッカーが成功するには、それらすべてを見つけてパッチを当てる必要があります。コンテンツが無効であると見なされた場合、ゲームがバグのある動作をするようにします。たとえば、彼のコンテンツ ファイルが無効な場合、ゲーム プレイヤーのヘルスと弾薬の値がランダムにゼロになり、簡単に倒せます!

2) コンテンツの新しいハッシュを生成し、EXE の新しいレイアウトを生成する以外に理由がなくても、より頻繁に (数か月ごとに) ゲームにパッチを適用することは、時間を稼ぐもう 1 つの保護手段です。毎月、ゲームにパッチを当てて、暗号ハッシュ アルゴリズムを更新し、コンテンツを微調整するだけだと想像してみてください。元のクラックをリリースしたハッカーは、最初からやり直さなければなりません。これにより、彼が再び成功した場合、更新されたクラックを配布するのに時間がかかります。

3) コンテンツのローカル検証とネットワーク検証の両方を行います。異なるハッシュ アルゴリズムを使用する必要があります。

4) 時間を稼ぐもう 1 つの安っぽいハック: EXE 自体の HASH とコンテンツ (ローカルとネットワークの両方) を検証します。

5) コンテンツの別のハッシュと exe を使用して、サーバーへのすべてのネットワーク メッセージにデジタル署名するための単純な暗号キーにします。ネットワーク メッセージに追加するだけです: your_simple_fash_hash(content_hash, exe_hash, network_message)。サーバーは、受信したすべてのネットワーク メッセージに対して同じことを行います。さまざまなネットワーク メッセージ タイプに対して、このハッシュ/署名コードのさまざまなバージョンを実装します。高速ハッシュ関数の例としてMurmur ハッシュを見てください。ここで、ハッカーはネットワーク コードもハッキングする必要があります。

6) ハッカーが Softice やその他の種類のカーネル デバッガーを使用してゲーム コードを逆アセンブルするのを困難にします。コンテンツ検証ハッシュ (または任意の暗号鍵) を格納するために使用される変数も暗号化する必要があります。安っぽい保護 - すべての重要な変数を RAM に格納するときに 0xAAAAAAAA (またはその他のノイズ) で XOR します。これらの値を使用する必要がある場合は、それらを XOR して一時変数に戻し、適切に使用してから、計算が完了したらすぐに結果をゼロにします。コンテンツ ファイルのハッシュに加えて、プレイヤーのヘルス、燃料、弾薬の変数もこの方法で処理する必要があります。

7) 可能であれば、重要な変数を RAM 内で移動して、ゲーム全体で同じメモリ位置に保持されないようにする賢い方法を見つけてください。

わかりました、それはブレインダンプです。stackoverflow で評判ポイントが 1 つしかない人のために、私が書きたいと思う以上のことです。お役に立てば幸いです。

于 2010-08-15T06:33:26.207 に答える