Привет, я новичок в перехвате функций, и я использовал код из статьи.
Это мой код
#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
Проблема в том, что я хочу только один ля ля ля
Это показывает тысячу ла ла ла
WriteProcessMemory внутри int main () работает, но внутри «HookedMessageBox» не работает.
Может кто-нибудь указать мне исправление
Также я хочу придерживаться основ. Есть обходные пути к библиотекам и т.д.
Я попытался получить ошибку с помощью GetLastError (), и он показал 998, что означает отказ в доступе (поиск в сети)
(Read|Write)ProcessMemory()
сGetCurrentProcess()
. У процесса есть доступ к собственному пространству памяти. Вместо этого будет достаточно простогоmemcpy()
илиCopyMemory()
. - person Remy Lebeau   schedule 21.05.2020MessageBox
за пределами функции. Вы можете обратиться к этому проекту обхода и использовать его. - person Drake Wu   schedule 22.05.2020