На многих так называемых «приватных» трекерах торренты раздаются с установленным флагом, не позволяющим использовать сеть DHT. Цель этого — не допускать раздачу материала клиентам, не зарегистрированным на данном трекере. Однако для пользователя это означает уменьшение количества сидеров, иногда — значительное.
Ниже мы рассмотрим, как отключить такое ограничение в популярных торрент-клиентах. Будет рассмотрен общий подход, а также практическое применение к актуальной версии uTorrent и qBitTorrent.
1. Вступление.
В сети в прошлом выкладывалось достаточно много информации касательно так называемых «патчей DHT», равно как выкладывались и сами патчи. Однако при анализе этих данных зачастую они оказываются противоречивыми и даже в ряде случаев полностью нерабочими. Связано это с постоянным обновлением клиентов, изменением структуры программ, а в ряде случаев — неправильным подходом авторов патчей.
Мы попытаемся не просто создать готовое решение, а проанализировать основные шаги так, чтобы читатель мог даже в случае изменение в будущем самостоятельно снимать ограничения DHT в новых версиях клиентов.
2. Подготовка.
Нам понадобятся:
- Актуальный дистрибутив торрент-клиента.
- Архиватор, способный распаковывать инсталляционные файлы, например в случае uTorrent и qBitTorrent — 7-zip.
- Распаковщик исполняемых файлов клиента, в случае uTorrent — UPX.
- 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)
dartraiden
19.01.2018 01:14Альтернативный вариант — заменить private на, допустим, privatb.
Тогда клиент будет искать поле privatb в torrent-файле, а не найдя его — не включит соответствующий режим.gjf Автор
19.01.2018 01:17Я встречал и такой вариант патча.
Но мне кажется подмена имени для всех функций, а не только одной конкретной — не лучшая идея.
Посмотрите сколько референсов на этот private.
gjf Автор
19.01.2018 12:53Да, и побочный эффект моего патча: поскольку логика работы программы нарушена только в плане обработки возврата функции и ограничения DHT, в интерфейсе будет показано, что DHT не работает. Но на самом деле сиды будут подтягиваться, при их наличии, конечно.
GennPen
19.01.2018 13:52Сиды будут подтягиваться с таких же патченых клиенов, т.к. если изменить torrent-файл — будет другой хеш, а на оригинальном хеше с непатченным клиентом все будут сидеть с флагом private и соответственно не светя раздачу в DHT.
ValdikSS
19.01.2018 03:19Зачем это нужно? Пиров-то больше не станет, у непатченные клиенты не будут анонсировать приватную раздачу по DHT, а Private-флаг меняет infohash раздачи.
monah_tuk
19.01.2018 06:31Тоже про это подумал. Сиды этого торрента — пользователи приватного трекера. Откуда их станет больше? Если только какой-то добрый человек будет переопубликовывать сей торрент на других ресурсах, без регистрации и SMS. Но тогда нужны пользователи с патченными клиентами, коих тоже будет мало мало мало.
gjf Автор
19.01.2018 12:49Хеш не изменится, поскольку сам торрент-файл мы не меняли. Это раз.
Зачастую, «приватный» материал — вовсе не приватный, и на DHT масса сидов. Но даже если их нет — это вовсе никак не ухудшит сиутацию, не так ли? Это два.ValdikSS
19.01.2018 15:09Хорошо, даже если infohash не меняется, откуда появятся сиды? Непатченные клиенты не будут анонсировать эту разрачу в DHT, а если такая раздача есть без флага private, то у нее будет другой infohash.
gjf Автор
19.01.2018 15:37От таких же клиентов, с такими же патчами.
Отличие в том, что нет зависимости от трекера. Трекер может иметь частоту апдейта в полчаса — чтобы снизить нагрузку, а некоторые особо «приватные» — находится в дауне сутками.
При этом материал всё равно не выйдет за пределы — не зная инфохеш, скачать по DHT не удастся.
Честно говоря, я в этом плане вообще не понимаю смысл ключа private, оттого и стала интересна эта проблема.ValdikSS
19.01.2018 15:40Честно говоря, я в этом плане вообще не понимаю смысл ключа private, оттого и стала интересна эта проблема.
Его используют для того, чтобы корректно учитывать рейтинг на закрытых торрент-трекерах (чтобы сходился баланс отданного одними пользователями и скачанного другими), а не для того, чтобы ограничивать права скачивания.gjf Автор
19.01.2018 15:59Этот баланс легко обводится кучей другого софта — тем же GreedyTorrent.
Суть вешается прокси с модификацией данных, общение с трекером — через прокси, с пирами — напрямую.
Пока админ лично не займётся проверкой баланса — ничего не всплывёт. А проверять надо много и долго.
А с регулярно падающими соединениями с трекером все эти проверки и рейтинги — пустой звук.
Varim
19.01.2018 05:22Прочитал по диагонали.
Не проще ли редактировать .torrent-файлы, снимать запрет DHT, неужели .torrent-файл зашифровывается в данном случае?
Написать программку которая при двойном клике на .torrent-файл, изменяет этот .torrent-файл сбрасывая «флаг запрета DHT», а затем запускает программу uTorrent, что бы uTorrent добавил файл себе на закачку.impalex
19.01.2018 12:47Изменение флага ведет к изменению хэша торрента. В результате получим совсем другой торрент.
gjf Автор
19.01.2018 12:48Попробуйте скачать любой торрент, отредактировать его и попробовать что-то скачать по новому торренту. Хеш изменится — и Вы не получите ничего.
nickbug
19.01.2018 15:55По большому счету, хеш изменится, только если редактировать поле info. Но, да, изменение приватности приводит к изменению хеша.
TheRaven
19.01.2018 09:50В чем смысл патча-то? Флаг «private» находится внутри секции «info» и его установка меняет sha1 раздачи.
Т.е. файл 1.avi размещенный на публичном трекере и приватном будут иметь разные хеши и пиры все равно через DHT не состыкуются т.к. в каждом запросе отправляют свой хеш раздачи.qw1
19.01.2018 10:58Смысл патча в том, чтобы не менять torrent-файл, но клиенты игнорировали это поле в torrent-файле, как будто его и не было.
TheRaven
22.01.2018 09:41Прочитайте внимательно что я написал — пиры анонсирующие в DHT раздачу без флага и с флагом «private» будут передавать разные хеши и качать друг с друга не с могут, а т.к. такими патченными клиентами, очевидно, пользуется незначительное меньшинство дополнительных пиров можно не ждать.
Итого — смысл патча не ясен.gjf Автор
22.01.2018 10:54+1TheRaven
22.01.2018 11:11От таких же клиентов, с такими же патчами.
И я о том же: дополнительных пиров нет и не будет. Проблему «родной аннонсер не отвечает» проще решить ручным добавлением любого публичного аннонсера, чем клиент ковырять.gjf Автор
22.01.2018 11:15+1Вы сами себе противоречите :)
А публичный анонсер откуда будет знать хеш из приватной раздачи?TheRaven
22.01.2018 11:27От таких же клиентов, с такими же патчами.
Отличие в том, что нет зависимости от трекера. Трекер может иметь частоту апдейта в полчаса — чтобы снизить нагрузку, а некоторые особо «приватные» — находится в дауне сутками.
Т.е. вы обозначили проблему — родной аннонсер в дауне.
Расстроенные пользователи удаляют свой старый торрент-клиент и ставят патченный, связываются через DHT, качают.
Точно так же расстроенные пользователи могут прописать в раздачу N дополнительных публичных аннонсеров и получить тот же результат.
Где противоречие? Суммарно пиров столько же, способ проще и очевиднее.gjf Автор
22.01.2018 11:31Откуда расстроенные анонсеры знают, какие публичные анонсеры прописаны?
Где им встретиться и обсудить общую политику?
ruslanfedoseenko
19.01.2018 11:12ваш патч для qbittorrent меняет поведение функции для интерфейса. в ядре qbittorrent — libtorrent — нужно патчиить код библиотеки. вот что вы поменяли github.com/qbittorrent/qBittorrent/blob/53cc8e11156d891e10f0315e98c8ddc8653fe6e7/src/base/bittorrent/torrenthandle.cpp#L265
gjf Автор
19.01.2018 12:51На самом деле это как раз наоборот.
Если бы я патчил функцию — менялся бы и интерфейс, то есть для приватных торрентов было бы «DHT — работает». Но функция работает как положено, возвращает корректное значение, однако логика обработки этого значения изменена.
BigD
19.01.2018 21:40Кстати, был приятно удивлён qBitTorrent после долгих лет использования uTorrent. Работает шустрее, опций много полезных.
chmv
21.01.2018 15:08-113 / 67
www.virustotal.com/#/file/55d68830de74ae910ce003d7306b3f526b19e017b28a5a933b213be1221f1ba1/detectiongjf Автор
21.01.2018 15:13Эту статью я написал ранее специально для Вас и таких же, как Вы.
chmv
21.01.2018 15:37-1Для таких как я, патчер не может быть 535KB. :)
chmv
21.01.2018 15:52-1Отлично, автор статьи дал в ней ссылки
>>Патчер распакованного файла uTorrent mir.cr/1BFNFS8D
>>Silent всё-в-одном патчер uTorrent: mir.cr/YBTF8OOV
ведущие на расспространителей троянов.
Трояны на хабре. Это что-то новое.
gjf Автор
21.01.2018 15:52По ссылке 12 зеркал Download Link — Click Here, но конечно интереснее жмакнуть на Download Now, не заметить, что размер скачанного — да и имя файла! — отличаются, и получить адварный загрузчик от хостинг-службы.
Очень грустно, когда пользователи Хабра с указанием громкого звания «Программист» в профиле не могут работать с ссылками в интернете.chmv
22.01.2018 14:30-1Ощущение, что со стенкой разговариваю. По вашей ссылке на вашу работу, на хабре, трояны раздаются, а вам пофиг, еще и из меня идиота делаете.
dragoangel
22.01.2018 12:15Что никто не пользуеться transmission? Надо будет себе на роутере бины перекомпилить или пропатчить попробовать в asuswrt download master.
ZyXI
qBitTorrent, вообще?то, имеет открытый исходный код (и libtorrent тоже). Патч к нему надёжнее, чем бинарный патч, он слишком зависит от стабильности выхода используемого автора компилятора.
gjf Автор
Я знаю. Честно признаться, исходно идея замышлялась на uTorrent. Потом стало интересно: а также у других или нет? И поскольку с х32 было уже скучно, нашёл такое, чтобы было ещё и х64.
Так что рассматривайте статью как пример, работающий на большинстве клиентов, неважно — закрытых или опенсорсных.
demoth
В данном случае — без разницы. Патч исходников в официальный репозиторий всё равно не возьмут, а значит под каждый релиз заново накладывать патч и пересобирать.
Кстати, есть у меня ощущение, что патч от автора не отключает блокировку DHT в qBitTorrent, а лишь заставляет GUI отображать DHT в списке трекеров таким, будто бы он включён. Судя по всему, сама блокировка dht идёт в libtorrent (функция should_announce_dht).
ZyXI
Именно эта процедура «заново накладывать патч и пересобирать» и является более надёжной, так что я бы не сказал «без разницы».
navion
Даже в виде дополнительной настройки вида «игнорировать опции torrent-файла»?