todo/Zapret/manual/zapret2_04.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

99 lines
3.8 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] Резервное зеркало
> Актуальная версия этой страницы — на основной вики: [wiki.zapret.moe/Zapret/manual/zapret2_04](https://wiki.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]]`