Реанимируем Dctc для борьбы с ложными файлами
Года 4 назад у меня родилась идея - написать бота, который бы отслеживал активность в нашем локальном DC-хабе - просто логировал чат и выполнял простые команды в приват. За пару вечеров был найден прекрасный консольный клиент - dctc, с которым можно взаимодействовать через unix-socket; а ещё за пару вечеров - написан простенький бот на php. При создании бота были внесены первые поправки в код dctc, чтобы он не посылал странные команды на сервер. Через некоторое время меня сделали модератором на этом самом хабе и я начал безжалостно банить. Но удобной системы для отслеживания количества банов у конкретных людей не было, но администратор каждые 5 минут генерировал информацию по текущим банам - ещё несколько убитых вечеров - и вот администрация обрела лёгкую возможность отслеживать порядковый номер бана.
Спустя ещё несколько месяцев в сети стали появляться фэйки - это когда, например, скачиваешь Шрэка, а там вовсе даже не Шрэк, а красная шапочка и трое непонятных мужиков… Некоторое время боролись своими силами, но душа поэта не выдержала - и я решил улучшить бота.
- В код dctc (v0.85.9) была добавлена обработка и хранение IP-адреса пользователя, проверка пользователя на online\offline, возможность отправки сырых команд на сервер. Обмен файлами в современных сетях по-прежнему невозможен - клиент не дружит с TTH.
- В бота, находящегося на стороне сервера, добавлена функция отсылки “уведомлений” пользователям - человеку в общий чат и в ЛС отправляется указанное сообщение, после чего пользователь перенаправляется на несуществующий хаб. Т.о. если человек повторно зашёл на хаб - можно с достаточной долей уверенности сказать, что человек прочитал уведомление.
- Так же - при появлении пользователя на хабе к нему автоматически отправляются запросы на поиск нескольких самых распространённых TTH.
- В контекстном меню файлов добавилась функция “сообщить о фейке” - при использовании которой отправляется сообщение модераторам хаба с указанием TTH файла.
- Полностью переписан мой бот: функции для работы с DCTC вынесены в отдельный класс и этот класс расширяется функциями, специфичными для нашего хаба.
- Скрипт поиска решено было разбить на 2 части - одна из них лишь отправляет запросы на поиск, а вторая - занимается анализом ответов на эти самые запросы.
- Из-за того, что скрипт был внедрён спустя некоторое время, а не сразу же после возникновения проблемы - количество банов за фейки у пользователя ищется через общую таблицу банов, а не через отдельную.
- Перед баном - пользователю отсылается уведомление о наличии у него некорректных файлов и только если такое уведомление уже отсылалось - применяется бан на период, зависящий от количества подобных нарушений.
При работе всей системы используются следующие таблицы:
- bans: Глобальное хранилище банов
- fake_check: Лог поиска фейков
- fake_list: Список зарегистрированных фейков
- fake_names_order: Списки файлов с запрещёнными и разрешёнными именами для каждого фейка
- fake_bans: Баны за фейки, используется только для логирования
- fake_notifies: Уведомления о наличии фейков, используется только для логирования
- fake_counter2: Количество файлов, не отнесённых ни в разрешённый, ни в запрещённый списки
Архив со всеми (кажется) необходимыми файлами: dctc.tar.bz2.html. Файлы:
- dctc.patch: Патч, который нужно наложить на dctc версии 0.85.9
- dctc.sh: Скрипт, которым я запускаю dctc. Он так же меняет права на доступ к сокету, т.о. всё члены группы dctc смогут с ним работать.
- dctcController.php: Базовый класс для работы с сокетом dctc
- dctcController_tech.php: Класс с настройками и дополнительными функциями для нашего хаба
- fakes.php: Страница для управления базой фейков
- reply_analizer.php: Анализатор ответов поиска - ведёт различные логи, уведомляет и банит пользователей
- search.php: Инициирует поиск 20 произвольных фейков
- tables.sql: Дамп структуры таблиц
Накладываем патч:
Скачиваем http://ac2i.homelinux.com/dctc/dctc-0.85.9.tar.gz, распаковываем, командуем patch -p1 -ddctc-0.85.9 < dctc.patch
.
Основная цель патча - добавить в dctc поддержку команды $UserIP - дабы мы могли узнавать IP-адрес пользователя, которого хотим банить.
Самое интересное так это то, что dctc нормально работает после моего патча - c/c++ я знаю только по университетскому курсу. Всё как-то на php больше быдлокожу…
Компилируем, устанавливаем, запускаем dctc. Как его запускать - смотрим в dctc.sh.
Дальше нужно поправить класс dctcController_tech - команды на бан и уведомление у вас, скорее всего, другие. Да и hubCharset, возможно, тоже отличается. В переменной $_socketPathFile лежит путь до файла, в котором сохраняется путь до сокета. Вот такое вот извращение. Для ограничения частоты поиска используется shared memory - дёшево и сердито. Убедитесь, что ваш php это умеет.
Инициализируем БД и через fakes.php записываем всякие нехорошие TTH в базу.
Затем в фоне (или в скрине, кому как больше нравится) запускаем скрипт reply_analizer.php - он будет молча делать свои грязные делишки.
Дальше настраиваем периодический запуск search.php и наслаждаемся массовыми расстрелами.
Надеюсь кому-нибудь в чём-нибудь да поможет.