todo/mtproxy/tsrman-tg-android-faketls.md
loop-uh 0ad0bcc8dd
Some checks failed
Published content check / validate (push) Failing after 5s
seo+зеркало: [!mirror]-плашка со ссылкой на вики и description во frontmatter всех заметок
Каждая публикуемая заметка получила callout-шапку со ссылкой на свою страницу
wiki.zapret.moe (на самой вики она вырезается транформером RemoveMirrorCallout,
видна только на зеркале Obsidian Publish и в Forgejo) и SEO-поле description —
1–2 предложения для meta description обоих сайтов.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-26 22:05:57 +03:00

16 KiB
Raw Permalink Blame History

date tags aliases link description
2026-06-14
mtproto
mtproxy
dpi
tspu
ja4
faketls
telegram
android
tsrman/tg
Telegram Android с клиентским FakeTLS
Форк Telegram с подменой JA4
tg android faketls
https://github.com/tsrman/tg tsrman/tg — форк Telegram для Android с Firefox-подобным JA4 в FakeTLS и джиттером коннектов к MTProxy: что меняет, проверка безопасности, сборка APK.

[!mirror] Резервное зеркало Актуальная версия этой страницы — на основной вики: wiki.zapret.moe/mtproxy/tsrman-tg-android-faketls

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

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

[!tip] Результат проверки безопасности (июнь 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), случайная задержка 5001000 мс между подключениями к прокси, ленивое создание push-соединения.
  3. По логике детекции (модель из трёх условий — наблюдения сообщества, см. mtproxy/ja4-sni-client-side, а не спецификация ТСПУ) это удар по двум из трёх условий: меняет JA4 (условие 1) и ломает «залп на один ip:port» (условие 3). Ротацию SNI (условие 2) он не делает — SNI задаётся ee-секретом прокси.
  4. Заодно обновляется узнаваемый старый отпечаток (та же болезнь протухшего почерка, что в Zapret/mtproto/10-telemt-logs-dpi у 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 мс назад — пауза 5001000 мс Размыть «залп на один ip:port» (условие 3 детекта)
jni/tgnet/ConnectionsManager.cpp Push-соединение создаётся лениво (через select()), а не разом на старте Меньше одновременных коннектов = меньше похоже на залп
jni/tgnet/Connection.cpp Добавлена пустая строка No-op

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

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


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

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

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

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


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

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

Методика и находки (проверка по 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). Это сильное свойство: нечего троянизировать в обход.

[!warning] Остаточные оговорки (чего проверка НЕ покрывает) Полностью отревьюен коммит автора и подтверждена общая история с официальным 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. Свой прокси можно поднять на mtproxy/mtproto-zig / telemt / mtg вне зоны блокировки.

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


📚 См. также

  • mtproxy/ja4-sni-client-side — тезис, который этот форк воплощает; разбор детекции из трёх условий
  • mtproxy/tdlib-obf-client-side-stealth — родственный клиентский подход на уровне библиотеки (а не готового приложения)
  • Zapret/mtproto/10-telemt-logs-dpi — протухший JA4 официального клиента, который этот форк обновляет
  • mtproxy/telegram-wss-transport — другой форк Telegram для Android (ZaStoGram) решает ту же задачу иначе: не меняет TLS-почерк, а уводит соединение на веб-релеи Telegram
  • mtproxy/mtproto-zig — серверная сторона FakeTLS-прокси, к которой подключается клиент
  • Zapret/mtproto/00-overview — общий обзор экосистемы
  • 🔗 tsrman/tg на GitHub — исходники форка
  • 🔗 DrKLO/Telegram — официальная база, против которой проверялась подлинность