в отладчике работает - в винде нет , программа мессагу вызывает , и все ....как это понять ?... Подскажите плз ..
Хы. я тож такую написал однажды. Она свой код на лету переписывать должна была. А фигушки %) Хотя в отладчике нормально работала... А вообще - кодес ф студию! Или хотя бы екзешник
=) ну моя тоже ... но я ограничил , код одной мессагой и выходом по екситпроцес...и там нет более ничего... даже код не меняется..
Ну дык. Если под дебагом бит трассировки в EFLAGS включить, то ничего и не случится. А винда такого не потерпит, ясен пень - онаж намылилась кодес выполнять, а тут бац - single-step режим. Вот её и срубает ИМХО. Вполне возможно, что я плету чушь. Подождём, пока отпишутся профи. [+]: Причём, судя по "эпитафии", срубает прогу именно на POPFD. Флаги не сменились: 00010202 and 100 == 0 Забил POPFD nop-ами - работает как миленькая. Вместо этого можно сие сделать и с предыдущей строчкой - эффект тот же...
Как раз с этим всё в порядке, там специально обработчик исключений есть А вот в обработчике исключений (4010D3) есть ошибки, а также формально работающие, но сомнительные конструкции. Ошибки: 1. eax при вызове обработчика может быть равен чему угодно, так что на его значение полагаться нельзя. Тем не менее он сходу начинает использоваться: запихивается в dr0-dr3 регистры (ну это ладно, там вроде любой мусор сойдёт) и используется в качестве возвращаемого значения для необрабатываемых исключений (а вот это уже ошибка). 2. Код (Text): .text:004011F8 mov esi, [ebx+CONTEXT._Esp] .text:004011FE mov esi, [esi] .text:00401200 push dword ptr [esi] .text:00401202 lea edx, SavedData .text:00401208 pop dword ptr [edx] .text:0040120A mov dword ptr [esi], 0CCh ; !!! .text:00401210 xor eax, eax .text:00401212 and [ebx+CONTEXT.EFlags], not 100h Здесь ставится точка останова на адрес возврата из вызванной функции и сбрасывается флаг трассировки. Так вот, запись 0xCC в секцию кода вызывает ошибку STATUS_ACCESS_VIOLATION, и программе конец - атрибуты секции .text exe'шника (куда и производится попытка записи) не допускают записи в эту секцию. Под отладчиком возможна ситуация, когда отладчик самостоятельно помухлевал с атрибутами защиты страниц, и это может работать (думаю, впрочем, что не для всех отладчиков это прокатит).
=) ну вы тут и намудрили , с тем кодом все впорядке ... Я же написал , прога не вызывает исключения , она даже не модифицирующая а не доделанная ...прогоните под отладкой и вы увидете что код что вы мне тутт показываете даже не запускается ))))) Ну вы даете Код (Text): 00401098 > 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL 0040109A . 68 61404000 PUSH xxx.00404061 ; |Title = "на этом все" 0040109F . 68 61404000 PUSH xxx.00404061 ; |Text = "на этом все" 004010A4 . 6A 00 PUSH 0 ; |hOwner = NULL 004010A6 . E8 3D050000 CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA 004010AB . 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL 004010AD . 68 61404000 PUSH xxx.00404061 ; |Title = "на этом все" 004010B2 . 68 61404000 PUSH xxx.00404061 ; |Text = "на этом все" 004010B7 . 6A 00 PUSH 0 ; |hOwner = NULL 004010B9 . E8 2A050000 CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA 004010BE . 6A 00 PUSH 0 ; /ExitCode = 0 004010C0 . E8 29050000 CALL <JMP.&kernel32.ExitProcess> ; \ExitProcess выполняется только код выше и Код (Text): 00401074 > 68 D3104000 PUSH xxx.004010D3 ; SE handler installation 00401079 . 64:FF35 000000>PUSH DWORD PTR FS:[0] 00401080 . 64:8925 000000>MOV DWORD PTR FS:[0],ESP 00401087 . 9C PUSHFD 00401088 . 810C24 0001000>OR DWORD PTR SS:[ESP],100 0040108F . 9D POPFD 00401090 . EB 06 JMP SHORT xxx.00401098 DEEP это ты с флагом трасировки попутал , я те отвечаю , это типичный прием. У меня половино программ с ним. diamond и ты тоже ошибся))))))) .. код не запускается это раз , а во вторых там все верно =) ... Всеравно Спасибо конечно )))))))
diamond Как раз с этим всё в порядке - там у секции '.text' атрибут 'writable' Кстати, мы посмотрели - eax (также как ebx, esi и edi) перед входом в пользовательский seh-обработчик на wnet sp2 очищаются; Хотя полагаться на подобное поведение - весьма странно, да. calidus Хотя все читавшие тему уже начали потихоньку догадываться, что код как бы не совсем твой... Но с тех пор как сегодня какой-то необычный день, мы решили описать всё, что происходит. Код (Text): /*401074*/ push xxx.004010D3 /*401079*/ push dword ptr fs:[0] /*401080*/ mov fs:[0],esp ; Устанавливается обработчик исключений /*401088*/ or dword ptr [esp],100 /*40108F*/ popfd ; Выставляется флаг трассировки /*401090*/ jmp short xxx.00401098 /*401092*/ ascii "START",0 /*401098*/ push 0 ; Выполняется инструкция jmp, а сразу после этого генерируется исключение EXCEPTION_SINGLE_STEP ; Управление передаётся на пользовательский обработчик исключений по адресу 4010D3, где выполняется проверка: /*4010F4*/ cmp dword ptr [ecx],80000003 /*4010FA*/ je xxx.0040121E /*401100*/ cmp dword ptr [ecx],80000004 ; EXCEPTION_SINGLE_STEP /*401106*/ jnz xxx.00401233 Далее в том же обработчике исключений в буфер копируется 10h байт с того места, где произошло исключение, эти 10h байт в буфере ксорятся на DEh ("расшифровываются"), после чего дизассемблер длин определяет, гм, длину L "расшифрованной" инструкции. После определения длины ксором на DEh "расшифровывается" L байт из того места, которое должно было выполнится. Затем восстанавливается трассировочный флаг и происходит выход из обработчика исключений (с кодом ExceptionContinueExecution). Выполняется "расшифрованная" инструкция, после чего опять генерируется исключение EXCEPTION_SINGLE_STEP. Управление получает обработчик исключений, который зашифровывает обратно (опять ксором на DEh) только что выполненную инструкцию и уже известным способом расшифровывает следующую. Код (Text): ; В итоге вместо push 0 push xxx.00404061 push xxx.00404061 push 0 call <jmp.&user32.MessageBoxA> ; выполняется это: mov ah, 0DE mov dh, 0BF sahf sahf 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 исключения.
Sol_Ksacap =) млин ты тудаже поумничать решил , такое очучение что все выпендретя хотели. Читайте мои посты еще раз !!!! Рассказыват как оно работает мне не надо , я и так знаю http://www.wasm.ru/forum/viewtopic.php?pid=257329#p257329 Короче кто по делу ясно сказать может , напишите в приват ПЛЗ.
calidus Не понятно чего ты спрашиваешь и какой ответ хочешь услышать. Если вопрос: почему по разному работает в отладчике и без отладчика, то тебе уже несколько раз сказали - потому, что на jmp 00401098 возникает исключение single-step которое отладчик сам обрабатывает и идет дальше на 00401098, а без отладчика управление передается на SEH-обработчик 004010D3, работу которого тебе расписал Sol_Ksacap. В чем вопрос то ? Попробуй в отладчике отключить обработку single-step break и наверняка получишь тот же результат, что и без отладчика
=) это то все верно , только в сехе все предусмотрено , когда происходит джамп jmp 00401098 то код в сехе выполняется вот такой !!! Код (Text): _exit: pop ebp ret а в начале Код (Text): 00401100 |. 8139 04000080 CMP DWORD PTR DS:[ECX],80000004 00401106 |. 0F85 27010000 JNZ sstep.00401233 0040110C |. 33C0 XOR EAX,EAX с этого перехода идет на Код (Text): 00401233 |> 5D POP EBP и выходит по рету на продолжение кода =) ... это типичный вариант провекри отладки. А вопрос читай выше ... почему не работает в винде в отладчике работает. При секции установленной в врайтбл. Если так туго понимается вот пример из этой же темы!!! Код (Text): ASSUME FS:NOTHING PUSH offset _SehExit PUSH DWORD PTR FS:[0] MOV FS:[0],ESP PUSHFD XOR DWORD PTR[ESP],154h POPFD PUSH 30h PUSH offset DbgFoundTitle PUSH offset DbgFoundText PUSH 0 CALL MessageBox PUSH 0 CALL ExitProcess RET _Exit: PUSH 40h PUSH offset DbgNotFoundTitle PUSH offset DbgNotFoundText PUSH 0 CALL MessageBox PUSH 0 CALL ExitProcess RET _SehExit: POP FS:[0] ADD ESP,4 JMP _Exit end start