Перехват API без обходов - PullRequest
6 голосов
/ 25 января 2012

Вводная информация: Windows 7 64-bit.C ++.64-битные приложения и библиотеки DLL.Подключение без MS Detours.

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

Ответы [ 2 ]

2 голосов
/ 11 мая 2012

Функции горячего исправления начинаются со следующей инструкции mov edi, edi и начинаются с 5 инструкций NOP (код, если я правильно помню).

При горячем обновлении mov edi, edi перезаписывается с помощью короткого перехода.к пещере кода.Пещера кода также переписывается с переходом к обработчику хуков (функция, в которой вы перехватываете вызов API, а затем перенаправляете его в реальную функцию API).

1 голос
/ 21 февраля 2012

Вся идея состоит в том, чтобы «перезаписать» исходный код, который выполняет Messagebox, на:

JuMP <CustomMessageBoxFunction>
RETurn (back to program execution) 

Итак,

Сначала он копирует свой шелл-код в массив JMP:

 memcpy(JMP, tempJMP, SIZE);

Затем он копирует байты исходного кода сборки с исходного адреса в свое временное хранилище "oldBytes", чтобы он мог скопировать его обратно после выполнения своей пользовательской функции:

memcpy(oldBytes, pOrigMBAddress, SIZE);

Затем он копирует ранее вычисленный размер адреса в массив JMP сразу после команды jmp:

memcpy(&JMP[1], &JMPSize, 4);

Наконец, его массив JMP [] содержит шелл-код, необходимый для вызова его функции, например,

JMP 1234
RET

поэтому теперь он должен скопировать это в исходные байты, где программа ожидает найти оригинальную функцию MessageBox:

memcpy(pOrigMBAddress, JMP, SIZE);

Теперь перейдем к вашему вопросу, если вы хотите перехватить InsertDate (), тогда вместо pOrigMBAddress вы можете использовать адрес InsertDate.

Но я не уверен, что это будет работать с 64-битными окнами.

...