6

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 を使用します。

4

0 に答える 0