|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Мар 17, 2004 01:17:31 Я бы хотел обсудить одну проблему с людьми толковыми. Итак, известно, что StarForce и XtremeProtector любят хватать int 1 под свои нужды, после чего айсу становится совсем скучно жить. На woodman шли очень интересные дискуссии о DR-регистрах/физической памяти и перехвате int 1. Короче, что бы ни было поставлено на int 1 (допустим, DR0-регистр и в DR7 прописан GD-бит), все это можно отвертеть. Другое дело, что защита сие заметит и будет ку-ку. Играть в прятки с конкретной реализацией бессмысленно, думаю, понятно почему. Поэтому предлагаю обсудить следующую идею: известно (пардон за банальность), что винда - мультизадачная ось. Я подумываю над созданием драйвера, который бы брал под контроль планировщик процессов (с релизом исходников это стало еще проще %-)) и поступал бы по примерно следующему алгоритму:
if(я вижу, что планировщик собирается дать квант времени Soft-Ice)
{
ok, планировщик подождет :)
тем временем я восстановлю вектор int 1, каков бы он там ни был, на то,
что я запомнил, когда был загружен айс
}
Мне непонятно пока, что делать, когда квант времени истечет - тут надо смотреть код виндузы. Скажем, в Линуксе планировщик прерывается не только по кванту, но и по IDT-векторам (колгейт и т.п.). В коде обработчиков прерываний виндузы я вызова скедьюлера не приметил. Означает ли это, что он прерывается только по таймеру? И как это учесть в коде драйвера-перехватчика? Словом, ряд вопросов пока есть. Я бы очень хотел услышать размышления по поводу. :) |
|
|
Дата: Мар 19, 2004 12:21:23 imho, внедрение такого драйвера - это игра в кошки-мышки, теи более что его можно и обойти. Похоже, что будущее за эмулирующими отладчиками, если его грамотно написать - защита не опознает что ее код эмулируют. А уж бряки можно будет ставить на такие хитрющие условия, которые в айсе невозможны и дампить все что угодно :). Уже который месяц (времени мало) пытаюсь окучить один такой эмулятор, idax86-emul это все-таки не то, в ide нужно лишь определить откуда и докуда эмулировать... вот по ходу дела возник один глупый вопрос про перехват int 1 и 3. Положим имеется cpu с vme, и я приготовил tss, где определил карту перенаправления прерываний и поставил бит trap. хочу перелючить tss - будет исключение отладки (и чье мое или старое)? А если при тех же условиях я предварительно пропишу эту tss в idt[8] (double fault) и передам управление черт знает куда, чтобы вызвать исключение, будет вызван обработчик int 3 в момент переключения на эту tss (и опять чей: старый или мой)? |
|
|
Дата: Мар 19, 2004 15:17:41 Зачем так извращаться, лучше обрабатывать исключения и эмулировать вызовы прерываний. Например в том же XtremeProtector'е программа Ring3(упакованная) с помощью драйвера получает доступ к IDT, заменяет там на свой обработчик. Выход - запретить доступ к IDT после DeviceIoControl и правильно обрабатывать исключения. Там не используются векторные исключения, так что всё просто, кроме перенаправления чтения/записи в память, придёться всё-таки хороший движок дизассемблера написать, на уровне IDA, а не то, что я в первый раз сделал. |
|
|
Дата: Мар 19, 2004 18:22:33 Nothing В винде только 3 tss. Причем 2 из них только для NMI и прочей гадости. Ты интересуешься конкретной реализацией под виндузу или просто ля-ля? dragon М-мм... А не реализация ли это для частного случая? |
|
|
Дата: Мар 20, 2004 16:31:27 Почему "ля-ля"? Читал дискуссию на woodmann'е и просто хотел уточнить - trap bit в tss с перенаправлением прерываний это trap или fault? А то что в винде tss юзают для int 2, 8, 18 это я знаю и это выглядит логично, но что мешает мне создать свою tss? |
|
|
Дата: Мар 20, 2004 22:32:55 но что мешает мне создать свою tss? Звучит серьезно. А можно конкретнее? Любопытно. Плюс, если не затруднит, иллюстрацию идеи в виде грубого псевдокода. |
|
|
Дата: Мар 20, 2004 22:49:55 · Поправил: Valery Офтоп - только для Nothing - ляля это trap или fault А что с перенаправлением выяснилось? В свое время выяснял без перенаправления - оказалось очень странно, нечто среднее: переключение проходит, останавливается перед первой командой, привилегии шлюза обработчика игнорируются (как у фолтов, но не у трэпов!), accessed сегментов = 1 Володя еще раз пардон за офтоп в твоем треде |
|
|
Дата: Мар 20, 2004 23:28:52 Забей, все ОК. Мне и самому интересно. Если бы еще кто-то чем-то конкретным швыряться начал, типа ссылок на страницы в интеловских доках, псевдокодом или настоящим кодом, было бы вообще классно. |
|
|
Дата: Мар 21, 2004 05:29:02 · Поправил: Black_mirror Насколько я понял из интеловских талмудов, VME работает только для виртуального режима. Если флаг CR4.VME установлен в 1, а n-ый бит в таблице перенаправления прерываний установлен в 0, то программное прерывание INT n будут обрабатываться так же как и в реальном режиме. То есть, в стеке виртуальной задачи будет сохранено cs,ip,flags, а из таблицы прерываний(виртуальной) будут взяты значения для cs и ip. То есть обращения к IDT и перехода в защищенный режим не будет. В томе 3 рекомендую посмотреть части 16.3 и 16.4. |
|
|
Дата: Мар 22, 2004 12:01:37 [q]Звучит серьезно. А можно конкретнее?[/q] Вроде создать tss не сложно, по аналогии с имеющимся в винде tss от double fault например. Поля заполнить по вкусу. Дальше его можно "повесить" на какое-нибудь прерывание, чтобы мгновенно переключать контекст при его возникновении, можно переключать tss "вручную" (ltr/iret), но тут надо быть осторожным. Зачем все это надо? Для защиты можно приспособить (контексты менять быстро), например. [q]А что с перенаправлением выяснилось?[/q] Так именно этот вопрос я и задавал :-) Будет свободное время, набросаю тест проверю - сообщу сюда о результатах. |
|
|
Дата: Мар 22, 2004 18:25:08 VME работает только для виртуального режима В таком случае применение этой штуки не имеет смысла для того, что мы сейчас обсуждаем. Nothing Для защиты можно приспособить (контексты менять быстро), например. Т.е. ты предлагаешь вывесить какой-то таск типа Xprot в отдельный TSS? |
|
|
Дата: Мар 24, 2004 12:01:59 Т.е. ты предлагаешь вывесить какой-то таск типа Xprot в отдельный TSS? Нет, так не получится. imho tss слабо приспособлен для переключения задач в винде, тут уж действительно придется шедулер переписывать. А вот кусок защиты (драйвер) вполне может использовать одну или несколько tss для организации своей "мультипоточности" (как fibera'ми в user-mode). А если при этом перехватить еще несколько неиспользуемых прерываний, то можно затруднить анализ программы, т.к. скажем iret может означать попеременно и возврат из прерывания и переключение задач или оба действия сразу (tss можно вкладывать друг в друга)... p.s. это вроде не имеет отношения к перехвату int 1, так что можно считать оффтопиком, сорри... |
|
|
Дата: Май 13, 2004 16:18:07 Я извиняюсь за возможно чайниковский вопрос, но перехват int3 от перехвата int1 чем-то принципиально отличается? |
|
|
Дата: Май 13, 2004 18:10:20 Если не собираешься эмулировать действие - нет. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.091 |