📱 tsrman/tg — форк Telegram для Android со сменой JA4 на клиенте

О чём заметка

tsrman/tg — форк официального приложения Telegram для Android (исходники DrKLO), который меняет TLS-почерк (JA4) FakeTLS-подключения к MTProto-прокси прямо в клиенте и добавляет джиттер между коннектами. Это готовый GUI-клиент, воплощающий тезис из разбора, почему обход MTProxy клиентский: чистая смена JA4 возможна только на стороне клиента — и здесь она встроена в обычное приложение, а не в отдельный relay или библиотеку. Ниже — что именно он меняет, результат проверки безопасности и как соотносится с детекцией ТСПУ (Технические Средства Противодействия Угрозам — DPI-оборудование российских операторов).

Результат проверки безопасности (июнь 2026)

В отревьюированной дельте автора не нашлось утечек, бэкдоров или чужих адресов, а база — подлинный официальный Telegram (общая история с DrKLO/Telegram подтверждена по полному SHA коммита). Проверен один коммит автора, а не весь миррор целиком (оговорки — в разделе Безопасность: что проверено), так что вердикт «запускать со своим аккаунтом можно» — условный, с поправкой на доверие к автору форка. Главная защита: APK собираешь из исходников сам, готового бинарника для подмены нет.


TL;DR

  1. Это официальный Telegram для Android + ровно один коммит автора (Pavel/tsrman) поверх миррора, синхронизирующего версии (на момент проверки — Telegram 12.7.3).
  2. Коммит меняет 3 файла в нативном MTProto-слое (TMessagesProj/jni/tgnet/): новый Firefox-подобный FakeTLS-ClientHello (JA4 t13d1616h2_86a278354501_eeeea6562960), случайная задержка 500–1000 мс между подключениями к прокси, ленивое создание push-соединения.
  3. По логике детекции (модель из трёх условий — наблюдения сообщества, см. заметку-источник, а не спецификация ТСПУ) это удар по двум из трёх условий: меняет JA4 (условие 1) и ломает «залп на один ip:port» (условие 3). Ротацию SNI (условие 2) он не делает — SNI задаётся ee-секретом прокси.
  4. Заодно обновляется узнаваемый старый отпечаток (та же болезнь протухшего почерка, что в [[Zapret/mtproto/10-telemt-logs-dpi|#30733]] у Telegram Desktop): вместо него отправляется свежий Firefox-подобный.
  5. Проверка безопасности: в дельте автора не нашлось утечек или чужих адресов, база — подлинный Telegram. Это неофициальный форк — доверие к автору и отставание от security-патчей официального клиента остаются на тебе.
  6. Только Android; собирается из исходников (Android Studio или Dockerfile), нужен свой api_id/api_hash.

Что именно меняет автор

Вся собственная дельта форка — один коммит (9fe18931d, «Изменен FakeTLS на ‘JA4.1’… добавлена случайная задержка подключения к MTProto»), три файла:

ФайлИзменениеЗачем
jni/tgnet/ConnectionSocket.cppНовый шаблон getFirefoxDefault() — FakeTLS-ClientHello под отпечаток Firefox (GREASE, TLS 1.3 cipher-suites, ALPN h2/http/1.1, key_share); замена getDefault() → getFirefoxDefault()Сменить JA4 Telegram на браузерный (условие 1 детекта)
jni/tgnet/ConnectionSocket.cpp«Jitter»: если предыдущий коннект к прокси был <1200 мс назад — пауза 500–1000 мсРазмыть «залп на один ip:port» (условие 3 детекта)
jni/tgnet/ConnectionsManager.cppPush-соединение создаётся лениво (через select()), а не разом на стартеМеньше одновременных коннектов = меньше похоже на залп
jni/tgnet/Connection.cppДобавлена пустая строкаNo-op

SNI он не ротирует — и это ожидаемо

Из трёх условий детекции (JA4 + одинаковый SNI + залп) форк бьёт по первому и третьему. Ротация SNI осталась за бортом, потому что в FakeTLS имя домена задаётся ee-секретом прокси (tls_domain), а не клиентом «из воздуха» — подробнее про это разделение в SNI. Чтобы менять SNI, нужно подключаться к разным секретам/доменам.

Два нюанса полноты

Новый JA4 (t13d1616h2_86a278354501_eeeea6562960) жёстко зашит в getFirefoxDefault() — он одинаков у всех пользователей форка и статичен между версиями. То есть это не ротация почерка, а замена одного статичного отпечатка на другой: свежее и не «телеграмное», но при массовом использовании сам по себе тоже становится узнаваемым маркером. Кроме того, использование неофициального клиента со сторонними api_id/api_hash несёт отдельный риск — Telegram может ограничить или забанить аккаунт либо сами api-ключи.


Где он в ряду клиентских решений

Тезис «JA4 меняет только клиент» теперь имеет три разных воплощения — tsrman/tg закрывает нишу «готовое приложение»:

РешениеЧто этоУдобствоПлатформа
Тестовый relay FlowsealЛокальный relay перед штатным клиентомВозня с прослойкойлюбая (где Telegram→localhost)
tdlib-obfФорк библиотеки TDLib — клиент пишешь самНужно писать/собирать клиентгде соберёшь libtdjson
tsrman/tgФорк готового приложения Telegram for AndroidСобрал APK из исходников — и работаеттолько Android

Все трое делают одно и то же по сути: строят свежий браузерный ClientHello на стороне клиента, до цензора. Разница — в форм-факторе.


Безопасность: что проверено

Почему это важно проверять

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

Методика и находки (проверка по git, июнь 2026):

  • Поверхность дельты мала и видна целиком. Автор добавил один коммит поверх дерева официального Telegram. Всё, что он привнёс, — 3 файла выше. Ни нового сетевого адреса, ни доступа к учётным данным/сессии/сообщениям, ни телеметрии, ни обфускации.
  • Подозрительный IP оказался штатным. Единственный «чужой» публичный адрес в коде — 95.161.76.100:443 — это bootstrap-адрес дата-центра №2 Telegram, добавленный самим DrKLO в 2020 (подтверждено git blame), а не автором форка.
  • База — подлинный официальный Telegram. В истории файлов присутствуют настоящие коммиты DrKLO; один из них (dceccae0b74576d092fb3b2accaffded2c0b5f63) успешно дотягивается из официального репозитория DrKLO/Telegram по полному SHA — а раз SHA коммита есть в официальном дереве, значит история до этой точки идентична и не подменена. (Это не проверяет автоматически каждый из ~210 более поздних синк-коммитов — см. оговорки ниже.)
  • Цепочка сборки чистая. Dockerfile скачивает только официальный Android SDK/NDK от Google; никаких curl | bash чужих скриптов. gradle-wrapper.jar — стандартный (≈59 КБ), менялся только в штатном «gradle wrapper update».
  • Готового APK нет — собираешь сам. То, что ты запустишь, и есть отревьюенный исходник (плюс официальный код Telegram и SDK от Google). Это сильное свойство: нечего троянизировать в обход.

Остаточные оговорки (чего проверка НЕ покрывает)

Полностью отревьюен коммит автора и подтверждена общая история с официальным Telegram. НЕ делался построчный diff всех ~210 синк-коммитов миррора (бампы версий; из них авторства Arseny271 лишь 36, остальное — официальные разработчики Telegram: xaxtix, DrKLO, dkaraush) против официальных релиз-тегов — теоретически в базе можно спрятать правку, но SHA-совпадение и авторство DrKLO в критичных файлах делают это маловероятным. Кроме того: это неофициальный форк — будущие обновления и своевременность security-патчей зависят от автора; собирать нужно со своими api_id/api_hash (вложенные keystore/google-services — заглушки официального Telegram для reproducible builds).


Как использовать

  • Получить api_id/api_hash на my.telegram.org и вписать в BuildVars.java.
  • Собрать APK: либо в Android Studio (нужны Android NDK и SDK), либо через вложенный Dockerfile (он гоняет gradle-сборку bundle и APK варианта Afat).
  • Подставить свой release.keystore (вложенный — заглушка).
  • В настройках приложения добавить MTProto-прокси с FakeTLS-секретом (ee…) — именно к нему применяется браузерный ClientHello. Свой прокси можно поднять на mtproto.zig / telemt / mtg вне зоны блокировки.

Что это даёт и чего не даёт

Даёт: свежий браузерный JA4 вместо протухшего Telegram-почерка + разнесённые во времени коннекты — то есть слом двух из трёх условий детекта. Не даёт: ротацию SNI и полную L7-неотличимость — после TLS-рукопожатия по-прежнему идёт сырой MTProto, а не настоящий браузерный HTTP (то же ограничение, что у tdlib-obf).


📚 См. также

  • SNI) — тезис, который этот форк воплощает; разбор детекции из трёх условий
  • tdlib-obf — клиентский TDLib с маскировкой JA4 — родственный клиентский подход на уровне библиотеки (а не готового приложения)
  • [[Zapret/mtproto/10-telemt-logs-dpi|Чтение логов telemt и #30733]] — протухший JA4 официального клиента, который этот форк обновляет
  • WSS: MTProto внутри WebSocket — другой форк Telegram для Android (ZaStoGram) решает ту же задачу иначе: не меняет TLS-почерк, а уводит соединение на веб-релеи Telegram
  • MTProxy и mtproto.zig — серверная сторона FakeTLS-прокси, к которой подключается клиент
  • MTProto Proxy — полный гайд — общий обзор экосистемы
  • 🔗 tsrman/tg на GitHub — исходники форка
  • 🔗 DrKLO/Telegram — официальная база, против которой проверялась подлинность