# Полная документация функции syndata
`syndata` — Lua функция из zapret-antidpi.lua, которая добавляет payload данные в TCP SYN пакет и отправляет его вместо оригинала. Работает на "нулевой фазе" — до установления TCP соединения.
Расположение: `zapret-antidpi.lua:357-380`
Формат вызова:
```bash
--lua-desync=syndata[:param1=val1[:param2=val2]...]
```
---
Специфические параметры syndata
| Параметр | Описание | По умолчанию |
|----------------|-----------------------------------------------|-----------------|
| blob=<name> | Payload данные для SYN пакета | 16 нулевых байт |
| tls_mod=<list> | Модификации TLS: rnd, rndsni, sni=<str>, none | - |
Важно: dupsid и padencap НЕ работают с syndata (требуют реальный TLS payload).
---
Standard Fooling (модификация L3/L4 заголовков)
| Параметр | Описание |
|---------------------------|--------------------------------------------------------|
| ip_ttl=N | Установить IPv4 TTL |
| ip6_ttl=N | Установить IPv6 hop limit |
| ip_autottl=delta,min-max | Автоопределение IPv4 TTL (напр. -1,3-20) |
| ip6_autottl=delta,min-max | Автоопределение IPv6 TTL |
| ip6_hopbyhop[=hex] | Добавить hop-by-hop extension header |
| ip6_hopbyhop2[=hex] | Добавить второй hop-by-hop header |
| ip6_destopt[=hex] | Добавить destination options header |
| ip6_destopt2[=hex] | Добавить второй destopt header |
| ip6_routing[=hex] | Добавить routing header |
| ip6_ah[=hex] | Добавить authentication header |
| tcp_seq=N | Сместить TCP sequence number |
| tcp_ack=N | Сместить TCP ack number |
| tcp_ts=N | Сместить TCP timestamp |
| tcp_md5[=hex] | Добавить MD5 TCP option (16 байт) |
| tcp_flags_set=<list> | Установить TCP флаги (FIN,SYN,RST,PSH,ACK,URG,ECE,CWR) |
| tcp_flags_unset=<list> | Снять TCP флаги |
| tcp_ts_up | Переместить timestamp option в начало |
| fool=<func> | Кастомная функция fooling |
---
Standard Reconstruct
| Параметр | Описание |
|----------|-----------------------|
| badsum | Испортить L4 checksum |
---
Standard Rawsend
| Параметр | Описание |
|---------------|--------------------------------|
| repeats=N | Количество повторов отправки |
| ifout=<iface> | Override исходящего интерфейса |
| fwmark=N | Override fwmark (Linux) |
---
Standard IPfrag
| Параметр | Описание | По умолчанию |
|------------------|----------------------------------------|--------------|
| ipfrag[=func] | Функция фрагментатора | ipfrag2 |
| ipfrag_disorder | Отправить фрагменты в обратном порядке | - |
| ipfrag_pos_tcp=N | Позиция фрагментации TCP (кратно 8) | 32 |
| ipfrag_pos_udp=N | Позиция фрагментации UDP (кратно 8) | 8 |
| ipfrag_pos=N | Общая позиция фрагментации | - |
| ipfrag_next=N | Next protocol для IPv6 fragment header | - |
---
НЕ поддерживается
| Параметр | Причина |
|-------------------|---------------------------------|
| ip_id, ip_id_conn | syndata не вызывает apply_ip_id |
| tls_mod=dupsid | Требует реальный TLS payload |
| tls_mod=padencap | Требует реальный TLS payload |
---
Примеры использования
# Простая syndata (16 нулевых байт)
--lua-desync=syndata
# С TLS fake blob
--lua-desync=syndata:blob=fake_default_tls
# С модификацией SNI
--lua-desync=syndata:blob=fake_default_tls:tls_mod=rnd,sni=google.com
# С TTL fooling
--lua-desync=syndata:blob=fake_default_tls:ip_ttl=5:ip6_ttl=5
# С MD5 TCP option
--lua-desync=syndata:tcp_md5
# С IP фрагментацией
--lua-desync=syndata:blob=fake_default_tls:ipfrag:ipfrag_disorder
# Комбинация с другими функциями
--lua-desync=wssize:wsize=1:scale=6 --lua-desync=syndata --lua-desync=multisplit:pos=midsld
---
Особенности работы
1. Только TCP SYN — если пакет не SYN, выполняется instance cutoff
2. Нулевая фаза — работает до установления соединения
3. VERDICT_DROP — оригинальный SYN дропается, отправляется модифицированный
4. Один пакет — payload должен помещаться в один пакет (сегментация невозможна)
5. С хостлистами — работает только в режиме --ipcache-hostname
## dupsid и padencap МОЛЧА ИГНОРИРУЮТСЯ
Поведение:
| Аспект | Результат |
|------------------------|---------------------------------|
| Вызывают ошибку? | НЕТ |
| Выводят warning в лог? | НЕТ |
| Возвращают false? | НЕТ (возвращают true = "успех") |
| Применяются? | НЕТ — код просто пропускается |
Почему так происходит:
// protocol.c:856-936
if (payload) // ← syndata передаёт NULL сюда
{
if (tls_mod->mod & FAKE_TLS_MOD_DUP_SID)
// ... этот код НЕ выполнится
if (tls_mod->mod & FAKE_TLS_MOD_PADENCAP)
// ... и этот тоже
}
return bRes; // возвращает true
Пример:
--lua-desync=syndata:blob=fake_default_tls:tls_mod=dupsid
Результат:
1. fake_default_tls загружается ✓
2. dupsid парсится без ошибки ✓
3. Блок if (payload) пропускается (payload=NULL)
4. Fake TLS отправляется БЕЗ дублирования session_id
5. Никакого предупреждения в логе
Итог по tls_mod в syndata:
| Мод | Работает? | Причина |
|----------|-----------------------|------------------------------|
| rnd | ✅ ДА | Код вне блока if(payload) |
| rndsni | ✅ ДА | Код вне блока if(payload) |
| sni=xxx | ✅ ДА | Код вне блока if(payload) |
| dupsid | ❌ Молча игнорируется | Требует реальный ClientHello |
| padencap | ❌ Молча игнорируется | Требует реальный ClientHello |
Это дизайн-решение — dupsid/padencap нужен реальный TLS от клиента, которого на фазе SYN ещё нет.