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

NebKa

История

Если у лошади на памятнике подняты две передних ноги, то человек умер в бою. Если одна – человек умер от ран, полученных в бою. Если ноги не подняты, то человек умер от естественных причин.


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

ПАСХАЛЬНАЯ ВЫШИВКА



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

Природа

В одном кубическом футе морской воды может содержаться до 6 миллионов диатомовых водорослей.


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

Русский язык - интересное

Вы знаете, что в русском языке слова «бык» и «пчела» — однокоренные? И другие интересные факты о русском языке.   Большинство слов с буквой «Ф» в русском языке — заимствованные. Пушкин гордился тем, что в «Сказке о царе Салтане» было всего лишь одно слово с буквой «ф» — флот.   В русском языке


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

Ежики из соленого теста

Используя соленое тесто можно смастерить огромное количество разнообразных поделок!Сегодня попробуем сделать ежиков,детки будут в восторге!   Для основы используем шарик из фольги,на который наматываем тесто,дальше ножницами делаем надрезы в шахматном порядке     Заготовки отправляем в духовку,а после остывания раскрашиваем



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

Сумка клатч своими руками

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



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

История

Одним из наказаний преступников в Древней Индии было уродование ушей.


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

Анекдот

Острый момент в индийском кино: - Я тебя убью, но сначала я и мои сорок слонов станцуем.


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

Космос

Если собрать в один сферический монолит все вещество колец Сатурна, диаметр этого монолита не превысит 100 километров.


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

Способ окраски трубочек из газет

Слова автора Ilatan: Все, кто плетут изделия из бумаги, уже давным-давно знают как это делается...., но мне сегодня захотелось показать вам как это делаю я, может, кому и пригодится... Так вот, я нашла бутылку (именно бутылку, т.к. емкость



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

ЛЕТНИЙ САРАФАН ВЯЗАНЫЙ КРЮЧКОМ

[AD]



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

Легкий вариант быстрого создания петель

 Как быстро сделать навесные петли для пуговиц. Автор делает заготовку с петлями на листочке в клетку:— Выкладывает петли по клеткам и прокладывает строчку;— Излишки срезает;— Перегибает бумагу, смотрит, что получится в готовом виде;— Затем эта



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

Салфетка с лилиями крючком

Салфетка с мотивом из объемных цветов связана крючком. Схема вязания салфетки крючком   Источник: http://clubmasteric.ru/  



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

Животные

Стрекозы могут летать со скоростью до 30 миль в час.


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

Анекдот

Морская примета: Если чайка летит жопой вперед, значит ветер очень сильный.


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

Точечная роспись и трафареты

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



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

Браслет из деревянных бусинок своими руками

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



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

Ткань + вязание

         



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

Воротничок для девочки с вышивкой божьих коровок



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

Космос

12 млрд. лет - таков возраст старейших галактик, сфотографированных космическим телескопом "Хаббл".


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

АЖУРНЫЕ косички от Леры Вероновой

АЖУРНЫЕ косички от  Леры Вероновой Источник: http://pinme.ua



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

Столик под ноутбук

1. Вот такой столик под ноутбук из газетных трубочек я соорудила, чтобы ставить его на ноги, когда сижу перед телевизором, или в постель, чтобы смотреть фильмы онлайн. 2. Уже в эксплуатации. 3. И с другой стороны. 4. А начиналось всё так. Взяла гофрированный



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

Наборный край с бахромой

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



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

Анекдот

Чисто прибранная квартира, вкусный ужин - два признака неисправного компьютера…


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

Вязание. НОСОЧКИ С ВЫВЯЗАННЫМИ ПАЛЬЦАМИ. Описание+схема

kolornitki.ru***kolornitki.ru



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

Пальто с отделкой на спине



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

Жакет свободного кроя. Как вязать

  В этом жакете вы всегда будете чувствовать себя свободно и комфортно. Его свободный крой не будет сковывать движений.   Размеры: 36-40 (42-46)Вам потребуется: пряжа Merino Air (90% натуральной шерсти, 10% полиамида; 130 м/50 г) - 450 (500) г серой;



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

Путин изменит выборы в США

Избиратель в США, традиционно довольно прохладно относящийся к событиям, происходящим за пределами Штатов, и мало интересующийся чем-то выходящим за границы его жизненного пространства, вот уже несколько месяцев к ряду вынужден слушать споры Дональда Трампа и



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

Декор для подушек.Мастер-классы.

.  Декор для подушки в виде цветка пиона. Вам потребуется: ткань для подушки, ткань для цветка, ножницы, нитки, швейная машина.   Декоративные подушки: яблоки и бабочки Декорируем праздник с помощью подушек….   http://magicaldecor.ru/dekoriruem-prazdnik-s-pomoshhyu-podushek/ Лохматая подушка «шегги»  Материалы для работы: - ткань для создания лохматости (90х150



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

Наука

Витамин K необходим для свертывания крови.


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

Беспрерывное вязание с двумя разными нитями. МК

Color stranding Цвет мель   При вязание с двух или более цветов, в котором расстояние между изменениями цвета короткое, позволяя неиспользованный пряжи проводиться вместе по той стороне, называется цвет мель. Цвет мель создает ткань, которая - в сущности



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

Фейские садики и домики для фей.

Если у вас живет фея – любая зелень у вас растет легко и густо. У меня феечке негде жить (пока). Надо исправлять положение.)))Еще несколько веков назад в английских садах хозяйка устраивала миниатюрный садик для феи.



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

Декор стен созвездиями (Diy)

Легкий способ сделать «звездное небо с созвездиями». На всю комнату сил не хватит, на маленькую ванную — вполне %).Или внутренность шкафа так украсить!Штампики можно купить, можно сделать из картона.Красьте их кисточкой и промокайте краску на



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

Природа

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


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

Мягкая игрушка – гусеница

Автор: Антонина  Посмотрите, какая забавная гусеница! Тело ее аналогично раскраске, как на детской игрушке йо-йо, и смешно извивается. Игрушка полна обаяния и очарования, и, несомненно, понравится ребятишкам. Сделать такую гусеницу очень просто. Можно сказать, что работа однообразная. Просто



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

Квиллинг Наташи Молотковой.

Для меня авторитетом в квиллинге  всегда была Юлия Бродская. Но недавно открыла для себя еще одно имя, это Наташа Молоткова, недавняя выпускница  Университета Вустер, наша соотечественница  из Новосибирска, ныне проживающая в Англии. квиллинг Наташи Молотковой Она изучала графический



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

Еще одна булочка

Еще одна булочка     Отделяем верхнюю часть волос, завязываем в хвост.Получившийся хвост начесываем.Оставшиеся волосы тоже собираем в хвост, и заворачиваем в верхний.Все аккуратно закрепляем невидимками и лаком. Источник: http://feedpro.ru



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

Как своими руками сделать африканские бусы

Лето – это замечательное время. Именно в это время нам хочется соприкоснуться с чем-то восточным или африканским. Но если у Вас так и не удалось посетить африканские или азиатские страны, не отчаивайтесь несколько аксессуаров к одежде помогут Вам стать



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

Как сплести шляпку из газетных трубочек. Мастер-класс

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



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

Космос

Цефеиды - это особый тип так называемых регулярных переменных звезд. В поверхностных слоях цефеид нарушено равновесие сил тяготения и сил газового давления. Вследствие этого их радиусы периодически изменяются на 10-15 процентов, а температура - более


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

Лавровый венок своими руками

Автор: Татьяна Карташова  Еще с древних античных времен лавровый венок считается символом славы.Им торжественно увенчивали головы победителей на разных состязаниях.Так почему же сейчас не вернуться к этой традиции и не преподнести кому-нибудь такой необычный сувенир в виде



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

Свитер в технике энтерлак. Как вязать

Миленький свитерок, связанный в технике энтерлак, станет зимой вашим незаменимым элементом гардероба.  Размер: 38-42Вам потребуется: 400 г жёлтой и 200 г зелёной пряжи секционного крашения Schachenmayr MERINO EXTRAFINE COLOR 120 (100% шерсти, 120 м/50 г); спицы № 6;



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

Мини сад в горшке своими руками+ мастер-класс

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



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

Керамическая флористика по созданию Новогоднего венка.

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



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

Летняя сумка из ленточной вискозной пряжи

Летняя сумочка связана из ленточной вискозной пряжи, она полностью состоит из прямоугольников, связанных крючком столбиками без накида Центральный квадрат из пряжи двух цветов. Работа начинается с цепочки из 8-ми петель, схему смотрите на фотографии. Квадрат состоит



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

Светильники-подвесы из салатниц Икея. Проект Made of Metall

Автор мастер-класса: print_design Дизайнерские светильники-подвесы из кухонной посуды. 01.Для дизайнерского ремонта интерьера понадобились светильники-подвесы.Такие, чтобы были невычурные, но и не простецкие, которые уже оскомину набили.Такие, чтобы и чрезмерно дорогими не были (об экономии бюджета думают все заказчики). Т.е. вариант выписывания светильников из



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

Анекдот

Ржевский танцует на балу с Ростовой, гладит ее по шее и говорит:- О Наталья, какая у вас шея.Она:-А я вся такая.Он:- Так мыться надо!!!


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

Мой совет:

Сковороды можно чистить легко так: слегка подогреть их и протереть солью, а затем пергаментом (в крайнем случае - простой бумагой).


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

Мой совет:

Протирать зеркала можно ватой, смоченной в одеколоне или спирте (водке). Можно использовать холодную воду с примесью бельевой синьки - это придаст зеркалу приятный блеск. Для той же цели подойдет разбавленный настой чая.


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

Анекдот

Пpогpаммист — человек, котоpый pешает пpоблемy, о котоpой вы даже не знали, таким способом, котоpый вы не понимаете.


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

Уреаплазмоз: найти и обезвредить!

Уреаплазмоз – инфекционное заболевание, возбудитель которого (микроорганизмом Ureaplasma Urealyticum) передается половым путем и признан причиной развития негонококкового уретирита у мужчин. Очень часто уреаплазма диагностируется параллельно и с микроплазмозом, так как оба возбудителя схожи своим строением



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

Детская сумочка-трансформер!


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

... игры взрослых детей...

   


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

ЛЕТНЕЕ ПЛАТЬЕ СПИЦАМИ



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

ВЯЗАНАЯ СПИЦАМИ ТУНИКА С КОРОТКИМ РУКАВОМ



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

Человек

Площадь поверхности человеческих легких примерно равна площади теннисного корта.


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

Мой совет:

Пятна от рыбьего жира можно удалить слабым раствором уксуса.


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

Мой совет:

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


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

Ракета «Союз» впервые взлетела из Южной Америки

21 октября в 14:30 по московскому времени с космодрома Куру во Французской Гвиане стартовала ракета-носитель «Союз СТ-Б» с двумя европейскими спутниками на борту.Первый старт «Союза» с другого континента — результат сотрудничества российского и европейского космических



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

Мой совет:

Запах лука можно удалить, натерев кухонные доски, столовые приборы сухой солью.


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

Юбка из рубашки (DIY)

Юбка для езды на велосипеде из рубашки и юбки с пайетками из кожи. Отрезаем нижнюю часть рубашки. Пришиваем полосу от юбки с пайетками.Источник   http://secondstreet.ru/blog/rubashki/yubka-iz-rubashki-diy.html



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

Мой совет:

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


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

Человек

Как известно, люди тоже звери. Однако, мы единственные из них, кто можем совокупляться лицом к лицу.


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

Природа

Земная кора имеет толщину 35 км. По соотношению с размером Земли это равноценно толщине скорлупы яйца.


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

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