R0 CREW

Дебаггинг SEH

Здравствуйте! Имеется кусок кода, который насколько я понял, устанавливает SEH.

.code:008714CD push    ebx             ; Это адрес нового хэндлера
.code:008714CE push    large dword ptr fs:0 ; Это сохранение предыдущего хэндлера
.code:008714D5 mov     large fs:0, esp
.code:008714E2 int     1               ; - internal hardware - SINGLE-STEP
.code:008714E2                         ; generated at end of each machine instruction if TF bit in FLAGS is set

Хочу отдебажить этот хэндлер. Для этого беру адрес, который был запушен командой

push ebx

. Его же я вижу, используя команду !exchain.

WINDBG>!exchain
002ffcbc: image011e0000+1d60 (011e1d60)
002ffd28: ntdll!RtlAddMandatoryAce+33c (7761e125)
Invalid exception stack at ffffffff

Хочу посмотреть, что по этому адресу находится, в IDA жму G, ввожу 011e1d60. И вижу следующее (приатачил архив с фото). Как функция, данные значения не распознаются. Если ставлю hardware брейкпоинт, приложение просто падает. Да и вообще, непонятно что это за значения. В общем, как мне отдебажить нужный мне хэндлер? И второй вопрос. Хэндлер начинает выполняться, после инструкции

int 1

, но я не понимаю почему. 1 - это ведь номер прерывания для дебаггинга. При чем тут он? После этой инструкции что-то явно происходит, потому как меняется значение регистра eax. Трейс данного участка ничего не дает.

Скорее всего есть VEH (Vectored Exception Handler) обработчик, в котором и происходят все проверки. Он вызывается раньше SEH-обработчика.

Это простой антиотладочный трюк: int 1 вызывает исключение, и если программа не под отладчиком, то выполнится обработчик, в противном случае дебаггер должен проигнорировать исключение, чтобы управление было передано на хендлер. Не имеет значения, как было сгенерировано исключение, это может быть int 3, обращение по неверному адресу или что-то иное.
Используйте команду gn в WinDbg, которая пробросит исключение в программу. Что касается дизассемлера, то сконвертируйте байты в код и перейдите на точный адрес обработчика, там есть что-то похожее на код. Хотя проще использовать u, раз вы в WinDbg.

Использую IDA с windbg. Прикладываю еще один скрин, с ним намного понятнее. На нем изображены два куска кода, в первом идет создание SEH, во втором VEH. Но до VEH еще дело не доходит, как вы можете увидеть. Проблема у меня, именно в первом куске кода, до

or ebp, 1

Есть такой, но он объявляется позже.

К сожалению, в иде, не вижу, что генерируется исключение.

В иде, команда Edit - Functions - Create function § не дает результата.

Попробуйте в другом отладчике вне Иды. Вообще, на будущее рекомендую не ограничивать себя какими-то определёнными инструментами. Те же дебаггеры не всегда ведут себя, как ожидаешь, и тогда нужно переключаться на иной.

На первом скрине у вас массив из двордов, который создала Ида, он может не сконвертироваться в код, нужно сначала преобразовать его в байты кнопкой d.