標準のハッキングケース。開始されたゲームプロセスにハックを挿入し、WriteProcessMemory
呼び出しを使用してプロセスメモリを上書きします。
状況は次のとおりです。
つまり、ゲームのメモリを難読化することはできませんが、同時に別のプログラムを実行する可能性があります。すべてのプロセスDLLを一覧表示するEnumProcessModules
を使用しようとしましたが、成功しませんでした。ハックはプロセスメモリに直接挿入されるため、検出されないようです。多くの「Googleリサーチ」を行った後、私はいくつかのオプションに行き着きました。
実行中のプロセス名、ゲームディレクトリ内のファイル、ファイルのバイトパターン、実行中のプロセスのバイトパターンをスキャンします。利用可能なすべてのハックのサンプルを取得し、新しいハッキングのたびにプログラムを更新する必要があるため、このタスクは非常に時間がかかります出てくる。すべてのハッキング情報はソース内に格納する必要があり、プログラムを非常に大きくする可能性があります。
ReadProcessMemory
を使用して、既知のメモリオフセットの変更を監視します(ハックは通常、同じオフセットを使用して何かを実現します)。通常の実行と比較して、いくつかのハックを実行し、動作を監視して、ハック動作のサンプルを取得する必要があります。プログラムは基本的にハックと同じことを行いますが、逆です。
メモリ内のWriteProcessMemory
呼び出しを検出します。これが正当なDLLからいくつかの誤検知をもたらすかどうかはわかりませんが、アイデアは興味深いようです。この呼び出しのプロセスメモリをどのようにスキャンしますか?そのバイト値を取得するにはどうすればよいですか?
これはハックコールの例です。
WriteProcessMemory(phandler,0xsomeoffset,&datatowrite,...);
オフセットは実際には少なくとも低レベルのハックでは修正されています。どういうわけかスタックを再配置したり、何らかの方法でスタックをプッシュダウンしたりすると、すでにハックをめちゃくちゃにしてゲームをクラッシュさせる可能性があります。
さらにいくつかの事実:
ここで私の質問は、ここで私の目標を達成するためのいくつかの良い方法は何でしょうか?ハッキングを混乱させたり、ハッキングの注入やメモリの変更を検出したりするアイデアは歓迎します。
100%安全なハッキング防止システムを導入する方法はないことはわかっていますが、一般に公開されているハックを使用しているハッカーだけを捕まえれば、すでにハッカーの95%にすぎないので、少数のスマートハッカーは気にしません。
これは非効率であるとおっしゃっていると思いますが、私も完全に同意します。確かに、ある種のタイマーを実行して、チートエンジンや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
命令などで置き換えるのはかなり簡単です。つまり、実行がスライドするだけですが、少しの自己検証でそれを簡単に取得できます。
したがって、結論として、次に:
独自のWriteProcessMemory関数を作成し、それをゲームのexeにリンクして、偽の呼び出しをフィルタリングしますか?または、フィルタリングできるストリームをインターセプトできるその他の関数。とにかく、これは非常に高度であり、すべてのkernel32.dll呼び出しまたはこのようなものを提供する必要があります。これからある程度保護したい場合は、基本的に実際に行う必要があります。ストリームのフィルタリングの一種が役立つかもしれませんが、これを見つけるには、コマンドが実行される瞬間を探すためにデバッガに時間を費やすことになります。デコードされるので、それをゼロで埋めることができます。 SSLプロキシはEMAILのように個別に用意するとよいでしょう。そのため、メッセージを受け取り、配信する前に、別のプロセスでスキャンチェックを実行してから、別のアカウントのメールボックスに配信します。
ゲームへのチャットを無効にする方法については、次の記事をお勧めします。
これは、いくつかの課題の優れた概要です。
もっと知りたい場合は、次の本もご覧ください。