特定のゲームで問題が発生し、同じコンピューターでゲームの複数のインスタンスを実行することを目的として、内部で実行されているゲームの存在を検出します sandboxie (サンドボックス内でプログラムを実行するためのアプリケーション) 。
ゲームはサンドボックスの存在を検出する手法を採用しており、オンラインでこの問題に関する情報が不足していることがわかりましたが、ゲームのモジュールリストで「SbieDll.dll」の存在を検出したことが原因のようです処理する。私はこれについて論理的に考え、PEB_LDR_DATA構造のようなものを使用して各モジュールを反復処理し、文字列が「SbieDll.dll」と一致するかどうかにフラグを立てていると仮定しました。
ですから、私がしなければならないことにはいくつか問題があります。sandboxieはクローズドソースプログラムなので、DLLの名前を単純に編集することはできません。
だから私はこれに関して最初の存在について2つの質問があります:
新しい名前を16進編集したときにアプリケーションが壊れないようにするにはどうすればよいですか?置換するSbieDll.dll以外の何かを検索する必要がありますか?
2つ目は、サンドボックスの存在を検出するためにゲームで使用できる他のテクニックは何ですか?もしそうなら、ゲームが実際にサンドボックスによって実行されていることを隠すことができる他の方法はありますか?
すべてのサンドボックスで置き換えられた実行可能ファイルとモジュールの16進数エディター(HXD)のSbieDll.dllのすべてのインスタンスの名前を同じ名前の長さのファイル名(例:1234567.dll)に変更し、PEエクスプローラーを使用してPEヘッダーを編集しました。 「sandboxie」のすべての痕跡をアプリケーションから削除しますが、これはsandboxie自体を壊して例外をスローするようです:
「ダイナミックリンクライブラリC:\ Program Files\Sandboxie\SbieDll.dllの初期化に失敗しました。プロセスは異常終了しています」
私はゲームがサンドボックスで問題なく実行できることを期待しています。
新しい名前を16進編集したときにアプリケーションが壊れないようにするにはどうすればよいですか?置換するSbieDll.dll以外の何かを検索する必要がありますか?
80年代には、16進エディターでプログラムバイナリを開いて文字列を変更することが可能であり(Atari ST、Amigaなどのコンピューター上)、それでも文字列のサイズは同じままである必要がありました...今日のオペレーティングシステムでは、.exe内の一部の文字列を変更することは可能ですが、これにより、exeの コード署名証明書 (存在する場合)が改ざんされ、対策(これらの文字列を難読化するなど)を克服した場合)取られませんでした。
2つ目は、サンドボックスの存在を検出するためにゲームで使用できる他のテクニックは何ですか?もしそうなら、ゲームが実際にサンドボックスによって実行されていることを隠すことができる他の方法はありますか?
一般的に使用されるその他の手法は次のとおりです。
アンチデバッグ実行中のデバッガを検出するには多くの方法があり、簡単な方法は IsDebuggerPresent 関数を呼び出すことです。この関数は、呼び出しプロセスがユーザーモードデバッガーによってデバッグされているかどうかを検出します。
アンチブレークポイントブレークポイントなしでソフトウェアをリバースエンジニアリングすることは非常に困難です。一般的なアンチリバースエンジニアリングの戦術は、ブレークポイントの検出に基づいており、対応する一連のアンチデバッグ方法を提供します。
NtQueryInformationProcessチェックのバイパスおそらくサンドボックスの検出に使用されたメソッドです。これを回避するには、NtQueryInformationProcess関数によって返される値を、デバッガーの存在を示さない値に変更する必要があります。
難読化の場合、文字列「SbieDll.dll」を見つけるのは困難です。
実際、この無限の戦いが提供しなければならない場合の反対側、たとえば PELock を読んで、詳細を学ぶことができます。彼らはゲームのハッキングを防ぐための専用機能を備えています。
要約すると、唯一の方法は、これらの保護方法をいくつか克服し、ソフトウェア全体をリバースエンジニアリングし、逆アセンブルしてから、ソースコードレベルで変更を加え、再構築することです。