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 的内存。有人可以帮我解决这个问题吗?我已经使用 OllyDbg 更改了操作码,它工作正常。

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 回答