. Сначала все работало правильно, и я получил три окна сообщений.
. Основная проблема связана с файлом Hooking.cpp. Хотя появляется первое окно сообщения/originql, но после этого программа завершается, не показывая второе/зацепленное окно.
Поэтому я пробовал некоторые вещи, например, но это не работает:
- Я указал rOffset как обычное целое число: DWORD rOffset; rOffset = dst-src;
- Я заменил memcpy() на CopyMemory().
- Я изменил тип патча на BYTE: BYTE patch[5] = {0};
- Я пытался изменить тип патча на void * и rOffset на const void*. Однако я столкнулся ошибки из-за того, что патч будет получать байты.
- Не знаю, проблема ли в количестве байт, которое нужно отрегулировать с 5 на большее значение.
Я пробовал использовать x64dbg, но не знал, как его использовать, если кто-нибудь может помочь, как работать с процессами памяти в нем и находить ошибки.
Код: Выделить всё
// hooking logic
void setMySuperHook() {
HINSTANCE hLib;
VOID *myFuncAddress;
DWORD *rOffset;
DWORD src;
DWORD dst;
CHAR patch[5]= {0};
// get memory address of function Cat
hLib = LoadLibraryA("pet.dll");
hookedAddress = GetProcAddress(hLib, "Cat");
// save the first 5 bytes into originalBytes (buffer)
ReadProcessMemory(GetCurrentProcess(), (LPCVOID) hookedAddress, originalBytes, 5, NULL);
// overwrite the first 5 bytes with a jump to myFunc
myFuncAddress = &myFunc;
// will jump from the next instruction (after our 5 byte jmp instruction)
src = (DWORD)hookedAddress + 5;
dst = (DWORD)myFuncAddress;
rOffset = (DWORD *)(dst-src);
// \xE9 - jump instruction
memcpy(patch, "\xE9", 1);
memcpy(patch + 1, &rOffset, 4);
WriteProcessMemory(GetCurrentProcess(), (LPVOID)hookedAddress, patch, 5, NULL);
}
int main() {
// I delated some code here to get a small
// call original Cat function
(catFunc)("meow-meow");
// install hook
setMySuperHook();
// call Cat function after install hook
(catFunc)("meow-meow");
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... is-the-jum