2012-01-24 14 views
5

イントロインフォメーション: Windows 7 64ビット。 C++。 64ビットのアプリケーションとDLL。 MS Detoursなしでフック。迂回のないAPIフックなし

質問:私は、Windowsでフッキングを示す実例を得るという問題に苦労しました。そこには、32ビットのWindows XPが唯一のオペレーティングシステムだった頃に書かれたようなものがあります...私は64ビットのハードルを克服し、DLLを正常に注入しました。知識のこの旅の私の次のステップはフックです。 トピックのノスタルジアに合わせて、MSのDetoursは64ビット(無料)をサポートしていません。だから私はthis tutorialの従来の方法を追求した。

これぇは素晴らしいですが、私はこのセグメントを理解少し問題抱えている:

void BeginRedirect(LPVOID newFunction) 
{ 
    BYTE tempJMP[SIZE] = {0xE9, 0x90, 0x90, 0x90, 0x90, 0xC3}; 
    memcpy(JMP, tempJMP, SIZE); 
    DWORD JMPSize = ((DWORD)newFunction - (DWORD)pOrigMBAddress - 5); 
    VirtualProtect((LPVOID)pOrigMBAddress, SIZE, 
       PAGE_EXECUTE_READWRITE, &oldProtect); 
    memcpy(oldBytes, pOrigMBAddress, SIZE); 
    memcpy(&JMP[1], &JMPSize, 4); 
    memcpy(pOrigMBAddress, JMP, SIZE); 
    VirtualProtect((LPVOID)pOrigMBAddress, SIZE, oldProtect, NULL); 
} 

は特に、私はtempJMPバイトに苦しんだし、me​​mcpyのすべてが起こっています。私は、ハイジャックしたいメモ帳のInsertDate()関数のアドレスを持っていますが、どこを目標にするのかわかりません...これは新しい関数のアドレスですか?それとも相対的ではないのですか? Idk、私はちょうどいくつかのポインタを探しています。

答えて

1

全体的なアイデアはにMessageboxはを実行元のコードを "上書き" することです:

JuMP <CustomMessageBoxFunction> 
RETurn (back to program execution) 

ので、

まず彼コピーJMPアレイへの彼のシェルコード:

memcpy(JMP, tempJMP, SIZE); 

その後元のアセンブリコードバイトを元のアドレスから一時記憶域「oldBytes」にコピーし、カスタム関数の実行後に元のアセンブリコードバイトをコピーできるようにします。

memcpy(oldBytes, pOrigMBAddress, SIZE); 

それから彼コピー彼は以前に右JMP命令の後にJMPアレイに計算されたアドレスのサイズ:

memcpy(&JMP[1], &JMPSize, 4); 

は、最後に彼のJMP []配列は、例えば、彼の関数を呼び出すために必要なシェルコードが含まれています

JMP 1234 
RET 

ので、今、彼はプログラムが本来のMessageBox関数を見つけることを期待オリジナルのバイトを超えることをコピーすることがあります:あなたはInsertDateを(フックしたい場合

memcpy(pOrigMBAddress, JMP, SIZE); 

さて)、あなたの質問に来てpOrigMBAddressを使用する代わりに、InsertDateのアドレスを使用することができます。

しかし、これは64ビットのウィンドウではうまくいかないと思います。

2

ホットパッチ可能な機能は、以下の命令から始まり、先に 5 NOP命令(正しく覚えていればコード洞窟)が付いています。

ホットパッチを適用すると、moviエディットが上書きされ、コード洞窟にジャンプします。 コード洞窟は、フックハンドラ(APIコールを傍受して実際のAPI関数に転送する関数)へのジャンプでも書き直されています。

関連する問題