Zapret2 для новичков — 04: dissect/reconstruct и что такое desync
Цель: научиться “читать” то, что видит Lua‑функция, и понимать, откуда берутся поля.
1) desync — главный объект, который получает Lua
Каждый --lua-desync=... вызывает Lua‑функцию вида:
function something(ctx, desync)
...
enddesync — это таблица, в которой есть:
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 большую часть модификаций делает так:
- разобрать → диссект
- поменять поля в диссекте
- собрать raw обратно (reconstruct)
4) Как debuggить desync
Есть готовые функции (в lua/zapret-lib.lua):
pktdebug— печатает весьdesync(большой вывод)argdebug— печатает толькоdesync.argposdebug— печатает счётчики conntrack и наличиеreasm/decrypt/replay
Минимальные “учебные” вставки:
--lua-desync=argdebug
--lua-desync=posdebug5) Что такое “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]]