Многопоточную часть я взял из предыдущего софта MailParser. Встроенный в паука парсер HTML умел только выделять ссылки, мне же требовалось парсить страницу, выделять не только ссылки, но и формы с полями. Пришлось подключить libxml, на ней и сделал парсер, который умел читать HTML-формы, задавать значение полей и отправлять назад, на сервер POST запрос. Сами же сервисы, такие как Mail.ru и Gmail.com, наследовали виртуальный интерфейс парсера.
Виртуальные интерфейсы я полюбил еще в «Адаманте». Там их взяли на вооружение после того, как посмотрели код Half-Life — 2. В этой игре каждая библиотека экспортировала наружу чисто виртуальный класс (C++). Эту фишку я использовал позже во всем нашем софте.
Далее у интерфейса реализовывалось несколько виртуальных методов: Login, Spam, Logout. Зайти, отправить письмо (несколько раз), выйти. Все остальное было общее для всех: загрузка базы адресов, загрузка аккаунтов, загрузка списка прокси.
К тому времени появилось уже несколько сервисов по продаже аккаунтов (login: password) для разных сайтов. Обычно 1000 штук стоила от $5 до $30.
Мой брат сделал для вебмейлера систему генерации письма на основе макросов. Макросы нужны были для рандомизации текста. Например, текст мог выглядеть так:
Привет, {ROT: NAME}
Покупай точную копию часов Hublot по ссылке {URL}
{BUY}.
Здесь NAME, URL, BUY — это макросы, которым задаются значения до начала рассылки, а ROT означает «выбирать значения макроса NAME последовательно, по кругу». Были и другие префиксы.
Проект получился коммерчески очень удачным. После Mail.ru мы добавили Yandex.ru, Gmail.com, AOL.com, Yahoo.com и другие почтовые сервисы. Мы продали вебмейлер более 12 клиентам по цене от $4000 за копию. Любой дополнительный сервис стоил денег. Также мы сдавали вебмейлеры в аренду. А Mail.ru тем временем захватила волна спама. На это компания отреагировала усилением фильтрации, да с такой степенью, что их фильтры рубили часть легитимной переписки.
В 2009 году новые владельцы Spamdot, партнерская программа Spam It, решили провести конкурс среди участников форума. Суть конкурса была в том, что участникам выдается небольшая почтовая база со специально вставленными контрольными адресами, далее по ней в определенное время нужно провести рассылку. Организаторы проверяют контрольные ящики и распределяют места. Я тогда получил статус Master of Inbox на Spamdot. Рассылки делал вебмейлером через Яндекс. Почту.
Архитектура
Настоящий спамер должен иметь свой ботнет. Тогда и загрузки, и базы будут в безопасности. Так мы и решили с братом. Для этого нужно было сделать максимально эффективного бота — экономного к памяти, не грузящего CPU и невидимого. И написать максимально эффективный к системным ресурсам сервер управления, чтоб не разориться на железе. Например, у Cutwail серверная часть была написана на Python и не держала больше четырех тысяч онлайна. Онлайн ботнета — это количество ботов, отстучавших на сервер управления в течение некоторого времени. Боты подключаются к серверу, например, раз в минуту, отчитываются о выполненных задачах и получают новые. Держать постоянные соединения нет смысла. Бот того же Cutwail работал в usermode, то есть его трафик был виден снифферам (работающим на уровне ядра операционной системы), и он был уязвим к антивирусам.
Разработка началась с посещения мной «Буквоеда» рядом с метро «Площадь Восстания» в Питере. Там я отыскал штук пять книг по руткитам[29] и одну — по разработке драйверов. Из всех книг по руткитам самая ценная была книга Хоглунда и Батлера «Руткиты: внедрение в ядро Windows». В ней было очень много реальных примеров кода.
Мне в то время очень хотелось равняться на Reactor Mailer (Srizbi). Его бот был руткитом ядра ОС Windows. Windows — самая распространенная десктопная операционная система, и писать руткит под Linux коммерчески невыгодно. Srizbi общался напрямую с драйвером сетевого адаптера по интерфейсу NDIS (Network Driver Interface Specification), то есть был невидим для любого антивируса и сниффера.
Книга «Руткиты: внедрение в ядро Windows» как раз и описывала работу бота в ядре операционной системы: как прятать файлы, как прятать драйверы и процессы в памяти, как работать с сетью на низком уровне. Чего мне не хватало, так это знаний в разработке драйверов. Ведь, по сути, хороший руткит режима ядра — это драйвер, который сам себя и маскирует.
Итак, нужно было сделать:
• Сервер управления ботнетом. Требования по памяти и CPU очень критичны. Серверное приложение должно было уместиться на средненьком сервере с 8 Гб памяти, при этом выдерживать онлайн 60 тысяч ботов.
• Бота — руткит режима ядра операционной системы: скрытие своего файла на диске, ключей в реестре, скрытие сетевого трафика, минимальная нагрузка на CPU, минимальный расход оперативной памяти.