Detours を使用して実行可能ファイルのメッセージ関数にフックしていますが、独自のコードを実行してから元のコードを呼び出す必要があります。私が Detours のドキュメントで見たものからすると、それは間違いなく自動的に行われるように思えます。元の関数は画面にメッセージを出力しますが、迂回を追加するとすぐにコードの実行が開始され、出力が停止します。
元の関数コードは大まかに次のとおりです。
void CGuiObject::AppendMsgToBuffer(classA, unsigned long, unsigned long, int, classB);
私の機能は次のとおりです。
void CGuiObject_AppendMsgToBuffer( [same params, with names] );
元の関数が存在するメモリ位置を知っているので、次を使用します。
DWORD OrigPos = 0x0040592C;
DetourAttach( (void*)OrigPos, CGuiObject_AppendMsgToBuffer);
関数に私を取得します。このコードはほぼ完全に機能します。関数は適切なパラメーターで呼び出されます。ただし、実行は関数を離れ、元のコードは呼び出されません。jmping を再試行しましたが、プログラムがクラッシュします (フックに合わせて Detours が移動したコードがクラッシュの原因であると想定しています)。
編集:プログラムの実行に戻ることなく、最初の問題を修正できました。OrigPos 値を関数として呼び出すことで、「トランポリン」関数に移動し、そこから元のコードに移動できます。ただし、どこかでレジスタが変更されているため、元のコードに戻るとすぐにプログラムがセグメンテーション違反でクラッシュします。
Edit2:最終的な作業コード:
class CGuiObject
{
public:
void MyFunc( [params] );
};
DWORD TrueAddr = 0x0040592C;
CGuiObject::MyFunc( [params] )
{
_asm { pushad }
// process
_asm {
popad
leave
jmp TrueAddr
}
}
DetourAttach の最初のパラメーターに TrueAddr を使用します。