Формат --out-range / --in-range:
--out-range=[(n|a|d|s|b|x)<int>](-|<)[(n|a|d|s|b|x)<int>]
───────────────────────────────────────────
FROM SEPARATOR TO
Префиксы (режимы счёта):
| Префикс | Значение | Что считает |
|---|---|---|
n | packet number | Порядковый номер перехваченного пакета (в выбранном направлении) |
d | data packet | Только пакеты с payload (данными) |
s | sequence | Относительный TCP sequence number |
b | byte count | Количество переданных байт |
a | always | Всегда (без числа) |
x | next/never | Никогда (без числа) |
Важно: все счётчики (
n/d/b/s/p) считаются только по тем пакетам, которые реально попали в движок (перехвачены NFQUEUE/WinDivert и не отфильтрованы раньше). Если какой-то пакет “мимо” (не перехвачен или отсеян, например пустые ACK в winws2), он не увеличитn, и “номер пакета” для--out-rangeсместится.
Разделители:
| Разделитель | Значение |
|---|---|
- | Включает конечную позицию |
< | Не включает конечную позицию |
Примеры с d:
| Значение | Расшифровка |
|---|---|
d1-d10 | С 1-го по 10-й data-пакет включительно |
d1<d10 | С 1-го по 9-й data-пакет (10-й не включён) |
-d10 | С начала (always) по 10-й data-пакет включительно |
d5- | С 5-го data-пакета и до конца (бесконечно) |
Что такое “data packet”?
Data packet (d) — это пакет, содержащий payload (данные L7). Пустые ACK, FIN, RST без данных не считаются.
out (клиент → сервер):
1) SYN → n=1, d=0
2) ACK (пустой) → n=2, d=0 (если этот ACK перехвачен)
3) ClientHello/HTTP → n=3, d=1
in (сервер → клиент):
1) SYN-ACK → n=1, d=0 (для --in-range, т.к. это входящее направление)Частая ловушка: пытаться считать
n“глобально по соединению” и включать туда SYN-ACK. На самом деле--out-rangeсчитает только outgoing, а--in-range— только incoming.
Важно про Windows / winws2: --wf-tcp-empty=0 ломает ожидания по n
В winws2 по умолчанию обычно включено --wf-tcp-empty=0 — это не перехватывает пустые ACK ради экономии CPU.
Следствие: второй исходящий пакет TCP (handshake ACK) часто не попадает в движок, n “перескакивает”, и n2<n3 может сработать на ClientHello.
Что делать:
- если тебе нужен именно пустой ACK — включай
--wf-tcp-empty=1 - если тебе нужно целиться в “первый пакет с данными”, используй
d(он стабильнее при отсеивании пустых ACK)
Практический пример:
--out-range=d1-d3 --lua-desync=my_func→ my_func будет вызываться только для 1-го, 2-го и 3-го исходящих пакетов с данными в соединении.
--out-range=d10-d10 # ровно 10-й data packet
--out-range=d10- # с 10-го и до бесконечности
--out-range=-d10 # с начала до 10-го включительно
--out-range=d10<d11 # только 10-й (11-й исключён)