повторно запустить функцию в случае исключения

Тема в разделе "WASM.WIN32", создана пользователем GorluM, 9 мар 2007.

  1. GorluM

    GorluM николай gorl

    Публикаций:
    0
    Регистрация:
    6 дек 2003
    Сообщения:
    61
    Адрес:
    Москва
    Не вызывается обработчик исключения в следующем коде:

    Код (Text):
    1. int STDCALL stub (LPVOID, LPVOID, LPVOID, LPVOID)
    2. {
    3.     // вычисляю дельту _delta
    4.  
    5.     // подготавливаю код, который будет запускаться после stub
    6.  
    7.     LPVOID handler = (LPVOID)( (DWORD)&stub + _delta);
    8.  
    9.     __asm   // устанавливаю обработчик
    10.      { 
    11.         push    handler
    12.         push    fs[0]
    13.         mov fs[0], esp
    14.     }
    15.  
    16.     // выполняю переход на подготовленный код
    17.  
    18.     __asm   // снимаю обработчик
    19.         {  
    20.         mov eax, [esp]
    21.         mov fs:[0], eax
    22.         add esp, 8
    23.     }
    24.  
    25.     return 0;
    26. }
    Задача простая. Тупо повторно запустить функцию в случае исключения в подготовленном коде. Например, если код был подготовлен неправильно (и вызывается неизвестная инструкция или переход осуществляется на NULL).

    Если исключения нет - все выполняется правильно. Если ошибка есть, программа вылетает без каких либо предупреждений. Функция повторно не запускается. В чем я налажал, подскажите, плиз (дельту вычисляю правильно).
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    У меня вроде работает =)
    Многократный вызов хендлера (то есть себя), а потом падение от stack overflow. Все нормально
     
  3. GorluM

    GorluM николай gorl

    Публикаций:
    0
    Регистрация:
    6 дек 2003
    Сообщения:
    61
    Адрес:
    Москва
    В чем-то я все равно туплю. У меня повторного вызова не происходит вообще. Это, грубо говоря, код некоторой навесной защиты, выполняющейся до основного. Я код расшифровываю, и если код расшифровался неправильно моя задача это дело зафиксировать. Однако хер там ;(. Код, разумеется, базонезависимый.
     
  4. GorluM

    GorluM николай gorl

    Публикаций:
    0
    Регистрация:
    6 дек 2003
    Сообщения:
    61
    Адрес:
    Москва
    Какие условия могут так негативно сказаться на запуске обработчика?
     
  5. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    в peheader'е есть такая фишка, как nt_headers -> optional_header -> dll_characteristics -> word

    вот если там word & 0400, то хоть тресни SEH работать не будет
     
  6. GorluM

    GorluM николай gorl

    Публикаций:
    0
    Регистрация:
    6 дек 2003
    Сообщения:
    61
    Адрес:
    Москва
    интересная тема, а какие симптомы будут? у меня если я свой обработчик не пытаюсь установить - нормально стартует xp-евый с руганью, а если свой ставлю, то никаких ругательств
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    может быть возникает исключение внутри обработчика до повторной установки SEH. Тогда всё вылетит без предупреждений
     
  8. GorluM

    GorluM николай gorl

    Публикаций:
    0
    Регистрация:
    6 дек 2003
    Сообщения:
    61
    Адрес:
    Москва
    То есть обработчик, может, и пускается, но что-то в нем генерирует исключение и все рушится?
    Тогда это "что-то" - это стаб функции. Ну там push ebp\mov ebp, esp. Это может вызывать? Как-то сомнительно, но похоже на правду. Однако, допустим это так, как это пофиксить? Что-то я окончательно затупил.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    да, симптомы указывают на это )
    это не только пролог, а весь код от пролога и до установки SEH'а.
    попробовать отладить ;)
     
  10. GorluM

    GorluM николай gorl

    Публикаций:
    0
    Регистрация:
    6 дек 2003
    Сообщения:
    61
    Адрес:
    Москва
    у меня сигнал Beep стоит сразу после пролога.
    и пищит программа только один раз

    мои кривые руки при отладке вообще не смогли дать ничего вразумительного
    код seh-хэндлер не попадает под олли
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    хм.. значит у тебя глюки с дельта-смещением тогда... или пролог падает, что весьма странно..
     
  12. GorluM

    GorluM николай gorl

    Публикаций:
    0
    Регистрация:
    6 дек 2003
    Сообщения:
    61
    Адрес:
    Москва
    смещение тоже верное) проверил

    мистика кривых рук, блин
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А что мешает отладить в ольке той же?)
    SEH-и отлаживаются в ней без проблем
     
  14. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
  15. GorluM

    GorluM николай gorl

    Публикаций:
    0
    Регистрация:
    6 дек 2003
    Сообщения:
    61
    Адрес:
    Москва
    В общем, ситуация следующая оказалась. Исключение не вызывалось, так как когда код был неподготовлен, то есть зашифрован - он нечаяно мусорил esp и исключение не перехватывалось. Даже отладчиком.