Вероятно, каждый не раз убеждался на своем опыте, что безопасность требует больших затрат времени и энергии как в 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.
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_ROOT\CLSID\[ГУИД]\. Здесь пишем название COM-сервера в значении по умолчанию. В нашем случае - ProxyBar. HKEY_CLASSES_ROOT\CLSID\[ГУИД]\InProcServer32. Не будем зацикливаться на поточной модели COM, и в ключ ThreadingModel запишем Apartment. Если тебя интересует, что это за зверь, то литературы по COM существует огромное количество, и, думаю, с поиском проблем возникнуть не должно.
HKEY_CLASSES_ROOT\CLSID\[ГУИД]\Implemented Categories\[Тип тулбара]. В этом ключе писать ничего не надо, его нужно просто создать. Он будет давать характеристику нашему COM-серверу. В нашем случае тип тулбара - это DeskBand, а его GUID равен {00021492-0000-0000-C000-000000000046}, что очень легко запомнить :).
И кульминационным моментом регистрации является объявление нашего COM-сервера как тулбара. В HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Toolbar\WebBrowser создаем пустой ключ [ГУИД] и начинаем распечатывать следующую бутылку сока.
Но что делать с этими [ГУИД]? Как же открывать ключи реестра, они ведь string, а это TGUID? А легко! Существует такая функция, как GuidToString. Вот и используй ее по назначению.
Не забыв сделать в процедуре анрега удаление ранее созданных ключей, можно считать, что зверюга готова. И что можно начинать учить ее жизни ;).
Объезжаем
Форма готова, но она пуста и проку от нее не больше, чем от безалкогольного сока. Придется исправлять. На форме у нас расположится ComboBox и кнопка. В ComboBox'е будет находиться сам прокси лист, а кнопкой мы будем менять прокси на выбранный нами вариант. Чтобы прицепить проксик к IE особого труда не требуется, всего-навсего нужно менять значение ключа HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyServer на значение вида 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 используется ключ:
Добывать прокси можно разными путями. Кто-то сканирует диапазоны на открытые порты 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