質問

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

明らかなことは、各ファイルの暗号化ハッシュを取り、ハッシュ出力を事前に計算されたハッシュと比較することです。ただし、ユーザーが、現在計算されているハッシュとの比較に使用される事前に計算されたハッシュを簡単に改ざんしないことを保証するために注意する必要があります。建築レベルで、私が念頭に置いていた手段は次のとおりです。

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

これは、ハッシュクライアント側を保存するよりも安全です。クライアント側が保存されている限り、誰かがそれらを変更することが可能であるためです。このスキームを使用して、攻撃者は、攻撃者の証明書を実際に含めるように、埋め込みパブリック証明書を変更する方法で実行可能ファイルを変更する方法を把握する必要があります。改ざんされたリソースファイル。これは確かに実行可能ですが、プログラムが事前に計算されたキーをクライアントに保存していた場合よりもはるかに困難ですよね?

実行可能ファイルはネイティブコードなので、バイナリを編集して公開キーを交換することをさらに困難にするパッカーにラップすることが可能かもしれません。

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

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

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

これは単なるゲームであり、国家安全保障や金銭的リスクの問題ではないため(ゲーム内経済のないゲームは100%フリーウェアです)、私が実装するソリューションはかなり良いはずですが、産業的である必要はありません-力。

あなたが私の質問の一方または両方の部分に適していると思うので、自由に答えてください。そして、あなたが私が最初から間違った質問をしていると思うなら、私を修正してください。

ありがとう!

役に立ちましたか?

解決

私はあなたの解決策が好きです。よく考えられています。あなたは本質的にあなた自身の質問に答えます。指摘する提案がいくつかあります。

あなたのタスクに最も適した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を変更して、このコードパスを常に成功させることが非常に簡単になります。ハッカーは、コードが最終チェックを行うポイントに到達するのを待つだけで、アセンブリを交換して虚偽のビットをtrueにひっくり返します。

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

2)コンテンツの新しいハッシュを生成する以外に理由がなくても、ゲームに頻繁にパッチを適用し、EXEの新しいレイアウトは時間を購入する別の保護です。毎月、ゲームにパッチを当て、暗号ハッシュアルゴリズムとコンテンツのわずかな調整を単純に更新することを想像してください。元の亀裂をリリースしたハッカーは、もう一度やり直す必要があります。彼が再び成功した場合、彼は更新された亀裂を配布するのに時間がかかり、より多くの時間がかかります。

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

4)購入時間を購入する別のチーズのハック:EXE自体のハッシュとコンテンツ(ローカルおよびネットワーク上の両方)を検証します。

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

6)ハッカーがSofticeまたは他の種類のカーネルデバッガーを使用してゲームコードを分解することを難しくします。コンテンツの検証ハッシュ(または暗号キー)の保存に使用される変数も暗号化する必要があります。 1つのチーズの保護-1つのCheeezy保護-0XAAAAAAAAA(または他のノイズ)を備えたすべての重要な変数をRAMに保存するとき。これらの値を使用する必要がある場合は、それらをTemp varに戻し、Appropraiteを使用してから、計算が完了したらすぐに結果をゼロにします。コンテンツファイルのハッシュに加えて、プレーヤーの健康、燃料、弾薬の変数もこのように扱う必要があります。

7)可能であれば、ゲーム全体の同じメモリ位置に持続することがないように、RAMで重要な変数を移動する賢い方法を見つけます。

わかりました、それは脳のダンプです。 Stackoverflowで1つの評判ポイントしかない人のために私が書くのが好きな以上です。私はそれが役立つことを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top