Установил бряк Код (Text): NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pusRegistryPath) { __asm int 3 //[...] } Естественно вылетел БСОД с исключением SYSTEM_THREAD_EXCEPTION_NOT_HANDLED. Как можно обработать исключение SYSTEM_THREAD_EXCEPTION_NOT_HANDLED, какой сервис ответственнен за обработку этого исключения? Естественно __try / __except не интересует
Мне нужно научится перехватывать исключение вызыванное вызовом int 3, так как это делает ядерный отладчик, что бы получить дальнейшее управление из своего драйвера который и вызвал исключение
JCronuz Тут семпл можите посмотреть http://files.virustech.org/indy/Code/XcptIp/, вам статус нужно изменить на STATUS_BREAKPOINT здесь: Код (Text): U_Xcpt: cmp [esi].ExceptionCode,STATUS_ILLEGAL_INSTRUCTION ; #UD jne Chain Вот тут можите посмотреть как выполняется работа с графом, это для обработки сепшенов из первого семпла, так как код мутирующий его границы не определены, создаётся граф для всего кода(GpCreateSnapshot()) и диспетчер исключений проверяет принадлежность инструкции вызвавшей фолт графу(GpFastCheckIpBelongToSnapshot()): http://files.virustech.org/indy/Code/XcptGp/ Тогда обработчик должен выполнить вместо линейной проверки: Код (Text): Call XDT1 XDT1: pop eax lea ecx,[eax + (offset GV_L1 - offset XDT1)] ; Base lea edx,[eax + (offset GV_L2 - offset XDT1)] ; Limit cmp ebx,ecx jb Chain cmp ebx,edx jnb Chain Проверку на вхождение в граф: Код (Text): lea eax,GpEntry mov ecx,fs:[PcEnvironment] push eax push [esi].rEip ; KTRAP_FRAME.rEip push ENGINE_ENVIRONMENT.GpSelf[ecx] ; * Для быстрого поиска описателя в графе он должен быть создан с замаскиро ; * ванным флагом GCBE_PARSE_SEPARATE(один вход описывает линейный блок, а ; * не каждую инструкцию). Call GpFastCheckIpBelongToSnapshot test eax,eax jnz Chain ; Инструкция вызвавшая фолт не определена в графе. (эта часть из руткита).