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

117 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
date: 2026-06-14
tags:
- mtproto
- mtproxy
- dpi
- tspu
- ja4
- faketls
- telegram
- android
aliases:
- tsrman/tg
- Telegram Android с клиентским FakeTLS
- Форк Telegram с подменой JA4
- tg android faketls
link: https://github.com/tsrman/tg
description: "tsrman/tg — форк Telegram для Android с Firefox-подобным JA4 в FakeTLS и джиттером коннектов к MTProxy: что меняет, проверка безопасности, сборка APK."
---
> [!mirror] Резервное зеркало
> Актуальная версия этой страницы — на основной вики: [wiki.zapret.moe/mtproxy/tsrman-tg-android-faketls](https://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|разбора, почему обход MTProxy клиентский]]: чистая смена 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|#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 мс назад — пауза 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|заметке про клиентскую сторону JA4/SNI]]. Чтобы менять SNI, нужно подключаться к разным секретам/доменам.
> [!warning] Два нюанса полноты
> Новый JA4 (`t13d1616h2_86a278354501_eeeea6562960`) **жёстко зашит** в `getFirefoxDefault()` — он одинаков у всех пользователей форка и статичен между версиями. То есть это не ротация почерка, а замена одного статичного отпечатка на другой: свежее и не «телеграмное», но при массовом использовании сам по себе тоже становится узнаваемым маркером. Кроме того, использование неофициального клиента со сторонними `api_id`/`api_hash` несёт отдельный риск — Telegram может ограничить или забанить аккаунт либо сами api-ключи.
---
## Где он в ряду клиентских решений
Тезис «JA4 меняет только клиент» теперь имеет три разных воплощения — `tsrman/tg` закрывает нишу «готовое приложение»:
| Решение | Что это | Удобство | Платформа |
|---|---|---|---|
| [Тестовый relay Flowseal](https://gist.github.com/Flowseal/de630dd9d9ddaa86cc6bed9b473fae0c) | Локальный relay перед штатным клиентом | Возня с прослойкой | любая (где Telegram→localhost) |
| [[mtproxy/tdlib-obf-client-side-stealth\|tdlib-obf]] | Форк **библиотеки** 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](https://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|mtproto.zig]] / telemt / mtg вне зоны блокировки.
> [!important] Что это даёт и чего не даёт
> Даёт: свежий браузерный JA4 вместо протухшего Telegram-почерка + разнесённые во времени коннекты — то есть слом двух из трёх условий детекта. Не даёт: ротацию SNI и **полную L7-неотличимость** — после TLS-рукопожатия по-прежнему идёт сырой MTProto, а не настоящий браузерный HTTP (то же ограничение, что у [[mtproxy/tdlib-obf-client-side-stealth|tdlib-obf]]).
---
## 📚 См. также
- [[mtproxy/ja4-sni-client-side|Почему обход MTProxy клиентский (JA4/SNI)]] — тезис, который этот форк воплощает; разбор детекции из трёх условий
- [[mtproxy/tdlib-obf-client-side-stealth|tdlib-obf — клиентский TDLib с маскировкой JA4]] — родственный клиентский подход на уровне библиотеки (а не готового приложения)
- [[Zapret/mtproto/10-telemt-logs-dpi|Чтение логов telemt и #30733]] — протухший JA4 официального клиента, который этот форк обновляет
- [[mtproxy/telegram-wss-transport|WSS: MTProto внутри WebSocket]] — другой форк Telegram для Android (ZaStoGram) решает ту же задачу иначе: не меняет TLS-почерк, а уводит соединение на веб-релеи Telegram
- [[mtproxy/mtproto-zig|MTProxy и mtproto.zig]] — серверная сторона FakeTLS-прокси, к которой подключается клиент
- [[Zapret/mtproto/00-overview|MTProto Proxy — полный гайд]] — общий обзор экосистемы
- 🔗 [tsrman/tg на GitHub](https://github.com/tsrman/tg) — исходники форка
- 🔗 [DrKLO/Telegram](https://github.com/DrKLO/Telegram) — официальная база, против которой проверялась подлинность