Реанимируем Dctc для борьбы с ложными файлами

Года 4 назад у меня родилась идея - написать бота, который бы отслеживал активность в нашем локальном DC-хабе - просто логировал чат и выполнял простые команды в приват. За пару вечеров был найден прекрасный консольный клиент - dctc, с которым можно взаимодействовать через unix-socket; а ещё за пару вечеров - написан простенький бот на php. При создании бота были внесены первые поправки в код dctc, чтобы он не посылал странные команды на сервер. Через некоторое время меня сделали модератором на этом самом хабе и я начал безжалостно банить. Но удобной системы для отслеживания количества банов у конкретных людей не было, но администратор каждые 5 минут генерировал информацию по текущим банам - ещё несколько убитых вечеров - и вот администрация обрела лёгкую возможность отслеживать порядковый номер бана.

Спустя ещё несколько месяцев в сети стали появляться фэйки - это когда, например, скачиваешь Шрэка, а там вовсе даже не Шрэк, а красная шапочка и трое непонятных мужиков… Некоторое время боролись своими силами, но душа поэта не выдержала - и я решил улучшить бота.

  1. В код dctc (v0.85.9) была добавлена обработка и хранение IP-адреса пользователя, проверка пользователя на online\offline, возможность отправки сырых команд на сервер. Обмен файлами в современных сетях по-прежнему невозможен - клиент не дружит с TTH.
  2. В бота, находящегося на стороне сервера, добавлена функция отсылки “уведомлений” пользователям - человеку в общий чат и в ЛС отправляется указанное сообщение, после чего пользователь перенаправляется на несуществующий хаб. Т.о. если человек повторно зашёл на хаб - можно с достаточной долей уверенности сказать, что человек прочитал уведомление.
  3. Так же - при появлении пользователя на хабе к нему автоматически отправляются запросы на поиск нескольких самых распространённых TTH.
  4. В контекстном меню файлов добавилась функция “сообщить о фейке” - при использовании которой отправляется сообщение модераторам хаба с указанием TTH файла.
  5. Полностью переписан мой бот: функции для работы с DCTC вынесены в отдельный класс и этот класс расширяется функциями, специфичными для нашего хаба.
  6. Скрипт поиска решено было разбить на 2 части - одна из них лишь отправляет запросы на поиск, а вторая - занимается анализом ответов на эти самые запросы.
  7. Из-за того, что скрипт был внедрён спустя некоторое время, а не сразу же после возникновения проблемы - количество банов за фейки у пользователя ищется через общую таблицу банов, а не через отдельную.
  8. Перед баном - пользователю отсылается уведомление о наличии у него некорректных файлов и только если такое уведомление уже отсылалось - применяется бан на период, зависящий от количества подобных нарушений.

При работе всей системы используются следующие таблицы:

  • 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 и наслаждаемся массовыми расстрелами.

Надеюсь кому-нибудь в чём-нибудь да поможет.

Comments