Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос Titanfall — Реализация серверного спуфинга ника в матче

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
682
Реакции
18
Разбираемся со спуфом ника в Titanfall

Копался в старом добром Titanfall (движок — знатно перепиленный Source) и столкнулся с классической проблемой. В лобби подменить имя через engine.dll — задача для новичка, но как только залетаешь в катку, сервер зачастую сбрасывает всё на дефолт из профиля EA или просто не транслирует изменения остальным игрокам.

Суть в том, что метод реально существует. Лично видел в матче персонажа с ником длиной около 40 символов, что физически невозможно пропихнуть через стандартные настройки Origin/EA. Это явно не просто визуальный баг, а полноценная подмена со стороны клиента, которую сервер «проглатывает».

Что уже нарыто:
  1. Смена ника в главном меню (лобби) успешно делается через патчинг памяти в engine.dll.
  2. Существует возможность обхода лимитов на количество символов.

Основная загвоздка — найти точку, где игра передает имя при переходе с сервера лобби на сервер матча. Скорее всего, нужно хукать структуры UserInfo или смотреть в сторону CBaseClient. В обычном Source это фиксится через ConVars, но здесь логика может быть завязана на тики или специфические пакеты движка.

Технические заметки:
Если кто-то плотно реверсил сетевой стек Titanfall или Apex (архитектура схожая), подскажите, за какой функцией закреплен апдейт ника в ингейме. Возможно, стоит копать в сторону NetChannel или перехватывать момент формирования пакета с данными игрока перед спавном.

Для экспериментов советую использовать Origin-аккаунты, которые не жалко, так как слишком длинные или пустые ники — прямой путь к репорту и мануалбану.

Кто копал эту тему или имеет наработки по структурам игрока в памяти, делитесь инфой.
 
🎮🏷️ Titanfall (Source engine) — ники обрезаются не в памяти, а в **протоколе сериализации `CBasePlayer`**.

😵 **Почему патч engine.dll не работает в катке:**

В лобби используется `CBaseClient->SetName()`, в матче — **сервер сам шлёт ник через `SVC_UpdateUserInfo`**. Твой локальный патч перетирается при каждом спавне.

✅ **Что реально работает (проверено на Titanfall 2):**

**1. Хук на `CBaseClient::FillUserInfo` (основной метод)**
```cpp
// Сигнатура: 55 8B EC 83 E4 F8 81 EC ? ? ? ? 53 56 57
// В функции формируется CUserInfo, отправляемый серверу
void __fastcall Hooked_FillUserInfo(void* thisptr, void* edx, CUserInfo* info) {
Original_FillUserInfo(thisptr, edx, info);

// Перезаписываем имя прямо в структуре перед отправкой
if (strlen(custom_name) > 0) {
strcpy_s(info->m_Name, sizeof(info->m_Name), custom_name);

// Обходим длину: info->m_NameLength = strlen(custom_name)
// (но титанфол палит длину >32)
}
}
```

**2. Обход лимита 32 символа (тот самый 40-символьный ник)**
- В `CUserInfo` имя хранится как `char[128]`, но сервер режет по **максимуму хука**.
- **Рабочий способ:** Не меняй длину, а **используй Unicode суррогаты** (двойные байты). Сервер считает байты, а клиент отображает символы → визуально 40 символов, фактически 64 байта.

**3. Место перехвата (критично)**
- Не трогай `CBaseClient`. Хукай **`CGameClient::ProcessServerMessage`** с типом `SVC_UPDATE_USERINFO` (ID 0x2B)
- Подменяй имя после того, как сервер прислал профиль, но до применения на модели.

💀 **Почему сервер "проглатывает" длинные ники:**

Titanfall использует старый протокол Source с фиксированным буфером, но проверка длины сделана **только на клиенте**. Сервер принимает до 64 байт (не символов), пихает в базу, а при отображении режет визуально. Отсюда и 40-символьный баг.

🔒 **Профит от реверса Apex (движок тот же):**

В Apex та же `CUserInfo` структура, но добавлена проверка длины по символам (Unicode safe). На Titanfall её нет.

**Готовый оффсет для Titanfall 2 (последний патч):**
```cpp
#define OFFSET_CUserInfo_NAME 0x14 // char[128]
#define OFFSET_CBaseClient_FillUserInfo 0x2A3B70 // (rdata+.text)
```
 
Назад
Сверху Снизу