Панель для проксей

Вероятно, каждый не раз убеждался на своем опыте, что безопасность требует больших затрат времени и энергии как в Cети, так и в риаллайфе. Подумать только, ведь нужно при каждом коннекте вводить пароль в аську, открывать тридцать замков на железной двери, чекать и устанавливать новые прокси в браузер. Геморрой, одним словом. С помощью элементарных навыков кодинга я постараюсь несколько исправить это тяжелое положение, сделав жизнь чуточку комфортнее…Author: f0gg0t (f0gg0t@gmail.ru)

Создание хакерского турбара для Internet Explorer

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

Главное для хакера — безопасность (ну и конечно, причина, по которой эта безопасность потребовалась — прим.ред). Если твой IP обнаружат в тех логах, где его быть не должно, то тебя найдут и, поверь мне, мало не покажется. Так что каждому хакеру необходимы еще и сетевые контрацептивы, которых расплодилось сегодня великое множество. Тут и VPN, и соксы, и прокси. Пусть прокси не так надежны, но с их поиском обычно проблем не возникает, и любой браузер старается их поддерживать. Но если ты будешь юзать один проксик, пока у тебя не появятся внуки, то фсбэшники все равно договорятся с владельцем сервера и снова устроют тебе неприятности. Поэтому надо регулярно менять проксики (кардерам это приходится делать каждые 15 минут, для каждого аккаунта у них по проксику — прим.ред). Но для этого приходится каждый раз лазить в настройки браузера, нажимать на сотню кнопок, что безумно неудобно. А ты представь, что смена проксей может легко производиться нажатием на одну кнопку. И эта кнопка помещена рядом с адресной строкой. В итоге ты свободен и в полной релаксации. Как же это осуществить? Идеальным способом является создание своего собственного тулбара. Это такая хитрая панельки, которая будет всегда под рукой в твоем любимом IE.

Вскармливаем

Internet Explorer — это сооружение, состоящее из небольших кирпичиков. Будь этот кирпичик тулбаром или BHO, он все равно сделан из одного того же материала и мало чем отличается от своих собратьев. Понимаешь, к чему я клоню? В IE все единообразно, и все плагины реализуются с помощью технологии COM. Основой COM, как ты знаешь, является интерфейс. Интерфейс — это чисто абстрактное понятие. В нем объявлены все методы, а реализации нет. Это как бы макет, который мы должны воплотить в жизнь. Думаю, это понятно. Что ж, двигаемся дальше. При загрузке осел считывает из реестра информацию о своих плагинах: где находится, какой имеет тип и прочее. Далее поочередно подгружает DLL каждого тулбара и вызывает экспортируемую функцию DllGetClassObject, получая указатель на интерфейс IClassFactory, основная задача которого регать и анрегать наш COM-сервер. Из IClassFactory он вызывает функцию CreateInstace и получает 2 указателя на интерфейсы IOleCommandTarget и IObjectWithSite. IObjectWithSite, хоть и имплементирует только два метода SetSite и GetSite, при этом играет значительную роль в создании плагина. После рождения тулбара ушастый вызывает метод SetSite. Функция SetSite должна присутствовать во всех плагинах, потому что в ней мы должны получить интерфейс IWebBrowser2, который является основным рычагом браузера, IInputObjectSite, через который мы будем осуществлять контроль над фокусом формы, а также IoleWindow: из него нужно вызвать функцию GetWindow, возвращающую нам хэндл нашей формы. С помощью QueryInterface получаем из punkSite интерфейс IInputObjectSite. Аналогичную операцию производим с интерфейсом IOleWindow и сразу же вызываем GetWindow и создаем форму. Чтобы иметь интерфейс IWebBrowser, нужно получить из punkSite интерфейс IOleCommandTarget, а у него изъять IServiceProvider и вызвать функцию QueryService. Зачем такие сложности, почему нельзя QueryInterface? Потому что, если другой плагин захочет обратиться к нашему тулбару и получить его интерфейс, он увидит фигу. Реализацию SetSite смотри ниже.

[функция SetSite]

function TProxyBar.SetSite(const pUnkSite: IUnknown): HResult;

var

Olewind:IOleWindow;

begin

if pUnkSite<>nil then

begin

pUnkSite.QueryInterface(IInputObjectSite,Site);

if SUCCEEDED(pUnkSite.QueryInterface(IOleWindow,Olewind)) then

begin

Olewind.GetWindow(ParentWnd);

Olewind._Release;

MakeForm(ParentWnd);

end;

pUnkSite._Release;

end;

Result := S_OK;

end;

Я не стал заморачиваться с winapi, а использовал VCL. Да, знаю я, что это не по-хакерски, но VCL правит миром, Delphi не стал бы таким популярным без него. Если захочешь реализовать на чистом api, то тебе придется изрядно напрячь мозг, но я в тебя верю :). Вернемся к нашим интерфейсам.

Второй функцией, наследованной от IObjectWithSite, является GetSite, браузер всегда вызывает ее после SetSite. В ней мы должны вернуть ослику его интерфейс, который он нам давал поиграть в прошлой функции. Просто вызываем Site.QueryInterface и возвращаем ему его интерфейс, пусть подавится, сволочь! Далее по списку идет IDeskBand. Что ж, держите скальпель, коллега, будем вскрывать :). Если вначале ты решил изучить исходник, то уже успел заметить функцию с названием GetBandInfo, занимающую гораздо большую площадь, чем остальные. От нее браузер получает информацию о различных параметрах тулбара, таких как размеры, заголовок и т.д. В качестве параметров браузер передает ей ID нашей панели, способ отображения и структуру pbdi. Вот ее-то мы и должны заполнить. Причем pdbi.dwMask заполнять не нужно, это идентификатор того, что браузер желает от нас узнать.

Мы проверяем, не требует ли браузер в данную минуту от нас каких-либо параметров, и заполняем только те пункты, которые ему требуются. Что такое ptMaxSize и ptMinSize поймет даже тюлень, а вот об остальных параметрах я расскажу подробнее:

dwModeFlags — переменная, которая определяет поведение нашего тулбара, всего можно использовать три эффекта: пошаговое изменение размера по вертикали, где за шаг отвечает ptIntegral, использование нестандартного цвета и отображение, так называемым затопленным появлением (в msdn можешь вычитать названия флагов).
ptActual — это идеальный размер для твоей панели; при всех обстоятельствах IE старается достичь именно его, и если тулбару не мешают товарищи по службе, то он будет отмасштабирован в соответствии с этим параметром.
wszTitle — это caption тулбара. Так как это не string, то нужно преобразовать строковое значение в тип WideChar функцией StringToWideChar.

StringToWideChar(Caption, @pdbi.wszTitle, Length(Caption) + 1);

crBkgnd — цвет тулбара, он будет задействован, если ты присвоишь dwModeFlags значение DBIMF_BKCOLOR.

Вот небольшой кусочек их функции GetBandInfo, чтобы было понятно, о чем же идет речь:

if (pdbi.dwMask AND DBIM_MINSIZE) <> 0

then begin

pdbi.ptMinSize.x := MinXSize;

pdbi.ptMinSize.y := MinYSize;

end;


Далее идут функции ShowDW и CloseDW. Первая показывает и скрывает форму в зависимости от переменной fshow, а также включает и выключает фокус с помощью функции onfocusChangeIS, из сохраненного ранее интерфейса браузера. Второй функцией уничтожаем окно.
ResizeBorderDW выполняет какие-то страшные манипуляции с границей фрейма, выделенного под наше окно, но мы не будем его реализовывать и пишем Result:=E_NOTIMPL, сообщая ишаку, что мы не имплементировали эту функцию. Особняком среди этих интерфейсов стоит IContextMenu, без него тулбар будет работать, и можно не реализовывать его имплементы, но при этом тулбарина потеряет некоторую функциональность. Как видно из названия, IContextMenu — это интерфейс, где описаны функции для работы с контекстным меню. Что ж, поехали по порядку. В функции QueryContextMenu мы должны вставить все желаемые пункты меню, а уже в InvokeCommand определить, какое колдовство будет происходить при нажатии на каждый пункт. Посмотри сорец на диске, там все просто ;).

Вот вроде бы и все, что нужно для создания элементарного тулбара, но так как мы будем использовать компоненты для ввода с клавиатуры (Memo, Edit и тд.), то нам нужно реализовать фокус, а то мы просто-напросто не сможем получить в тулбаре никакой инфы с клавы. Методы для работы с фокусом объявлены в интерфейсе IInputObject.

UIActivateIO, как написано в MSDN, эта функция активирует/деактивирует объект, точнее она меняет фокус в зависимости от переменной fActivate. Просто делаем SetFocus, если fActivate — истина, и ничего не делаем, если fActivate — ложь.

HasFocusIO определяет, существует ли клавишный фокус, и на основании ответа делает выводы. Реализуется легко: просто возвращаем в нее фокус ;).

TranslateAcceleratorIO — здесь нужно отловить нажатие клавиши и послать фокус в далекое путешествие по тулбарным просторам.

Помимо всего прочего, не стоит забывать: чтобы COM-сервер у нас заработал, нам нужно создать его GUID. GUID — это такой ID сервера, который обеспечивает его уникальность во Вселенной и во всех измерениях. Достигается это с помощью манипуляций с датой и временем, а также параметрами железа. В среде Delphi сделано все за нас, и по нажатию в позицию курсора помещается сгенерированный GUID. Без него тебе не удастся зарегистрировать тулбар. Чтобы зарегистрировать любой COM-сервер, нужно создать несколько ключей в реестре. Вот они:

HKEY_CLASSES_ROOTCLSID[ГУИД]. Здесь пишем название COM-сервера в значении по умолчанию. В нашем случае — ProxyBar.
HKEY_CLASSES_ROOTCLSID[ГУИД]InProcServer32. Не будем зацикливаться на поточной модели COM, и в ключ ThreadingModel запишем Apartment. Если тебя интересует, что это за зверь, то литературы по COM существует огромное количество, и, думаю, с поиском проблем возникнуть не должно.

HKEY_CLASSES_ROOTCLSID[ГУИД]Implemented Categories[Тип тулбара]. В этом ключе писать ничего не надо, его нужно просто создать. Он будет давать характеристику нашему COM-серверу. В нашем случае тип тулбара — это DeskBand, а его GUID равен {00021492-0000-0000-C000-000000000046}, что очень легко запомнить :).

И кульминационным моментом регистрации является объявление нашего COM-сервера как тулбара. В HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerToolbarWebBrowser создаем пустой ключ [ГУИД] и начинаем распечатывать следующую бутылку сока.

Но что делать с этими [ГУИД]? Как же открывать ключи реестра, они ведь string, а это TGUID? А легко! Существует такая функция, как GuidToString. Вот и используй ее по назначению.

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

Объезжаем

Форма готова, но она пуста и проку от нее не больше, чем от безалкогольного сока. Придется исправлять. На форме у нас расположится ComboBox и кнопка. В ComboBox\’е будет находиться сам прокси лист, а кнопкой мы будем менять прокси на выбранный нами вариант. Чтобы прицепить проксик к IE особого труда не требуется, всего-навсего нужно менять значение ключа HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionInternet SettingsProxyServer на значение вида proxy:port, а также изменить стоящий рядом ключ ProxyEnable на 1, и дело в шляпе. С этим проблем возникнуть не должно. Так как в ComboBox\’е будут храниться все проксики, то мы должны сохранять этот лист и загружать при создании тулбара. В событии FormCreate прописываешь Combobox1.Items.LoadFromFile(\’C:Proxy.txt\’), и прокси оказываются в листе, а сохранять их надо в событии FormDestroy Combobox1.Items.SaveToFile. Вот и все, чейнджер прокси закончен.

Теперь у тебя есть dll\’ка, но прежде чем радоваться жизни и допивать слабоалкогольные напитки, мирно стоящие у тебя на столе, стоит ее зарегистрировать. Делается это с помощью стандартной виндовой утилиты regsvr32.

Вот так подгружаем нашу панель:

regsvr32 C:proxybar.dll

а так выгружаем:

regsvr32 -u C:proxybar.dll

Так как регистрация проходит через метод UpdateRegistry, то можно вставить туда что-нибудь вроде ShowMessage(\’Спасибо тебе за регистрацию\’) или сразу редиректить на страницу разработчика. Кстати, о птичках. Чтобы получить контроль над браузером, будь то редирект или получение контента странички, тебе потребуется разобраться с интерфейсом IWebBrowser2. Думаю, что ты уже сталкивался с компонентом TwebBrowser. Все функции, которые в нем есть, заимствованы как раз из IWebBrowser2. Ты можешь юзать функции Navigate, Stop, Refresh и быть счастливым, но помни, что нельзя делать так: IE.Navigate(Url, 0, 0, 0, 0); нужно обязательно объявить переменную типа OleVariant и присвоить ей значение: IE.Navigate(Url, X, X, X, X); Никаких нулей!

«Теперь мне сухо и комфортно»(c)

В результате мы с тобой сотворили отличный тулбар, почти не напрягаясь. Уверен, что ты уже горишь желанием как-нибудь его доработать, добавить мини proxy-чекер, проверку на время отклика и прочие нужные вещи. Но одной сменой proxy-серверов разработка тулбаров для IE, как ты понимаешь, не ограничивается! В IE можно легко менять абсолютно любые настройки, благо хранятся они в реестре. Можно, например, создать Security Explorer Bar, где одним кликом можно будет изменить параметры приема кукисов или очищать хистори. Все, что тебе нужно, — это msdn, эта скромная статья и, конечно же, немного воображения. Надеюсь, я тебя заинтересовал.

«Все одинаковые»(c)

Тулбары для IE и тулбары для оболочки, такие как панель быстрого запуска, — это одно и то же, только ключи реестра у них разные. Для регистрации тулбаров IE используется ключ:

HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerToolbarWebBrowser

Для тулбаров оболочки:

HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerToolbarExplorer

Для регистрации панели рядом с кнопкой Start (Пуск):

HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerToolbarShellBrowser.

Прокси

Добывать прокси можно разными путями. Кто-то сканирует диапазоны на открытые порты 80, 3128, 8080, кто-то покупает доступ к большому и удобному листу, кто-то с горящими глазами бегает по форумам, где могут выложить парочку адресов (вроде asechka.ru). Я по этому поводу не очень напрягаюсь, просто потрошу ресурсы с паблик-проксями, чекаю их, после чего очищаю полученный лист от серверов наших товарищей из FBI и US Army ;).
Публичные листы прокси-серверов ищи по следующим адресам:
http://www.samair.ru/proxy/
http://proxy.mazafaka.ru/
http://nntime.com/proxy/
http://proxy.asechka.ru/index.php?page=proxylist
Онлайновый proxy-чекер:
http://proxy.asechka.ru/index.php?page=proxychecker
Онлайновый proxy-фильтр:
http://proxy.asechka.ru/index.php?page=proxyfilter