Не вызывается обработчик исключения в следующем коде: Код (Text): int STDCALL stub (LPVOID, LPVOID, LPVOID, LPVOID) { // вычисляю дельту _delta // подготавливаю код, который будет запускаться после stub LPVOID handler = (LPVOID)( (DWORD)&stub + _delta); __asm // устанавливаю обработчик { push handler push fs[0] mov fs[0], esp } // выполняю переход на подготовленный код __asm // снимаю обработчик { mov eax, [esp] mov fs:[0], eax add esp, 8 } return 0; } Задача простая. Тупо повторно запустить функцию в случае исключения в подготовленном коде. Например, если код был подготовлен неправильно (и вызывается неизвестная инструкция или переход осуществляется на NULL). Если исключения нет - все выполняется правильно. Если ошибка есть, программа вылетает без каких либо предупреждений. Функция повторно не запускается. В чем я налажал, подскажите, плиз (дельту вычисляю правильно).
У меня вроде работает =) Многократный вызов хендлера (то есть себя), а потом падение от stack overflow. Все нормально
В чем-то я все равно туплю. У меня повторного вызова не происходит вообще. Это, грубо говоря, код некоторой навесной защиты, выполняющейся до основного. Я код расшифровываю, и если код расшифровался неправильно моя задача это дело зафиксировать. Однако хер там ;(. Код, разумеется, базонезависимый.
в peheader'е есть такая фишка, как nt_headers -> optional_header -> dll_characteristics -> word вот если там word & 0400, то хоть тресни SEH работать не будет
интересная тема, а какие симптомы будут? у меня если я свой обработчик не пытаюсь установить - нормально стартует xp-евый с руганью, а если свой ставлю, то никаких ругательств
может быть возникает исключение внутри обработчика до повторной установки SEH. Тогда всё вылетит без предупреждений
То есть обработчик, может, и пускается, но что-то в нем генерирует исключение и все рушится? Тогда это "что-то" - это стаб функции. Ну там push ebp\mov ebp, esp. Это может вызывать? Как-то сомнительно, но похоже на правду. Однако, допустим это так, как это пофиксить? Что-то я окончательно затупил.
да, симптомы указывают на это ) это не только пролог, а весь код от пролога и до установки SEH'а. попробовать отладить
у меня сигнал Beep стоит сразу после пролога. и пищит программа только один раз мои кривые руки при отладке вообще не смогли дать ничего вразумительного код seh-хэндлер не попадает под олли
В общем, ситуация следующая оказалась. Исключение не вызывалось, так как когда код был неподготовлен, то есть зашифрован - он нечаяно мусорил esp и исключение не перехватывалось. Даже отладчиком.