Категория > Новости > Железный бряк. Используем хардверные брейк-пойнты в пентестерских целях - «Новости»
Железный бряк. Используем хардверные брейк-пойнты в пентестерских целях - «Новости»28-10-2023, 00:00. Автор: Эрнест |
AddVectoredExceptionHandler().
PVOID AddVectoredExceptionHandler(
ULONG FirstHandler,
PVECTORED_EXCEPTION_HANDLER VectoredHandler)
Зарегистрируем обработчик и проверим работу VEH. Исключением пока будет стандартный
#include <iostream>
#include <windows.h>
#include <errhandlingapi.h>
LONG WINAPI MyVectoredExceptionHandler(PEXCEPTION_POINTERS exceptionInfo)
{
std::cout << "Exception occurred!" << std::endl;
std::cout << "Exception Code: " << exceptionInfo->ExceptionRecord->ExceptionCode << std::endl;
std::cout << "Exception Address: " << exceptionInfo->ExceptionRecord->ExceptionAddress << std::endl;
return EXCEPTION_CONTINUE_SEARCH;
}
int main()
{
if (AddVectoredExceptionHandler(1, MyVectoredExceptionHandler) == nullptr)
{
std::cout << "Failed to add the exception handler!" << std::endl;
return 1;
}
int* p = nullptr;
*p = 42; // Исключение возникает тут
return 0;
}
Обработка исключения с помощью VEHВидим, что обработчик успешно срабатывает и вызывается, затем возвращает Бесконечная обработка исключения Точно такое же исключение будет срабатывать и при хардверных бряках. Наконец, последний тип обработчиков — Unhandled Exception Filter. Он редко когда используется, но изначально задумывался как обработчик для исключений, которые вообще никто не обрабатывает. Ни VEH (если отсутствует или вернул
LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(
[in] LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
);
Функция принимает один‑единственный параметр — адрес функции‑обработчика, которая должна вызываться при возникновении необработанного исключения. С помощью UEF также ловятся исключения, возникающие при бряках. Возьмем прошлый код и переделаем его под UEF.
#include <iostream>
#include <windows.h>
LONG WINAPI MyUnhandledExceptionHandler(PEXCEPTION_POINTERS exceptionInfo)
{
std::cout << "Unhandled exception occurred!" << std::endl;
std::cout << "Exception Code: " << exceptionInfo->ExceptionRecord->ExceptionCode << std::endl;
std::cout << "Exception Address: " << exceptionInfo->ExceptionRecord->ExceptionAddress << std::endl;
return EXCEPTION_CONTINUE_SEARCH;
}
int main()
{
if (SetUnhandledExceptionFilter(MyUnhandledExceptionHandler) == nullptr)
{
std::cout << "Failed to set the unhandled exception filter!" << std::endl;
return 1;
}
int* p = nullptr;
*p = 42;
return 0;
}
Обрати внимание, что если ты запустишь этот код в Visual Studio, то она выдаст ошибку до UEF. Исключение от «Студии», а не от UEF Это связано с тем, что исключение в данном случае обрабатывает Visual Studio. Если же файл будет запущен за пределами IDE, то мы получим успешный вызов обработчика. Вызов обработчика Установка hardware breakpointПерейти обратно к новости |