Pull to refresh

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

Reading time3 min
Views663
Года 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: Дамп структуры таблиц

Накладываем патч:
Скачиваем 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 и наслаждаемся массовыми расстрелами.

Надеюсь кому-нибудь в чём-нибудь да поможет.
Tags:
Hubs:
+14
Comments7

Articles