В отладчике работает - в винде нет.

Тема в разделе "WASM.WIN32", создана пользователем calidus, 25 июл 2008.

  1. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    в отладчике работает - в винде нет , программа мессагу вызывает , и все ....как это понять ?... Подскажите плз ..
     
  2. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Хы. я тож такую написал однажды. Она свой код на лету переписывать должна была. А фигушки %) Хотя в отладчике нормально работала...

    А вообще - кодес ф студию! Или хотя бы екзешник
     
  3. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    =) ну моя тоже ... но я ограничил , код одной мессагой и выходом по екситпроцес...и там нет более ничего... даже код не меняется..
     
  4. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
  5. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Ну дык. Если под дебагом бит трассировки в EFLAGS включить, то ничего и не случится. А винда такого не потерпит, ясен пень - онаж намылилась кодес выполнять, а тут бац - single-step режим. Вот её и срубает ;)

    ИМХО. Вполне возможно, что я плету чушь. Подождём, пока отпишутся профи.


    [+]: Причём, судя по "эпитафии", срубает прогу именно на POPFD. Флаги не сменились:

    00010202 and 100 == 0

    Забил POPFD nop-ами - работает как миленькая. Вместо этого можно сие сделать и с предыдущей строчкой - эффект тот же...
     
  6. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Как раз с этим всё в порядке, там специально обработчик исключений есть :)
    А вот в обработчике исключений (4010D3) есть ошибки, а также формально работающие, но сомнительные конструкции.
    Ошибки:
    1. eax при вызове обработчика может быть равен чему угодно, так что на его значение полагаться нельзя. Тем не менее он сходу начинает использоваться: запихивается в dr0-dr3 регистры (ну это ладно, там вроде любой мусор сойдёт) и используется в качестве возвращаемого значения для необрабатываемых исключений (а вот это уже ошибка).
    2.
    Код (Text):
    1. .text:004011F8                 mov     esi, [ebx+CONTEXT._Esp]
    2. .text:004011FE                 mov     esi, [esi]
    3. .text:00401200                 push    dword ptr [esi]
    4. .text:00401202                 lea     edx, SavedData
    5. .text:00401208                 pop     dword ptr [edx]
    6. .text:0040120A                 mov     dword ptr [esi], 0CCh ; !!!
    7. .text:00401210                 xor     eax, eax
    8. .text:00401212                 and     [ebx+CONTEXT.EFlags], not 100h
    Здесь ставится точка останова на адрес возврата из вызванной функции и сбрасывается флаг трассировки. Так вот, запись 0xCC в секцию кода вызывает ошибку STATUS_ACCESS_VIOLATION, и программе конец - атрибуты секции .text exe'шника (куда и производится попытка записи) не допускают записи в эту секцию. Под отладчиком возможна ситуация, когда отладчик самостоятельно помухлевал с атрибутами защиты страниц, и это может работать (думаю, впрочем, что не для всех отладчиков это прокатит).
     
  7. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    =) ну вы тут и намудрили , с тем кодом все впорядке ... Я же написал , прога не вызывает исключения , она даже не модифицирующая а не доделанная ...прогоните под отладкой и вы увидете что код что вы мне тутт показываете даже не запускается ))))) Ну вы даете

    Код (Text):
    1. 00401098   > 6A 00          PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
    2. 0040109A   . 68 61404000    PUSH xxx.00404061                        ; |Title = "на этом все"
    3. 0040109F   . 68 61404000    PUSH xxx.00404061                        ; |Text = "на этом все"
    4. 004010A4   . 6A 00          PUSH 0                                   ; |hOwner = NULL
    5. 004010A6   . E8 3D050000    CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA
    6. 004010AB   . 6A 00          PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
    7. 004010AD   . 68 61404000    PUSH xxx.00404061                        ; |Title = "на этом все"
    8. 004010B2   . 68 61404000    PUSH xxx.00404061                        ; |Text = "на этом все"
    9. 004010B7   . 6A 00          PUSH 0                                   ; |hOwner = NULL
    10. 004010B9   . E8 2A050000    CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA
    11. 004010BE   . 6A 00          PUSH 0                                   ; /ExitCode = 0
    12. 004010C0   . E8 29050000    CALL <JMP.&kernel32.ExitProcess>         ; \ExitProcess
    выполняется только код выше и
    Код (Text):
    1. 00401074   > 68 D3104000    PUSH xxx.004010D3                        ;  SE handler installation
    2. 00401079   . 64:FF35 000000>PUSH DWORD PTR FS:[0]
    3. 00401080   . 64:8925 000000>MOV DWORD PTR FS:[0],ESP
    4. 00401087   . 9C             PUSHFD
    5. 00401088   . 810C24 0001000>OR DWORD PTR SS:[ESP],100
    6. 0040108F   . 9D             POPFD
    7. 00401090   . EB 06          JMP SHORT xxx.00401098
    DEEP это ты с флагом трасировки попутал , я те отвечаю , это типичный прием. У меня половино программ с ним.

    diamond
    и ты тоже ошибся))))))) .. код не запускается это раз , а во вторых там все верно =) ... Всеравно Спасибо конечно )))))))
     
  8. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    diamond
    Как раз с этим всё в порядке - там у секции '.text' атрибут 'writable' ;)
    Кстати, мы посмотрели - eax (также как ebx, esi и edi) перед входом в пользовательский seh-обработчик на wnet sp2 очищаются; Хотя полагаться на подобное поведение - весьма странно, да.


    calidus
    Хотя все читавшие тему уже начали потихоньку догадываться, что код как бы не совсем твой... Но с тех пор как сегодня какой-то необычный день, мы решили описать всё, что происходит.
    Код (Text):
    1. /*401074*/  push xxx.004010D3
    2. /*401079*/  push dword ptr fs:[0]
    3. /*401080*/  mov fs:[0],esp
    4. ; Устанавливается обработчик исключений
    5.  
    6. /*401088*/  or dword ptr [esp],100
    7. /*40108F*/  popfd
    8. ; Выставляется флаг трассировки
    9.  
    10. /*401090*/  jmp short xxx.00401098
    11. /*401092*/  ascii "START",0
    12. /*401098*/  push 0
    13. ; Выполняется инструкция jmp, а сразу после этого генерируется исключение EXCEPTION_SINGLE_STEP
    14.  
    15. ; Управление передаётся на пользовательский обработчик исключений по адресу 4010D3, где выполняется проверка:
    16. /*4010F4*/  cmp dword ptr [ecx],80000003
    17. /*4010FA*/  je xxx.0040121E
    18. /*401100*/  cmp dword ptr [ecx],80000004           ; EXCEPTION_SINGLE_STEP
    19. /*401106*/  jnz xxx.00401233
    Далее в том же обработчике исключений в буфер копируется 10h байт с того места, где произошло исключение, эти 10h байт в буфере ксорятся на DEh ("расшифровываются"), после чего дизассемблер длин определяет, гм, длину L "расшифрованной" инструкции. После определения длины ксором на DEh "расшифровывается" L байт из того места, которое должно было выполнится. Затем восстанавливается трассировочный флаг и происходит выход из обработчика исключений (с кодом ExceptionContinueExecution).

    Выполняется "расшифрованная" инструкция, после чего опять генерируется исключение EXCEPTION_SINGLE_STEP. Управление получает обработчик исключений, который зашифровывает обратно (опять ксором на DEh) только что выполненную инструкцию и уже известным способом расшифровывает следующую.
    Код (Text):
    1. ; В итоге вместо
    2. push 0
    3. push xxx.00404061
    4. push xxx.00404061
    5. push 0
    6. call <jmp.&user32.MessageBoxA>
    7.  
    8. ; выполняется это:
    9. mov ah, 0DE
    10. mov dh, 0BF
    11. sahf
    12. sahf
    13. fidiv word ptr [esi+DE9E9EBF]
    При попытке выполнить последнюю инструкцию возникает нарушение доступа. Управление передаётся функции KiUserExceptionDispatcher (также как и во все прошлые разы; она должна вызвать пользовательский обработчик исключений).

    После исполнения первой инструкции функции KiUserExceptionDispatcher генерируется EXCEPTION_SINGLE_STEP исключение (ведь трассировочный флаг не был сброшен). Управление опять попадает на KiUserExceptionDispatcher, но теперь трассировочный флаг сброшен и происходит вызов пользовательского обработчика. Пользовательский обработчик видит, что это EXCEPTION_SINGLE_STEP, но, определив что исключение произошло совсем не в пользовательском коде, находит в стеке код предыдущего исключения (EXCEPTION_ACCESS_VIOLATION), меняет его на 0xCC и возвращает управление (ExceptionContinueExecution).

    Управление возвращается к KiUserExceptionDispatcher, которая изначально была вызвана с кодом EXCEPTION_ACCESS_VIOLATION (хотя код исключения был втихую изменён и теперь он - 0xCC). Управление передаётся пользовательскому обработчику. Он, будучи не в силах обработать исключение с кодом 0xCC, возвращает ExceptionContinueSearch.

    Вызывается UnhandledExceptionFilter и выводит МесаджБокс "Исключение неизвестное программное исключение (0x000000cc) бла по адресу бла бла бла". Юзер кликает "Ok" и управление передаётся пользовательскому обработчику (происходит глобальная раскрутка - больше возможности починиться не будет!). Обработчик фейлит, возвращая ExceptionContinueSearch. Приложение завершается.


    calidus
    То, что под отладчиком ты не видишь всего этого означает, что твой отладчик зохававает single-step исключения.
     
  9. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    Sol_Ksacap =) млин ты тудаже поумничать решил , такое очучение что все выпендретя хотели. Читайте мои посты еще раз !!!! Рассказыват как оно работает мне не надо , я и так знаю ;)

    http://www.wasm.ru/forum/viewtopic.php?pid=257329#p257329

    Короче кто по делу ясно сказать может , напишите в приват ПЛЗ.
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    calidus
    Не понятно чего ты спрашиваешь и какой ответ хочешь услышать. Если вопрос: почему по разному работает в отладчике и без отладчика, то тебе уже несколько раз сказали - потому, что на jmp 00401098 возникает исключение single-step которое отладчик сам обрабатывает и идет дальше на 00401098, а без отладчика управление передается на SEH-обработчик 004010D3, работу которого тебе расписал Sol_Ksacap. В чем вопрос то ? Попробуй в отладчике отключить обработку single-step break и наверняка получишь тот же результат, что и без отладчика
     
  11. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    =) это то все верно , только в сехе все предусмотрено , когда происходит джамп jmp 00401098 то код в сехе выполняется вот такой !!!

    Код (Text):
    1. _exit:          pop           ebp
    2.                      ret
    а в начале

    Код (Text):
    1. 00401100  |. 8139 04000080  CMP DWORD PTR DS:[ECX],80000004
    2. 00401106  |. 0F85 27010000  JNZ sstep.00401233
    3. 0040110C  |. 33C0           XOR EAX,EAX
    с этого перехода идет на
    Код (Text):
    1. 00401233  |> 5D             POP EBP
    и выходит по рету на продолжение кода =) ... это типичный вариант провекри отладки. А вопрос читай выше ... почему не работает в винде в отладчике работает. При секции установленной в врайтбл.

    Если так туго понимается вот пример из этой же темы!!!

    Код (Text):
    1.     ASSUME FS:NOTHING
    2.     PUSH offset _SehExit
    3.     PUSH DWORD PTR FS:[0]
    4.     MOV FS:[0],ESP
    5.  
    6.     PUSHFD
    7.     XOR DWORD PTR[ESP],154h
    8.     POPFD
    9.  
    10.     PUSH 30h
    11.     PUSH offset DbgFoundTitle
    12.     PUSH offset DbgFoundText
    13.     PUSH 0
    14.     CALL MessageBox
    15.     PUSH 0
    16.     CALL ExitProcess
    17.     RET
    18. _Exit:
    19.     PUSH 40h
    20.     PUSH offset DbgNotFoundTitle
    21.     PUSH offset DbgNotFoundText
    22.     PUSH 0
    23.     CALL MessageBox
    24.     PUSH 0
    25.     CALL ExitProcess
    26.     RET
    27.  
    28. _SehExit:
    29.     POP FS:[0]
    30.     ADD ESP,4
    31.     JMP _Exit
    32. end start
     
  12. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    =) усе ....нашел я где ошибка .. ггг элементарная жесть ) ... и мудрить не надо )
     
  13. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    тихий ужас )) просто мега-способ детектить отладчик, так ещё и кривовато реализованный))) мда...