| Посл.ответ | 
Сообщение | 
 Ранг: 203.3 (наставник) Активность: 0.22↘0 Статус: Участник UPX Killer -d 
 
 | 
Создано: 20 июля 2005 18:12   · Личное сообщение ·  #1 
Целый днь потратил, пока не понял, что в XP при трейсе ~после 7000 инструкций возникает этот C000001D Exception. Нечто вроде INVALID INSTRUCTION. В 98 такого нет - там все нормально. 
 Но в ХР генерится этот эксепшн, как его обработать - я не знаю. Если возложить на систему - то получаем 100% загрузку проца и мотыляние где-то в недрах ОС, если его пропустить - то программа не запустится.
 Что с ним делать?
 ----- Я медленно снимаю с неё UPX... *FF_User*  | Сообщение посчитали полезным:  | 
 | 
  Ранг: 332.0 (мудрец) Активность: 0.18↘0 Статус: Участник •Pr0tEcToRs KiLLeR• 
 
 | 
Создано: 20 июля 2005 18:24   · Личное сообщение ·  #2 
AlexZ пишет:
 что в XP при трейсе ~после 7000 инструкций возникает этот C000001D Exception. 
хмм... это как ? например  в олли трейс инструкций вроде никаким числом не ограничен ) ты покажи инструкцию на которой эксепшн возникает... C000001D это ILLEGAL INSTRUCTION
   | Сообщение посчитали полезным:   | 
 Ранг: 203.3 (наставник) Активность: 0.22↘0 Статус: Участник 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.22↘0 Статус: Участник 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.18↘0 Статус: Участник •Pr0tEcToRs KiLLeR• 
 
 | 
Создано: 22 июля 2005 21:29   · Личное сообщение ·  #5 
тогда посмотри что как в данном случае работают ринг3 отладчики, хотя бы тот же олли.
   | Сообщение посчитали полезным:  | 
 Ранг: 203.3 (наставник) Активность: 0.22↘0 Статус: Участник UPX Killer -d 
 
 | 
Создано: 26 июля 2005 19:09   · Личное сообщение ·  #6 
Как они работают не знаю, но думаю, что придется загрузку делать аналогичную bpint3. Только в данном случае моя прога ессно разберется, что на ЕР нужно байт профиксить. Иначе эти инструкции не поддаются трассировке в ринг3.
 ----- Я медленно снимаю с неё UPX... *FF_User*  | Сообщение посчитали полезным:  | 
 Ранг: 62.9 (постоянный) Активность: 0.02↘0 Статус: Участник 
 
 | 
Создано: 26 июля 2005 21:58   · Личное сообщение ·  #7 
Ничего особенного в этой инструкции нет, она прекрасно проходится трейсером в ринг3. У тебя либо ошибка в реализации, либо sysenter получает неправильные параметры, либо память с инструкцией оказывается невыделенной.
   | Сообщение посчитали полезным:  | 
  Ранг: 332.0 (мудрец) Активность: 0.18↘0 Статус: Участник •Pr0tEcToRs KiLLeR• 
 
 | 
Создано: 26 июля 2005 23:08   · Личное сообщение ·  #8 
ASMax пишет:
 Ничего особенного в этой инструкции нет, она прекрасно проходится трейсером в ринг3. 
хмм... при трейсе в олли ILLEGAL INSTRUCTION. тоесть если run то всё OK, а с TraceInto значение EIP меняется на адрес 7FFE0307  SYSCALL и появляется эта ошибка.
   | Сообщение посчитали полезным:   | 
 Ранг: 62.9 (постоянный) Активность: 0.02↘0 Статус: Участник 
 
 | 
Создано: 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.18↘0 Статус: Участник •Pr0tEcToRs KiLLeR• 
 
 | 
Создано: 27 июля 2005 22:06   · Личное сообщение ·  #10 
похоже что разных сервиспаках XP разная реакция на выполнение sysenter с поднятым TF. C SP1 выдаётся ILLEGAL INSTRUCTION, а вот с SP2 говорят всё OK проходит.
 ASMax пишет:
 И результат: 
у меня на SP1 этот результат закончился адресом sysenter`а.
   | Сообщение посчитали полезным:  | 
 Ранг: 203.3 (наставник) Активность: 0.22↘0 Статус: Участник UPX Killer -d 
 
 | 
Создано: 27 июля 2005 23:16   · Личное сообщение ·  #11 
У меня тоже СП-1, и с TraiceInto даже в Олли многие программы завершаютсяяя досрочно :( Так что, видимо, трейсер у меня "правильный".
 ----- Я медленно снимаю с неё UPX... *FF_User*  | Сообщение посчитали полезным:  | 
 Ранг: 163.7 (ветеран) Активность: 0.07↘0 Статус: Участник 
 
 | 
Создано: 28 июля 2005 02:31 · Поправил: S_T_A_S_   · Личное сообщение ·  #12 
В XP для совместимости оставлен шлюз int 2E, что если его вызывать вместо sysenter ?
   | Сообщение посчитали полезным:  | 
 Ранг: 203.3 (наставник) Активность: 0.22↘0 Статус: Участник UPX Killer -d 
 
 | 
Создано: 28 июля 2005 09:41   · Личное сообщение ·  #13 
Дело уже не совсем в самом sysenter/syscall и т.п. Проблемно в ХР весь код с TF исполнять. От тупой трассировки я думаю может избавить только "умный трейсер", который будет и ДАСМить инструкции, и читать стек и предсказывать следующий набор инструкций, дабы не ходить с TF там, где ненадо. мб ДДК проще выкачать и изучить.
 ----- Я медленно снимаю с неё UPX... *FF_User*  | Сообщение посчитали полезным:  | 
 Ранг: 62.9 (постоянный) Активность: 0.02↘0 Статус: Участник 
 
 | 
Создано: 28 июля 2005 13:03   · Личное сообщение ·  #14 
У меня действительно sp2. Да, интересный в таком случае момент наблюдается, жалко sp1 под рукой нету чтобы взглянуть на причину. Это мне обработку CD03 напомнило   
А по существу - ты же трейсер небось против протекторов делаешь? Тогда по любому анализатор встраивать придется, на голом трейсе далеко не уедешь. Только это вовсе не долго и не сложно, хотя зависит от задач конечно.
 А ддк зачем, ring0 трейсер думаешь сделать?
   | Сообщение посчитали полезным:  | 
 Ранг: 203.3 (наставник) Активность: 0.22↘0 Статус: Участник UPX Killer -d 
 
 | 
Создано: 28 июля 2005 15:34   · Личное сообщение ·  #15 
[i]ASMax пишет:
 ring0 трейсер думаешь сделать? [/i]
 Типа того. Чем AZ не шутит =)
 ----- Я медленно снимаю с неё UPX... *FF_User*  | Сообщение посчитали полезным:  |