Сейчас на форуме: jinoweb (+6 невидимых)

 eXeL@B —› Программирование —› Windows выхватывает исключение из отладчика
Посл.ответ Сообщение

Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

Создано: 17 декабря 2017 18:46
· Личное сообщение · #1

В программе создаётся исключение вида переполнения буфера. Исключение возникает
в функции gets_s(buf, size). Я для примера, символьный буфер buf задал на 10 символов,
размер size вводимого функцией массива задан на 5 символов. При вводе 5 символов или
более возникает исключение и программа закрывается.
Хотелось бы остановить отладчик на этом исключении, однако Windows 7 выхватывает
его, и с этим не справляются ни отладчик IDA, ни OllyDbg. Между тем Windows XP так не
поступает - здесь всё нормально: она спрашивает на возможность отладки.
Может кто встречался с подобной ситуацией и знает как умерить аппетит Windows 7
в отношении программных исключений ?
----------------------------------------------------------------------
За основу пример взят из части 21 курса Нарвахи для IDA , перевод Яши.
Код программы:
Code:
  1. #include <stdio.h>
  2. int main(int arg, char *argv[])
  3. {
  4.   char buf[10];
  5.   int size = 5;
  6.   gets_s(buf, size);
  7.   return 0;
  8. }




Ранг: 53.9 (постоянный), 33thx
Активность: 0.050
Статус: Участник

Создано: 17 декабря 2017 19:20 · Поправил: deniskore
· Личное сообщение · #2

Чем собирали этот пример?
В настройках Olly не стоит игнорирование эксепшенов по диапазону?
По идее STACK_BUFFER_OVERRUN вас должен тормозить на int 29h, если пример был собран компилятором => MSVC 2015



Ранг: 58.0 (постоянный), 13thx
Активность: 0.020.01
Статус: Участник

Создано: 17 декабря 2017 19:45
· Личное сообщение · #3

https://docs.microsoft.com/en-us/cpp/c-runtime-library/parameter-validation




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 17 декабря 2017 20:56
· Личное сообщение · #4

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

-----
vx




Ранг: 53.9 (постоянный), 33thx
Активность: 0.050
Статус: Участник

Создано: 17 декабря 2017 21:14 · Поправил: deniskore
· Личное сообщение · #5

difexacaw пишет:
При i29 процесс должен сразу киляться, без разворачивания исключения. Как частный случай при ловушке на переполнение процесс снимается.

Проверил в x64DBG и IDA PRO при INT 29h (эту инструкцию использует ucrtbase в новых версиях MSVC) ничего не киляется, дебагер управление получает. (Win 8-10)




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 17 декабря 2017 21:45
· Личное сообщение · #6

KiRaiseSecurityCheckFailure -> KiFastFailDispatch -> KiDispatchException -> отладчик походу вызывается.

Это я не совсем верно сказал, вроде как локально исключение в процессе не поднимается.

Переполнение стека в NtMapView:

PsValidateUserStack:
DbgkForwardException(STATUS_STACK_BUFFER_OVERRUN)
ZwTerminateProcess().

-----
vx




Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

Создано: 18 декабря 2017 18:36
· Личное сообщение · #7

Спасибо! Многое вы все сказали! - я так глубоко с исключениями не знаком и
буду разбираться. Столкнулся из-за попытки пройти часть 21 Нарвахи.
Код, который я привёл, я прогонял только на WinXP - там всё хорошо идёт
и в OllyDbg и в IDA. Там собирал с помощью MSVC2008, и он, конечно, не
идёт в Win7 - другие библиотеки. В Win7 я использовал пример Нарвахи.
Думаю, собирал он с MSVC2015.
-----------------------------------------------------
Теперь, что я успел надёргать на Win7:
Отладчик OllyDbg как-то справляется: нажал крест на сообщении Windows,
появляется опять такое же; я опять давлю крест - процесс terminated, но
не выгружается из отладчика и можно разбирать на чём он остановился.
---------------
Наверное,также бы надо поступать и с IDA'ой, но нет возможности проверить
это. IDA закрывает процесс без какого-либо сообщения. И от Windows нет
сообщения, и в журнале сообщений нет соответствующей записи По всей
видимости, блокирует IDA, пишет лишь в строке состояния код выхода: -1073740777,
что соответствует коду исключения С0000417. Этот код я внёс в список
исключений (там уже был код подобного исключения С00000FD EXCEPTION_
STACK_OVERFLOW) , но это ничего не изменило.
В самом начале, когда я только приступал к этому исключению, IDA пропускала
Windows сообщение, и возможно оно было такое же, как оно сейчас идёт от OllyDbg.
Но, похоже, IDA всё это порядком надоело, и она просто закрывает процесс!
Чтобы получить то исходное состояние, я пробовал по разному: и удалял *.idb ,
и переименовывал программу, и переносил в другую папку - всё без толку!

Добавлено спустя 18 часов 23 минуты
---------------------------------------------------------------------------
Прерывание, механизм исключения - это,конечно, очень важно!
Но сейчас хотелось бы знать как остановить отладчик IDA при
этом исключении и разобрать что программа уже успела сделать
перед исключением.



Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

Создано: 24 декабря 2017 17:43
· Личное сообщение · #8

============================================
IDA теперь останавливается и прекрасно перехватывает исключение !


 eXeL@B —› Программирование —› Windows выхватывает исключение из отладчика
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати