Содержание статьи
- Q: Я устроился на работу в компанию, основной проект которой разрабатывается на PHP. Одна из поставленных задач — оптимизировать производительность приложения. Система за несколько лет сильно разрослась и теперь заметно подтормаживает. Понятно, что многие участки кода легко можно оптимизировать, возможно даже переписать заново. Но это непростая и ресурсоемкая затея. С чего бы начали в такой ситуации вы?
- Q: В одной из колонок редактора ты рассказывал, как с помощью Amazon Web Services легко можно организовать кластер из нескольких серверов, который бы включался по требованию и выполнял ресурсоемкие задачи вроде брутфорса. Для меня сейчас интересен вопрос автоматизации. Понятно, что для своих облачных сервисов Amazon предоставляет документированный API, но как начать использовать технологии максимально быстро, не вникая в систему сложных вызовов?
- Q: Можно ли извлечь журнал событий винды (Windows Event Log) из имеющегося в наличие дампа памяти?
- Q: На новый ноутбук в качестве основной системы был выбран Linux. Установились драйвера на все устройства, кроме беспроводной карты. Но что ты думаешь: нигде в Сети дров под Linux я не нашел. Может быть, есть какие-то универсальные варианты?
- Q: Недавно увидел, как пользователи MacBook’ов ловко управляют приложениями (вращают, перемещают, зумят и так далее) при помощи тачпада. Можно ли сделать такое на Linux?
- Q: Как проще всего сделать автоматический вход в систему (Windows 7)?
- Q: По работе приходится дебажить глючный драйвер, но есть проблема: WinDBG работает отвратительно медленно! Как можно ускорить работу отладчика?
- Q: Как отследить использования ARP Poison в локальной сети и противодействовать ему?
- Q: Подскажи фаззер для тестирования сетевого приложения, который бы генерировал намеренно испорченные пакеты. Формат сообщений для обмена данными я более-менее представляю.
- Q: Попалась мне тут в руки редкая рыба — жесткий диск ATA, защищенный паролем! Честно говоря, вижу такой впервые и как обойти защиту не представляю. Как бы ее снять?
Есть вопросы — при сылай на faq@real.xakep.ru
Q: Я устроился на работу в компанию, основной проект которой разрабатывается на PHP. Одна из поставленных задач — оптимизировать производительность приложения. Система за несколько лет сильно разрослась и теперь заметно подтормаживает. Понятно, что многие участки кода легко можно оптимизировать, возможно даже переписать заново. Но это непростая и ресурсоемкая затея. С чего бы начали в такой ситуации вы?
A: Без серьезного рефакторинга кода здесь, конечно, не обойтись. Стандартная практика, которой пользуются разработчики больших приложений, заключается в переносе ресурсоемких участков кода на С++. Функционал оформляется в виде модулей, которые далее подключаются к PHP. Но есть и альтернативные пути. Например, в недрах Facebook’а был разработан замечательный инструмент HipHop for PHP (github.com/facebook/hiphop-php), который трансформирует исходник на PHP в хорошо оптимизированный код на C++ и компилирует его с помощью g++ в бинарные файлы. Таким образом удается программировать на чистом PHP, но при этом HipHop будет выполнять код значительно эффективнее. Прирост достигается не только за счет компиляции кода (сам PHP — интерпретируемый язык), но и благодаря ряду серьезных оптимизаций, в том числе отказа от «дорогих» операций вроде eval(). Facebook заявляет об уменьшении нагрузки на CPU до 50% (в сравнении с Apache и PHP при обработке одного и того же объема трафика). Разработка появилась в публичном доступе в начале 2010 года и сейчас стремительно набирает популярность.
Это легко понять: если компании приходится переносить часть кода на C/C++, то это непременно влечет за собой необходимость в соответствующих программистах. При этом количество людей, которые могут работать со всем кодом проекта, уменьшается. Попробовать в действии HipHop проще простого, исходники и инструкции по сборке открыто доступны в git:
git clone git://github.com/facebook/hiphop-php.git
Для использования тебе понадобится PHP 5.2 (в скором времени будет поддержка 5.3) и любая система на базе Linux.
Q: В одной из колонок редактора ты рассказывал, как с помощью Amazon Web Services легко можно организовать кластер из нескольких серверов, который бы включался по требованию и выполнял ресурсоемкие задачи вроде брутфорса. Для меня сейчас интересен вопрос автоматизации. Понятно, что для своих облачных сервисов Amazon предоставляет документированный API, но как начать использовать технологии максимально быстро, не вникая в систему сложных вызовов?
A:На самом деле, ничего сложного в API Amazon’овских сервисов нет. Разработчикам доступны не только подробные описания, но еще и гора примеров. Для технологии S3, позволяющей хостить любые объемы данных при любой нагрузке, есть удобнейший REST API. Для сервиса EC2, с помощью которого можно в считанные секунды поднять сколько угодно серверов, предоставляется довольно простой Query API для EC2. Если хочешь использовать все, даже самые тонкие настройки, то работать лучше всего именно с оригинальным API. Если же критично время разработки, то задачу можно упростить с помощью привязок для разных языков программирования. Я говорю о модулях, скрывающих большую часть общения с API и предоставляющих понятные и простые функции для работы с сервисами Amazon.
Я использовал замечательный пакет Boto (code.google.com/p/boto). Текущая версия проекта — 2.0beta4, поддерживающая все технологии AWS (Amazon Web Services), в том числе недавно появившийся облачный DNS-сервис Route53 и технологию для организации массовых рассылок Amazon Simple Email Service. Написать скрипт, который управлял бы работой облачных ресурсов, можно уже через десять минут после знакомства с этим модулем, настолько все прозрачно. На сайте boto.cloudhackers.com представлена подробная документация и примеры.
Q: Можно ли извлечь журнал событий винды (Windows Event Log) из имеющегося в наличие дампа памяти?
A:Если ты читал статью «Анализатор памяти офлайн» из прошлого номера, то должен быть знаком с программами Memoryze (mandiant.com/products/free_software/memoryze) и Volatility (volatilesystems.com/default/volatility). Любая из них справится с поставленной задачей. В случае с Memoryze алгоритм следующий:
- Запускаем Auditviewer для выполнения анализа дампа памяти. По сути, нам необходимо получить информацию о запущенных процессах. Поэтому в настройках анализа достаточно выбрать только «Process Enumeration» и «Memory sections».
- Как только появятся результаты, выбираем в списке процессов services.exe, а в правой панели — вкладку «Memory Sections». Ниже отобразятся записи, ссылающиеся на логфайлы.
- Теперь вызываем контекстное меню для процесса services.exe в левой панели и выбираем в нем пункт «Acquire Process». В папке, куда экспортируются результаты, появятся файлы типа «__SystemMemory%5c0x### #####-########.VAD». Это и есть логи Windows, в которых зафиксированы различные системные события.
- Удобно проанализировать журнал событий с другого компьютера позволяет утилита Event Log Explorer (eventlogxp.com) или бесплатный Perl-скрипт evtViewer (sourceforge.net/projects/evtviewer). Расширение файлов с логами необходимо предварительно поменять на .evt.
Q: На новый ноутбук в качестве основной системы был выбран Linux. Установились драйвера на все устройства, кроме беспроводной карты. Но что ты думаешь: нигде в Сети дров под Linux я не нашел. Может быть, есть какие-то универсальные варианты?
A:Несмотря на то, что современные дистрибутивы тукса стараются поддерживать все актуальное железо, по-прежнему встречаются ситуации, когда после установки не хватает драйвера для того или иного устройства. В твоей ситуации можно попробовать хитрый трик: пустить в ход драйверы для… Windows! Да-да, именно виндовые дрова, как бы странно это ни звучало. Как это возможно?
Благодаря утилите Ndiswrapper (ndiswrapper.sourceforge.net). По сути, это реализация API-вызовов ядра Windows и (как понятно из названия) API спецификации NDIS (Network Driver Interface Specification) для ядра Linux. Таким образом, удается виндовый драйвер заставить выполняться под Linux’ом нативно, как если бы он выполнялся под виндой, причем без какой-либо бинарной эмуляции. С помощью Ndiswrapper заработают большинство встроенных, PCMCIA и USB беспроводных адаптеров и многих других устройств. Чтобы не гадать и делать все наверняка, рекомендую набрать в системе команду lspci –nn (для PCI-устройства) или lsusb (для USB-девайса), чтобы получить идентификатор устройства и поискать его в списке поддерживаемых адаптеров, доступном на официальном сайте.
Скорее всего, он в этом списке окажется. Как показывает опыт, лучше всего использовать драйвера для 32-битной Windows XP. Они распространяются в разных контейнерах, но будьто .zip, .cab или .exe, необходимо архиватором извлечь непосредственно файлы драйвера (все файлы с расширениями *.inf, *.sys, *.bin).
После этого можно приступать к установке виндового драйвера под туксом следующей командой:
ndiswrapper -i driver.inf
Далее проверяем, подошел ли драйвер:
ndiswrapper –l
Если ответ будет «driver present, hardware present» — значит, все окей. Загружаем модуль Ndiswrapper:
modprobe Ndiswrapper
Если все заработает, то в системе появится новое беспроводное устройство wlan0, которое ты можешь отконфигурировать с помощью утилит iwconfig/wpa_supplicant и начать работать с ним. Такой вот приятный фокус.
Q: Недавно увидел, как пользователи MacBook’ов ловко управляют приложениями (вращают, перемещают, зумят и так далее) при помощи тачпада. Можно ли сделать такое на Linux?
A:Сделать такое возможно, так как ядро Linux начиная с версии 2.6.30 поддерживает multitouch. Все, что потребуется, — это подходящее ПО, которое позволяло бы использовать наконец возможности тачпада на всю катушку. Тут нельзя не попробовать утилиту TouchEgg (code.google.com/p/touchegg), с помощью которой легко привязать к поддерживаемым жестам на тачпаде различные действия. Установка программы достаточно проста, надо лишь убедиться в наличии необходимых библиотек uTouch и evdev. Утилита не имеет какого-либо графического интерфейса, а все настройки выполняются в конфигурационном файле /usr/share/touchegg.conf.
Каждая запись в конфиге состоит из трех частей: название жеста, действие, параметры. Допустим, ты хочешь, чтобы при проведении четырьмя пальцами снизу вверх у тебя менялся рабочий стол. Для этого нужно добавить в touchegg.conf следующую запись:
#FOUR FINGERS DRAG
[FOUR_FINGERS_DRAG_UP]
action=CHANGE_DESKTOP
settings=DIRECTION=LEFT
Для других жестов и действий все выполняется аналогично. Вся сопутствующая информация хорошо описана в мануале.
Q: Как проще всего сделать автоматический вход в систему (Windows 7)?
A:Вообще говоря, возможность для настройки автоматического входа в систему есть в винде по умолчанию. Но стандартные средства, как известно, редко сделаны для людей, поэтому я чаще всего использую тулзу Autologon (technet.microsoft.com/en-us/sysinternals/bb963905) от Марка Руссинови ча. Это GUI-приложение попросит указать имя пользователя, пароль и домен, которые и будут использоваться для автоматического логона. Тулзу при необходимости можно использовать и из консоли, передав нужные значения в качестве ключей запуска: autologon.exe user domain password.
Q: По работе приходится дебажить глючный драйвер, но есть проблема: WinDBG работает отвратительно медленно! Как можно ускорить работу отладчика?
A:Причина медлительности отладки заключается в виртуальном COM-порте, который используется для обмена данными с хостом. Скорость такого порта ограничена 115200 битами в секунду (то есть всего около 10 Кб/с), и хоть ты тресни, быстрее через него передаваться ничего не будет. Как быть? Логично предположить, что можно заменить низкоскоростной виртуальный COM-порт более широким каналом. Этот трик лежит в основе проекта VirtualKd (virtualkd.sysprogs.org), который ускоряет отладку ядра Windows до сорока пяти раз за счет использования виртуальных машин на базе VMware и VirtualBox.
В случае со связкой WinDBG/KD для общения с отлаживаемой ОС вместо COM-порта используется именованный канал (named pipe): это повышает скорость передачи до 450 Кб/с в случае с VirtualBox и до 150 Кб/с на VMWare. В результате мы можем дебажить драйвера Windows на виртуальных машинах, используя стандартный набор инструментов (WinDBG/ KD), но со значительно более низким временем отклика. Помимо этого программа использует преимущества виртуальных машин, позволяя мгновенно останавливать работу гостевых ОС и автоматически восстанавливать snapshot, что сводит к минимуму количество телодвижений. Среди других крутых фишек: автоматическая установка виртуальных машин. Все операции выполняются через понятный GUI-интерфейс.
На официальном сайте есть подробный мануал по настройке. А в случае, если хочешь подружить VirtualKd с плагином «Windbg debugger» — в IDA Pro рекомендую следующую инструкцию: hexblog.com/?p=123.
Q: Как отследить использования ARP Poison в локальной сети и противодействовать ему?
A:Давно известный прием ARP Poison попрежнему позволяет успешно перехватывать трафик между хостами в локальной сети (в том числе беспроводной). Если хочешь подтянуть матчасть, рекомендую нашу старую статью об ARP-spoofing’е (xakep.ru/magazine/xa/068/060/2.asp). Теперь по сути вопроса. Начнем со способов обнаружения атаки. Если не брать в расчет серьезные IDS вроде Snort’а, то проще всего заюзать утилиту вроде DecaffeinatID (irongeek.com/downloads/decaffeinatid0.08.zip), которая тихо сидит в трее и предупреждает об активности с ARP-таблицей. Каждый раз, заметив, что MAC-адрес шлюза изменился, тулза будет выдавать сообщение. Помимо этого можно настроить уведомления о некоторых событиях из журнала Windows и логов файервола. Чтобы противодействовать атаке, рекомендую прогу ARPFreeze (irongeek.com/downloads/arpfreezeng.zip), позволяющую через удобный GUI-интерфейс настроить статические записи в ARP-таблице, которые хакер уже никак не сможет заменить с помощью Cain & Abel, Ettercap, Arpspoof или любых других утилит, и выполнить MITM-атаку. То же самое можно было сделать и стандартными инструментами винды (с помощью команд arp и netsh), но ARPFreeze сводит процесс фиксирования записей в ARP-таблице к двум кликам мыши.
Q: Подскажи фаззер для тестирования сетевого приложения, который бы генерировал намеренно испорченные пакеты. Формат сообщений для обмена данными я более-менее представляю.
A: Итак, речь идет об умном фаззинге, подразумевающем, что ты знаешь формат данных и, соответственно, можешь подогнать процесс мутации передаваемых данных под своей конкретный случай. Есть два пути. Первый — использовать какой-нибудь мощный фреймворк для фаззинга, например небезызвестный Peach (peachfuzzer.com). Имей в виду, что если дела с ним раньше не имел, то придется порядочно повозиться с его настройкой: параметры сложного фаззинга и описание структуры протокола выполняются через специальные XML-файлы. Тебе придется описать формат обмена сообщениями сетевого приложения, а также правила мутации отдельных элементов сетевого пакета. Впрочем, если задача несложная, то есть шанс, что удастся обойтись входящей в комплект с фреймворком GUI-утилитой, которая изначально заточена под простой фаззинг сетевых приложений. Второй вариант — написать фаззер самому. Звучит страшно, но на практике такой подход может оказаться намного проще, чем ковыряние с тем же самым Peach’ем.
Если взять простой язык программирования (скажем, Python) и готовую библиотеку для конструирования пакетов (Scapy, secdev.org/projects/scapy), то написать простейший фаззер можно буквально за несколько минут.
Не веришь? Тогда прочитай, на что способен этот модуль, и как его использовать, в нашей статье «Работа со скальпелем» (xakep.ru/magazine/xa/126/028/1.asp).
Q: Попалась мне тут в руки редкая рыба — жесткий диск ATA, защищенный паролем! Честно говоря, вижу такой впервые и как обойти защиту не представляю. Как бы ее снять?
A:Я помню, раньше были какие-то сложные методики для восстановления этого пароля, но сейчас все стало намного проще. Заветный ключ хранится в специальной защищенной зоне жесткого диска вместе с его прошивкой. Проблема в том, что ты не можешь обратиться к ней напрямую. Методика обхода этого ограничения зависит от производителя HDD. В большинстве случаев может выручить программа MHDD (ihdd.ru/mhdd), загруженная с флешки. С ее помощью удается обойти ограничения BIOS’а, который не позволяет считывать защищенные данные с жесткого диска, и обратиться напрямую к SATA- или PATA-контроллеру материнской платы. Получив дамп защищенной области, можно открыть его в любом HEX-редакторе и найти в открытом виде пароль пользователя, а также так называемый мастер-пароль. Подробную инструкцию (в переводе с испанского) ты можешь прочитать по следующему линку: bit.ly/pass_hdd_retrive.