从DLL写入内存时出错

时间:2014-07-27 09:26:29

标签: c dll hook

我正在尝试更改我所拥有的程序上的MessageBox显示。我试图通过注入DLL并从MessageBox函数执行跳转到我的DLL来执行此操作,这将导致我的MessageBox显示而不是常规的。{/ p>

我编写了以下代码,它在内存中获取了MessageBox的地址以及我的MessageBox的地址,我正在尝试计算操作码以预先形成跳转但不幸的是我每次注入DLL时都会收到“访问冲突”错误,这里是代码:

DWORD   oldProtect;

PVOID MessageBoxaddr = GetProcAddress(
    GetModuleHandle("User32.dll"), "MessageBoxA");
PVOID MessageBoxHookAddr = &HookedMessageBox;
DWORD relJmp = (DWORD)MessageBoxaddr- ((DWORD)MessageBoxHookAddr + 5);

VirtualProtect(MessageBoxaddr,
    sizeof(BYTE)* 5, PAGE_EXECUTE_READWRITE, &oldProtect);

// These line preform the little Debian method and are the cause for the error

((PBYTE)MessageBoxaddr)[0] = 0xe9;
((PBYTE)MessageBoxaddr)[1] = relJmp ^ 0x000000ff;
((PBYTE)MessageBoxaddr)[2] = (relJmp ^ 0x0000ff00) >> 8;
((PBYTE)MessageBoxaddr)[3] = (relJmp ^ 0x00ff0000) >> 16;
((PBYTE)MessageBoxaddr)[4] = (relJmp ^ 0xff000000)>>24;

VirtualProtect(MessageBoxaddr,
    sizeof(BYTE)* 5, PAGE_EXECUTE_READ, &oldProtect);

return 0; 

1 个答案:

答案 0 :(得分:1)

User32.dll

中没有MessageBox这样的功能

MessageBox实际上是一个解析为MessageBoxAMessageBoxW的宏,具体取决于是否设置了预处理程序标记UNICODE

因此,您可以定位MessageBoxAMessageBoxW,但GetProcAddress(.., "MessageBox")将返回NULLVirtualProtect将尝试更改网页访问权限NULL指针,这就是您获得访问冲突的原因。

此外,您可能希望使用Microsoft Detours库来执行此操作,而不是滚动自己的代码。