我制作了一个测试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更改了操作码并且它工作正常。
答案 0 :(得分:0)
我认为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并且地址将出错。