Сейчас на форуме: jinoweb, bartolomeo, rmn (+4 невидимых) |
eXeL@B —› Программирование —› Перехват прерываний и исключений |
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . >> |
Посл.ответ | Сообщение |
|
Создано: 09 декабря 2013 15:35 · Личное сообщение · #1 Руководствуясь Хоглундом и Батлером на тему перехват прерываний и исключений , написать и запустить драйвер получается но перехват не выходит, пытался перехватить как 0x04 OF так и 0x13 ошибки доступа к памяти, запускал на VB xp 32 с одним процессором, но увы, не опытность даёт знать, вот код на Си который вышел: init.c: Code:
IDT.c Code:
|
|
Создано: 13 января 2014 21:24 · Поправил: MickeyBlueEyes · Личное сообщение · #2 |
|
Создано: 13 января 2014 22:16 · Поправил: Модератор · Личное сообщение · #3 MickeyBlueEyes > Тута пытаюсь int 1 перехватывать, прямо из IDT, делаю такой трюк Не будет оно работать, почему я уже расписал. > PsGetCurrentProcess(); //БСОД Селекторы нужно восстановить соответствующие. Я просто поражаюсь как так можно, не думайте что какой то сарказм. Просто человек пилит ISR не имея представления про сегментацию, короче попытка работать в прот моде в р0 не зная что это такое. int > К сожалению действительно стоящей документации и примеров нет. Как бы не так. Документации тонны, как оригинальной, так и косвенной/оттранслированной етц. Тоже касается и кода. > т.е. понять куда указывают сегментные регистры в режиме ядра и какими они должны быть. Когда я не понимал механизмов сегментации, у меня сегмент" вызывало очень не приятные ассоциации, это были впечатления связанные с досом. Вероятно у тс тоже самое, так как той же хернёй забивают разум, даже сейчас. Это заблуждение, профессор может и умный, но в данный момент он ... и ему низя верить, так как его знания устарели. Беру в пример БГУИР, беларусский вуз, личный опыт. Мне там говно впихивали, сортировки какие то в досе.. кому оно щас надо. int На словах нумерация происходит в десятичной системе. Я могу посчитать сдачу в магазе в бинах, но думаю продавец не осилит Archer > а не клеркокостыли, работающие на единственной платформе, а то и единственном билде ОС. Может пример приведёте, так прямо и скажем чтобы не быть ... ? Обычно мой код робит во всей линейке, вот например LWE. На WOW тоже робит. И в чём именно костыли ? На си ты такой код никак не запилишь, только если вручную транслировать, это даже можно и не обсуждать - конпиль не под те задачи запилен. Ну а на си это реализовать маразм полнейший. Есть некоторые коды, как например под недавний ман про клифа - так это POC. Мне нужно обьяснять что это такое ? У меня вообще нет желания с вами спорить, у вас у всех вместе взятых уровень знаний и понимания далёк от моего. Это не моё желание, нет конечно, это просто обьективные факт. Сейчас наверно вентилятор должен разбросать говна, так как детский разум морально не устойчив.. Ну а то, что вы называете портабельностью - си в простейшем случае это примитивнейший язык, он и популярен именно за свой минимализм. Можно описать всё 3-хэтажными конструкциями, что есть приведение типов. Это его суть. Я изучил си за пару дней, причём эти дни не помню, так как был пьяный в дрова. Возмите любой мой код и подумайте как реализовать на си. Я уверен что вы ничего не ответите, так как таких попыток на том же аверлабе было много, но не одного вменяемого ответа. |
|
Создано: 13 января 2014 22:32 · Поправил: dosprog · Личное сообщение · #4 Dr0p, ...На словах нумерация происходит в десятичной системе. --плохо. И не факт. Возьмите int21h,int10h,int13h,16h,int19h,25h,int33h,int35h,int52h,...int71h - всюду хекс. В Windows в сообщениях об ошибках тоже хекс. Tак принято. Зачем держать в памяти два набора данных, когда это те же цветы, но в профиль? В программах (нормальных) я тоже не видел, чтобы использовали dec, потому что неудобно, да и ошибками чревато (RADIX). Кстати, это один из издевательских способов обфускации асм-текстов - все числа в десятичной системе. --ADD-- К сожалению (или нет), для хекс-арифметики давно уже использую калькулятор. В уме не считаю после нескольких идиотских ошибок, стоивших времени. P.S. Прошу извинить за оффтоп... |
|
Создано: 13 января 2014 22:33 · Поправил: Dr0p · Личное сообщение · #5 |
|
Создано: 14 января 2014 00:09 · Поправил: Dr0p · Личное сообщение · #6 |
|
Создано: 14 января 2014 00:48 · Личное сообщение · #7 Dr0p Си за пару дней изучить не получится. В смысле изучить синтаксис можно быстро, а вот все парадигмы языка надо курить опытным путем и изучением примеров. По поводу перевести исходники... Пару асм-файлов SIDE я уже перевел на Си, могу скинуть, если интересно. Хотя есть свои недостатки, например битовые маски в асме работают очень быстро, но без комментариев выглядят не наглядно. В сях они выглядят более наглядно, за счет битовых полей. Однако оптимизации нет, ибо нет у меня на сях прямого доступа к тем же SHRD, SHLD. Остается слепо верить, что компиль сделает более менее хороший код. Отладка усложняется, ибо на асме я вижу в отладчике свой код, а если он был написан на сях, мне еще надо пытаться разглядеть плоды компилятора. Холивар на тему языков программирования считаю глупым. Все языки хороши, каждый под свою задачу. Я развел холивар не на тему выбора языка, а на тему не понятной мне каши из разных языков в одном файле. Преимущество языка Си я вижу только в том, что код очень лаконичным получается против ассемблера. Приведения типов - это типичный быдлокод. Оно редко надо, на самом деле, если адекватно писать. Против десятичной системы счисления я ничего не имею. Просто ты написал 14-ый вектор, а тс написал как 0x14. dosprog пишет: --плохо. И не факт. Почему это? Я мыслю обычно в десятичной системе счисления. Просто надо понимать где ставить h или 0x, а где нет. Ошибки возникают там, где нет понимания. Или от невнимательности. Короче обсуждение ЯП и систем счисления бессмысленный холивар и к теме отношения не имеет. |
|
Создано: 14 января 2014 13:44 · Личное сообщение · #8 |
|
Создано: 14 января 2014 16:22 · Личное сообщение · #9 Dr0p Фигня с точки зрения работоспособности или с точки зрения оптимизации? Добавлено спустя 3 часа 59 минут MickeyBlueEyes пишет: "К.Ирвин - Язык ассемблера для процессоров Intel" * Слишком много воды. * Слишком много времени отведено MS-DOS. В наши дни 8086 режим нужен только чтобы запустить защищенный режим и для ntvdm. * Построена как учебник, препод-стайл * Слишком много вниманию макроассемблеру * О страничной адресации не сказано почти ничего, а все потому, что это учебник, +инфа устарела, уже давно используется PAE, в книге упоминается лишь PSE-36 и то с пометкой "мы не будем его тут описывать" Читаем авторский пролог: "Материал данной книги подобран в соответствии с ее первоначальным замыслом — научить студентов писать и отлаживать программы на уровне машинных кодов. Она никогда не заменит собой полноценный учебник по архитектуре компьютеров, но позволит студентам получить из первых рук бесценный опыт в написании программ и продемонстрирует, как на самом деле работает компьютер." Старая избитая ложь, копируемая авторами из книги в книгу (собственно так большинство учебников пишется: лектор берет книгу по которой учился сам, меняет текст определений, добавляет немного новых материалов и издает под своим именем; этим страдает даже МГУ). Что-то не фига я не знал, как работает компьютер (и сейчас не знаю, но что-то все-таки уже знаю), пока не полез изучать тонкости защищенного режима. По архитектурам ОС есть книги Таненбаума. Но там тоже воды до фига. В итоге документацией является то, о чем я сказал. Маны Интела/АМД и исходники винды. Если кто-то знает другие хорошие примеры, было бы интересно обсудить. Вот, например, как заполняются сегментные регистры в коде из WRK: Code:
Взято | Сообщение посчитали полезным: Dr0p |
|
Создано: 14 января 2014 21:47 · Поправил: Dr0p · Личное сообщение · #10 int > Фигня с точки зрения работоспособности или с точки зрения оптимизации? Вроде же када пивас пили я вам растёр этот вопрос подробно. Зачем опять спрашивать. Сайда тело есть микод > Но вот в fs обязан быть KGDT_R0_PCR Это всё фундаментально, но думаю вы зря это пишите, так как для тс это некий непонятный язык/образы. |
|
Создано: 14 января 2014 21:56 · Личное сообщение · #11 |
|
Создано: 14 января 2014 22:11 · Личное сообщение · #12 int Основная часть фильтра(дллка) не портабельна, так как используются конструкции типо загрузки флагов и далее восстановления регистров, при этом учитывается TF etc. Изменение кода приведёт к не работоспособности. В общем часть, которая является непосредственно фильтром не может быть транслирована на си. На нём походу можно хорошо фильтры сервисов описывать. Описание апи - отложенная маршрутизация также будет извратом, так как используются текущие регистры. |
|
Создано: 14 января 2014 22:21 · Личное сообщение · #13 |
|
Создано: 14 января 2014 22:26 · Личное сообщение · #14 int Не могу ничего сказать по поводу инлайн макро(интринсики эти самые). Не нравится мне это, хотя это чисто моё мнение, возможно не корректное. Думаю это могут реализоать лишь те, кто полностью конпиль разобрал и знает во что будет каждое выражение сконпилено. Я например понятия не имею. Видимо поэтому и не нравится. |
|
Создано: 15 января 2014 06:27 · Личное сообщение · #15 int пишет: ss (стэк всегда соответствует CPL) Если быть совсем точным, то это CPL всегда соответствует стеку. Иными словами, текущие привилегии процессора всегда соответствуют полю DPL в теневом регистре SS. При этом SS.CPL и CS.CPL могут (теоретически) быть другими, т.е. вполне допустима ситуация когда SS.CPL = CS.CPL = 0, а фактически проц работает в ринг3. Об этом писал еще Коллинз 15 лет назад. Правда стандартными методами добиться рассинхронизации ShadowSS.DPL с SS.CPL и CS.CPL невозможно (или я просто не знаю как). На современных процах единственный путь - это залезть в SMM и в образах теневых регистров, сохраненных в SMRAM Save State Map, поменять DPL на нужное значение. На древних 286 и 386 для этой цели можно было еще заюзать команду loadall. P.S. Проверял только в native mode, насчет лонгмода, когда в SS запросто может быть нулл-селектор - хз. |
|
Создано: 15 января 2014 08:21 · Поправил: dosprog · Личное сообщение · #16 spinz, ...CS.CPL = 0, а фактически проц работает в ринг3. - это проверено?))) Проверка SS.CPL==CS.CPL выполняется во время загузки SS, а не CS. --ADD-- К следующему посту: ...пытался выполнить любую привилегированную команду... --какое значение (число) у вас при этом было в регистре CS? И в любом случае: 1) при загрузке в SS значения с CPL<>CS.CPL будет неприятность. 2) при загрузке в SS (и СS) значений 0..3 - то же самое 3) при использовании в SS селектора дескриптора сегмента данных - то же самое. |
|
Создано: 15 января 2014 08:37 · Личное сообщение · #17 Проверено. Я вызывал SMI из ринг 0, через cache poisoning хучил обработчик SMI#, менял в образе shadow SS DPL на 3 и выполнял RSM. Потом пытался выполнить любую привилегированную команду, в рез-те GP#, т.е фактически проц был в ринг3, хотя SS.CPL=CS.CPL=0. Еще раз повторю, что все делалось в обычном 32битном протмоде. |
|
Создано: 16 января 2014 01:23 · Личное сообщение · #18 Господа извиняюсь что я перебиваю, но после прочтения некоторых постов, меня всё больше осинило, мне некий код драйвер в том числе перехват int 1, нужно будет на x64, но как я понимаю там патч гвард, так шо там мне ничего не светит. Я незнаю как там всё точно, но можна же както подключится типо своим отладчиком и отлаживать свои DR через kernel mode легально и без патча IDT? Хотябы подскажите ключевый слова для поиска в гугле ) Мат часть понимаете хромает |
|
Создано: 16 января 2014 01:28 · Поправил: Dr0p · Личное сообщение · #19 MickeyBlueEyes > Хотябы подскажите ключевый слова Маршрутизация. И не обращайте внимания на их заумные тексты. В реале под нт на это можно забить, так как они вещают то, чего в реале не потрогали. Я например пытался поюзать тсс и ничо не получилось. Сугубо по матчасте. Реальные задачи этого не требуют. Тёрки про теневые части регистров следует на аверлабе обсуждать, просто там люди есть которые знают теорию хорошо(не сходящуюся частично с реальностью). |
|
Создано: 16 января 2014 01:31 · Личное сообщение · #20 |
|
Создано: 16 января 2014 01:36 · Поправил: Dr0p · Личное сообщение · #21 |
|
Создано: 16 января 2014 06:28 · Личное сообщение · #22 dosprog пишет: --какое значение (число) у вас при этом было в регистре CS? И в любом случае: 1) при загрузке в SS значения с CPL<>CS.CPL будет неприятность. 2) при загрузке в SS (и СS) значений 0..3 - то же самое 3) при использовании в SS селектора дескриптора сегмента данных - то же самое. Емнип CS=0x500. За следущее замечание - спасибо, привет от КО )) Правда не понял насчет "SS селектора дескриптора сегмента данных" - по твоему там должен быть дескриптор кодового сегемента что ли? Dr0p пишет: как ты етот сигнал сгенерил если не секрет Грустно, когда илита илит, которая везде орет про свое доскональное знание матчастей и обязательность изучения интеловских манов всем одептам, так фейлит. В главе про Local APIC все описано. Dr0p пишет: Я не понял, к чему путь К рассинхронизации shadow.DPL и CPL. Видимо одинаково "внимательное" чтение чужих постов и мануалов и стало причиной вышеупомянутого фейла |
|
Создано: 16 января 2014 09:36 · Личное сообщение · #23 Аппаратная виртуализация поможет перехватить прерывания, не мешая патчгарду. К слову сказать, в виртуализации амд есть отдельно CS, а есть отдельно CPL. Вероятно, их можно рассинхронизивать, но не пробовал. В интеле такого разделения нет. | Сообщение посчитали полезным: MickeyBlueEyes |
|
Создано: 16 января 2014 15:47 · Личное сообщение · #24 |
|
Создано: 19 января 2014 22:03 · Личное сообщение · #25 Есть способы узнать прямо в обработчике прерываний в каком мы векторе? Ну тоесть чтобы не подставлять при перехвате всем одно и тоже тело заголовка и конца, а сделать один трап для всех, чтобы заполнял все сегменты, потом узнавал в каком мы векторе и из массива хуков использовал вектор в качестве индекса. |
|
Создано: 20 января 2014 10:37 · Личное сообщение · #26 MickeyBlueEyes В чем проблема открыть наконец мануал? Если проблемы с английским, у меня есть перевод 6-ой главы. Не выкладываю, т.к. еще не успел доделать. Вы знаете, что такой класс исключений? Можете назвать отличие в обработчиках отказов (faults в оригинале) и ловушек? Вы понимаете, что будет в стеке в каждом конкретном случае? Там бывает код ошибки, который IRET не выталкивает из стека. Догадываетесь, чем дело кончится? А что сохраняется кроме кода ошибки? Без ответа на эти вопросы, ваши вопросы не имеют смысла. Я понимаю, что вы не смогли сегментные регистры настроить на селекторы винды (KPCR в смысле хотя бы). Тема мало где раскрыта, чтобы тут не писали (драйвер Archer'а с хуком IDT рассмотрен в соседней теме, он конечно сейчас может написать лучше, но с фактом некорректности того кода нельзя не согласиться, а ведь это тоже опыт). Но все же ман Интела, изучить придется. Вот, что вам надо открыть (официальная книга Intel): 64-ia-32-architectures-software-developer-manual-325462.pdf Поверю, что вы открыли эту книгу, только если назовете мне хотя бы одну ошибку в тексте этой PDF. Да, чтение это скучно и нудно, не так весело чем писать код. Однако, смысла в таком коде не будет, и вам все равно надоест. | Сообщение посчитали полезным: MickeyBlueEyes, _0d0a |
|
Создано: 20 января 2014 12:46 · Личное сообщение · #27 MickeyBlueEyes пишет: Есть способы узнать прямо в обработчике прерываний в каком мы векторе? Без лишних телодвижений вроде нельзя. А если все (кроме #NP) дескрипторы IDT пометить как Not present, то в обработчике #NP, анализируя код ошибки, можно определить какой эксепшн должен был бы вызваться (будь его дескриптор Present). Только вряд ли это будет стабильно работать, например в случае фактического double fault мы получим в итоге triple fault (дескриптор даблфолта ведь невалиден) |
|
Создано: 20 января 2014 13:00 · Личное сообщение · #28 |
|
Создано: 20 января 2014 13:23 · Личное сообщение · #29 Как я понял, идея автора заключалась в том, чтобы сделать единую точку входа для всех прерываний, потом неким образом определять номер вызванного прерывания(эксепшна) и затем вызывать нужный обработчик. Так действительно код был бы немного компактней, только вот определить искомый номер практически невозможно без извращений с дескрипторными таблицами | Сообщение посчитали полезным: MickeyBlueEyes |
|
Создано: 20 января 2014 18:42 · Личное сообщение · #30 |
|
Создано: 20 января 2014 19:19 · Личное сообщение · #31 |
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . >> |
eXeL@B —› Программирование —› Перехват прерываний и исключений |