2012-11-19 4 views
8

ここでは、興味のある機能の始めにいくつかのバイトを書き換えるフックをインストールする標準的なコードを示します。私の質問は、なぜ、書き換えられたメモリを再保護する必要があるのでしょうか?アクセス許可をPAGE_EXECUTE_READWRITEにするだけでいいですか?ここでは、元のバイトを常に元に戻して、再度読み直す必要があると仮定します。フック:権限を復元するためにVirtualProtect()をもう一度実行する必要があるのはなぜですか?

if (VirtualProtect(funcPtr, 6, PAGE_EXECUTE_READWRITE, &dwProtect)) // make memory writable 
{ 
    ReadProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, Hook::origData, 6, 0); // save old data 
    DWORD offset = ((DWORD)hook - (DWORD)funcPtr - 5); //((to)-(from)-5) 
    memcpy(&jmp[1], &offset, 4); // write address into jmp 
    memcpy(Hook::hookData, jmp, 6); // save hook data 
    WriteProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, jmp, 6, 0); // write jmp 
    VirtualProtect(funcPtr, 6, dwProtect, NULL); // reprotect 
} 
+1

まあ、そうではありません。あなたがしていることに決して成功しない限り。そうすれば、あなたが開いたままのドアから他の人がプログラムをハックするのは面白いものになります。 –

+1

@HansPassantでも、他の人が同じことをするのを止めることができます。つまり、VirtualProtect()にフックして、私の(または元の)バイトとVirtualProtect()を書き直しますか? – withkittens

答えて

8

ドアが開いたら、誰もが通り抜けることができます。書き込み保護をメモリ範囲から削除した場合、コードだけでなく、そのメモリを更新することができます。メモリには、あなたの(合法的な)コードが、それを更新するコードであるか、プロセス空間にロードされている単純なバグのあるDLLであっても、それを知る方法がありません。それを再プロテクトすると、コードを変更しないで、変更したいメモリの場所を更新するのを防ぐことができます。

+0

あなたの答えをありがとう、David。扉との比較を続ける - 誰がそれを通って歩いてくれるのか分かっていれば、私はそれを開いたままにすることができるようです。常にメモリの保護/再保護のパフォーマンスヒットはありますか? – withkittens

+0

セキュリティの観点から、 'VirtualProtect'は悪い/バグのコードに対する1つの保護層を管理します。その層が必要かどうかは、あなた次第です。パフォーマンスの観点からは、呼び出される関数は呼び出されない関数よりも実行に時間がかかります。プロファイリングを使用して、実際にそのようなパフォーマンスが向上しているかどうかを確認し、保護層がないと考える価値があるかどうかを確認します。 – prprcupofcoffee

関連する問題