Отключаем блокировку DHT в популярных торрент-клиентах


    На многих так называемых «приватных» трекерах торренты раздаются с установленным флагом, не позволяющим использовать сеть 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\"
    Поделиться публикацией
    Похожие публикации
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 48
    • +4

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

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

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


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

          • 0

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

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

              Даже в виде дополнительной настройки вида «игнорировать опции torrent-файла»?
          • 0
            Альтернативный вариант — заменить private на, допустим, privatb.
            Тогда клиент будет искать поле privatb в torrent-файле, а не найдя его — не включит соответствующий режим.
            • 0
              Я встречал и такой вариант патча.
              Но мне кажется подмена имени для всех функций, а не только одной конкретной — не лучшая идея.
              Посмотрите сколько референсов на этот private.
              • 0
                Да, и побочный эффект моего патча: поскольку логика работы программы нарушена только в плане обработки возврата функции и ограничения DHT, в интерфейсе будет показано, что DHT не работает. Но на самом деле сиды будут подтягиваться, при их наличии, конечно.
                • 0
                  Сиды будут подтягиваться с таких же патченых клиенов, т.к. если изменить torrent-файл — будет другой хеш, а на оригинальном хеше с непатченным клиентом все будут сидеть с флагом private и соответственно не светя раздачу в DHT.
            • +10
              Зачем это нужно? Пиров-то больше не станет, у непатченные клиенты не будут анонсировать приватную раздачу по DHT, а Private-флаг меняет infohash раздачи.
              • 0

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

                • 0
                  Хеш не изменится, поскольку сам торрент-файл мы не меняли. Это раз.
                  Зачастую, «приватный» материал — вовсе не приватный, и на DHT масса сидов. Но даже если их нет — это вовсе никак не ухудшит сиутацию, не так ли? Это два.
                  • 0
                    Хорошо, даже если infohash не меняется, откуда появятся сиды? Непатченные клиенты не будут анонсировать эту разрачу в DHT, а если такая раздача есть без флага private, то у нее будет другой infohash.
                    • 0
                      От таких же клиентов, с такими же патчами.
                      Отличие в том, что нет зависимости от трекера. Трекер может иметь частоту апдейта в полчаса — чтобы снизить нагрузку, а некоторые особо «приватные» — находится в дауне сутками.
                      При этом материал всё равно не выйдет за пределы — не зная инфохеш, скачать по DHT не удастся.
                      Честно говоря, я в этом плане вообще не понимаю смысл ключа private, оттого и стала интересна эта проблема.
                      • 0
                        Честно говоря, я в этом плане вообще не понимаю смысл ключа private, оттого и стала интересна эта проблема.
                        Его используют для того, чтобы корректно учитывать рейтинг на закрытых торрент-трекерах (чтобы сходился баланс отданного одними пользователями и скачанного другими), а не для того, чтобы ограничивать права скачивания.
                        • 0
                          Этот баланс легко обводится кучей другого софта — тем же GreedyTorrent.
                          Суть вешается прокси с модификацией данных, общение с трекером — через прокси, с пирами — напрямую.
                          Пока админ лично не займётся проверкой баланса — ничего не всплывёт. А проверять надо много и долго.
                          А с регулярно падающими соединениями с трекером все эти проверки и рейтинги — пустой звук.
                          • 0
                            Это все давно автоматизировано, подобные махинации выявляют в течение суток.
                            • 0
                              Ну как-то у меня не выявили, хотя накручено было более 8 Тб трафика :)
                              Знать надо, как, и не жадничать. Но это уже материал другой статьи )))
                • +2
                  Прочитал по диагонали.
                  Не проще ли редактировать .torrent-файлы, снимать запрет DHT, неужели .torrent-файл зашифровывается в данном случае?

                  Написать программку которая при двойном клике на .torrent-файл, изменяет этот .torrent-файл сбрасывая «флаг запрета DHT», а затем запускает программу uTorrent, что бы uTorrent добавил файл себе на закачку.
                  • +2
                    На сколько понял, при смене private-флага меняется хеш.
                    • 0
                      Изменение флага ведет к изменению хэша торрента. В результате получим совсем другой торрент.
                      • +1
                        Попробуйте скачать любой торрент, отредактировать его и попробовать что-то скачать по новому торренту. Хеш изменится — и Вы не получите ничего.
                        • 0
                          По большому счету, хеш изменится, только если редактировать поле info. Но, да, изменение приватности приводит к изменению хеша.
                      • –1
                        В чем смысл патча-то? Флаг «private» находится внутри секции «info» и его установка меняет sha1 раздачи.
                        Т.е. файл 1.avi размещенный на публичном трекере и приватном будут иметь разные хеши и пиры все равно через DHT не состыкуются т.к. в каждом запросе отправляют свой хеш раздачи.
                        • 0
                          Смысл патча в том, чтобы не менять torrent-файл, но клиенты игнорировали это поле в torrent-файле, как будто его и не было.
                          • 0
                            Прочитайте внимательно что я написал — пиры анонсирующие в DHT раздачу без флага и с флагом «private» будут передавать разные хеши и качать друг с друга не с могут, а т.к. такими патченными клиентами, очевидно, пользуется незначительное меньшинство дополнительных пиров можно не ждать.
                            Итого — смысл патча не ясен.
                              • 0
                                От таких же клиентов, с такими же патчами.

                                И я о том же: дополнительных пиров нет и не будет. Проблему «родной аннонсер не отвечает» проще решить ручным добавлением любого публичного аннонсера, чем клиент ковырять.
                                • +1
                                  Вы сами себе противоречите :)
                                  А публичный анонсер откуда будет знать хеш из приватной раздачи?
                                  • 0
                                    От таких же клиентов, с такими же патчами.
                                    Отличие в том, что нет зависимости от трекера. Трекер может иметь частоту апдейта в полчаса — чтобы снизить нагрузку, а некоторые особо «приватные» — находится в дауне сутками.

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

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

                                    Где противоречие? Суммарно пиров столько же, способ проще и очевиднее.
                                    • 0
                                      Откуда расстроенные анонсеры знают, какие публичные анонсеры прописаны?
                                      Где им встретиться и обсудить общую политику?
                        • 0
                          ваш патч для qbittorrent меняет поведение функции для интерфейса. в ядре qbittorrent — libtorrent — нужно патчиить код библиотеки. вот что вы поменяли github.com/qbittorrent/qBittorrent/blob/53cc8e11156d891e10f0315e98c8ddc8653fe6e7/src/base/bittorrent/torrenthandle.cpp#L265
                          • 0
                            На самом деле это как раз наоборот.
                            Если бы я патчил функцию — менялся бы и интерфейс, то есть для приватных торрентов было бы «DHT — работает». Но функция работает как положено, возвращает корректное значение, однако логика обработки этого значения изменена.
                          • 0
                            Кстати, был приятно удивлён qBitTorrent после долгих лет использования uTorrent. Работает шустрее, опций много полезных.
                            • 0
                              А есть в природе клиенты, лишенные данного недостатка?
                              • 0
                                А чего Вы называете это недостатком? Это — фича самого протокола, её не клиенты придумали.
                                • 0
                                  Эту статью я написал ранее специально для Вас и таких же, как Вы.
                                  • –1
                                    Для таких как я, патчер не может быть 535KB. :)
                                    • 0
                                      • –2
                                        Отлично, автор статьи дал в ней ссылки
                                        >>Патчер распакованного файла uTorrent mir.cr/1BFNFS8D
                                        >>Silent всё-в-одном патчер uTorrent: mir.cr/YBTF8OOV
                                        ведущие на расспространителей троянов.

                                        Трояны на хабре. Это что-то новое.
                                        • +2
                                          По ссылке 12 зеркал Download Link — Click Here, но конечно интереснее жмакнуть на Download Now, не заметить, что размер скачанного — да и имя файла! — отличаются, и получить адварный загрузчик от хостинг-службы.
                                          Очень грустно, когда пользователи Хабра с указанием громкого звания «Программист» в профиле не могут работать с ссылками в интернете.
                                          • –1
                                            Ощущение, что со стенкой разговариваю. По вашей ссылке на вашу работу, на хабре, трояны раздаются, а вам пофиг, еще и из меня идиота делаете.
                                    • 0
                                      Для uTorrent 1.8.2 такой патч можете сделать?
                                      • 0

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

                                        • 0
                                          А я уж подумал, что тут решение проблемы с блокировкой основных DHT нод в торрент-клиенте.
                                          • 0
                                            Торренты раньше спасали

                                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                            Самое читаемое