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

3.8 KiB
Raw Permalink Blame History

date tags aliases description
2026-01-21
zapret
zapret2
lua
networking
learning
Zapret2 учебник 04
Урок 04 учебника Zapret2: объект desync в Lua, диссект пакетов (dis.ip, dis.tcp, payload), reconstruct, отладка через pktdebug и standard args.

[!mirror] Резервное зеркало Актуальная версия этой страницы — на основной вики: wiki.zapret.moe/Zapret/manual/zapret2_04

Zapret2 для новичков — 04: dissect/reconstruct и что такое desync

Цель: научиться “читать” то, что видит Luaфункция, и понимать, откуда берутся поля.

1) desync — главный объект, который получает Lua

Каждый --lua-desync=... вызывает 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

Минимальные “учебные” вставки:

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