Сейчас на форуме: _MBK_, ManHunter, Magister Yoda, rtsgreg1989 (+9 невидимых)

 eXeL@B —› Основной форум —› C000001D Exception NT (DebugAPI)
Посл.ответ Сообщение

Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 20 июля 2005 18:12
· Личное сообщение · #1

Целый днь потратил, пока не понял, что в XP при трейсе ~после 7000 инструкций возникает этот C000001D Exception. Нечто вроде INVALID INSTRUCTION. В 98 такого нет - там все нормально.
Но в ХР генерится этот эксепшн, как его обработать - я не знаю. Если возложить на систему - то получаем 100% загрузку проца и мотыляние где-то в недрах ОС, если его пропустить - то программа не запустится.
Что с ним делать?

-----
Я медленно снимаю с неё UPX... *FF_User*





Ранг: 332.0 (мудрец)
Активность: 0.180
Статус: Участник
•Pr0tEcToRs KiLLeR•

Создано: 20 июля 2005 18:24
· Личное сообщение · #2

AlexZ пишет:
что в XP при трейсе ~после 7000 инструкций возникает этот C000001D Exception.

хмм... это как ? например в олли трейс инструкций вроде никаким числом не ограничен ) ты покажи инструкцию на которой эксепшн возникает... C000001D это ILLEGAL INSTRUCTION



Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 21 июля 2005 18:31
· Личное сообщение · #3

Дело в том, что я не знаю что это за инструкция. Могу только предположить, что это SYSENTER в ntdll либо что-то ещё из ZwContinue. Пишу я прогу-трейсер, запускаю отладочный процесс (прога2),и приходит мне сообщение EXCEPTION_DEBUG_EVENT, с пояснением C000001D, что соответствует INVALID INSTRUCTION или ещё как-то там. Если сказать ОС, что я не хочу самостоятельно исправлять ошибку (DBG_EXCEPTION_NOT_HANDLED) то лодырь ХР-шной винды откажется грузить прогу2, а если сказать ОС, что исключение обработано и можно продолжать дальше - то 100% загрузка камня, но прога2 так и не запускается. Я так думаю, что все это время прога2 торчит в виндовых обработчиках исключений.
В 98 винде такого нет. Моя прога-трейсер выполняется в 3 кольце, как и Olly (но по моему причина не в этом)

-----
Я медленно снимаю с неё UPX... *FF_User*




Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 22 июля 2005 19:05
· Личное сообщение · #4


7FFE0300 8BD4 MOV EDX,ESP
7FFE0302 0F34 SYSENTER ;Вот эта инструкция. Теперь уже точно она. 100%
7FFE0304 C3 RETN


Как же заставить выполниться эту команду?

-----
Я медленно снимаю с неё UPX... *FF_User*





Ранг: 332.0 (мудрец)
Активность: 0.180
Статус: Участник
•Pr0tEcToRs KiLLeR•

Создано: 22 июля 2005 21:29
· Личное сообщение · #5

тогда посмотри что как в данном случае работают ринг3 отладчики, хотя бы тот же олли.



Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 26 июля 2005 19:09
· Личное сообщение · #6

Как они работают не знаю, но думаю, что придется загрузку делать аналогичную bpint3. Только в данном случае моя прога ессно разберется, что на ЕР нужно байт профиксить. Иначе эти инструкции не поддаются трассировке в ринг3.

-----
Я медленно снимаю с неё UPX... *FF_User*




Ранг: 62.9 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 26 июля 2005 21:58
· Личное сообщение · #7

Ничего особенного в этой инструкции нет, она прекрасно проходится трейсером в ринг3. У тебя либо ошибка в реализации, либо sysenter получает неправильные параметры, либо память с инструкцией оказывается невыделенной.




Ранг: 332.0 (мудрец)
Активность: 0.180
Статус: Участник
•Pr0tEcToRs KiLLeR•

Создано: 26 июля 2005 23:08
· Личное сообщение · #8

ASMax пишет:
Ничего особенного в этой инструкции нет, она прекрасно проходится трейсером в ринг3.

хмм... при трейсе в олли ILLEGAL INSTRUCTION. тоесть если run то всё OK, а с TraceInto значение EIP меняется на адрес 7FFE0307 SYSCALL и появляется эта ошибка.



Ранг: 62.9 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 27 июля 2005 18:07
· Личное сообщение · #9

Mario555 пишет:
при трейсе в олли ILLEGAL INSTRUCTION. тоесть если run то всё OK, а с TraceInto значение EIP меняется на адрес 7FFE0307 SYSCALL и появляется эта ошибка.

Не знаю, что там в олли (не пользуюсь), я имел ввиду простейший программный трейсер:


void main()
{
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)Filter);
proc();
}

void __declspec(naked) proc()
{
__asm
{
pushfd
or dword ptr [esp],0x100
popfd

push eax
call dword ptr NtClose
ret
}
}

int Filter(EXCEPTION_POINTERS *ep)
{
if(ep->ExceptionRecord->ExceptionCode == 0x80000004)
{
printf("%X", (DWORD)ep->ExceptionRecord->ExceptionAddress);
printf("%s\n", dasm(ep->ExceptionRecord->ExceptionAddress));

ep->ContextRecord->EFlags|=0x100;
return EXCEPTION_CONTINUE_EXECUTION;
}

ExitProcess(0);
}


И результат:

0040115B push eax
0040115C call [00403004h]
7C90D586 mov eax, 00000019h
7C90D58B mov edx, 7FFE0300h
7C90D590 call [edx]
7C90EB8B mov edx, esp
7C90EB8D sysenter
7C90D592 retn 0004h
00401162 ret





Ранг: 332.0 (мудрец)
Активность: 0.180
Статус: Участник
•Pr0tEcToRs KiLLeR•

Создано: 27 июля 2005 22:06
· Личное сообщение · #10

похоже что разных сервиспаках XP разная реакция на выполнение sysenter с поднятым TF. C SP1 выдаётся ILLEGAL INSTRUCTION, а вот с SP2 говорят всё OK проходит.

ASMax пишет:
И результат:

у меня на SP1 этот результат закончился адресом sysenter`а.



Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 27 июля 2005 23:16
· Личное сообщение · #11

У меня тоже СП-1, и с TraiceInto даже в Олли многие программы завершаютсяяя досрочно :( Так что, видимо, трейсер у меня "правильный".

-----
Я медленно снимаю с неё UPX... *FF_User*




Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 28 июля 2005 02:31 · Поправил: S_T_A_S_
· Личное сообщение · #12

В XP для совместимости оставлен шлюз int 2E, что если его вызывать вместо sysenter ?



Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 28 июля 2005 09:41
· Личное сообщение · #13

Дело уже не совсем в самом sysenter/syscall и т.п. Проблемно в ХР весь код с TF исполнять. От тупой трассировки я думаю может избавить только "умный трейсер", который будет и ДАСМить инструкции, и читать стек и предсказывать следующий набор инструкций, дабы не ходить с TF там, где ненадо. мб ДДК проще выкачать и изучить.

-----
Я медленно снимаю с неё UPX... *FF_User*




Ранг: 62.9 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 28 июля 2005 13:03
· Личное сообщение · #14

У меня действительно sp2. Да, интересный в таком случае момент наблюдается, жалко sp1 под рукой нету чтобы взглянуть на причину. Это мне обработку CD03 напомнило
А по существу - ты же трейсер небось против протекторов делаешь? Тогда по любому анализатор встраивать придется, на голом трейсе далеко не уедешь. Только это вовсе не долго и не сложно, хотя зависит от задач конечно.
А ддк зачем, ring0 трейсер думаешь сделать?



Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 28 июля 2005 15:34
· Личное сообщение · #15

[i]ASMax пишет:
ring0 трейсер думаешь сделать? [/i]
Типа того. Чем AZ не шутит =)

-----
Я медленно снимаю с неё UPX... *FF_User*



 eXeL@B —› Основной форум —› C000001D Exception NT (DebugAPI)
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати