todo/Zapret/manual/zapret2_04.md
loop-uh 737f065567 Вики переехала на wiki2.zapret.moe: домен заменён во всём хранилище
wiki.zapret.moe заблокирован в России, читатели до редиректа не доходят. Во всех заметках, плашках [!mirror], ссылках и скриптах домен заменён на wiki2.zapret.moe; в AGENTS.md записано правило — ссылаться только на wiki2. Скрипт статистики считает своими заходы с обоих доменов. Чужие незакоммиченные правки в nuc/ в коммит не попали — только замена домена.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 15:15:27 -04:00

99 lines
3.9 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-01-21
tags:
- zapret
- zapret2
- lua
- networking
- learning
aliases:
- Zapret2 учебник 04
description: "Урок 04 учебника Zapret2: объект desync в Lua, диссект пакетов (dis.ip, dis.tcp, payload), reconstruct, отладка через pktdebug и standard args."
---
> [!mirror] Резервное зеркало
> Актуальная версия этой страницы — на основной вики: [wiki2.zapret.moe/Zapret/manual/zapret2_04](https://wiki2.zapret.moe/Zapret/manual/zapret2_04)
# Zapret2 для новичков — 04: dissect/reconstruct и что такое `desync`
Цель: научиться “читать” то, что видит Lua‑функция, и понимать, откуда берутся поля.
## 1) `desync` — главный объект, который получает Lua
Каждый `--lua-desync=...` вызывает Lua‑функцию вида:
```lua
function something(ctx, desync)
...
end
```
`desync` — это таблица, в которой есть:
- `desync.dis` — текущий диссект (структура IP/TCP/UDP/payload)
- `desync.arg` — аргументы текущего инстанса (все строки/флаги)
- `desync.l7payload` / `desync.l7proto` — распознанные типы
- `desync.track` — conntrack‑состояние (может быть nil)
- `desync.reasm_data` / `desync.decrypt_data` — если сработал механизм сборки
- флаги про replay (например `desync.replay`, `desync.replay_piece`, …)
## 2) Что такое `desync.dis` (диссект)
Упрощённо:
- `desync.dis.ip` или `desync.dis.ip6` — IP заголовок
- `desync.dis.tcp` или `desync.dis.udp` — транспортный заголовок
- `desync.dis.payload` — байты полезной нагрузки (string)
Для TCP полезно знать, что:
- `desync.dis.tcp.th_seq`, `th_ack`, `th_flags`, `th_win`, `th_urp` — основные поля
- `desync.dis.tcp.options` — массив tcp‑опций (timestamp, md5, nop, …)
## 3) Почему “диссект” удобнее, чем raw
С raw пакетами неудобно работать:
- нужно помнить смещения полей
- легко ошибиться
- сложно корректно пересчитать checksum
Поэтому zapret2 большую часть модификаций делает так:
1) разобрать → диссект
2) поменять поля в диссекте
3) собрать raw обратно (reconstruct)
## 4) Как debuggить `desync`
Есть готовые функции (в `lua/zapret-lib.lua`):
- `pktdebug` — печатает весь `desync` (большой вывод)
- `argdebug` — печатает только `desync.arg`
- `posdebug` — печатает счётчики conntrack и наличие `reasm/decrypt/replay`
Минимальные “учебные” вставки:
```bash
--lua-desync=argdebug
--lua-desync=posdebug
```
## 5) Что такое “standard args”
Многие стратегии (`fake`, `multisplit`, `multidisorder`) принимают одинаковые “блоки” аргументов:
- direction (dir=in/out/any)
- payload (payload=...)
- fooling (ttl, md5, flags, badsum, …)
- ipid (ip_id=seq/rnd/…)
- rawsend (repeats/ifout/fwmark)
- ipfrag (ipfrag_pos_tcp/…)
Почему так сделано:
- проще комбинировать техники,
- один и тот же механизм отправки/реконструкции применяет эти опции одинаково.
## 6) Что читать дальше
- `[[Zapret2 - 05 - Payload types, reasm/replay и маркеры]]`
- `[[Zapret2 - lua-desync]]`