Каждая публикуемая заметка получила callout-шапку со ссылкой на свою страницу wiki.zapret.moe (на самой вики она вырезается транформером RemoveMirrorCallout, видна только на зеркале Obsidian Publish и в Forgejo) и SEO-поле description — 1–2 предложения для meta description обоих сайтов. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
16 KiB
| date | tags | aliases | link | description | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2026-06-14 |
|
|
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
- Это официальный Telegram для Android + ровно один коммит автора (Pavel/tsrman) поверх миррора, синхронизирующего версии (на момент проверки — Telegram 12.7.3).
- Коммит меняет 3 файла в нативном MTProto-слое (
TMessagesProj/jni/tgnet/): новый Firefox-подобный FakeTLS-ClientHello (JA4t13d1616h2_86a278354501_eeeea6562960), случайная задержка 500–1000 мс между подключениями к прокси, ленивое создание push-соединения. - По логике детекции (модель из трёх условий — наблюдения сообщества, см. mtproxy/ja4-sni-client-side, а не спецификация ТСПУ) это удар по двум из трёх условий: меняет JA4 (условие 1) и ломает «залп на один ip:port» (условие 3). Ротацию SNI (условие 2) он не делает — SNI задаётся
ee-секретом прокси. - Заодно обновляется узнаваемый старый отпечаток (та же болезнь протухшего почерка, что в Zapret/mtproto/10-telemt-logs-dpi у Telegram Desktop): вместо него отправляется свежий Firefox-подобный.
- Проверка безопасности: в дельте автора не нашлось утечек или чужих адресов, база — подлинный Telegram. Это неофициальный форк — доверие к автору и отставание от security-патчей официального клиента остаются на тебе.
- Только 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.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 — официальная база, против которой проверялась подлинность