Компьютерный муравейник Петя, Волк и Никита Хакер, номер #073, стр. 073-056-2 Скелет плагина #include <windows.h> __declspec(dllexport) DWORD __stdcall Load(LPVOID) { return 0; } bool __stdcall DllMain(HINSTANCE, DWORD, PVOID) {return true;} Для удобства Петр написал несколько модулей: сокс-сервер, md5-переборщик и dll, которая выводит мессаджбокс. Простая структура модуля и универсальность программы загрузчика позволит переделать в плагин абсолютно любую программу, будь то кейлоггер или какой-нибудь хитрый vpn-прокси. Если захочешь разобраться с этой программой и понять, как пишутся модули для нее, – загляни на наш диск, ты найдешь там сорцы системы. Как управлять? В предыдущей главе мы рассмотрели, как взаимодействуют основная программа и подгружаемая dll’ка. Но по-прежнему открыт вопрос о том, каким образом мы будем управлять работой самой dll на компьютере. Ведь совершенно ясно, что нам потребуется как-то общаться с этим модулем: нам нужно отдавать команды, получать результат их выполнения и т.д. Тут встает уже знакомая нам проблема. Сейчас многие пользователи Сети используют на своих машинах серые ip-адреса, недоступные напрямую снаружи. Это сделано и по экономическим причинам, и по соображениям безопасности, и еще потому, что существующего адресного пространства в четвертой версии ip не хватит для всех компьютеров на Земле. Поэтому в dll’ках мы с Петром решили использовать реверсивный подход: в этом случае сам клиент, пользовательский компьютер, соединяется с сервером и получает оттуда задание – согласись, это значительно функциональнее случая, когда на юзерском компьютере открывается порт и ожидаются входящие подключения с командами. Чтобы не быть голословным, я приведу пример такого интерфейса для модуля, осуществляющего перебор md5-хэшей. Всю работу по управлению модулями перебора md5 берет на себя серверная часть системы – скрипт, который распределяет задания между пользовательскими компьютерами, принимает результаты работы и т.д. Вот как выглядит этот интерфейс. Когда модуль только подгрузился, он должен зарегистрироваться у скрипта, обратившись к адресу md5crack.php?action=register&key=SGDF324D453H543D65H4GSD34, где SGDF324D453H543D65H4GSD34 - случайная последовательность символов, которая однозначно идентифицирует каждого клиента. Модуль запоминает этот ключ, и им теперь идентифицируется все дальнейшее общение с серверной частью. Конечно, чтобы начать свою работу, перебор md5-хэша, dll’ка должна как-то получить диапазон перебираемых значений и ломаемый md5-хэш. Для этого она обращается к скрипту вот так: md5crack.php?action=getwork&key=SGDF324D453H543D65H4GSD34, после чего сценарий отдает ей диапазон паролей и сам хэш: aaaaaa aaZZZZ 507250B947CC397023A9595001FCF167. Получив диапазон и ломаемый ключ, dll’ка должна перебрать все возможные варианты в этом диапазоне. Когда перебор закончен (дошли до последнего варианта либо нашли коллизию), модуль опять вызывает управляющий скрипт, обращаясь к нему вот так: script.php?action=donework&success=-1 - если дошли до последнего варианта и нет коллизии, script.php?action=donework&result=CoolPasswD - если нашли подходящий оригинал. В ответ на любой из этих вызовов сценарий возвращает новое задание в указанном выше формате либо отвечает «Wait» - это означает, что модуль должен перейти в режим ожидания, поскольку работы для dll’ки пока нет. Написать управляющий скрипт совсем несложно, если ты читаешь статьи по кодингу на PHP в нашем журнале. Чтобы навести тебя на какие-то мысли, я расскажу в общих словах, как такая система должна функционировать, и приведу кусок соответствующего php-сценария. |