Посл.ответ |
Сообщение |
Ранг: 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* | Сообщение посчитали полезным: |