我正在尝试更改我所拥有的程序上的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;
答案 0 :(得分:1)
User32.dll
中没有MessageBox
这样的功能
MessageBox
实际上是一个解析为MessageBoxA
或MessageBoxW
的宏,具体取决于是否设置了预处理程序标记UNICODE
。
因此,您可以定位MessageBoxA
或MessageBoxW
,但GetProcAddress(.., "MessageBox"
)将返回NULL
,VirtualProtect
将尝试更改网页访问权限NULL
指针,这就是您获得访问冲突的原因。
此外,您可能希望使用Microsoft Detours库来执行此操作,而不是滚动自己的代码。