Сейчас на форуме: Rio, tyns777, zombi-vadim (+7 невидимых) |
eXeL@B —› Программирование —› SEH - исключение в C++ |
Посл.ответ | Сообщение |
|
Создано: 15 декабря 2014 18:03 · Поправил: ksol · Личное сообщение · #1 Может кто знает и скажет почему в следующей программе структура scopetable, описывающая __try-блок, вычисляется только для последнего фрейма (c i = 3). Подстановка в оператор if() другое значение i ведет к незапланированному исключению. И другой вопрос: чем вызвана разница адресов в 5 байтов между обработчиками handler и _except_handler3? Заранее благодарю за ответ! -------------------------------------- Вот копия результата с консоли: _except_handler3: 411087 i = 0 CurrentSEH: 12fe68, PrevSEH: 12ff58 Handler: 41108c, scopetable: a1820c0d trylevel: 2 i = 1 CurrentSEH: 12ff58, PrevSEH: 12ffa8 Handler: 41108c, scopetable: a1820cf5 trylevel: 0 i = 2 CurrentSEH: 12ffa8, PrevSEH: 12ffe0 Handler: 41108c, scopetable: a1820cad trylevel: 0 i = 3 CurrentSEH: 12ffe0, PrevSEH: ffffffff Handler: 7c8399f3, scopetable: 7c816d58 trylevel: 0 previousTryLevel: ffffffff lpfnFilter: 7c843612, lpfnHandler: 7c843628 Code:
|
|
Создано: 19 декабря 2014 11:39 · Личное сообщение · #2 Нашел сам ответ на 2-й вопрос, да, возможно, это связано и с моим 1-м вопросом: Компилятор VS C++ 2008 использует не _except_handler3 , а _except_handler4. Теперь мне надо либо как-то заставить компилятор использовать _except_handler3, а если это не удастся, то надо будет менять структуру scopetable под обработчик _except_handler4. |
|
Создано: 19 декабря 2014 17:16 · Личное сообщение · #3 |
|
Создано: 20 декабря 2014 15:39 · Личное сообщение · #4 Исключения вовсю применяются в антиотладке, и как-то они меня заинтересовали. А сравнительно недавно наткнулся на статью Matt Pietrek'a "A Crash Course on the Depth...", и вот приведенная выше программа - это его пример в несколько приглаженном виде. Теперь мне понятно, что теперь Microsoft значительно усложнило обработку исключений на внутреннем уровне, введя в обиход функцию _except_handler4 c ее прологами и эпилогами. Желание запустить эту программу у меня осталось, но отключить использование _except_handler4 опциями типа /safeseh:no не удается. |
|
Создано: 20 декабря 2014 22:16 · Личное сообщение · #5 Статья Петрика пожалуй лучшая по теме, да вот беда - написана она очень давно, почти 18 лет назад. С тех пор, понятное дело, многое изменилось. Я когда-то копал эту тему, статью Петрика выучил чуть не наизусть и задавал вопросы вот здесь: https://exelab.ru/f/action=vthread&forum=5&topic=20420&page=0#4 Если интересно, гляньте, там есть несколько толковых ссылок, которые могут быть вам полезными. ----- Give me a HANDLE and I will move the Earth. |
|
Создано: 21 декабря 2014 15:14 · Поправил: ksol · Личное сообщение · #6 Спасибо, plutos, посмотрю. Мне удалось переключить программу на использование _except_handler3. Результат ниже. Как видно, программа непосредственно использует фреймы 0 и 1, а два последних - система, наверное, использует для своих нужд. В фрейме 2 система опять вернулась к _except_handler4, а в последнем фрейме в качестве обработчика используется функция из пространства kernel32.dll, хотя и по правилам EH3. _except_handler3: 411087 i = 0 CurrentSEH: 12fe6c, PrevSEH: 12ff58 Handler: 411087, scopetable: 416b60 trylevel: 2 previousTryLevel: ffffffff lpfnFilter: 413a90, lpfnHandler: 413a9e i = 1 CurrentSEH: 12ff58, PrevSEH: 12ffa8 Handler: 411087, scopetable: 416b98 trylevel: 0 previousTryLevel: ffffffff lpfnFilter: 411835, lpfnHandler: 41183b i = 2 CurrentSEH: 12ffa8, PrevSEH: 12ffe0 Handler: 41108c, scopetable: 15de6cb9 trylevel: 0 i = 3 CurrentSEH: 12ffe0, PrevSEH: ffffffff Handler: 7c8399f3, scopetable: 7c816d58 trylevel: 0 previousTryLevel: ffffffff lpfnFilter: 7c843612, lpfnHandler: 7c843628 |
|
Создано: 04 января 2015 17:59 · Личное сообщение · #7 Совсем застрял на определении адреса обработчика SEH4 (в приведенном мной результате это когда i = 2) -- может кто что-нибудь подскажет?! Для SEH4 адрес таблицы scopetable кодируется, и при каждом запуске программы он другой. Начальный этот адрес XOR - ится с __security_cookie, но воспользоваться в коде си этой переменной мне не удается. Компилятор MSVC признаёт эту __security_cookie, если сделать следующее: вначале закомментировать ее, установить в коде точку останова, запустить программу в MSVC, затем раскомментировать ее. Тогда при подводе к ней указателя мыши, компилятор узнает ее и выдает какое-то значение. А вот включить в код эту __security_cookie никак не удаётся. |
|
Создано: 04 января 2015 20:40 · Личное сообщение · #8 Как я уже писал выше, с этой темой разбирался очень давно и детали потускнели в памяти. Гляньте по вот этим ссылкам, может прояснит что-нибудь, хотя не гарантирую. http://blogs.msdn.com/b/vcblog/archive/2009/03/19/gs.aspx http://blogs.technet.com/b/srd/archive/2009/03/16/gs-cookie-protection-effectiveness-and-limitations.aspx ----- Give me a HANDLE and I will move the Earth. |
|
Создано: 05 января 2015 02:01 · Личное сообщение · #9 ksol пишет: Исключения вовсю применяются в антиотладке, и как-то они меня заинтересовали. Сплоеты вообще интересная штука. Есть же нормальные маны по написанию сплоетов, зачем ходить вокруг да около. |
|
Создано: 05 января 2015 03:08 · Личное сообщение · #10 |
|
Создано: 05 января 2015 18:28 · Личное сообщение · #11 To plutos и F_a_u_s_t - прошёлся я по указанным ссылкам - вроде всё не то, хотя и близко. Мне не нужно переполнять буфер, мне бы хотелось в данный момент прочитать только поля структуры scopetable для SEH4. Да, вверху там приведены структуры для SEH3, для SEH4 их надо немного подправить. ClockMan - Вас я совсем не понял. |
|
Создано: 06 января 2015 14:28 · Личное сообщение · #12 ksol пишет: вроде всё не то Там точно есть то что вам нужно, но раз не нравится, то попытка номер два. | Сообщение посчитали полезным: ksol |
|
Создано: 06 января 2015 17:45 · Личное сообщение · #13 F_a_u_s_t спасибо! Ваше 1-е предложение ближе - там есть SEH4. Я посмотрел свою программу в OllyDbg и нашел интересный момент: Оказывается даже при компиляции с опцией /GS в функции ShowSEH(), из которой я пытаюсь достать scopetable для SEH4, находится __SEH_prolog3. А в двух других функциях стоят __SEH_prolog4. Остается теперь уничтожить ShowSEH(), а её тело вставить в другую, например, в Function1(). |
|
Создано: 07 января 2015 16:41 · Личное сообщение · #14 |
|
Создано: 12 января 2015 18:50 · Личное сообщение · #15 Сделал! Адрес __security_cookie взял из __SEH_prolog4, он оказался 0х417000. После этого XOR с __security_cookie даёт реальный адрес таблицы scopetable, а дальше уже делается как для незащищённой SEH. Вот результат для двух режимов компиляции: Незащищённый, опция /GS- _except_handler3: 411087 _except_handler4: 41108c i = 0 CurrentSEH: 12fe6c, PrevSEH: 12ff58 handler: 411087 trylevel: 2 Handler => _except_handler3 scopetable: 416b50 previousTryLevel: ffffffff lpfnFilter: 41178a, lpfnHandler: 41178d i = 1 CurrentSEH: 12ff58, PrevSEH: 12ffa8 handler: 411087 trylevel: 0 Handler => _except_handler3 scopetable: 416b90 previousTryLevel: ffffffff lpfnFilter: 411855, lpfnHandler: 41185b i = 2 CurrentSEH: 12ffa8, PrevSEH: 12ffe0 handler: 41108c trylevel: 0 Handler => _except_handler4 e4scopetable = 416bb0 scope4 = 416bc0 previousTryLevel: fffffffe lpfnFilter: 411eed, lpfnHandler: 411f08 i = 3 CurrentSEH: 12ffe0, PrevSEH: ffffffff handler: 7c8399f3 trylevel: 0 Handler => _except_handler3 scopetable: 7c816d58 previousTryLevel: ffffffff lpfnFilter: 7c843612, lpfnHandler: 7c843628 Защищённый, опция /GS _except_handler3: 411087 _except_handler4: 41108c i = 0 CurrentSEH: 12fe68, PrevSEH: 12ff58 handler: 41108c trylevel: 2 Handler => _except_handler4 e4scopetable = 416b50 scope4 = 416b60 previousTryLevel: fffffffe lpfnFilter: 411797, lpfnHandler: 41179a i = 1 CurrentSEH: 12ff58, PrevSEH: 12ffa8 handler: 41108c trylevel: 0 Handler => _except_handler4 e4scopetable = 416b90 scope4 = 416ba0 previousTryLevel: fffffffe lpfnFilter: 411862, lpfnHandler: 411868 i = 2 CurrentSEH: 12ffa8, PrevSEH: 12ffe0 handler: 41108c trylevel: 0 Handler => _except_handler4 e4scopetable = 416bb0 scope4 = 416bc0 previousTryLevel: fffffffe lpfnFilter: 411eed, lpfnHandler: 411f08 i = 3 CurrentSEH: 12ffe0, PrevSEH: ffffffff handler: 7c8399f3 trylevel: 0 Handler => _except_handler3 scopetable: 7c816d58 previousTryLevel: ffffffff lpfnFilter: 7c843612, lpfnHandler: 7c843628 |
|
Создано: 13 января 2015 01:30 · Личное сообщение · #16 |
|
Создано: 13 января 2015 16:42 · Поправил: ksol · Личное сообщение · #17 Пожалуйста, вот код: Code:
| Сообщение посчитали полезным: plutos |
eXeL@B —› Программирование —› SEH - исключение в C++ |
Эта тема закрыта. Ответы больше не принимаются. |