web-dev-qa-db-ja.com

Windowsでのプロセスメモリインジェクションの検出または防止(アンチハッキング)

標準のハッキングケース。開始されたゲームプロセスにハックを挿入し、WriteProcessMemory呼び出しを使用してプロセスメモリを上書きします。

状況は次のとおりです。

  1. 私たちはゲームサーバーをホストしています
  2. クライアントは自分のゲームでサーバーに参加し、さまざまなハックを使用してゲームを破壊することができます
  3. ゲームソースを変更する機会はありません。現状のままです。ただし、クライアントがサーバーに参加する前にプログラムを強制的に実行する可能性があります。

つまり、ゲームのメモリを難読化することはできませんが、同時に別のプログラムを実行する可能性があります。すべてのプロセスDLLを一覧表示するEnumProcessModulesを使用しようとしましたが、成功しませんでした。ハックはプロセスメモリに直接挿入されるため、検出されないようです。多くの「Googleリサーチ」を行った後、私はいくつかのオプションに行き着きました。

  1. 実行中のプロセス名、ゲームディレクトリ内のファイル、ファイルのバイトパターン、実行中のプロセスのバイトパターンをスキャンします。利用可能なすべてのハックのサンプルを取得し、新しいハッキングのたびにプログラムを更新する必要があるため、このタスクは非常に時間がかかります出てくる。すべてのハッキング情報はソース内に格納する必要があり、プログラムを非常に大きくする可能性があります。

  2. ReadProcessMemoryを使用して、既知のメモリオフセットの変更を監視します(ハックは通常、同じオフセットを使用して何かを実現します)。通常の実行と比較して、いくつかのハックを実行し、動作を監視して、ハック動作のサンプルを取得する必要があります。プログラムは基本的にハックと同じことを行いますが、逆です。

  3. メモリ内のWriteProcessMemory呼び出しを検出します。これが正当なDLLからいくつかの誤検知をもたらすかどうかはわかりませんが、アイデアは興味深いようです。この呼び出しのプロセスメモリをどのようにスキャンしますか?そのバイト値を取得するにはどうすればよいですか?

これはハックコールの例です。

WriteProcessMemory(phandler,0xsomeoffset,&datatowrite,...);

オフセットは実際には少なくとも低レベルのハックでは修正されています。どういうわけかスタックを再配置したり、何らかの方法でスタックをプッシュダウンしたりすると、すでにハックをめちゃくちゃにしてゲームをクラッシュさせる可能性があります。

さらにいくつかの事実:

  1. 新しいハッキングが公開されることはめったになく、公開されて実際に機能するハックの数は決まっています。それらのほとんども同様に機能します。
  2. 目標は、ハッキングを検出するか、それが機能しないように混乱させることです

ここで私の質問は、ここで私の目標を達成するためのいくつかの良い方法は何でしょうか?ハッキングを混乱させたり、ハッキングの注入やメモリの変更を検出したりするアイデアは歓迎します。

100%安全なハッキング防止システムを導入する方法はないことはわかっていますが、一般に公開されているハックを使用しているハッカーだけを捕まえれば、すでにハッカーの95%にすぎないので、少数のスマートハッカーは気にしません。

5
cen

これは非効率であるとおっしゃっていると思いますが、私も完全に同意します。確かに、ある種のタイマーを実行して、チートエンジンやtsearchなどのプログラムを継続的にスキャンすることができます

次に、完全にランダムな別のアイデアを示します。ゲームのオフセットでバイトをチェックする関数を記述し、それが目的のバイトと一致するかどうかを確認できます。一致しない場合は、イベントを呼び出してゲームをシャットダウンできます。または、そのオフセットに正しいバイトを書き込むために、サーバーに保存されているバイトに対してバイトをチェックすることもできます。バイトが異なる場合、ユーザーはキックされます。

それがあなたにいくつかのアイデアを与えることを願っています:)

このような質問が大好きです。

さて、最初に:

私たちはゲームサーバーをホストしています

バム、行ったよ。クライアントが状態の更新を他のクライアントにプッシュする前にゲームサーバーに送り返す必要がある場合は、ゲームの状態の変化を分析する機会があります。これは、異常なパターンを検出できることを意味します。したがって、たとえば、金の価値の大幅な変化が突然見られた場合、そのユーザーをゲームから締め出すことができます。

あなたが取ることができる多くの統計的アプローチがあります。明らかな「大幅な変更」または「不可能なアクション」の他に、長期にわたる金などのより長期的なソリューションを適用できます。 「キャラクターに大量の金を追加しない」トリックについて知っているとすれば、時間の経過とともに金を安全な量だけ増やす可能性があります。私が常にエッジをプッシュするなら、素晴らしいです。ただし、この一定の増加は、本物の一貫したゲームプレイで獲得した同等の金と相関しないため、再び、アカウントを検出してシャットダウンします。

ここで重要なのは、エンドユーザーがゲームの状態を操作したとしても、エンドユーザーが何もできないサーバー側でできることです。

次に、Win32の副次的な質問について説明します。まず、WriteProcessMemoryは、デバッガを除いて、DLLを呼び出す場合に特に有効な呼び出しではないと思います。これにより、コード内の命令が置き換えられます-これは、ただし、デバッガーによって設定されたブレークポイントは機能します)が、実際にルートキットであるものを記述せずに、システム上のすべての呼び出しに対して確実にこれを置き換える方法はありません。 。

あなたができることの1つ-それは決して偉業ではありません-自分の実行可能メモリの変更を定期的にチェックすることです。詳細については、codeprojectの Tamper Aware/Self Healing Code を参照してください。基本的に、定期的にこれを呼び出し、変更を検出した場合にゲームをクラッシュさせます。

コード署名 を検討することもできます。これは途方もなく高価ではなく、オフラインで実行可能な変更を防ぐための組み込みのWindowsの方法を提供します。

保存した状態をローカルに保存する場合は、チェックサムを保存してサーバーアカウントに送信することを検討してください。いいえ、これは完全なものではありませんが、さらに複雑になります。

これらの機能のいずれかを実装する場合は、バリアを少し上げて、クラッカーが無効化、スキップ、またはその他の方法で保護メカニズムを回避するのを困難にする必要があります。明確にしましょう-誰かが十分に決意している場合、あなたは終わりですが、少なくともあなたは彼らの生活を非常に苦痛にすることができます。

私のリーディングリストでのアンチリバースエンジニアリングのトップ記事も コードプロジェクトから です。このガイドは非常に詳細であり、デバッガーを混乱させたり、他の方法で混乱させたりするためにできることを正確に説明しています。私はそれらの1つを見ていきます。

 SetUnhandledExceptionFilter(UnhandledExcepFilter);
 __asm{xor eax, eax}
 __asm{div eax}

これは悪です。基本的に、この記事で説明しているように、UnhandledExceptionHandlerは、最後の手段として、非デバッグプロセスで呼び出されます。ただし、この場合は、意図的にeaxをクリアしてから、ゼロで除算します。これによりプロセッサ障害が発生し、OSが実行可能ファイルの例外ハンドラに返送されます(デバッガが接続されている場合のみ)。デバッガーが接続されている場合、デバッガーに通知が送信され、実行可能ファイルが終了します。

もちろん、攻撃者がdiv eaxを1つまたは複数のnop命令などで置き換えるのはかなり簡単です。つまり、実行がスライドするだけですが、少しの自己検証でそれを簡単に取得できます。

したがって、結論として、次に:

  • 私の最初のアドバイスは、サーバー側のチートを検出しようとすることです。ここで、すべてのキーを保持します。これらの変更を「暗く」導入することもできます。つまり、だまされている人を確認して確認し、それらの状態を分析して、うまく機能するかどうかを確認して、途切れることはありません。
  • 次に、いくつかの形式で定期的な自己検証を試みます。
    • 実行可能ファイルの信頼できる限りのメモリ内。
    • 重要なデータ構造のメモリ内で、信頼できる限り。
    • ディスク上の実行可能ファイルも。
  • 最後に、そのリバースエンジニアリングガイドを上から下に読み、実行可能ファイルに何を適用できるかを確認します。実行可能ファイルを変更することはできないとおっしゃっていましたが、正直に言ってそうしないと、それに反対する可能性があります。結局のところ、2番目の「監視プロセス」は、攻撃者によって強制終了される可能性があります。
6
user2213

独自のWriteProcessMemory関数を作成し、それをゲームのexeにリンクして、偽の呼び出しをフィルタリングしますか?または、フィルタリングできるストリームをインターセプトできるその他の関数。とにかく、これは非常に高度であり、すべてのkernel32.dll呼び出しまたはこのようなものを提供する必要があります。これからある程度保護したい場合は、基本的に実際に行う必要があります。ストリームのフィルタリングの一種が役立つかもしれませんが、これを見つけるには、コマンドが実行される瞬間を探すためにデバッガに時間を費やすことになります。デコードされるので、それをゼロで埋めることができます。 SSLプロキシはEMAILのように個別に用意するとよいでしょう。そのため、メッセージを受け取り、配信する前に、別のプロセスでスキャンチェックを実行してから、別のアカウントのメールボックスに配信します。

0
Andrew Smith

ゲームへのチャットを無効にする方法については、次の記事をお勧めします。

これは、いくつかの課題の優れた概要です。

もっと知りたい場合は、次の本もご覧ください。

0
D.W.