Приветсвую всех. Столкнулся вот с проблемой: обработчик исключения отаказывается реагировать на исключения навроде xor eax,eax mov esp,eax mov dword ptr [eax], 1 Такие исключения вообще реально обрабатывать?
Исключение срабатывает, только её обработка не происходит, так как указатель на обраточик теряется. PS: А ты где это используешь, непойму
Vasil Программа сложная, малоли что может случится. Хотелось бы чтобы критичные данные были сохранены в любом случае, а при такого рода исключении процесс просто завершается. Указатель на обработчик кстати не теряется. он хранится в SEH фрейме по fs:[0], только модификация esp его не уничтожает. Похоже что даже до KiUserExceptionDispatcher дело не доходит reverser Проблема в том что виндовый обработчик использует стек. В своем обработчике я могу стек и скорректировать перед использованием. Может быть можно использовать какие нибудь альтернативные методы. SEH и похоже SetUnhandledExceptionFilter некатят.
EvilsInterrupt Смотрел (правда не очень подробно), ничего похожего не нашел. Из ч.3 понял что вроде ошибка обрабатывается Int0E -> KiUserExceptionDispa -> SEH обработчик пользователя. В любом случае SEH не катит, ибо обработка идет в контексте текущего потока. У текущего потока стек сорван => обработка обламывается.
blood От хорошего чела, СПЕСИАЛЬНО для тебя! там тому челу с СЕХом - скажи, что в ядре проверки есть, не выходит ли esp за границы из ТИБа можно потрейсить в сайсе и все видно будет но с нулевым esp процесс завершается
EvilsInterrupt То есть ядро видит, что esp ноль, и посылает программу на х в обход обработчиков структурных исключений? Но зачем это надо? Блин, а ведь процедура обработки исключений использует стек. Она же по идее выполняет call <SEH procedure>, ведь эта процедура заканчивается ret'ом. Кажись, ядро чисто предупреждает более серьёзные последствия (зацикливание обработки: стек сорвался -> исключение -> обработка -> исключение (при попытке вызвать функцию) -> ...) Всё-таки, что точно?
EvilsInterrupt Факт остается фактом - SEH обработчик не вызывается. Проверить стек мало, нужно его еще и скорректировать. Не сомневаюсь что винда проверяет esp. Насколько я понимаю, первая функция, которая отрабатывает в контексте потока это KiUserExceptionDispatcher, которая, как я уже сказал, не вызывается. Вероятно винда проверяет esp и просто убивает процесс...
Ну раз не вызывается, то скорее всего Windows просто пристреливает процесс, так как KiUserExceptionDispatcher выполняет ряд call'ов, а call'ы пишут в стек, а стека нет, чтобы не повис сам обработчик, не было зацикливаний и т.п. ядро обработчик не вызывает и срабатывает предусмотренная в нём реакция - прибить процесс.