---
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
---

# 📱 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`), случайная задержка 500–1000 мс между подключениями к прокси, ленивое создание 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 мс назад — пауза 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|заметке про клиентскую сторону 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) — официальная база, против которой проверялась подлинность
