0

IsDebuggerPresent をテストするコンソールを作成しましたが、その出力を変更しようとしています。DLL注入前のメモリ領域:http: //imageshack.us/photo/my-images/842/hso7.jpg/ DLL注入後のメモリ領域:http: //imageshack.us/photo/my-images/59/ i1jw.jpg/

C++を使用して、004116D5(選択された灰色のアドレス)のアドレスをJE 004116DEからJNZ/JNE 004116DEに変更したいと考えています。

DWORD asmAddy = 0x004116D5;    
#define Naked __declspec(naked)
Naked void changeasm()
{
_asm
{
jnz 0x004116DE
}
}

DllMain の下で、私は Microsoft Detours 1.5 を使用しました

DetourFunction((PBYTE)asmAddy,(PBYTE)changeasm);

後画像では、挿入された dll のメモリにジャンプしているように見えます。

4

1 に答える 1

1

Detours は、インポート テーブルをフックすることで関数全体を置き換えると思いますね。それはあなたが本当にやろうとしていることのようには聞こえません。

私があなたの質問を理解している場合、オペコードを JE (0x74) から JNE (0x75) に変更したいと考えています。コード領域への書き込みは保護されています。新しいオペコードを既知の場所に書き込む前に、メモリの保護を変更する必要があります。このようなもの (エラー処理なしのテストされていないコード):

char *address = 0x004116d5;
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery(address, &mbi, sizeof(mbi));
VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_READWRITE, &mbi.Protect);

*address = 0x75; // opcode of 

// restore the memory protection
DWORD oldProtect;
VirtualProtect(mbi.BaseAddress, mbi.RegionSize, mbi_thunk.Protect, &oldProtect);

ただし、これはすべて非常に危険であることに注意してください。これが DLL 内のアドレスである場合、DLL が再配置され、アドレスが間違っている可能性があります。

于 2013-08-04T08:53:50.837 に答える