Владислав Кабак | Omegicus CIO

NebKa

Светящийся наряд для маленькой принцессы

Бабушкам и мамочкам маленьких принцесс хочу предложить создать для своих девочек шикарный праздничный наряд, юбку-пачку или, как еще ее называют, туту-юбочку с использованием светодиодной гирлянды, которой обычно украшают елочку и праздничный интерьер. Юбку можно сшить



читать далее »

История

Столетняя война длилась 116 лет.


читать далее »

Мебель своими руками из картона. Идеи

1. 2.3.   4.5.6.7.8.9.  



читать далее »

География

В Амстердаме и Антверпене по 26 островов, в Санкт-Петербурге - 101, а в Венеции - аж 118.


читать далее »

Мой совет:

Яблоки кислых сортов нельзя долго держать в духовке - они превращаются в пюре.


читать далее »

Простой дизайн с клейкой малярной лентой.

1. Малярной лентой прикрепите образец к рабочему столу и натуральной мочалкой нанесите лёгкий текстурный узор.2. С помощью малярной ленты создайте такой (или похожий)дизайн:3. Закрасьте полосы между лентами разными цветами:4. Для данного образца мы использовали металлические



читать далее »

Из картона

К сожалению, автора не знаю. Взято у Мурзилки.  



читать далее »

Мой совет:

Запах масляной краски в квартире быстрее исчезнет, если в нескольких местах поставить тарелки с солью.


читать далее »

Поделки из пуговиц. Много-много идей и мк

Регулируемое колье из пуговиц Вам понадобится: - пуговицы - нить, шнур, леска или шнурок (достаточно крепкий и тонкий, чтобы проходить через отверстия в пуговице) - иголка - ножницы - измерительная лента 1. Отмерьте примерно 150 см нити и отрежьте кусок. Вденьте нить



читать далее »

Ведро для мусора из папье-маше

 Ведёрко для бумаг из папье-маше. Попробуйте сделать такое ведро для бумаг. Такого точно вы ни у кого не встретите. Получается красиво. Для этого нужно: надувной шарик, клейкая лента, газета, ПВА клей, кисть, краска, картонная коробка, тонкая бумага,



читать далее »

Анекдот

Помню, как-то раз в детстве, под Новый год, я вырезал много красивыхснежинок из папиной заначки. Поэтому молочные зубы у меня выпали гораздораньше, чем у сверстников...


читать далее »

КАК СВЯЗАТЬ ТАПОЧКИ БЕЗ ШВОВ. Описание+мастер-класс

Яркие и красивые получаются женские тапочки без швов, связанные своими руками.Для работы потребуются спицы номер 3. Пряжа шерстяная или полушерсть, 2 мотка по 100 гр. Длина нити 250 метров.Набираем на спицы 13 петель и вяжем



читать далее »

Заменим бисер на пластиковую бутылку

1.И так для начала бутылку надо порезать на кусочки. Мне в данном случае помогли дырокол и маникюрные ножницы. В принципе заготовки могут быть любой формы, но мне задумались круглые. 2.Каждый кусочек протыкаем иглой (шилом) и аккуратно



читать далее »

Человек

Во время полета человека в самолете скорость роста его волос удваивается.


читать далее »

КАК СДЕЛАТЬ ДЖИНСОВЫЙ "КОМОДИК"

Для начала вам понадобится несколько тетрапаков от молока,сока и т.п. Так же вам будет нужен картон и джинса.Отрежьте пакеты на желаемую высоту .Это будут выдвижные ящички.Я советую сначала обклеить коробки джинсой ,а уж затем вырезать


читать далее »

Заколка для волос. Розы мк из фоамирана

Привет всем! На днях перебирала свои заколки и нашла те, которые я уже не ношу из-за того, что они уже либо не модны, либо потеряли свой внешний вид. Вот и решила одну из таких приветси


читать далее »

Классная переделка туфлей

Предлагаю такой вариант переделки ваших старых и уже приевшихся туфлей, в вот такие класснецкие туфли.Для того, чтоб их переделать нам понадобится:1. пара туфелек;2. белая спрей краска;3. неоновая краска-спрей (любой оттенок, который вы хотите);4. газета;5. скотч



читать далее »

Наука

Самые большие гайки весят 4,74 т каждая, имеют внешний диаметр 132 см и 63,5-сантиметровую резьбу.


читать далее »

Что можно сделать из ПВХ труб. Идеи и мастер-классы

1. Багажник для автомобиля. Вот такой багажник для авто можно соорудить из водопроводных труб. Не менее интересно смотрится держатель для велосипеда на автомобиль.   2. Бортик на кровать. Чтобы ребенок ночью не упал с кровати, можно смастерить импровизированный бортик. 3.



читать далее »

Плетеный стул из старых ремней – вышедшее из моды в дело!

Вышедшие из моды ремни можно пустить в дело и сплести из них сидение для стула, требующего реконструкции. Ремни могут быть любые, даже из искусственных материалов. Плетение позволит равномерно распределить нагрузку и ремни будут способны выдержать



читать далее »

Овечка-подушка (или коврик:)) Выкройка и МК.

 



читать далее »

Анекдот

Жена мужу:- У меня для тебя две новости: хорошая и плохая.- Ну и какие же?- Я от тебя ухожу.- А плохая?


читать далее »

6 рецептов от целлюлита. Готовимся к лету!

Рецепт от целлюлита №1: Жесткая мочалка   Этот рецепт от целлюлита прост и не требует каких-нибудь нереальных затрат. Нужна жесткая мочалка – можно искусственную губку с массажным слоем из ближайшего супермаркета. Во время душа или после ванны нужно


читать далее »

Как отбелить тюль

Со временем белоснежный тюль приобретает неприятный желтоватый оттенок. В таком случае стирка обычным порошком уже не устранит загрязнения. Но не спешите покупать новые занавески. В этой статье вы узнаете, как отбелить капроновый тюль и придать ему



читать далее »

Бежевый кардиган, связанный спицами. Описание. Для начинающих

 Бежевый кардиган связан спицами лицевой гладью и платочной вязкой. Украшен кардиган застежками-петлицами и кусочками кожи. Размер: 42/44 Вам потребуется: 7 мотков пряжи Pingouin Marte (100% акрил) бежевого цвета; Спицы №10; 3 петлицы черного цвета; 6 кусочков кожи Узоры:Лицевая гладь:



читать далее »

Декор джинсов (подборка)

Подборка джинсов с красивым декором. Красивая вышивка, стразы, бусины и др. Источник: http://secondstreet.ru/blog/diy_djinsi/dekor-dzhinsov-podborka.html



читать далее »

ПОДАРОЧНАЯ УПАКОВКА

  Источник: http://barrellab.ru



читать далее »

Леонид Рогозов. Сам себе хирург

Судно «Обь» с шестой советской антарктической экспедицией на борту вышло в плавание 5 ноября 1960 года. Девять недель спустя, 18 февраля 1961, была открыта новая советская станция «Новолазаревская». Экспедиция успела как раз вовремя: опускалась полярная



читать далее »

Гетры спицами (спицы)

Узор спицами «Фасонный жгут» состоит из двух «простых кос», перекрещенных в разные стороны. Количество петель этого узора тоже может быть разным (но только четным), я же приведу образец именно узора из связанного комплекта. Для этого



читать далее »

Анекдот

Что нужно обязательно сделать в жизни: - Нанять двух сыщиков следить друг за другом. - Забежать в магазин, прокричав: "Какой сейчас год?" Услышав ответ, выбежать с криком "Сработало!" - Сделать ванильный пудинг. Положить его в банку из под


читать далее »

ОЧЕНЬ КРАСИВЫЙ Пасхальный декор: идеи и мастер-классы

Спасибо автору: http://prazdnichnyymir.ru/ Яйцо пасхальное с ландышами Для яйца взять бисер нескольких близких оттенков и прямым плетением обшить болванку, максимально растягивая цвета.Или яйцо вполне может быть однотонным, это кому как нравится. Для ландышей потребуется пластмассовый «жемчуг» разного размера, металлизированная


читать далее »

Сколько люди жили раньше?

В древней Греции люди жили в среднем 29 лет, в Европе 16 века – 21, 17 века – 26, 18 века – 34, в начале 20 века – около 50, в середине 20 века –


читать далее »

Человек

99% всего кальция в организме находится в зубах.


читать далее »

Летние блузки и топы... выкройки...(много)

Летние блузки и топы.ТАКУЮ МОЖНО ИЗ ПЛАТКОВ СШИТЬ:))ЭХ, ГДЕ МОИ 17 ЛЕТ?!:)):))



читать далее »

Мой совет:

Если вымытую зелень плотно завернуть в фольгу и положить в морозильную камеру, она будет свежей 2-3 месяца. Причем в отличие от сушеной или засоленной совершенно не изменит своего запаха и вкуса.


читать далее »

10 мифов о русском языке

Кофе Кофе — заимствованное слово, заканчивающееся на букву «е», но мужского рода. В огромном большинстве такие слова приобретают в нашем языке средний род — так уж он устроен, и эта тенденция необыкновенно сильна. Например, «метро» было раньше тоже мужского рода (от «метрополитен»), даже выходила газета «Советский


читать далее »

Как сшить детские домашние тапочки из войлока

Домашние детские тапочки из войлока в стиле hand made украсят ножки вашего малыша и согреют его прохладными вечерами. Всего немного усилий и навыков, минимум войлока и чуть-чуть желания, и вы получите в итоге замечательные, необычные, непохожие



читать далее »

Природа

В 1932 году было так холодно, что Ниагарский водопад полностью замерз.


читать далее »

Анекдот

- Ой, кaкие у вaс крaсивые тройняшки... Кaк вы тaк филигрaнно копии сделaли? Муж: - Трaфaрет покaзaть?


читать далее »

Анекдот

Пошла Машенька по грибы, да по ягоды. Вернулась ни с чем. Потому что надо ставить перед собой конкретные цели.


читать далее »

ЧУДО-МАСКА ОТ ВЫПАДЕНИЯ ВОЛОС

ЧУДО-МАСКА ОТ ВЫПАДЕНИЯ ВОЛОС — !  Я такого еще не видела.. После первого применения волосы перестали выпадать! Если бы мне кто-то сказал такое, не поверила бы! Наверное, большинство из нас хоть раз в жизни сталкивались с выпадением



читать далее »

Украшения из проволоки от Antonietta Vitullo

Украшения от Antonietta Vitullo



читать далее »

Красивое вязаное колье (мастер-класс)

    Мастер класс:Как всегда любимый Tulip и тонкий крючок.2. Весь принцип в том, что сначала надо нанизать бусины на нить (ту же, какой будете вязать), затем обвязать их.Я не могу знать размер бусин, которые вы будете использовать,



читать далее »

Имитация вышивки ришелье на шкатулке. МК.

источник http://www.mastera-rukodeliya.ru/risovanie/rospis/3181-imitaciya-rishelie.html Автор: Lu Heringer Блог автора: APRENDA A FAZER ARTESANATO PASSO A PASSO! Com Lu Heringer С помощью несложных действий и краски можно сделать великолепную имитацию кружева  ришелье на любой поверхности. Процесс росписи:  часть2  Шаблон для росписи:



читать далее »

Теплая зимняя шапка, вязание крючком для начинающих (крючок)


читать далее »

Крокусы из фоамирана. Мастер-класс



читать далее »

Мой совет:

Плиссированная юбка не изомнется, если хранить ее в капроновом чулке.


читать далее »

Переделки из свитера.

Если у Вас состарился свитер, надоел или растянулся, не спешите его выбрасывать, а лучше посмотрите оригинальные идеи использования его для разнообразных переделок, которыми Вы можете обновить не только себя, дорогие читатели, но и свой интерьер



читать далее »

Мастер-класс. Венок с цветами персика из фоамирана.

Автор мастер-класса: Авелли Сегодня мы хотим вам показать МК по цветам персика из корейского фоамирана. Вы можете использовать элементы цветов для изготовления заколки, броши, бутоньерки. Материалы: фоамиран персиковый, шампань, тычинки мелкие «топленое молоко», кусочек глины, проволока 24, шаблон



читать далее »

Веточка жасмина из фоамирана

Тatiana Popova"nn    Я с большим удовольствием работаю с фоамираном. В сети сейчас достаточно различных мастер-классов с данным материалом, но аналогичный я не встречала. Будем делать веточку жасмина, которую можно использовать как брошь, бутоньерку или заколку. Нам понадобится: -фоамиран



читать далее »

Анекдот

Пропала собака без задней ноги. Особые приметы: когда писает - падает.


читать далее »

Открыт ремонт нервов при помощи молодой крови

Некоторые эффекты старения в центральной нервной системе животных могут быть обращены вспять при воздействии кровотока молодой особи. Авторы опыта предполагают, что открытое явление в каком-то виде может быть использовано в терапии и у людей. Биологи из университета Кембриджа провели опыт


читать далее »

Как задекорировать старые горшки. Мастер-класс

Очень оригинальный способ задекорировать неприглядные горшки для цветов, а заодно и украсить интерьер. Для работы нам надо: картонная коробкаскотчклейкоричневая грубая упаковочная бумага Как сделать: Автор: Svetlana 



читать далее »

Плетение вокруг волос

Озорная прическа с плетением на распущенные волосы. Оригинально и очень просто. Как делать:    



читать далее »

Подшивка "УГОЛКОМ" (покрывало,скатерть,шторы,салфетки)!!! Видео

 


читать далее »

Шьем детские штанишки из рукавов папиной джинсовой рубашки

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



читать далее »

Анекдот

- Морковка или жизнь!!! - кричал заяц, угрожая снеговику феном


читать далее »

Большая подборка бохо



читать далее »

Разное

Самая большая жемчужина, получившая название «Жемчужина Аллаха», найдена в 1934 году у берегов Филиппин внутри гигантской раковины тридакны. Ее вес - 6,5 килограмма. Ювелирной ценности эта гигантская жемчужина не имеет, она интересна лишь как игра


читать далее »

МК цветк из узкой ленты

Ну начнем"с! Решила сделать свой мк, так как с инета меня не удовлетворил. Буду делать цветочек маленький (о том цветке, который побольше я ниже опишу как делала), для этого я взяла узкую ленту 0.5-0.6 (почему-то


читать далее »

МК оттиски растений и создание украшений с ними

Автор:  Титова Юлия (Botanica)    Давно нравилась техника отпечатывания растений на глине, поэтому решила сделать что-нибудь сама, и в процессе фотографировать. Так как он (процесс ) занял не один день, фотографии все разные  получились. Итак, сначала раскатываем пласт толщиной


читать далее »

Ажурное платье "Прозрачный шик"

С наступлением лета не мешает обновить свой гардероб и добавить в него новое платье, соответствующее сезону. Предлагаем вам связать его спицами своими руками.Для работы потребуется:- белая пряжа "Жасмин" (100% хлопок, 220 м / 75 г)



читать далее »

Анекдот

Девушка обращается к еврею:- Мойша, можно я задам тебе вопрос?- Какой?- Когда мы, наконец, пойдем в кино?- Нельзя.


читать далее »

Ажурная скатерть крючком

 



читать далее »
Здесь пока пусто

Unauthorized.

MSR-регистры на службе хакера

2011.10.08

Автор: (c)Крис Касперски ака мыщъх

Популярные дебагеры (Soft-Ice, Syser, Olly) используют базовые отладочные возможности, появившиеся еще в 80386 и совершенно игнорируют тот факт, что процессоры изрядно подросли и обросли целым комплексом отладочных механизмов термоядерного типа, реализованных в виде нестандартных расширений, управляемых посредством специальных MSR-регистров, с помощью которых мы можем перехватывать системные вызовы, трассировать ветвления в реальном времени, дампить содержимое регистров общего назначения на каждом такте и делать еще множество других удивительных вещей, существенно упрощающих взлом защищенных программ

Бывает, что человек пытается решить какую-то проблему,
хотя она решена уже тысячи лет назад, а он просто об этом
не знает или не понимает, что это именно его проблема.
Виктор Пелевин, "Желтая Стрела"

Введение

Количество регистров Pentium-процессоров вплотную приближается к тысяче и хотя значительная часть из них носит сугубо служебный характер, сути дела это не меняет. Часть регистров стандартизирована и реализована во всех моделях (например, EAX, CR3, DR1), часть - специфична для определенной группы процессоров и совместимость с другими процессорами не гарантирована, хотя все они продаются под торговой маркой Pentium. Вот о таких специфичных регистрах мы и поговорим.

В технической документации они скрываются за аббревиатурой MSR - Model Specific Register(s) и впервые такие регистры появились (если мне не изменяет память) в P6, более известном как Pentium Pro и его "бюджетном" собрате Pentium-II. Революции не свершилось, но команда RDTSC с тех времен прочно вошла в лексикон всех разработчиков защит. Специальный MSR-регистр каждый такт увеличивает свое значение на единицу, а команда RDTSC позволяет прикладным программам считывать его содержимое. Как результат - при пошаговом прогоне защищенного кода под отладчиком, кол-во "тиков" процессора между двумя соседними замерами резко возрастала и защита палилит хакера только так.

Разработчики процессоров, используемых главным образом в серверах и высокопроизводительных рабочих станциях, совершили огромный бросок вперед, сотворив новые отладочные механизмы, глядя на которые обладатели Pentium-II/III только облизывались. Но с появлением Pentium 4 эти возможности, хлынув в бюджетную сферу, стали доступными всем и каждому, к чему создатели отладчиков ни морально, ни физически, ни технически оказались не готовы.

К счастью, большинство дебагеров поддерживают подключаемые модули, позволяя нам дописать весь необходимый функционал самостоятельно, однако использование MSR-регистров не ограничивается одной лишь отладкой и как мы увидим по ходу статьи, они интересны и создателям rootkit'ов, а также разработчикам самих защит.

Мыщъх

Рисунок 1. Мыщъх (a.k.a. Chuha на Хинди) за работой.

Что нам понадобится

Для экспериментов, описанных в статье, нам понадобятся следующие вещи, программы и инструменты:

  • Windows Driver Kit (WDK) для всех систем, по Висту включительно:
    http://www.microsoft.com/whdc/DevTools/default.mspx (требует регистрации);

  • Windows Server 2003 SP1 DDK:
    http://www.microsoft.com/whdc/devtools/ddk/default.mspx;

  • IA-32 Architecture Software Developer's Manual Vol. 3: System Programming Guide:
    http://www.intel.com/products/processor/manuals/;

  • DebugView:
    http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx;

  • KmdManager - утилита динамической загрузки/выгрузки драйверов:
    https://wasm.ru/pub/21/files/kmd3.zip;

  • Syser 1.95.19000.0894:
    http://www.sysersoft.com/download/download.php;

  • Soft-Ice:
    www.google.com ;-)

Чтение и запись MSR-регистров

MSR-регистры имеют свои собственные имена (например, IA32_TIME_STAMP_COUNTER), однако мыщъх'у не известен ни один ассемблер, "переваривающий" их, а потому приходится использовать "безликие" номера, перечисленные в приложении "MODEL-SPECIFIC REGISTERS" руководства Intel "IA-32 Architecture Software Developer's Manual Volume 3: System Programming Guide", откуда, в частности, можно узнать, что MSR-регистр IA32_TIME_STAMP_COUNTER имеет номер 10h.

Чтение MSR-регистров осуществляется машинной командой RDMSR с предварительной загрузкой номера нужного нам MSR-регистра в ECX. После выполнения команды регистровая пара EDX:EAX содержит исходный результат. В EDX помещаются старшие 32-бита значения MSR, а в EAX, соответственно, идут младшие.

За запись отвечает команда WRMSR, ожидающая номер MSR-регистра в ECX, а записываемое значение в регистровой паре EDX:EAX. Пример использования обоих команд показан ниже:

MOV        ECX, 10h         ; // IA32_TIME_STAMP_COUNTER
RDMRD                       ; // MOV (EDX:EAX), IA32_TIME_STAMP_COUNTER
INC        EAX
WMSR                        ; MOV IA32_TIME_STAMP_COUNTER, (EDX:EAX)

Листинг 1. Демонстрация чтения и записи MSR-регистров.

В защищенном режиме обе команды могут вызываться только из нулевого кольца, иначе операционная система сгенерирует исключение. Другими словами, для экспериментов с MSR-регистрами нам необходимо написать драйвер, "скелет" которого представлен ниже:

.686
.MMX
.model flat, stdcall
extern DbgPrint:PROC
.code

DriverEntry proc
        NOP
        NOP
        INT 03                      ; // Soft-Ice: I3HERE DRV

        MOV ECX, 10h                ; // IA32_TIME_STAMP_COUNTER
        RDMSR                       ; // MOV (EDX:EAX), IA32_TIME_STAMP_COUNTER

        MOV        EAX, 666h        ; LOW 32 bits
        WRMSR                       ; // MOV (EDX:EAX), IA32_TIME_STAMP_COUNTER

        RDMSR                       ; // READ AGAIN - just for fun :-)

        push offset mystring
        CALL DbgPrint
        pop eax

        mov eax, 0C0000182h         ; STATUS_DEVICE_CONFIGURATION_ERROR
;       RET                         ; Four-F says
        RETN 8                      ; <- haron says
DriverEntry endp

.data
mystring DB "*] MSR [*",0Dh,0Ah,0

end DriverEntry

Листинг 2. Исходный текст "скелета" простейшего драйвера MSR-base.asm для экспериментов с MSR-регистрами.

Для сборки драйвера нам понадобиться NTDDK и командный файл следующего содержания (для настройки которого необходимо прописать путь к библиотекам ядра):

@ECHO OFF

SET FILE_NAME=MSR-base

REM каждый настраивает эту строку под себя!
SET ntoskrnl=D:\NTDDK\libchk\i386\ntoskrnl.lib

IF EXIST %FILE_NAME%.obj DEL %FILE_NAME%.obj
ml /nologo /c /coff %FILE_NAME%.asm
IF NOT EXIST %FILE_NAME%.obj GOTO err
link /nologo /driver /base:0x10000 /align:32 /out:%FILE_NAME%.sys /subsystem:native %FILE_NAME%.obj %ntoskrnl%
GOTO end

:err
ECHO -ERR!

:end

Листинг 3. Командный файл для сборки драйвера.

Остается самая малость - загрузить драйвер внутрь системы, передав управление процедуре DriverEntry, которая выполнив все, что задумано, завершится с кодом STATUS_DEVICE_CONFIGURATION_ERROR, автоматически выгружая драйвер из системы.

Существует множество загрузчиков драйверов (на худой конец, можно написать и свой, благо в MSDN входит пример с ZwLoadDriver вместе со строгой рекомендацией не использовать эту функцию в серьезных проектах). Перебрав кучу загрузчиков, мыщъх остановился на KmdManager'е, написанным легендарным хакером Four-F, известным своим циклом статей на WASM'е, откуда можно скачать сам загрузчик вместе с исходными текстами: https://wasm.ru/pub/21/files/kmd3.zip.

Но прежде, чем загружать драйвер в систему, необходимо установить Soft-Ice (или Syser - это кому что больше нравится) и сказать ему "I3HERE DRV", заставив его отлавливать INT 03h в драйверах. Зачем все это?! А зачем, что наблюдать за командами RDMSR/WRMSR удобнее всего из отладчика, а Soft-Ice - это классика жанра.

Загрузка драйвера посредством KmdManager'a

Рисунок 2. Загрузка драйвера посредством KmdManager'a.

Ок, Soft-Ice подготовлен к работе, запускаем KmdManager.exe, указываем путь к драйверу, взводим галочку, расположенную между [Register] и [Run] и нажимаем на [Reg'n'Run] - Soft-Ice тут же появляется на экране в точке, где мы заботливо воткнули в драйвер команду INT 03h и теперь можем трассировать драйвер, сколько нашей душе угодно, а когда надоест - нажать или "x;" для выхода.

KmdManager, конечно, обругает нас матом, что драйвер загрузить не удалось, но все идет по плану. Именно так оно и было задумано. Зачем загружать драйвер, если все, что нам нужно - выполнить несколько команд на уровне нулевого кольца?!

Наблюдение за MSR-регистрами в Soft-Ice

Рисунок 3. Наблюдение за MSR-регистрами в Soft-Ice.

Чтение/запись MSR с прикладного уровня

Для чтение/записи MSR с прикладного уровня можно воспользоваться недокументированной native-API функцией NtSystemDebugControl(), экспортируемой из динамической библиотеки NTDLL.DLL. Готовый к употреблению пример работы с ней лежит на http://www.openrce.org/blog/view/535/Branch_Tracing_with_Intel_MSR_Registers, однако для этого необходимо: а) обладать правами администратора; б) в последних пакетах обновления под Server 2003 и XP возможности этой функции были существенно урезаны и, по-видимому, политика урезания продолжится и в дальнейшем, так что все-таки без драйвера не обойтись.

Перехватываем системные вызовы

Для перехода с прикладного уровня в режим ядра операционные системы NT 3.х/4.х и W2K использовали прерывание INT 2Eh, которое в изобилии водится в динамической библиотеке NTDLL.DLL, служащей своеобразными вратами в "ад"... тьфу, мостом между прикладным и ядерным уровнями.

77F88278 public ZwCreateFile
77F88278 ZwCreateFile      proc near        ; CODE XREF:LdrLoadAlternateResourceModule+29F?p
77F88278
77F88278 arg_0  = dword ptr  4
77F88278
77F88278        mov        eax, 20h        ; NtCreateFile
77F8827D        lea        edx, [esp+arg_0]
77F88281        int        2Eh             ; <-- врата в ад
77F88283        retn       2Ch
77F88283 ZwCreateFile      endp

Листинг 4. Реализация вызова функции ZwCreateFile на W2K.

Основной недостаток INT 2Eh в том, что выполняется она очень медленно и потому в P6-процессорах появилась пара более быстрых команд: SYSENTER (с прикладного уровня в режим ядра) и SYSEXIT (из режима ядра - назад на прикладной уровень), которую Microsoft стала использовать взамен INT 2Eh, начиная с XP и Server 2003, в результате чего NTDLL.DLL оказалась чуть ли не полностью переписанной.

В частности, в ней появилась пара процедур быстрого вызова ядерных функций и выхода из них обратно на прикладной уровень:

ntdll!KiFastSystemCall:
7C82ED50 8BD4        MOV EDX,ESP
7C82ED52 0F34        SYSENTER

ntdll!KiFastSystemCallRet:
7C82ED54 C3          RET

Листинг 5. Процедуры NTDLL.DLL быстрого вызова ядерных функций с прикладного уровня.

Прерывание INT 2Eh вопреки распространенному заблуждению не было предано анафеме и вместо морга перекочевало в процедуру KiIntSystemCall:

ntdll!KiIntSystemCall:
7C82ED60 8D542408        LEA        EDX,[ESP+0X8]
7C82ED64 CD2E            INT        2Eh
7C82ED66 C3              RET

Листинг 6. Процедура вызова ядерных функций через INT 2Eh, оставленная в XP/Server 2003 для совместимости.

Однако дизассемблирование показывает, что ни та, ни другая процедура реально не используются и NTDLL.DLL исповедует совершенно другой механизм диспетчеризации системных вызовов. В частности, код той же функции ZwCreateFile в Server 2003 выглядит так (сравните его с листингом 4):

77F42467 public ZwCreateFile
77F42467 ZwCreateFile proc near            ; CODE XREF: LdrLoadAlternateResourceModule-10C?p
77F42467        mov        eax, 27h        ; NtCreateFile
77F4246C        mov        edx, 7FFE0300h  ; offset SharedUserData!SystemCallStub
77F42471        call       edx
77F42473        retn       2Ch
77F42473 ZwtCreateFile endp

Листинг 7. Реализация вызова функции ZwCreateFile на Server 2003.

Что находится по адресу 7FFE0300h? Призвав на помощь Soft-Ice ("U 7FFE0300h"), мы видим (см. рис. 4), что здесь расположена машинная инструкция SYSENTER, что, собственно говоря, и требовалось доказать.

SYENTER в SharedUserData!SystemCallStub

Рисунок 4. SYENTER в SharedUserData!SystemCallStub.

Теперь немного о сути самой диспетчеризации. В таблице дескрипторов прерываний (IDT) для прерывания INT 2Eh имеется своя запись, указывающая - по какому адресу и селектору процессор должен передавать управление при ее выполнении. Естественно, на уровне ядра IDT легко модифицировать, установив свой перехватчик системных вызовов (многие rootkit'ы именно так и поступают), однако это слишком заметно. Целостность IDT проверяют многочисленные антивирусы и прочие защитные механизмы.

Операционные системы семейства XP/Виста и Server 2003/2008 предоставляют в этом плане намного больше возможностей. Во-первых, мы можем изменить содержимое SharedUserData, заменив SYSENTER переходником на свой собственный обработчик. И хотя этот регион формально недоступен для записи с прикладного уровня, он находится в пользовательской области памяти, которая в отличие от ядра все-таки может быть модифицирована с прикладного уровня, пускай и не без извращений, но... это тема совсем другого разговора.

Задумаемся - а куда SYSENTER передает управление? Ведь целевой адрес нигде явным образом не указан. Курим мануал от Intel и выясняем, что SYSENTER принимает три скрытых аргумента, передаваемые через MSR-регистры.

  • SYSENTER_CS_MSR (174h): - CS регистр для перехода на уровень нулевого кольца;
  • SYSENTER_ESP_MSR (175h): - ESP регистр для перехода на уровень нулевого кольца;
  • SYSENTER_EIP_MSR (176h): - EIP регистр для перехода на уровень нулевого кольца;

Селектор стека (регистр SS) получается путем сложения константы 08h со значением MSR-регистра SYSENTER_CS_MSR, так что SYENTER позволяет задавать не только CS:EIP, но и SS:ESP. Таким образом, мы имеем в своем распоряжении все четыре необходимых ингредиента для перехвата, хотя на практике достаточно подменить целевой EIP, перенаправив его на код нашего хакерского обработчика (естественно, расположенного внутри ядра, т.е. представляющего из себя драйвер, хотя чисто теоретически можно заставить SYSENTER вызывать обработчик, находящийся на прикладном уровне, но на этом пути слишком много подводных камней, чтобы принимать его всерьез). Весь фокус в том, что за MSR-регистрами еще мало кто следит и подобный rootkit имеет хорошие шансы остаться незамеченным долгое время (или даже не быть замеченным вообще).

Ниже приведен фрагмент кода, считывающего MSR-регистры, связанные с командой SYSENTER. На NT 3.х/4.х и W2K мы получим нули, а XP/Виста/Server 2003/2008 покажут нам адрес диспетчера системных вызовов, который можно хакнуть через WRMSR:

INT 03               ; // for Soft-Ice

MOV ECX, 174H        ; // SYSENTER_CS_MSR
RDMSR                ; // MOV (EDX:EAX), SYSENTER_CS_MSR

MOV ECX, 175H        ; // SYSENTER_ESP_MSR
RDMSR                ; // MOV (EDX:EAX), SYSENTER_ESP_MSR

MOV ECX, 176H        ; // SYSENTER_EIP_MSR
RDMSR                ; // MOV (EDX:EAX), SYSENTER_EIP_MSR

Листинг 8. Фрагмент исходного текста драйвера MSR-SYSENTER.asm, определяющего адрес диспетчера системных вызовов под XP/Виста/Server 200x.

Загружаем драйвер привычным способом (Soft-Ice должен быть предварительно запущен) и начинаем трассировать программу, наблюдая за значениями, возвращаемыми в регистровых парах EDX:EAX.

Читаем MSR-регистр

Рисунок 5. Читаем MSR-регистр номер 174h (SYSENTER_CS_MSR) под W2K и видим в EDX:EAX значение 00000000h, т.к. W2K не использует SYSENTER.

Читаем MSR-регистр

Рисунок 6. Читаем MSR-регистр номер 174h (SYSENTER_CS_MSR) под Server 2003 и видим в EAX значение 08h, совпадающее с ядерным селектором CS, что и требовалось доказать.

Халтурный хронометр или хронометраж наоборот

Начиная с P6 в Pentium-процессорах появился специальный счетчик производительности, увеличивающий значение MSR-регистра IA32_TIME_STAMP_COUNTER (10h) на единицу каждый такт (на самом деле это очень большое допущение, документация от Intel гарантирует просто увеличение, оставляя за собой простор для маневров, но это уже дебри технических деталей, в которые лучше не вдаваться).

По умолчанию прикладным программам даровано право читать его содержимое командой RDTSC, возвращающей текущее значение в регистровой паре EDX:EAX, причем отладчики типа Soft-Ice не "замораживают" этот счетчик на время своей работы, что позволяет защитным механизмам легко обнаруживать факт трассировки или срабатывания точек останова (обработка которых требует значительного количества процессорного времени). Во времена IBM XT/AT-совместимых компьютеров для той же цели использовался системный таймер (ну, грубо говоря, часы) и вот его-то Soft-Ice как раз и "замораживал", не позволяя защитам обнаружить себя. А сейчас что?!

Флаг TSD в управляющем регистре CR4

Рисунок 7. Флаг TSD в управляющем регистре CR4.

Начнем с того, что команду RDTSC очень легко сделать привилегированной. Для этого достаточно взвести TSD флаг (2-й бит) в регистре CR4 (доступном только с нулевого кольца), после чего всякая попытка вызова RDTSC с прикладного уровня заставит процессор генерировать общее исключение защиты, перехватываемое отладчиком и мы (перед возвращением управления программе) можем записать в регистровую пару EDX:EAX все, что нам захочется, а конкретно - создать видимость, что выполнение данного участка кода заняло ничуть не больше времени, чем обычно.

Фрагмент кода, который взводит TSD-бит, приведен ниже:

MOV        EAX, CR4        ; // читаем управляющий регистр CR4
OR         EAX, 4          ; // взводим TSD флаг
MOV        CR4, EAX        ; // обновляем CR4

Листинг 9. Делаем команду RDTSC привилегированной инструкцией.

А как быть, если защита реализована на уровне драйвера и наш запрет на чтение IA32_TIME_STAMP_COUNTER ей не помеха?! Тогда можно прибегнуть к прямой записи MSR-регистра IA32_TIME_STAMP_COUNTER командой WRMSR, пример использования которой приведен в листинге 1. Правда, здесь есть одно "но". Процессор (вот сцука) записывает только младшие 32-бита MSR-регистра IA32_TIME_STAMP_COUNTER, а остальные сбрасывает в ноль и защита может разоблачить наши махинации, правда, все известные мыщъх'у защиты с этим не заморачиваются, а просто сравнивают результаты двух замеров и если в обоих старшие 32-бита обнулены, то все ок.

Или не ок? Прикинем, насколько нам хватит младших 32 бит. Возьмем процессор с тактовой частотой в 1 ГГц, увеличивающий IA32_TIME_STAMP_COUNTER на единицу каждый такт, тогда младшие 32-бита переполнятся за 4,294967296 сек. Срок, в общем-то, не такой уж и большой. Впрочем, учитывая многозадачную природу Windows, защиты осуществляют замеры только на коротких "трассах", выполняющихся сотые или даже тысячные доли секунды, т.е. меньше одного кванта (времени, отпущенного процессу системным планировщиком, после которого происходит переключение на другой поток). В XP длительность кванта составляет ~100 мс, поэтому результаты замера в ~50 мс уже нельзя считать достоверными - поток мог быть прерван планировщиком. Короче говоря, для борьбы с защитами младших 32 бит вполне хватит.

Кстати, интересный факт. При записи IA32_TIME_STAMP_COUNTER под VM Ware, старшие 32 бита MSR-регистра не обнуляются, а в младшие записывается немного большая величина, чем замышлялось (издержки эмуляции), следовательно, анти-антиотладочный механизм должен работать так:

  1. Записать что-то в IA32_TIME_STAMP_COUNTER;
  2. Прочитать IA32_TIME_STAMP_COUNTER;
  3. Если старшие 32 бита равны нулю, мы на живом процессоре и записываем в младшие 32 бита фиктивное значение;
  4. Если старшие 32 бита не равны нулю, мы под VM Ware и записываем в младшие 32 бита значение с поправкой на эмуляцию

Таким образом, ломая программы под VM Ware и корректируя значение IA32_TIME_STAMP_COUNTER должным образом, мы надежно скроем присутствие отладчика от всех защит, основанных на замере временных интервалов.

Трассируем ветвления

Взведите бит TF регистра флагов (E)FLAGS (от там 8-й по счету, начиная от нуля) и процессор начнет генерировать отладочное прерывание INT 01h после выполнения каждой инструкции (за исключением инструкций, записывающих сегментный регистр SS) - это еще со времен IBM XT (не путать с XP!) всем хакерам хорошо известно.

Недостаток такого подхода прежде всего в его чрезвычайной медлительности. Даже с учетом быстродействия современных процессоров обработка исключений обходится очень дорого и "серьезную" программу мы будем трассировать до конца сезона. А смысл?! К трассировке обычно прибегают для реконструкции логики работы машинного кода, мысленно разбивая его на структурные блоки - ветвления, циклы, etc.

В частности, при написании универсальных распаковщиков, автоматически определяющих оригинальную точку входа в программу, нам совершенно незачем исполнять все команды, вполне достаточно после каждого прыжка сравнить целевой код с набором сигнатур стартового кода, внедряемых компиляторами в начало программы.

Вот если бы мы могли заставить процессор генерировать отладочные прерывания только после ветвлений - скорость распаковки возросла бы в сотни раз. Или вот еще. Сравнивания два прогона защищенной программы - до и после завершения испытательного срока, мы легко найдем тот самый условный переход, после которого все пошло по пути "trial expired". Естественно, полный лог трассировки нам ни к чему. Нас интересуют только ветвления. Вот только так их получить?!

Бит BTF

Рисунок 8. Бит BTF в MSR-регистре MSR_DEBUGCTLA (1D9h).

Оказывается, процессор позволяет сделать это! Если бит BTF (1-й, считая от нуля) MSR-регистра MSR_DEBUGCTLA (1D9h) взведен, то процессор будет интерпретировать стандартный TF флаг как указание генерировать отладочное прерывание только после встречи с ветвлением или исключением, при этом оба флага (BTF и TF) автоматически очищаются.

Проведем следующий эксперимент. Уберем из "скелета" нашего драйвера INT 03h, и поместим туда следующий код, взводящий флаг BTF.

MOV ECX, 1D9H        ; // MSR_DEBUGCTLA
RDMSR                ; // MOV (EDX:EAX), MSR_DEBUGCTLA

OR EAX, 2            ; // SET BTF (single-step on branches) flag (bit 1)
WRMSR                ; // MOV (EDX:EAX), MSR_DEBUGCTLA

Листинг 10. Фрагмент драйвера MSR-branch-trace.asm, взводящего BTF-флаг.

Загрузим драйвер в систему и запустив любой отладчик - например, OllyDbg, нажмем для трассировки одной инструкции. Опс! Отладчик заносит нас черт знает куда, останавливаясь на первом ветвлении (которым в большинстве случаев будет инструкция CALL, вызывающая некоторую API-функцию из стартового кода). Флаг BTF при этом сбрасывается и дальше трассировка проходит нормально (то есть, шаг за шагом), во всяком случае пока мы вновь не загрузим наш драйвер, устанавливающий BTF-флаг или не напишем plug-in для OllyDbg.

К статье (на диске к журналу) прилагается исходный код и откомпилированный модуль MSR-branch-trace.sys, устанавливающий BTF-флаг и тут же проверяющий его значение, выводя результат проверки в отладочный поток, содержимое которого можно просмотреть как с помощью Soft-Ice, так и утилитой DbgView от Марка Руссиновича.

Если взвести BTF-флаг не удается, это означает, что на данной платформе он не поддерживается (на P-III Coppermine поддерживается, на P-4 тоже, а вот под VM Ware 4.5 и 5.2 - увы и ах).

Проверить значение BTF-бита поможет другой драйвер (MSR-branch-trace-x.sys), также прилагаемый к статье (см. рис. 9).

Проверка состояния BTF-флага

Рисунок 9. Проверка состояния BTF-флага драйвером MSR-branch-trace-x.sys.

Заключение

На этом наше краткое знакомство с MSR-регистрами не заканчивается и заложенный в них потенциал только начинает раскрываться. Как поется в некогда популярной песне "то ли еще будет, ой-ой-ой". Мыщъх сейчас работает над созданием трассера реального времени, который на самом деле никаким трассером не является, а представляет собой своеобразный "дампер" истории выполнения команд, сохраняемой процессором как в MSR-регистрах, так и в специально отведенной для этих целей области памяти.

Мы не только получаем колоссальный выигрыш в производительности, но и полностью скрываем свое присутствие от защитных механизмов и все существующие на данный момент антиотладочные механизмы перестают работать. Но это будет не сейчас. Такая обширная тема требует отдельной статьи, в которой MSR-регистры - лишь малая часть огромного отладочного механизма, спрятанного в недрах процессора.

Короче, ждите прихода и он будет!!!

Учиться, учиться и учиться!

Рисунок 10. Учиться, учиться и учиться!

https://nebka.ru/?uid=1&post=20972