【发布时间】:2020-09-07 20:36:13
【问题描述】:
您好,我是函数挂钩的新手,我正在使用文章中的代码。
这是我的代码
#include <windows.h>
#include <iostream>
FARPROC messageBoxAddress = NULL;
SIZE_T bytesWritten = 0;
unsigned char messageBoxOriginalBytes[6] = { } ;
int __stdcall HookedMessageBox(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) {
printf("la la la ");
printf("\n");
WriteProcessMemory(GetCurrentProcess(), (LPVOID)messageBoxAddress, messageBoxOriginalBytes, sizeof(messageBoxOriginalBytes), &bytesWritten);
return MessageBoxA(NULL, lpText, lpCaption, MB_OK);
}
int main()
{
SIZE_T bytesRead = 0;
HINSTANCE library = LoadLibraryA("user32.dll");
FARPROC messageBoxAddress =GetProcAddress(library, "MessageBoxA");
ReadProcessMemory(GetCurrentProcess(), messageBoxAddress, messageBoxOriginalBytes, 6, &bytesRead);
void* hookedMessageBoxAddress = &HookedMessageBox;
char patch[6] = { 0 };
memcpy_s(patch, 1, "\x68", 1);
memcpy_s(patch + 1, 4, &hookedMessageBoxAddress, 4);
memcpy_s(patch + 5, 1, "\xC3", 1);
WriteProcessMemory(GetCurrentProcess(), (LPVOID)messageBoxAddress, patch, sizeof(patch), &bytesWritten);
MessageBoxA(NULL, "hello", "Welcome", MB_OK);
return 0;
}
输出
la la la
la la la
la la la
la la la
la la la
la la la
la la la
问题是我只想要一个啦啦啦
这显示了一千个啦啦啦
int main() 中的 WriteProcessMemory 可以工作,但 'HookedMessageBox' 中的那个不工作。
谁能给我指点一下
我也想坚持基础。图书馆有弯路等。但坚持基本的帮助我理解它。
我尝试使用 GetLastError() 获取错误,它显示 998 表示访问被拒绝(在网上搜索)
【问题讨论】:
-
我想由于最近执行了该功能,该页面被标记为不可写。您可以尝试调整此问题的答案中提到的内存权限。 stackoverflow.com/questions/39732894/…
-
您不应该在 HookedMessageBox 内调用 MessageBox,因为 MessageBox 已被钩住,而您正在调用您的钩子 HookedMessabeBox。所以会导致无限递归。相反,您应该调用 messageBoxOriginalBytes。但是 messageBoxOriginalBytes 最后应该包含五个字节,jmp + 地址到 MessabeBox 中的下一个字节
-
@TheSteve 页面不会被标记为不可写,具体取决于它们的执行时间。与最近的时间无关
-
如果您想要基础知识,请从错误检查开始。
-
永远不需要使用
(Read|Write)ProcessMemory()和GetCurrentProcess()。进程可以访问自己的内存空间。一个简单的memcpy()或CopyMemory()就足够了。