Перехват API без обходных путей

Вступительная информация: 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 (), который я хочу захватить, но я не уверен, куда его направить ... Будет ли это адрес новой функции? Или это не относительное? Идк, я просто ищу указатели.

6
задан user850275 24 January 2012 в 20:52
поделиться