EndScene
任意の DirectX 9 アプリケーションから迂回して小さなオーバーレイを作成したい。例として、FRAPS のフレーム カウンター オーバーレイを取り上げることができます。これは、アクティブ化されたときにゲームに表示されます。
これを行うには、次の方法を知っています。
新しい を作成し
d3d9.dll
、それをゲーム パスにコピーします。現在のフォルダーが最初に検索されるため、system32 などに移動する前に、変更した DLL が読み込まれ、追加のコードが実行されます。
欠点:ゲームを開始する前に、そこに置く必要があります。最初の方法と同じですが、system32 の DLL を直接置き換えます。
欠点:ゲーム固有のコードを追加することはできません。DLL をロードしたくないアプリケーションを除外することはできません。IDA Pro 4.9 Free などのツールを使用して、DLL から EndScene オフセットを直接取得します。DLL はそのままロードされるため、このオフセットを DLL の開始アドレスに追加するだけでゲームにマップされ、実際のオフセットが取得され、フックされます。
欠点:オフセットはすべてのシステムで同じではありません。D3D9
Direct3DCreate9
を取得するためにフックD3D9->CreateDevice
し、デバイス ポインターを取得するためにフックDevice->EndScene
し、仮想テーブルを介してフックします。
欠点:プロセスが既に実行されている場合、DLL を挿入することはできません。CREATE_SUSPENDED
イニシャルをフックするには、フラグを使用してプロセスを開始する必要がありますDirect3DCreate9
。DLL が挿入されるとすぐに、新しいウィンドウで新しいデバイスを作成します。次に、
EndScene
このデバイスからオフセットを取得してフックすると、ゲームで使用されるデバイスのフックになります。
欠点:私が読んだいくつかの情報によると、2番目のデバイスを作成すると既存のデバイスに干渉する可能性があり、ウィンドウモードとフルスクリーンモードなどでバグが発生する可能性があります.3番目の方法と同じです。ただし、取得するにはパターン スキャンを実行します
EndScene
。
欠点:それほど信頼できるようには見えません。
他のシステムで異なるd3d9.dllを処理する必要なく、信頼できる方法でEndScene
、ゲームが既に実行されているときに読み込まれる可能性のある注入された DLL からフックするにはどうすればよいですか? たとえば、FRAPS は DirectX フックをどのように実行しますか? DLL は、すべてのゲームに適用する必要はありません。CreateRemoteThread