На многих так называемых «приватных» трекерах торренты раздаются с установленным флагом, не позволяющим использовать сеть DHT. Цель этого — не допускать раздачу материала клиентам, не зарегистрированным на данном трекере. Однако для пользователя это означает уменьшение количества сидеров, иногда — значительное.

Ниже мы рассмотрим, как отключить такое ограничение в популярных торрент-клиентах. Будет рассмотрен общий подход, а также практическое применение к актуальной версии uTorrent и qBitTorrent.

1. Вступление.


В сети в прошлом выкладывалось достаточно много информации касательно так называемых «патчей DHT», равно как выкладывались и сами патчи. Однако при анализе этих данных зачастую они оказываются противоречивыми и даже в ряде случаев полностью нерабочими. Связано это с постоянным обновлением клиентов, изменением структуры программ, а в ряде случаев — неправильным подходом авторов патчей.

Мы попытаемся не просто создать готовое решение, а проанализировать основные шаги так, чтобы читатель мог даже в случае изменение в будущем самостоятельно снимать ограничения DHT в новых версиях клиентов.

2. Подготовка.


Нам понадобятся:

  1. Актуальный дистрибутив торрент-клиента.
  2. Архиватор, способный распаковывать инсталляционные файлы, например в случае uTorrent и qBitTorrent — 7-zip.
  3. Распаковщик исполняемых файлов клиента, в случае uTorrent — UPX.
  4. IDA или любой другой дизассемблер.

Вначале, извлечём и распакуем исполняемые файлы. Для этого откроем скачанные инсталляторы и откроем их в 7-zip. Нам потребуются:

  • в случае uTorrent — файл Carrier.exe;
  • В случае qBitTorrent — файлы qbittorrent.exe и qbittorrent.pdb (либо их 64-разрядные аналоги, если будет изменяться 64-битный клиент).

Для uTorrent также необходимо распаковать UPX-упаковку, это можно сделать командой
upx.exe -d Carrier.exe

2. Поиск и изменение кода.


В общем, реализация блокировки DHT во всех клиентах на уровне Ассемблера выглядит одинаково, это вызов функции проверки флага, и если эта функция возвращает нулевое значение — переход на область кода, которая позволяет использовать DHT:

call TestPrivate
test eax, eax
jz NotPrivate

по этой причине сам патч будет выражаться в простом изменении одного байта кода 74 => EB, превращающего условный переход jz в безусловный и таким образом игнорирующий проверку на «приватность».

Остаётся найти данную функцию.

На самом деле это совершенно не сложно, учитывая специфику данного кода и наличие ключевого слова «private». Откроем распакованный файл клиента uTorrent в IDA и выполним поиск по данному ключевому слову:



Видно, что с указанным ключом в uTorrent присутствует всего три участка кода. Вот как они выглядят:


Совершенно очевидно, что необходимый нам код — это третий в списке, поскольку только он представляет собой вызов функции и проверку возврата на ноль с последующим условным переходом.

Наша задача заключается в простом замене функции, как мы уже упоминали ранее:

По сути, это замена характерной последовательности
68 00 FF 69 00 E8 19 F1 FA FF 85 C0 74 07
на
68 00 FF 69 00 E8 19 F1 FA FF 85 C0 EB 07

В случае qBitTorrent задача упрощается ещё больше, поскольку разработчик вложил pdb-файл в установщик, так что названия функций будут более очевидными, и поиск по ключевому слову упрощается:



Так выглядит сам код проверки:



Как видите, по сути он неотличим от uTorrent. Патч будет аналогичным:



Это замена характерной последовательности
E8 20 CB FA FF 84 C0 74 59
на
E8 20 CB FA FF 84 C0 EB 59

qBitTorrent также предлагается в виде 64-разрядного клиента. Действия в отношении него буду совершенно аналогичными, за исключением того, что нам потребуется 64-разрядная версия IDA. Результат поиска по ключевому слову ожидаемо аналогичен:



Вид соответствующей функции несколько отличен, однако суть осталась та же:



Ну и соответствующий патч, здесь это будет три байта:



Это замена характерной последовательности
E8 8F 0E F8 FF 4C 8D 3D 54 E5 46 01 83 CB FF 84 C0 0F 84 DB 00 00 00
на
E8 8F 0E F8 FF 4C 8D 3D 54 E5 46 01 83 CB FF 84 C0 E9 DC 00 00 00 00

3. Итоги


Нами было последовательно изучена процедура поиска и отключения функции ограничения использования DHT для приватных торрентов в популярных клиентах uTorrent и qBitTorrent.
Думаю, что предложенный механизм будет аналогичен и для любых других клиентов — во всяком случае я проверил его и на ComboPlayer.

Для автоматизации процесса мной были созданы два патчера для актуальных версий uTorrent и qBitTorrent. Для uTorrent патчер также распаковывает исходный инсталлятор. Файлы можно скачать здесь:

Патчер qBitTorrent версии x32
Патчер qBitTorrent версии x64
Патчер распакованного файла uTorrent
Silent всё-в-одном патчер uTorrent: распаковывает, патчит и обратно упаковывает инсталлятор, а также распаковывает, патчит и упаковывает обратно уже установленный uTorrent (при условии, что установочная папка — по умолчанию, то есть "%userprofile%\AppData\Roaming\uTorrent\"

Комментарии (46)


  1. ZyXI
    19.01.2018 00:38

    qBitTorrent, вообще?то, имеет открытый исходный код (и libtorrent тоже). Патч к нему надёжнее, чем бинарный патч, он слишком зависит от стабильности выхода используемого автора компилятора.


    1. gjf Автор
      19.01.2018 00:45

      Я знаю. Честно признаться, исходно идея замышлялась на uTorrent. Потом стало интересно: а также у других или нет? И поскольку с х32 было уже скучно, нашёл такое, чтобы было ещё и х64.
      Так что рассматривайте статью как пример, работающий на большинстве клиентов, неважно — закрытых или опенсорсных.


    1. demoth
      19.01.2018 01:07

      В данном случае — без разницы. Патч исходников в официальный репозиторий всё равно не возьмут, а значит под каждый релиз заново накладывать патч и пересобирать.


      Кстати, есть у меня ощущение, что патч от автора не отключает блокировку DHT в qBitTorrent, а лишь заставляет GUI отображать DHT в списке трекеров таким, будто бы он включён. Судя по всему, сама блокировка dht идёт в libtorrent (функция should_announce_dht).


      1. ZyXI
        19.01.2018 11:35

        Именно эта процедура «заново накладывать патч и пересобирать» и является более надёжной, так что я бы не сказал «без разницы».


      1. navion
        19.01.2018 13:31

        Патч исходников в официальный репозиторий всё равно не возьмут

        Даже в виде дополнительной настройки вида «игнорировать опции torrent-файла»?


  1. dartraiden
    19.01.2018 01:14

    Альтернативный вариант — заменить private на, допустим, privatb.
    Тогда клиент будет искать поле privatb в torrent-файле, а не найдя его — не включит соответствующий режим.


    1. gjf Автор
      19.01.2018 01:17

      Я встречал и такой вариант патча.
      Но мне кажется подмена имени для всех функций, а не только одной конкретной — не лучшая идея.
      Посмотрите сколько референсов на этот private.


    1. gjf Автор
      19.01.2018 12:53

      Да, и побочный эффект моего патча: поскольку логика работы программы нарушена только в плане обработки возврата функции и ограничения DHT, в интерфейсе будет показано, что DHT не работает. Но на самом деле сиды будут подтягиваться, при их наличии, конечно.


      1. GennPen
        19.01.2018 13:52

        Сиды будут подтягиваться с таких же патченых клиенов, т.к. если изменить torrent-файл — будет другой хеш, а на оригинальном хеше с непатченным клиентом все будут сидеть с флагом private и соответственно не светя раздачу в DHT.



  1. ValdikSS
    19.01.2018 03:19

    Зачем это нужно? Пиров-то больше не станет, у непатченные клиенты не будут анонсировать приватную раздачу по DHT, а Private-флаг меняет infohash раздачи.


    1. monah_tuk
      19.01.2018 06:31

      Тоже про это подумал. Сиды этого торрента — пользователи приватного трекера. Откуда их станет больше? Если только какой-то добрый человек будет переопубликовывать сей торрент на других ресурсах, без регистрации и SMS. Но тогда нужны пользователи с патченными клиентами, коих тоже будет мало мало мало.


    1. gjf Автор
      19.01.2018 12:49

      Хеш не изменится, поскольку сам торрент-файл мы не меняли. Это раз.
      Зачастую, «приватный» материал — вовсе не приватный, и на DHT масса сидов. Но даже если их нет — это вовсе никак не ухудшит сиутацию, не так ли? Это два.


      1. ValdikSS
        19.01.2018 15:09

        Хорошо, даже если infohash не меняется, откуда появятся сиды? Непатченные клиенты не будут анонсировать эту разрачу в DHT, а если такая раздача есть без флага private, то у нее будет другой infohash.


        1. gjf Автор
          19.01.2018 15:37

          От таких же клиентов, с такими же патчами.
          Отличие в том, что нет зависимости от трекера. Трекер может иметь частоту апдейта в полчаса — чтобы снизить нагрузку, а некоторые особо «приватные» — находится в дауне сутками.
          При этом материал всё равно не выйдет за пределы — не зная инфохеш, скачать по DHT не удастся.
          Честно говоря, я в этом плане вообще не понимаю смысл ключа private, оттого и стала интересна эта проблема.


          1. ValdikSS
            19.01.2018 15:40

            Честно говоря, я в этом плане вообще не понимаю смысл ключа private, оттого и стала интересна эта проблема.
            Его используют для того, чтобы корректно учитывать рейтинг на закрытых торрент-трекерах (чтобы сходился баланс отданного одними пользователями и скачанного другими), а не для того, чтобы ограничивать права скачивания.


            1. gjf Автор
              19.01.2018 15:59

              Этот баланс легко обводится кучей другого софта — тем же GreedyTorrent.
              Суть вешается прокси с модификацией данных, общение с трекером — через прокси, с пирами — напрямую.
              Пока админ лично не займётся проверкой баланса — ничего не всплывёт. А проверять надо много и долго.
              А с регулярно падающими соединениями с трекером все эти проверки и рейтинги — пустой звук.


              1. ValdikSS
                19.01.2018 16:00

                Это все давно автоматизировано, подобные махинации выявляют в течение суток.


                1. gjf Автор
                  19.01.2018 16:06

                  Ну как-то у меня не выявили, хотя накручено было более 8 Тб трафика :)
                  Знать надо, как, и не жадничать. Но это уже материал другой статьи )))


  1. Varim
    19.01.2018 05:22

    Прочитал по диагонали.
    Не проще ли редактировать .torrent-файлы, снимать запрет DHT, неужели .torrent-файл зашифровывается в данном случае?

    Написать программку которая при двойном клике на .torrent-файл, изменяет этот .torrent-файл сбрасывая «флаг запрета DHT», а затем запускает программу uTorrent, что бы uTorrent добавил файл себе на закачку.


    1. GennPen
      19.01.2018 09:30
      +1

      На сколько понял, при смене private-флага меняется хеш.


    1. impalex
      19.01.2018 12:47

      Изменение флага ведет к изменению хэша торрента. В результате получим совсем другой торрент.


    1. gjf Автор
      19.01.2018 12:48

      Попробуйте скачать любой торрент, отредактировать его и попробовать что-то скачать по новому торренту. Хеш изменится — и Вы не получите ничего.


      1. nickbug
        19.01.2018 15:55

        По большому счету, хеш изменится, только если редактировать поле info. Но, да, изменение приватности приводит к изменению хеша.


  1. TheRaven
    19.01.2018 09:50

    В чем смысл патча-то? Флаг «private» находится внутри секции «info» и его установка меняет sha1 раздачи.
    Т.е. файл 1.avi размещенный на публичном трекере и приватном будут иметь разные хеши и пиры все равно через DHT не состыкуются т.к. в каждом запросе отправляют свой хеш раздачи.


    1. qw1
      19.01.2018 10:58

      Смысл патча в том, чтобы не менять torrent-файл, но клиенты игнорировали это поле в torrent-файле, как будто его и не было.


      1. TheRaven
        22.01.2018 09:41

        Прочитайте внимательно что я написал — пиры анонсирующие в DHT раздачу без флага и с флагом «private» будут передавать разные хеши и качать друг с друга не с могут, а т.к. такими патченными клиентами, очевидно, пользуется незначительное меньшинство дополнительных пиров можно не ждать.
        Итого — смысл патча не ясен.


        1. gjf Автор
          22.01.2018 10:54
          +1

          1. TheRaven
            22.01.2018 11:11

            От таких же клиентов, с такими же патчами.

            И я о том же: дополнительных пиров нет и не будет. Проблему «родной аннонсер не отвечает» проще решить ручным добавлением любого публичного аннонсера, чем клиент ковырять.


            1. gjf Автор
              22.01.2018 11:15
              +1

              Вы сами себе противоречите :)
              А публичный анонсер откуда будет знать хеш из приватной раздачи?


              1. TheRaven
                22.01.2018 11:27

                От таких же клиентов, с такими же патчами.
                Отличие в том, что нет зависимости от трекера. Трекер может иметь частоту апдейта в полчаса — чтобы снизить нагрузку, а некоторые особо «приватные» — находится в дауне сутками.

                Т.е. вы обозначили проблему — родной аннонсер в дауне.
                Расстроенные пользователи удаляют свой старый торрент-клиент и ставят патченный, связываются через DHT, качают.

                Точно так же расстроенные пользователи могут прописать в раздачу N дополнительных публичных аннонсеров и получить тот же результат.

                Где противоречие? Суммарно пиров столько же, способ проще и очевиднее.


                1. gjf Автор
                  22.01.2018 11:31

                  Откуда расстроенные анонсеры знают, какие публичные анонсеры прописаны?
                  Где им встретиться и обсудить общую политику?


  1. ruslanfedoseenko
    19.01.2018 11:12

    ваш патч для qbittorrent меняет поведение функции для интерфейса. в ядре qbittorrent — libtorrent — нужно патчиить код библиотеки. вот что вы поменяли github.com/qbittorrent/qBittorrent/blob/53cc8e11156d891e10f0315e98c8ddc8653fe6e7/src/base/bittorrent/torrenthandle.cpp#L265


    1. gjf Автор
      19.01.2018 12:51

      На самом деле это как раз наоборот.
      Если бы я патчил функцию — менялся бы и интерфейс, то есть для приватных торрентов было бы «DHT — работает». Но функция работает как положено, возвращает корректное значение, однако логика обработки этого значения изменена.


  1. BigD
    19.01.2018 21:40

    Кстати, был приятно удивлён qBitTorrent после долгих лет использования uTorrent. Работает шустрее, опций много полезных.


  1. Quei
    19.01.2018 21:52

    А есть в природе клиенты, лишенные данного недостатка?


    1. gjf Автор
      19.01.2018 21:53

      А чего Вы называете это недостатком? Это — фича самого протокола, её не клиенты придумали.


  1. chmv
    21.01.2018 15:08
    -1

    1. gjf Автор
      21.01.2018 15:13

      Эту статью я написал ранее специально для Вас и таких же, как Вы.


      1. chmv
        21.01.2018 15:37
        -1

        Для таких как я, патчер не может быть 535KB. :)


        1. gjf Автор
          21.01.2018 15:39


        1. chmv
          21.01.2018 15:52
          -1

          Отлично, автор статьи дал в ней ссылки
          >>Патчер распакованного файла uTorrent mir.cr/1BFNFS8D
          >>Silent всё-в-одном патчер uTorrent: mir.cr/YBTF8OOV
          ведущие на расспространителей троянов.

          Трояны на хабре. Это что-то новое.


        1. gjf Автор
          21.01.2018 15:52

          По ссылке 12 зеркал Download Link — Click Here, но конечно интереснее жмакнуть на Download Now, не заметить, что размер скачанного — да и имя файла! — отличаются, и получить адварный загрузчик от хостинг-службы.
          Очень грустно, когда пользователи Хабра с указанием громкого звания «Программист» в профиле не могут работать с ссылками в интернете.


          1. chmv
            22.01.2018 14:30
            -1

            Ощущение, что со стенкой разговариваю. По вашей ссылке на вашу работу, на хабре, трояны раздаются, а вам пофиг, еще и из меня идиота делаете.


  1. WayMax
    22.01.2018 09:30

    Для uTorrent 1.8.2 такой патч можете сделать?


  1. dragoangel
    22.01.2018 12:15

    Что никто не пользуеться transmission? Надо будет себе на роутере бины перекомпилить или пропатчить попробовать в asuswrt download master.