Работа с файлами        10.04.2024   

Advanced Serial Port Monitor - Перехватчик данных из нашей программы Advanced Serial Port Monitor. Как сделать serial port sniffer

Многим пользователям компьютерных сетей, в общем-то, незнакомо такое понятие как «сниффер». Что такое сниффер, попытаемся и определить, говоря простым языком неподготовленного пользователя. Но для начала все равно придется углубиться в предопределение самого термина.

Сниффер: что такое sniffer с точки зрения английского языка и компьютерной техники?

На самом деле определить сущность такого программного или программно-аппаратного комплекса вовсе несложно, если просто перевести термин.

Это название происходит от английского слова sniff (нюхать). Отсюда и значение русскоязычного термина «сниффер». Что такое sniffer в нашем понимании? «Нюхач», способный отслеживать использование сетевого трафика, а, проще говоря, шпион, который может вмешиваться в работу локальных или интернет-ориентированных сетей, извлекая нужную ему информацию на основе доступа через протоколы передачи данных TCP/IP.

Анализатор трафика: как это работает?

Оговоримся сразу: сниффер, будь он программным или условно-программным компонентом, способен анализировать и перехватывать трафик (передаваемые и принимаемые данные) исключительно через сетевые карты (Ethernet). Что получается?

Сетевой интерфейс не всегда оказывается защищенным файрволлом (опять же - программным или «железным»), а потому перехват передаваемых или принимаемых данных становится всего лишь делом техники.

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

Благие намерения и злоумышленные цели?

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

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

Виды снифферов

Но и по видам их можно разделить на несколько основных:

  • аппаратные;
  • программные;
  • аппаратно-программные;
  • онлайн-апплеты.

Поведенческое определение присутствия сниффера в сети

Обнаружить тот же сниффер WiFi можно по нагрузке на сеть. Если видно, что передача данных или соединение находится не на том уровне, какой заявляется провайдером (или позволяет роутер), следует обратить на это внимание сразу.

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

Онлайн-ресурсы

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

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

Как защититься от перехвата данных?

Будь то сниффер WiFi или любой другой анализатор, системы защиты от несанкционированного сканирования трафика все же есть. Условие одно: их нужно устанавливать только при условии полной уверенности в «прослушке».

Такие программные средства чаще всего называют «антиснифферами». Но если задуматься, это те же самые снифферы, анализирующие трафик, но блокирующие другие программы, пытающиеся получить

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

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

Вместо послесловия

Вот и все, что касается понятия «сниффер». Что такое sniffer, думается, уже многие сообразили. Напоследок вопрос остается в другом: насколько правильно такие вещи будет использовать рядовой пользователь? А то ведь среди юных юзеров иногда можно заметить склонность к компьютерному хулиганству. Они-то думают, что взломать чужой «комп» - это что-то вроде интересного соревнования или самоутверждения. К сожалению, никто из них даже не задумывается о последствиях, а ведь определить злоумышленника, использующего тот же онлайн-сниффер, очень просто по его внешнему IP, например, на сайте WhoIs. В качестве местоположения, правда, будет указана локация провайдера, тем не менее, страна и город определятся точно. Ну а потом дело за малым: либо звонок провайдеру с целью блокировки терминала, с которого производился несанкционированный доступ, либо подсудное дело. Выводы делайте сами.

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

SmartSniff позволяет перехватить сетевой трафик и отобразить его содержимое в ASCII. Программа захватывает пакеты проходящие через сетевой адаптер и выводит на экран содержание пакетов в текстовом виде (протоколы http, pop3, smtp, ftp) и в виде шестнадцатеричного дампа. Для захвата TCP/IP пакетов SmartSniff использует методики: необработанные сокеты - RAW Sockets, WinCap Capture Driver и Microsoft Network Monitor Driver. Программа поддерживает русский язык и проста в использовании.

Программа сниффер для захвата пакетов


SmartSniff отображает следующую информацию: название протокола, локальный и удаленный адрес, локальный и удаленный порт, локальный узел, название службы, объем данных, общий размер, время захвата и время последнего пакета, длительность, локальный и удаленный МАС адрес, страны и содержание пакета данных. Программа обладает гибкими настройками, в ней реализована функция фильтра захвата, распаковка ответов http, преобразования ip адреса, утилита сворачивается в системный трей. SmartSniff формирует отчет о потоках пакетовв виде HTML страницы. В программе возможно выполнить экспорт потоков TCP/IP.

Программа Wireshark станет отличным помощником для тех пользователей, кому требуется произвести детальный анализ сетевых пакетов, - трафика компьютерной сети. Сниффер легко взаимодействует с такими распространенными протоколами, как netbios, fddi, nntp, icq, x25, dns, irc, nfs, http, tcp, ipv6 и многими другими. Позволяет при анализе разделять сетевой пакет на соответствующие составляющие, согласно определенному протоколу, и выдавать на экран удобочитаемую информацию в числовом виде.
поддерживает огромное число разнообразных форматов передаваемой и получаемой информации, способен открывать файлы, которые находятся в пользовании других утилит. Принцип работы заключается в том, что сетевая карточка переходит в широковещательный режим и начинается перехват сетевых пакетов, которые находятся в зоне её видимости. Умеет работать как программа для перехвата пакетов wifi.

Как пользоваться wireshark

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

Запустив wireshark, Вы увидите на экране главное меню программы, которое расположено в верхней части окна. С помощью него и происходит управление утилитой. Если вам нужно загрузить файлы, которые хранят данные о пакетах, пойманных в предыдущих сессиях, а также сохранить данные о других пакетах, добытые в новом сеансе, то для этого вам потребуется вкладка "File".

Чтобы запустить функцию захвата сетевых пакетов, пользователь должен кликнуть на иконку "Capture", затем отыскать специальный раздел меню под названием "Interfaces", с помощью которого можно открыть отдельное окно "Wireshark Capture Interfaces", где должны будут показаны все доступные сетевые интерфейсы, через которые и будет произведен захват нужных пакетов данных. В том случае, когда программа (сниффер) способна обнаружить только один подходящий интерфейс, она выдаст на экран всю важную информацию о нем.

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

Имеется версия и для Linux систем.

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

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


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

Откуда появляются снифферы?

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

Как распознать сниффер?

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

Как отстранить сниффер

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

Как не стать жертвой сниффера
  • Зашифруйте всю отправляемую и принимаемую вами информацию
  • Сканируйте свою локальную сеть на наличие уязвимостей
  • Используйте только проверенные и защищенные сети Wi-Fi
Обезопасьтесь от снифферов

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

В этой статье мы рассмотрим создание простого сниффера под ОС Windows.
Кому интересно, добро пожаловать под кат.

Введение

Цель: написать программу, которая будет захватывать сетевой трафик (Ethernet, WiFi), передающийся по протоколу IP.
Средства: Visual Studio 2005 или выше.
Подход, который здесь описан, не принадлежит лично автору и успешно применяется во многих коммерческих, а также категорически бесплатных программах (привет, GPL).
Сей труд предназначен прежде всего для новичков в сетевом программровании, которые, однако, имеют хотя бы базовые знания в области сокетов вообще, и windows-сокетов в частности. Здесь я часто буду писать общеизвестные вещи, потому что предметная область специфическая, если что-то пропустить - в голове будет каша.

Надеюсь, Вам будет интересно.

Теория (читать не обязательно, но желательно)

В данный момент подавляющее большинство современных информационных сетей базируются на фундаменте стека протоколов TCP/IP. Стек протоколов TCP/IP (англ. Transmission Control Protocol/Internet Protocol) - собирательное название для сетевых протоколов разных уровней, используемых в сетях. В настоящей статье нас будет интересовать в основном протокол IP - маршрутизируемый сетевой протокол, используемый для негарантированной доставки данных, разделяемых на так называемые пакеты (более верный термин – дейтаграмма) от одного узла сети к другому.
Особый интерес для нас представляют IP-пакеты, предназначенные для передачи информации. Это достаточно высокий уровень сетевой OSI-модели данных, когда можно обстрагироваться от устройства и среды передачи данных, оперируя лишь логическим представлением.
Совершенно логичным является то обстоятельство, что рано или поздно должны были появится инструменты для перехвата, контроля, учета и анализа сетевого трафика. Такие средства обычно называется анализаторами трафика, пакетными анализаторыми или снифферами (от англ. to sniff - нюхать). Это - сетевой анализатор трафика, программа или программно-аппаратное устройство, предназначенное для перехвата и последующего анализа, либо только анализа сетевого трафика, предназначенного для других узлов.

Практика (разговор по существу)

На данный момент создано достаточно много программного обеспечения для прослушивания трафика. Наиболее известный из них: Wireshark . Естественно, пожинать его лавры цель не стоит - нас интересует задача перехвата трафика методом обычного «прослушивания» сетевого интерфейса. Важно понимать, что мы не собираемся заниматься взломом и перехватывать чужой трафик. Нужно всего лишь просматривать и анализировать трафик, который проходит через наш хост.

Для чего это может понадобиться:

  1. Смотреть текущий поток трафика через сетевое соеднинение (входящий/исходящий/всего).
  2. Перенаправлять трафик для последующего анализа на другой хост.
  3. Теоретически, можно попытаться применить его для взлома WiFi-сети (мы ведь не собираемся этим заниматься?).
В отличие от Wireshark, который базируется на библиотеке libpcap/WinPcap, наш анализатор не будет использовать этот драйвер. Чего уж там, у нас вообще не будет драйвера, и свой NDIS(о ужас!) мы писать не собираемся. Про это можно прочитать в этом топике . Он будет просто пассивным наблюдателем, использующим только библиотеку WinSock. Использование драйвера в данном случае избыточно.

Как так? Очень просто.
Ключевым шагом в превращении простого сетевого приложения в сетевой анализатор является переключение сетевого интерфейса в режим прослушивания (promiscuous mode), что и позволит ему получать пакеты, адресованные другим интерфейсам в сети. Этот режим заставляют сетевую плату принимать все кадры, вне зависимости от того, кому они адресованы в сети.

Начиная с Windows 2000 (NT 5.0) создать программу для прослушивания сегмента сети стало очень просто, т.к. ее сетевой драйвер позволяет перевести сокет в режим приёма всех пакетов.

Включение неразборчивого режима
long flag = 1; SOCKET socket; #define SIO_RCVALL 0x98000001 ioctlsocket(socket, SIO_RCVALL, &RS_Flag);
Наша программа оперирует IP-пакетами, и использует библиотеку Windows Sockets версии 2.2 и «сырые» сокеты (raw sockets). Для того чтобы получить прямой доступ к IP-пакету, сокет нужно создавать следующим образом:
Создание сырого сокета
s = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
Здесь вместо константы SOCK_STREAM (протокол TCP) или SOCK_DGRAM (протокол UDP), мы используем значение SOCK_RAW . Вообще говоря, работа с raw sockets интересна не только с точки зрения захвата трафика. Фактически, мы получаем полный контроль за формированием пакета. Вернее, формируем его вручную, что позволяет, например, послать специфический ICMP-пакет…

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

Описание структуры IP-пакета
typedef struct _IPHeader { unsigned char ver_len; // версия и длина заголовка unsigned char tos; // тип сервиса unsigned short length; // длина всего пакета unsigned short id; // Id unsigned short flgs_offset; // флаги и смещение unsigned char ttl; // время жизни unsigned char protocol; // протокол unsigned short xsum; // контрольная сумма unsigned long src; // IP-адрес отправителя unsigned long dest; // IP-адрес назначения unsigned short *params; // параметры (до 320 бит) unsigned char *data; // данные (до 65535 октетов) }IPHeader;
Главная функция алгоритма прослушивания будет выглядеть следующим образом:
Функция захвата одного пакета
IPHeader* RS_Sniff() { IPHeader *hdr; int count = 0; count = recv(RS_SSocket, (char*)&RS_Buffer, sizeof(RS_Buffer), 0); if (count >= sizeof(IPHeader)) { hdr = (LPIPHeader)malloc(MAX_PACKET_SIZE); memcpy(hdr, RS_Buffer, MAX_PACKET_SIZE); RS_UpdateNetStat(count, hdr); return hdr; } else return 0; }
Здесь все просто: получаем порцию данных с помощью стандартной функции socket-функции recv , а затем копируем их в структуру типа IPHeader .
И, наконец, запускаем бесконечный цикл захвата пакетов:
Захватым все пакеты, которые попадут на наш сетевой интерфейс
while (true) { IPHeader* hdr = RS_Sniff(); // обработка IP-пакета if (hdr) { // печатаем заголовок в консоли } }
Немного оффтопика
Здесь и далее у некоторых важных функций и переменных автор сделал префкис RS_ (от Raw Sockets). Проект делал 3-4 года назад, и была шальная мысль написать полноценную библиотеку для работы с сырыми сокетами. Как это часто бывает, после получения сколь-нибудь значимых(для автора) результатов, энтузиазм угас, и дальше учебного примера дело не полшло.

В принципе, можно пойти дальше, и описать заголовки всех последующих протоколов, находящихся выше. Для этого необходимо анализировать поле protocol в структуре IPHeader . Посмотрите на пример кода (да, там должен быть switch, чёрт возьми!), где происходит раскрашивание заголовка в зависимости от того, какой протокол имеет пакет, инкапсулированный в IP:

/* * Выделение пакета цветом */ void ColorPacket(const IPHeader *h, const u_long haddr, const u_long whost = 0) { if (h->xsum) SetConsoleTextColor(0x17); // если пакет не пустой else SetConsoleTextColor(0x07); // пустой пакет if (haddr == h->src) { SetConsoleTextColor(BACKGROUND_BLUE | /*BACKGROUND_INTENSITY |*/ FOREGROUND_RED | FOREGROUND_INTENSITY); // "родной" пакет на отдачу } else if (haddr == h->dest) { SetConsoleTextColor(BACKGROUND_BLUE | /*BACKGROUND_INTENSITY |*/ FOREGROUND_GREEN | FOREGROUND_INTENSITY); // "родной" пакет на прием } if (h->protocol == PROT_ICMP || h->protocol == PROT_IGMP) { SetConsoleTextColor(0x70); // ICMP-пакет } else if(h->protocol == PROT_IP || h->protocol == 115) { SetConsoleTextColor(0x4F); // IP-in-IP-пакет, L2TP } else if(h->protocol == 53 || h->protocol == 56) { SetConsoleTextColor(0x4C); // TLS, IP with Encryption } if(whost == h->dest || whost == h->src) { SetConsoleTextColor(0x0A); } }

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

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

Преобразование IP-заголовка в строку
inline char* iph2str(IPHeader *iph) { const int BUF_SIZE = 1024; char *r = (char*)malloc(BUF_SIZE); memset((void*)r, 0, BUF_SIZE); sprintf(r, "ver=%d hlen=%d tos=%d len=%d id=%d flags=0x%X offset=%d ttl=%dms prot=%d crc=0x%X src=%s dest=%s", BYTE_H(iph->ver_len), BYTE_L(iph->ver_len)*4, iph->tos, ntohs(iph->length), ntohs(iph->id), IP_FLAGS(ntohs(iph->flgs_offset)), IP_OFFSET(ntohs(iph->flgs_offset)), iph->ttl, iph->protocol, ntohs(iph->xsum), nethost2str(iph->src), nethost2str(iph->dest)); return r; }
На основании приведенных выше базовых сведений, получается вот такая небольшая программа (жуткое название ss, сокр. от англ. simple sniffer), реализующая локальное прослушивание IP-трафика. Интерфейс ее приведен ниже на рисунке.

Исходный и бинарный код предоставляю как есть, таким как он был несколько лет назад. Сейчас мне на него страшно смотреть, и все же, он вполне читабельный (конечно же, нельзя быть таким самоуверенным). Для компиляции будет достаточно даже Visual Studio Express 2005.

Что у нас получилось в итоге:

  • Сниффер работает в режиме пользователя, однако требует привилегии администратора.
  • Пакеты не фильтруются, отображаясь как есть (можно добавить настраиваемые фильтры - предлагаю подробно рассмотреть эту тему в следующей статье, если интересно).
  • WiFi-трафик тоже захватывается(все зависит от конкретной модели чипа, у Вас может и не работать, как у меня несколько лет назад), хотя есть AirPcap, которая чудесно это умеет делать, но стоит денег.
  • Весь поток дейтаграмм логируется в файл (см. архив, приложенный в конце статьи).
  • Программа работает в качестве сервера на порту 2000. Можно подключиться с помощью утилиты telnet к хосту и произвести мониторинг потоков трафика. Количество подключений ограничено двадцатью (код не мой, нашел на просторах сети и применял для экспериментов; удалять не стал - жалко)
Спасибо за внимание, проздравляю хабровчан и хабровчанок и всех-всех-всех с наступающим Рождеством!