Установлена ​​ли одиночная ловушка на выигрыше 7? - программирование
Подтвердить что ты не робот

Установлена ​​ли одиночная ловушка на выигрыше 7?

Я делал с так называемым "seh hooking". Фактически он изменяет разрешение области памяти и улавливает исключение, когда к нему обращаются, поэтому он может подключить функцию.

Он использует одношаговую ловушку, которая выглядит следующим образом:

info->ContextRecord->EFlags |= 0x100;

чтобы возобновить защиту до PAGE_NOACCESS.

Приложение работает хорошо на выигрыше xp, но не так, как это было на выигрыше 7. Он просто заморозился на выигрыше 7. Я очень сомневаюсь, что это связано с "установкой одиночной атаки", но я не уверен.

Нажмите здесь в ссылку прямой загрузки исходного пакета

4b9b3361

Ответ 1

Короткий ответ:

Да, флаг одного шага является частью архитектуры x86 и также все еще реализован в Windows 7 через компонент eflags в контексте процессора.

Мне удалось загрузить ваш проект, и все отлично работает без изменений в Windows 8 с выключенным UAC. Поэтому он тоже должен работать на Windows 7. При запуске VEH Hooking Test.exe он отображает два окна сообщений, после каждого из них я получаю консольный вывод MessageBoxA, так что крючок работал. Может быть, попробуйте запустить программу в качестве администратора в Windows 7?


Длинный ответ:

SEH означает обработку структурированных исключений, но то, что вы описываете, больше похоже на VEH - векторную обработку исключений.

Захват VEH - это метод перехвата, который на самом деле проклят медленно, поэтому его нельзя использовать в критических критических ошибках производительности, например, для графического захвата, например, когда ваши крючки попадают несколько раз в секунду. Он обычно используется для одноразовых крючков. Цель подключения VEH - быть действительно скрытой. В чём-то код elses отсутствует память, и вам не нужно использовать регистры отладки.


Ниже я расскажу, как реализовать его с помощью С++.

Сначала вам нужно зарегистрировать векторный обработчик исключений. Это глобальный обработчик исключений для процесса. Каждое заброшенное исключение, которое было необработанным и попадет в операционную систему, будет захвачено этим обработчиком.

PVOID pExHandler = AddVectoredExceptionHandler(1, VectoredHandler);

После этого вы должны установить защиту памяти на странице, где находится ваш HOOK_LOCATION (адрес для перехвата). Новая защита, которую я использую, - PAGE_EXECUTE_READ|PAGE_GUARD. Защищенная страница вызовет исключение при доступе и автоматически удалит защитную защиту. Это исключение не будет обрабатываться кем-либо, поэтому оно провалится в наш векторный обработчик. После того, как выбрано исключение, страница снова доступна. (см. Создание стражей страниц)

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

DWORD orgProt;
VirtualProtect(HOOK_LOCATION, 1, PAGE_EXECUTE_READ|PAGE_GUARD, &orgProt);

Теперь для нашего обработчика исключений. Вот как это могло бы выглядеть:

LONG CALLBACK VectoredHandler(PEXCEPTION_POINTERS exc)
{
    if (exc->ExceptionRecord->ExceptionCode == STATUS_GUARD_PAGE_VIOLATION)
    {
        // guard page exeption occured. guard page protection is gone now

        if (HOOK_LOCATION == reinterpret_cast<long*>(exc->ContextRecord->Eip)) {
            // hook location was hit! call any hook callbacks here
        } else {
            // hook was not hit and has to be refreshed. set single-step flag
            exc->ContextRecord->EFlags |= 0x100;
        }

        return EXCEPTION_CONTINUE_EXECUTION;
    }

    if (exc->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP)
    {
        // single-step exeption occured. single-step flag is cleared now

        // set guard page protection
        DWORD oldProt;
        VirtualProtect(HOOK_LOCATION, 1, PAGE_EXECUTE_READ|PAGE_GUARD, &oldProt);

        return EXCEPTION_CONTINUE_EXECUTION;
    }

    return EXCEPTION_CONTINUE_SEARCH;
}

Если код запущен на странице защищенной памяти, это приведет к нарушению страницы защиты. Мы проверяем, находимся ли мы на месте крючка. Если мы все хорошо, и мы можем вызвать обратный вызов крючка. Если мы не находимся в правильном месте, нам как-то нужно перепрограммировать код, но если мы это сделаем сейчас, мы не сможем продвигаться и всегда получать исключение в одном месте и затормозить приложение. Поэтому мы устанавливаем единый флаг процессора.

Теперь, когда вы получаете одноэтапное исключение, мы можем снова установить защиту защиты, потому что мы перешли на одну команду. Так мы всегда можем защитить целевую страницу и не пропустить ни одного хита.

Стоимость - это два исключения и защита одной страницы для каждой команды, которая выполняется на целевой странице. Не пытайтесь делать это при подключенном отладчике. Это сойдет с ума.

Для реальной реализации вам могут понадобиться объекты синхронизации, чтобы избавиться от крюка без сбоев в программе и лучшего управления захватом.

Мне очень нравится этот умный механизм и надеюсь, что некоторые люди узнали об этом немного.