Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
20.04.2024
Размер:
8.27 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

модель, хранящуюся в переменной model. В начале этого метода путем перемножения матрицы сдвига и матрицы вращения создается целевая матрица перемещения объекта. После этого в цикле foreach перебираем все меши объекта, чтобы затем во вложенном цикле через умножение матрицы текущего меша на полученную на предыдущем шаге матрицу получить мировую матрицу. Все эти трансформации нужны для корректного отображения объекта в пространстве. Объект класса BasicEffect кроме собственно пространственной матрицы содержит многие другие свойства: текстурные координаты, альфа-составляющую материала, параметры для освещения, видовую матрицу, матрицу проекции и многое другое. Вообще, этот объект предоставляет возможности такого механизма, который раньше в DirectX назывался фиксированным конвейером визуализации. Но, начиная с DX 10, его напрочь удалили, оставив только программируемый конвейер. Для того чтобы с его помощью визуализировать хоть что-то, надо писать свои шейдеры. Конечно, это позволяет добиться наилучших результатов, однако иногда вполне подходят стандартные механизмы. В XNA тоже имеется программируемый конвейер, но мы его рассматривать сегодня не будем. Последняя операция метода DrawObj (также находящаяся в цикле foreach) выводит меш в задний буфер. Единственное действие, выполняемое методом UpdateState, — это обновление позиции объекта в пространстве путем скалярного умножения вектора направления вперед матрицы rotMat-объекта и переданного в параметре значения. Последний метод класса SetupEffects вызывается лишь единожды — при инициализации. В него передаются матрицы проекции и вида, которые впоследствии присваиваются эффекту каждого меша модели. Также, для каждого меша включается стандартное освещение. Результат операции присваивается переменной — члену trans, которая участвует в построении объекта (в процессе метода DrawObj (см. выше). Преждечемзапускатьпостроениепроекта, надовнестиизменения вклассGame1, которыйгенерируетсяавтоматоминаследуетсяот

Microsoft.Xna.Framework.Game, перегружаянекоторыеегометоды. И

сноваисходниксдискатебевпомощь, здесьжекраткорасскажу, что тамкчему. ВначалеклассаGame1 объявляемвсеглобальныепеременные— так, например, объектклассаObject — Object car1 = new Object(20); передаваясмещениепараметром, здесьженаходятся объявленияматрицвидаипроекции, онибудутинициализированы позже. Конструкторклассаужерассмотрен. Вфункцииинициализациипроизводимматрицы:

projectionMatrix = Matrix.CreatePerspectiveFieldOfView (MathHelper.ToRadians(45.0f),aspectRatio,1.0f,100.0f);

viewMatrix = Matrix.CreateLookAt(cameraPosition, Vector3.Zero, Vector3.Up);

Длясозданияматрицыпроекциипередаем: полевидимостипо осиY врадианах, соотношениесторонэкрана(объявленоранее), расстояниедоближнейидальнейплоскостиотсечения. В созданиивидовойматрицыучаствуюттакиезначения: позиция камеры(объявленаранее— триплетзначений, представляющий координатыX,Y,Z), направлениевидакамерыивекторобзо-

равверх, относительнотекущемувиду. ВметодеLoadContent происходитзагрузкаресурсов, такмодельдляобъектанашегоклассазагружаетсятакойстрочкой: car1.model = Content.

Load<Model>("Models/Hotrod"); Сразупослезагрузкивызывается методобъектадляустановкипреобразованиймешеймодели:

car1.SetupEffects(projectionMatrix, viewMatrix);, длякоторого передаютсяранеесозданныематрицы. ВметодеUpdate, который подобнометодуDraw вызываетсяприперерисовкикаждогокадра, осуществляетсятрансформациянашихобъектовклассаObject.

ДополнительновнемвызываетсяфункцияUpdateInput, которая детектитнажатиелевойклавишимыши, иврезультатеувеличиваетскоростьвращенияиперемещенияобъектов, инкрементируя значенияпеременных. ПоследнийметодDraw выводитвсена

XÀÊÅÐ 09 /152/ 2011

экран. Сначалаоночищает— закрашиваетзаднийбуферсплошнымцветом, затемвыводиттекстуруидваобъектаклассаObject. Последняястрочкаметодаbase.Draw(gameTime); меняетположенияпервичногоизаднегобуферов. Витогевсе, чтовизуализировалосьтам, теперьнанашемэкране.

Сейчассамоевремяоткомпилироватьипротестироватьпроект. В томслучае, есливсесделаноправильно, тыувидишьтакуюдемонстрацию3D надисплееэмулятора(рис. 3).

Звуки

Напоследокдобавимзвук. Возьмикакой-нибудь*.wav-файл(напри- мер, сдиска) изагрузиеговконтентпайплайн. Объявитрипеременных: однудлязагрузкизвука, вторую— дляосуществленияконтрола надпроигрыванием, ипоследнюю— длясостоянияпроигрывания:

SoundEffect sound; //звук

SoundEffectInstance soundControl; //управление звуком bool isPlay = false; //индикатор проигрывания музыки

ЗатемвфункцииLoadContent загрузизвук, создайобъектдляуправлениязагруженнымзвуком, зациклиеговоспроизведениеиначни проигрывать:

sound= Content.Load<SoundEffect>("Music/jets014"); soundControl = sound.CreateInstance(); soundControl.IsLooped = true;

soundControl.Play(); isPlay = true;

ТеперьвфункциюUpdateInput добавькоддляостановкиивоспроизведениямузыкипонажатиюнакнопкуBack эмулятора:

if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) {

if (isPlay) { soundControl.Pause(); isPlay = false;

}else { soundControl.Play(); isPlay = true;

}

}

Послеэтогоможешьпротестироватьсвойэкземпляр. Теперьдолжна проигрыватьсявыбраннаямелодия. Да, подготовленныймнойзвук, конечно, вообщеневтему, затобесплатно:)!

Итоги

Впроцессенаписаниястатьияпостаралсярассказатьтебеоб основахпрограммированиядляWP 7.1 и, главнымобразом, о созданииприложенийсдинамическойтрехмернойграфикой. Не рассмотреннымиосталисьмногиепримечательныемеханизмы, присущиеэтойплатформе: взаимодействиесразнымидатчиками, сервисамиидругимиаппаратнымисредствами. Приэтомянеставилпередсобойтакойцели, ялишьхотелсделатьвводныйтуториал овозможностяхпрограммированияигрдляWindows Phone 7.1. К сожалению, рамкистатьинепозволилимнерассказатьоразработкеполностьюзаконченнойигры, протестироватьеенареальном устройстве(ктомуже, впериоднаписаниястатьиустройствас WP7.1 ещенесуществоваловприроде:)) ивыложитьеенаWindows Phone Marketplace (отмечу, чтозаправоторговатьвмагазиненадо приобрестилицензиюнагодза2900 рублей). Однакояужеработаю надэтойигрой, ивследующийразпостараюсьдетальноописатьее разработку, чтобыутебябылнеисчерпаемыйбагажзнаний!

Удачиввыводеденег— ведьпользователиWindows Phone привыкли платитьзаполезныеикачественныеприложения! z

109

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

o

 

 

 

w

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-xcha

 

 

 

 

 

CODING

Александр Эккерт (stannic.man@gmail.com)

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

РУТКИТ В СЕТЕВУХЕ

Фантазии системного программиста о создании непобедимого руткита

Представь себе фантасмагорию: твоя сетевая карта (или процессор, или видеокарта) живет отдельной жизнью

шизофреника. И дружит она (или все эти компьютерные потроха сразу) против тебя. Возможно ли такое восстание машин, инициированное силами хакеров или, скажем, производителей железа? Давай пофантазируем!

110

XÀÊÅÐ 09 /152/ 2011

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

Сетевая карта (NIC)

 

 

 

Операционная система

 

 

 

 

 

 

 

RJ45

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PHY block

 

 

 

MAC block

 

 

 

 

 

Драйвер NIC

 

Процесс

 

 

кабель

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PCI-шина

 

 

(минипорт)

 

 

 

 

 

 

 

Обработка

 

 

 

Обмен сетевы-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

цифровых

 

 

 

ми фреймами

 

 

 

 

 

 

 

 

 

 

 

 

 

сигналов

 

 

 

с ОС

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

на портах

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ethernet

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Так схематично проходит процесс обработки сетевых пакетов на уровне NIC <===> PCI

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

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

Поехали!

Скажутолькоодно— естьвсетипримеры(внимание!) веб иSSH-серверов, базирующихсянаресурсаходнойлишь сетевойилиграфическойкарты. Да-да, использующих ресурсы(микропроцессориоперативнуюпамять) этих самыхкарт(prooflink: alchemistowl.org/arrigo/Papers/ Arrigo-Triulzi-PACSEC08-Project-Maux-II.pdf, атакже radioradar.net/news/electronics_news/avr_crumb644_net. html).

Еслитыдосихпорнепонял, очемречь, повторю: ненужнаоперационнаясистема, ненужноядро, всечтонужно– этомикропроцессорсетевойкарты, которыйбудет обрабатыватьприходящиепакетыизсетиичто-тотам отсылатьобратно. Представьсебемини-Apache, который реализованвнеконтроляядразасамоймашиной, ведь сетеваякарта, какжелезка, виситгде-тонаPCI-шинеи ейподвластновсеядрооперационки Страшно, ноэтоещецветочки, мойдорогойдруг. Главное—

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

Леземвнедра

Атеперьпредставьсеберуткит, которыйживетне воперационнойсистеме, а, скажем, втойжесамой

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

Сегоднямыпопытаемсярассмотретьэтуинтересную темусточкизрениясистемногопрограммиста. Мы попробуемответитьнавопрос, как«глубокакроличья нора», какглубокоможнозалезтьвнедраоперационной системы. Боротьсясруткитами, живущимивfirmware железяктвоегокомпьютера, наверное, все-такибес- смысленно. Однакоковыряниевовнутренностяхядра

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

Обычныйперехватсетевоготрафикавсовременных файрволахсводитсякустановкамTDI-NDIS-фильтров

иперехватеважныхNDIS-функций, таких, как, скажем, NdisRegisterProtocol. Естьдваподходакперехвату сетевоготрафика. Первое— этоустановить, скажем, TDIфильтрилиNDIS IM-драйверижитьсебеспокойно. Но этотподходнезащититминипортсетевойкарты, который являетсясвоеобразнымфорпостом, ибодальше— ресурсысетевойкартыисеть.

ПерехватключевыхфункцийвструктуреNDIS_ MINIPORT_BLOCK можетгарантироватьтвоейзверюшкеуверенныйконтрольилимодификациюсетевого трафика, еслибынеодно«но» — заполучитьуказательна NDIS_MINIPORT_BLOCK ойкакнепросто! Одинизсамых распространенныхспособовполучитьуказательна минипорт— регистрироватьсвойсетевойпротоколвядре вызовомNdisRegisterProtocol, нофайрволудостаточно перехватитьэтуфункцию, чтобыобломатьвсепопытки этосделать.

Какжебыть?

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

Сетеваякарта(физически) состоитиздвухблоков— PHY- блокиMAC-блок. Первыйотвечаетзанепосредственное «переваривание» сигналовсRJ45-кабелявнаборбайт,

DVD

dvd

На диске ты найдешь пару зачетных книг

вpdf-формате, посвященных описанию PCI-интерфейса, которые настоятельно рекомендую к прочтению, а также код, позволяющий легко просканировать PCIшину, найти и описать все устройства, «висящие» на шине,

втом числе регион памяти, который выделен устройству.

HTTP://WWW

links

Рекомендую к посещению — alchemistowl.org/ arrigo/index.html, сайт Arrigo Triulzi,

там есть немало вкусностей на тему нагиба всяких операционных систем.

XÀÊÅÐ 09 /152/ 2011

111

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

CODING

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

которыедлядальнейшейобработкипередаютсявMAC-блок. Этот блокгораздоинтереснее, потомучтоименнооннепосредственноотвечаетзавзаимодействиесдрайверомсетевойкарты(минипортом). ОнобладаетоднимилидвумяCPU, EEPROM-памятью, собственной SRAM-памятьюинаборомрегистров, посредствомкоторыхуправляется«устройство» сетевойкарты. ВEEPROM, какправило, содержитсяинформацияопроизводителе, MAC-адрессетевойкарты, образ прошивки. СтруктуракаждогоконкретногоEEPROM имеетнедокументированныйформатизависитлишьотфантазииразработчиков самойсетевойкарты. SRAM-памятьсодержиткопиюпрошивки firmware, структурысетевыхпакетов, атакжевременныебуферы дляхраненияприходящих/уходящихсетевыхпакетов. Регистры, в своюочередь, позволяютполностьюконтролироватьсетевуюкартуи управлятьею. Сколькоих, идлячегоонислужатвкаждомконкретном случае— такжезависитотфантазииразработчика, поэтомузачастую частьизнихимеетнедокументированныйформат.

Главныйвопросстатьи— можнолиполучитьдоступкEEPROM, SRAM илирегистрам? Ответ— да, можно. Исделаеммыэточерез PCI-интерфейс.

PCI-шинаподдерживаетметодпередачиданных, называемый«linear burst» (методлинейныхпакетов). Этотметодпредполагает, чтопакет информациисчитывается(илизаписывается) «однимкуском», то естьадресавтоматическиувеличиваетсядляследующегобайта. Естественнымобразомприэтомувеличиваетсяскоростьпередачи собственноданныхзасчетуменьшениячислапередаваемыхадресов. ШинаPCI являетсятойчерепахой, накоторойстоятслоны, поддерживающие«Землю» — архитектуруPlug and Play (PnP). СпецификацияшиныPCI определяеттритипаресурсов: два обычных(«диапазонпамяти» и«диапазонввода/вывода», каких называеткомпанияMicrosoft) иconfiguration space — «конфигура-

ционноепространство».

БолееподробноошинеPCI тысможешьпрочестьвзамечательной книге«PCI Bus Demystified» оттоварищаDoug Abbott, еетысможешь найтинадискекжурналу.

ИменноPCI-шина, благодарясвоим«фундаментальным» особенностям, позволитнамполучитьдоступковсемресурсамнетолько сетевойкарты, ноилюбогодругогоустройства, котороесидитна PCI-шине. Иприэтоммы, находясьвтрезвомумеинесовсемтрезвойпамяти:), незадеваятакиеуровнисетевойинфраструктуры, как TDI илиNDIS, гдесидятсторожафайрволов, сразузалеземвглотку сетевойкарте. Иниктонамвэтомнепомешает: все, чтонужнобудет сделать— засандалитьдрайвервсистему.

ОперационнаясистемадлявзаимодействиясустройстваминаPCI- шинезадействуетмеханизмввода-вывода, основанныйнапроекции участковпамяти(memory-mapped I/O).

Такойучастокпамяти, какправило, имеетразмерв64 килобайта. Первые32 килобайтаиспользованыдляпроекциирегистровустройства, вторые32 килобайтапредставляютсобой«окно» свозмож- ностямичтения/записивSRAM-памятьсетевойкарты. Всегоэтого вполнехватит, чтобыполучитьконтрольнадлюбымизустройств, присутствующихнаPCI-шине.

ПеречислимвсеустройстванаPCI-шине

for (busNumber = 0; !adapterFound && moreBuses; busNumber++)

{

for (deviceNumber = 0;

!adapterFound && deviceNumber < PCI_MAX_DEVICES; deviceNumber++) {

slotNumber.u.bits.Reserved = 0;

slotNumber.u.bits.DeviceNumber = deviceNumber; slotNumber.u.bits.FunctionNumber = 0;

length = HalGetBusData(PCIConfiguration, busNumber,

slotNumber.u.AsULONG,

configInfo, sizeof(PCI_COMMON_CONFIG) );

}

}

Осталасьсамаямалость— разобраться, всмысле, отреверсить EEPROM сетевойкарты, потомучтовнашемслучаеEEPROM — этовсе. Чтотутнадоиметьввиду? Во-первых, EEPROM содержитвсебе non-volatile-данные. Во-вторых, этиданныедоступныдлячтенияи записичерезнаборрегистровсетевойкарты. Нуив-третьих, надо помнить, чтоформатEEPROM практическиникемизпроизводителейсетевыхкартнедокументируется. ЧтомызнаемоEEPROM? Он содержитвсебе, какправило, заголовокзагрузчика, метаданные «устройства» сетевойкарты, данныеоконфигурациисетевойкарты, такиекакMAC-адрес, исамоеглавное— наборfirmware-имиджей, тоесть: кодзагрузчика, дефолтныйимидж, PXE (Preboot eXecution Environment, хреньдлявозможности«загрузкикомпьютерасиспользованиемсетевогоинтерфейса») имноговсегопрочего. Теперьнадоответитьнавопрос, какимиджfrimware загружаетсяиз EEPROM впамять? Оченьпросто— надоперегрузитьсетевуюкарту иостановитьпроцессоркакможноскорее! Разумеется, делатьэто надосиспользованиемПО, поддерживающегоэмуляциюфизическихустройств:). Чтоврезультате? Врезультатеможноувидеть, чтокаждыйраз, когдапроисходитподключениесетевойкарты(или перезагрузкаPCI-шины):

а. ПроцессоринициализируетEEPROM иизагружаетзагрузчик firmware (проститезатавтологию) изEEPROM.

б. Выполняеткодзагрузчикаfirmware, тоестьконфигурируетядросетевойкарты, настраиваячасы, потреблениеэнергииипрочее; послечего загружаетнаисполнение«вторуюочередь» firmware, котораяявляется дефолтнымосновнымимиджемсетевойкарты; послечегонастраивает всеостальное— MAC-адресипрочиеособенностисетевойкарточки.

Вот, впринципе, ивсе, чтонужнознатьипроцессезагрузкиимиджа сетевойкарты. Инаконец, отвечунавопрос, который, наверное, давновертитсяутебявголове: можнолисделатьтакойруткит, который сможетзаразитьсетевуюилиграфическуюкарту? Ответпрост: да, этоможносделать, хотяиочень-оченьнепросто. Несмотрянато, чтотакойруткитбудетвесьмаопаснымиживучим, онсможетжить лишьнаконкретноймаркесетевойкартыотодногопроизводителя. Дляразработкитакогоруткитанужносдампитьfirmware, отреверситьего, разобратьсявпринципахработырегистров... Азатем написатьсвоесобственноеfirmware, котороеибудетзаменено

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

Ачтонасчетконтролязасетевымикартамибезвариантаинсталляции руткита? Ненамногопроще! Универсальногоспособа, которыйбы позволилнагнутьвсесетевыекартыразом, несуществует. Производителеймножество, изапилитьпрограмму, котораябудетконтролировать всесетевыекартыподряд, невозможно. Дляэтого, кактыужепонял, нужнознатьконкретныеособенностиконкретнойсетевойкарты— ведьсколькоразработчиков, столькоиразныхформатовEEPROM, регистров, нуи, разумеется, firmware. Нужнохорошоразбиратьсяв принципахдействияшиныPCI исамойоперационнойсистемы.

Вместозаключения

Согласен: выбиратьпутьзараженияиликонтролязаPCI-based- устройствамитакимвотспособом— уделнемногихизвращенцев. Нет, яотнюдьнепризываютебяприсоединятьсякизвращенцам, однакосистемныйкодингвэтомнаправлениипоможеттебепонять, как работаетсистеманауровнеаппаратногожелеза. Поверь, этокрайне увлекательноезанятие:). Удачногокомпилирования, идапребудетс тобойСила! z

112

XÀÊÅÐ 09 /152/ 2011

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

ПОДПИСКА

ГОДОВАЯ ЭКОНОМИЯ 500 ðóá.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

1.Разборчиво заполни подписной купон и квитанцию, вырезав их из журнала, сделав ксерокопию или распечатав с сайта shop. glc.ru.

2.Оплати подписку через любой банк.

3.Вышли в редакцию копию подписных документов — купона и квитанции — любым из нижеперечисленных способов:

на e-mail: subscribe@glc.ru;

по факсу: (495) 545-09-06;

почтой по адресу: 115280, Москва,

ул. Ленинская Слобода, 19, Омега плаза, 5 эт., офис № 21,

ООО «Гейм Лэнд», отдел подписки.

Внимание! Если произвести оплату в сентябре, то подписку можно оформить с ноября.

Единая цена по всей России. Доставка за счет издателя, в том числе курьером по Москве в пределах МКАД

12 НОМЕРОВ — 2200 ÐÓÁ.

6 НОМЕРОВ — 1260 ÐÓÁ.

УЗНАЙ, КАК САМОСТОЯТЕЛЬНО ПОЛУЧИТЬ ЖУРНАЛ НАМНОГО ДЕШЕВЛЕ!

ПРИ ПОДПИСКЕ НА КОМПЛЕКТ ЖУРНАЛОВ

ЖЕЛЕЗО + ХАКЕР + 2 DVD: — ОДИН НОМЕР ВСЕГО ЗА 162 РУБЛЯ (НА 35% ДЕШЕВЛЕ, ЧЕМ В РОЗНИЦУ)

ЗА 12 МЕСЯЦЕВ 3890 РУБЛЕЙ (24 НОМЕРА) ЗА 6 МЕСЯЦЕВ 2205 РУБЛЕЙ (12 НОМЕРОВ)

ЕСТЬ ВОПРОСЫ? Пиши на info@glc.ru или звони по бесплатным телефонам 8(495)663-82-77 (для москвичей) и 8 (800) 200-3- 999 (для жителей других регионов России, абонентов сетей МТС, БиЛайн и Мегафон).

ПРОШУ ОФОРМИТЬ ПОДПИСКУ НА ЖУРНАЛ «ХАКЕР»

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

CODING

Адиль Хаштамов (adil.khashtamov@gmail.com, http://khashtamov.kz)

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

ВЕБ ПО-АСИНХРОННОМУ

Обзор асинхронных фреймворков для Python

Асинхронный фреймворк — это ключ к тому, чтобы твое крутое веб-приложение могло обрабатывать сразу тысячи одновременно висящих клиентов даже на средненьком дедике. Звучит фантастично? Поверь мне, это правда!

Чтозазверь?

Преждечемокунутьсявомутфреймворков, яхочуповедатьотом, чтоже насамомделетакое«асинхронность».

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

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

s = socket.socket(...) s.setblocking(ISBLOCKING) s.connect((host,port))

data = s.recv(1024)

# какой-то другой код s.close()

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

114

XÀÊÅÐ 09 /152/ 2011

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Серьезность сайта Twisted говорит о серьезности фреймворка

ТЕМАТИЧЕСКИЕ ССЫЛКИ

tornadoweb.org — официальныйсайтфреймворкаTornado.

twistedmatrix.com — сетевойасинхронныйшвейцарскийнож

Twisted.

gunicorn.org — WSGI Python-сервера.

gevent.org — сетеваябиблиотека, основаннаянабиблиотекеlibevent.

nichol.as — asynchronous-servers-in-python-тестна

производительностьсетевыхнеблокирующихфреймворковна

Python.

pycon.blip.tv — видеосконференцииPyCon.

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

Например, вWindows этоselect(), вLinux epoll(), poll(), авоFreeBSD

этоkqueue(). Помнитсямне, чтоводномизстарыхвыпусковжурнала][ многоуважаемыйМихаилФлёнов, онжеhoriffic, рассказывалотом, как написатьсамыйбыстрыйвмиресканерпортов. Оченьсоветуюотыскать тебеэтустатьюикакследуетпонятьописанныевнеймеханизмы(xakep. ru/magazine/xa/042/058/1.asp — какжедавноэтобыло… — прим. ред.).

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

Зверинецфреймворков

Кудажебезих, родимых? ДляPython-программистовнаинтернет- рынкесуществуетогромноеколичествоинтересныхфреймворков— как асинхронных, такисинхронных. Изпоследних, пожалуй, стоитвыделить всемиизвестныйипопсовыйфреймворкDjango, окотором][ писалне такдавно. Носегодняречьнеонем(точнее, нетолькоонем). Итак, что жеунасестьнасегодняшнийдень?

Tornado

Стоитотметить, чтоуданногофреймворкавесьмаинтереснаяистория. Изначальноонписалсядлявнутреннегоиспользованиясервисом FriendFeed. Позже, когдасервисбылвыкупленв2009 годусоциальной сетьюFacebook, ребятарешиливыложитьисходныетекстыэтогозамечательногоинструмента. НатекущиймоментTornado имеетнебольшое, нодружноесообществоразработчиковипользователей, которые активнообсуждаютиподдерживаютлюбимыйфреймворк. Доказательствоммоихсловслужитнедавнийстабильныйрелизвторойверсии Tornado. Пожалуй, однимиззначительныхминусовэтогонеблокирующегоаппаратаявляетсяотсутствиевнятнойдокументации, отсюдаине стольегобольшаяпопулярностьпосравнениюсDjango, гдедокументацияпростосказочная. Нодлянастоящегопитонистаэтонедолжно бытьпреградой, ибомынеищемлегкихпутей! Темболее, чточитать исходныйкодTornado оченьприятно— онкрасивоикорректнонаписан. Асовмещатьприятноесполезнымвдвойнеприятно, темболее, чтокода совсемнемного. Кстати, еслитыработалсмикрофреймворкомweb.py, тоTornado покажетсяоченьзнакомым, внемсочетаютсятежесамые простотаиэффективность:) — запримерамиможнообратитьсякпапке demos вархивефреймворка, благо, ихтамдостаточно.

Такчтожеунеговнутри? Чемонтакпривлекаетнемалоеколичество профессионаловсредивеб-разработчиков? Tornado поправуможнона- зватьполноценнымвеб-инструментом. Внемотличноподдерживается парадигмаMVC (model-view-controller), обращаетнасебявнимание весьмасерьезныйпоскоростивстроенныйшаблонизаторсхорошим синтаксисомшаблонов, похожимнасинтаксисшаблоновDjango. Приятнымплюсомдляменябылинабормодулейдляавторизациина популярныхсоциальныхсервисахтипаTwitter, Facebook, Google — сейчасоченьмоднолепитьтакиефишкинасайтах, дабынепосылатьюзера черездебриэтаповрегистрации. Благонынчеукаждогокомпьютеризированногочеловекаестьхотябыодинаккаунтвэтихсетях. ОтносительноработысбазойданныхразработчикипроявилинекоторыйагностицизмипоумолчаниюподдерживаютработутолькосMySQL, которая всецелопостроенавблокирующемстиле, поэтомупрактическивсе плюшкиасинхроннойработыTornado исчезают, еслитыпишешьвебприложение, котороевзаимодействуетсMySQL-базой, хотяпопытки написаниястабильногоасинхронногодрайверапродолжаются. Изэтой ситуацииестьвыход— использоватьPostgreSQL, которыйявнобыстрее MySQL ивпоследнихрелизахподдерживаетасинхроннуюобработку запросов.

XÀÊÅÐ 09 /152/ 2011

115

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

CODING

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

База интересных сниппетов от сообщества Tornado

ПростейшийHello world вTornado выглядиттак:

HelloworldнаTornado import tornado.ioloop import tornado.web

class MainHandler(tornado.web.RequestHandler): def get(self):

self.write("Hello, world")

application = tornado.web.Application([ (r"/", MainHandler),

])

if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start()

Запускатьданныйскриптможнопрямовконсоли— Tornado действительномногоеунаследовалотweb.py впланепростоты. Вегопоставку входитвесьманеплохойhttp-сервер, которыйлучшевсегозапускать заfront-end-серверомвродеnginx, дляболеестабильнойиэффектив- нойработытвоеговеб-приложения. Дляболеедетальногоознакомлениясегоспецификациямисоветуюсходитьнаофициальныйсайт фреймворка.

Плюсы:

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

2.Весьмалегкийдлячтенияипониманиякод, нетпрактическиничего лишнего.

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

Минусы:

1.Отсутствиевнятнойдокументации.

2.Tornado беденнасторонниебиблиотеки, хотяэтовопросвремени.

Twisted

Пожалуй, Twisted поправуможноназвать«швейцарскимножом» для любогосетевогопрограммистанаPython. Этонастолькоогромный

монстрсвнушительнымфункционалом, чтообольшемимечтатьнельзя. Онподдерживаетработусцелымзоопаркомпротоколов: TCP/UDP, SSL/ TLS, HTTP, SSH, FTP, IRC, NNTP, XMPP иещекучейвсегоостального.

ИзплюсовTwisted стоитвыделитьвесьмабогатуюбиблиотеку, атакже внятнуюиобширнуюдокументациюспрактическимипримерами. Чисто смоейточкизрения, Twisted — этоцелаяплатформа, изучениекоторой требуетнемаловремениипрактики, ноонотогостоит, еслитытакили иначевовлеченвудивительныймирсетевогокодинга. Кстати, оTwisted написананеоднакнига, чтолишнийразподтверждаетсерьезность фреймворка. Обратнойстороноймедалиявляетсятотфакт, чтолюбая большаясистемачащевсегоявляетсясложной. Увы, Twisted — неисключение. Помимосложностиизучения, Twisted значительноуступаетпоскоростиобработкисоединенийвышеупомянутомуTornado.

Омногочисленныхтестах, которыепроводилисьмеждуразличными неблокирующимифреймворкамиPython, тыможешьузнатьизлинковв концестатьи. Такжестоитотметить, чторазрабатыватьвеб-приложение наTwisted, каквпланенаписания, такивпланеразвертывания, на порядоксложнее, чемвTornado. Twisted нетакпросто(посравнениюс Tornado илитемжеDjango) интегрироватьсбазойданных— вегоконкурентахльвинуюдолюработынасебяберетфреймворк— дажевчасти созданиятаблициформированияSQL-запросов.

Плюсы:

1.Оченьбогатаябиблиотека.

2.Отличнаядокументация.

Минусы:

1.Судяпотестам, являетсядалеконелидеромвбыстродействии.

2.Достаточновысокийпорогвхождения.

Gunicorn+Gevent

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

яуслышалнаконференцииPyCon, котораяпроходилавэтомгодув Атланте. СутьзаключаетсявобъединениисупербыстрогоWSGI-сервера Gunicorn ссетевойбиблиотекойновогопоколенияGevent (онатакже включаетвсебявстроенныйWSGI-сервернаосновеlibevent). Еслибыть максимальнократким, тосетеваябиблиотекаGevent даетнамвозможностьписатьасинхронныйкодвсинхронномстиле, что, несомненно, являетсявесомымплюсомпочаститрудозатрат. Gevent используеттак называемые«гринлеты» («микропотоки») чащевсеговнутриглавного потока, поэтомунеудивительно, чторазработчикбиблиотекивкачестве

116

XÀÊÅÐ 09 /152/ 2011

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Читабельный код модуля asyncore

«планировщика» дляэтихсамых«гринлетов» выбралдавноужеизвестнуюбиблиотекуlibevent (используетсявChromium, memcached), котораяктомуженаписананачистомСи, чтонесомненносказывается наскоростиработы. Но, насколькомнеизвестноизофициальногоблога, впланируемойверсииGevent собираютсяиспользоватьужеставшую стабильнойибыстройlibev, лишеннуютехошибок, чтоприсущиlibevent. Практическивсястандартнаясетеваябиблиотекапитонанаписанав блокирующемстиле, будьтоurllib, ftplib иличто-тоеще. Логично, что обычнымобразомнамбынеудалосьзаставитьихработатьвасинхронномрежиме, еслибынеспециальныйпатчингсокетов, которыйделает Gevent. Вот, кстати, тебепримерработысGevent:

ПараллельнаязагрузкасайтоввGevent

urls = ['http://www.google.com', 'http://www.yandex.ru', 'http://www.python.org']

import gevent

from gevent import monkey monkey.patch_all()

import urllib2

def print_head(url): print ('Адрес %s' % url)

data = urllib2.urlopen(url).read()

print ('%s: %s байт: %r' % (url, len(data), data[:50]))

jobs = [gevent.spawn(print_head, url) for url in urls]

gevent.joinall(jobs)

Каквидноизлистинга, написаниеасинхронногокодасGevent оченьпохоженасинхронныйстильпрограммирования. Тынаверняказаметил, чтофункцияmonkey.patch_all() выполняетзанасвсю «грязную» работу— какяуженаписалранее, онапатчитстандартную сетевуюбиблиотекупитона, темсамымпревращаясинхронныйкодв асинхронный. Например, библиотекаurllib2 изстандартнойпоставки рептилии, котораяспомощью«манкипатчинка» превращаетсяв неблокирующую, темсамымповышаяскоростьобработкизасчет параллельнойработы.

XÀÊÅÐ 09 /152/ 2011

Плюсы:

1.Облегчениенаписанияипониманиякода.

2.Достаточновысокаяскоростьработы.

Минусы:

1.Манкипатчингработаетдалеконесовсемибиблиотеками.

2.Функциональныйстилькода, чтотребуетпривыкания.

Нативныйasyncore

Далеконевсепитонистыобращаютвниманиенато, чтовстандартной библиотекепитонаестьтакойзамечательныймодуль, какasyncore. Asyncore позволяетписатькодвсобытийно-ориентированномстиле (использованиетакназываемыхcallback’ов), что, впрочем, далеконе вселюбят. Библиотекаasyncore предназначенадлянастоящиххардкорныхпитонщиков, страдающихNIH-синдромом(NIH — not invented here), нониктонеговоритотом, чтоэтоплохо. Моеличноемнениезаключаетсявтом, чтонужнохорошоразбиратьсявинструментах, которые тыиспользуешь, иименноэтабиблиотекадаетнеплохойшансосвоить тонкостиасинхронногопрограммирования, темболее, чтоеекодочень приятенипонятен. Сеепомощьюутебяестьвозможностьнаписать собственныйкрутойсерверпопараллельнойобработкемножествазапросов— кпримеру, балансер.

Иэтовсе?

Нет! ВСетитыможешьнайтиещеуймуразличныхсетевыхасинхронныхфреймворковдлянашеголюбимогопитона, укаждогоизнихесть, несомненно, плюсыиминусы. Асинхронность— этокруторовнодотех пор, покатебененужнобудетвыполнитькакой-тосложныйпоресур- созатратамкод: выборкаизогромнойбазыданных, поискфайловитак далее, таккаквэтомслучаенашпотокбудетнадолгозанят, аклиенты будутвынужденыждать. Всеэтоследствиесинхронногоподходав решениипроблем. Ещедолжнопройтидостаточномноговремени, пока современныеметодыпрограммированияперейдутнаасинхронный лад, таккакэтотребуетпереписыванияогромногоколичествакодав достаточнонеудобномстиле. Ачтонасчетинструмента? Помни, мой друг, чтопреждевременнаяоптимизацияработыприложения— не естьдобро. Знай, чтолучшенаписать, апотомоптимизировать, нежели гнатьсязаскоростьюивитогетакничегопутногоиненаписать. Если тыполучаешьогромноеудовольствиеотнаписаниясвоегоочередного шедевранаDjango, топишинанем. Вконечномсчете, мы— одниизтех немногих, ктодействительносчастлив, работая... z

117

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

 

F

 

 

 

 

 

 

t

 

 

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to

BUY

 

 

 

 

 

CODING

 

 

 

 

 

 

m

deeonis (deeonis@gmail.com)

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

Программерские типсыитриксы

Обзор асинхронных фреймворков для Python

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

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

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

ксожалению, базовыепринципыООП(инкапсуляция, полиморфизм

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

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

Итак, представь, чтотысоздалинтерактивныйкаталогсотовыхтелефонов. Это— твойбизнес, онприноситденьги, иегонадоразвивать. Темболеечтоиндустриямобильныхзвонилокнестоитнаместеи тожедвижетсявпередсемимильнымишагами. Всебылохорошо, когдамобилкибылипростыми, имелимонохромныедисплеииполифоническиемелодии. Втевременакодтвоегокаталогавыглядел примернотак:

Иерархияклассовмобильныхтелефонов class MobilePhone

{

public:

void display() = 0; void makeSound()

{

//код воспроизведения мелодии вызова

};

...

}

class Nokia3310 : public MobilePhone

{

void display()

{

// код вывода телефона на дисплей

};

}

class SiemensA35 : public MobilePhone

{

void display()

{

// код вывода телефона на дисплей

};

}

ЗдесьунасестьбазовыйклассMobilePhone, которыйописываетдваобщихдлявсехпотомковметода: display() иmakeSound(). ПричемmakeSound имеетсразуиреализацию, ведьвсетрубки умеютвоспроизводитьтолькополифонию. Авотdisplay являетсяабстрактнымметодом, каждыйдочернийклассреализуетего по-своему, таккаккаждаямобилкаимеетсвойнеповторимыйи сногсшибательныйдизайн.

Ивсеутебябылохорошодотехпор, покавтелефонахнесталипоявлятьсяфотокамеры, авместеснимииmp3-мелодии. Иеслиmp3 ты ещехотькак-томогигнорировать(естьзвукпризвонке— иладно), тоотсутствиевозможностизапечатлетьлюбимуюкошечкупользователипроститьнесмогут. Атутещеиконкурентобъявился, укоторого иmp3 работает, ифотикфоткает. Надочто-тоделать!

КлассическийООП-подход

Первое, чтоприходитвголову— добавитьметодmakePhoto в базовыйклассMobilePhone. Идеявпринципенеплохая, еслине считатьтого, чтоNokia 3310 вдругкаким-тообразомнаучилась фотографировать:).

ДобавляемметодmakePhoto class MobilePhone

{

public:

void display() = 0; void makeSound()

{

118

XÀÊÅÐ 09 /152/ 2011

Соседние файлы в папке журнал хакер