Вступительная информация: 64-разрядная версия Windows 7. C ++. 64-битные приложения и библиотеки DLL. Подключение без обходов MS.
Вопрос: Я не мог найти рабочий пример, демонстрирующий перехват в Windows. Похоже, что большинство из них было написано в то время, когда 32-битная Windows XP была единственной операционной системой ... С тех пор я преодолел 64-битные трудности понимания и успешно внедрил DLL. Мой следующий шаг в этом познании - зацепление. В соответствии с ностальгией по этой теме, MS Detours не поддерживает 64-разрядную версию (бесплатно), и я, конечно, ни за что не плачу 10 000 долларов. Поэтому я использовал обычные методы в в этом руководстве .
Этот урок великолепен, но у меня возникли небольшие проблемы с пониманием этого сегмента:
void BeginRedirect(LPVOID newFunction)
{
BYTE tempJMP[SIZE] = {0xE9, 0x90, 0x90, 0x90, 0x90, 0xC3};
memcpy(JMP, tempJMP, SIZE);
DWORD JMPSize = ((DWORD)newFunction - (DWORD)pOrigMBAddress - 5);
VirtualProtect((LPVOID)pOrigMBAddress, SIZE,
PAGE_EXECUTE_READWRITE, &oldProtect);
memcpy(oldBytes, pOrigMBAddress, SIZE);
memcpy(&JMP[1], &JMPSize, 4);
memcpy(pOrigMBAddress, JMP, SIZE);
VirtualProtect((LPVOID)pOrigMBAddress, SIZE, oldProtect, NULL);
}
В частности, я борюсь с байтом tempJMP и всем происходящим с memcpy. У меня есть адрес для функции Блокнота InsertDate (), который я хочу захватить, но я не уверен, куда его направить ... Будет ли это адрес новой функции? Или это не относительное? Идк, я просто ищу указатели.