Template
1
0
mirror of https://github.com/bol-van/zapret2.git synced 2026-03-14 06:13:09 +00:00

update docs

This commit is contained in:
bol-van
2025-12-13 16:31:18 +03:00
parent c4818a6a32
commit 004c583595

View File

@@ -620,12 +620,6 @@ nfqws2 <глобальные_параметры>
или откуда он приходит. Если ему это удается - происходит проверка по списку сетей, если нет - условие фильтра не соблюдается, профиль не выбирается.
Такая концепция позволяет работать даже если вы подключаетесь к нескольким wifi сетям на разных адаптерах.
> [!CAUTION]
> Основной способ получения SSID на Linux - через nl80211 был сломан с ядра 5.19 и не исправлен по настоящее время.
Дополнительный способ через wireless extensions работает, но API в процессе депрекации, многие ядра собираются без, поэтому определение SSID может не работать.
Для проверки nl80211 использовать `iw dev wlan0 info`, wext - `iwgetid wlan0`. Если ни одна команда не вернула корректный SSID, детект работать не будет.
iwgetid может не быть по умолчанию, нужно устанавливать wireless-tools.
В Windows концепция иная. Мониторится наличие указанных wifi сетей на всех wifi адаптерах, и если на любом из них SSID есть,
перехват windivert включается, а иначе выключается. Чтобы обслужить wifi сети с разными стратегиями нужно запускать несколько истансов winws2.
Один будет включаться, остальные - отключаться. Список SSID задается параметром `--ssid-filter`.
@@ -640,3 +634,83 @@ iwgetid может не быть по умолчанию, нужно устан
В остальных системах нужно копаться в powershell или лезть в реестр, чтобы раскидать подключения по нужным GUID,
если вдруг они раскидались системой неправильно. Но можно и не бороться, а просто внести список GUID, назначенных системой автоматически.
## Вызов LUA кода
LUA код вызывается в 2 этапа.
1. Однократно при запуске программы через `--lua-init=code|@file`. Если значение параметра начинается с `@`, выполняется файл, иначе значение параметра является LUA кодом.
2. При обработке профиля через `--lua-desync=function_name:arg1[=val1]:arg2[=val2]:argN[=valN]`.
Сначала идет имя функции, затем через двоеточия аргументы и их значения.
Все значения являются строками. Если значение не задано, оно равно пустой строке.
Реализовано 2 типа автоматических подстановок на строне C кода.
`%var` подставляет значение переменной `desync.var` или `var`, если первая отсутствует.
`#var` подставляет длину переменной `desync.var` или `var`, если первая отсутствует.
Двоеточия и знаки `%`, `#` в начале могут быть эскейпнуты через `\`.
И `--lua-init`, и `--lua-desync` может быть несколько. Выполнение производится строго в порядке указания.
### Передача блобов
Блоб - это двоичный блок данных любого размера, который может быть загружен в переменную LUA средствами C кода при старте программы.
`--blob=<item_name>:[+ofs]@<filename>|0xHEX`
* `item_name` - имя переменной LUA.
* `[+ofs]@<filename>` - загрузка из файла со смещения ofs.
* `0xHEX` - загрузка из HEX строки
Прямые операции с файлами из кода LUA не рекомендованы без необходимости.
LUA код выполняется с ограниченными правами, задуманное может не получиться или не работать на разных ОС в разных условиях.
Загрузка blob происходит до вхождения в песочницу, поэтому шансов на успех больше.
### Внутрипрофильные фильтры
Они бывают трех видов - `--payload`, `--in-range`, `--out-range`.
Значения фильтров действуют с момента их указания до следующего переопределения.
* `--payload=type1[,type2][,type2]...` принимает список известных пейлоадов через зяпятую, "all" или "known". Список известных пейлоадов доступен в help тексте nfqws2. По умолчанию `--payload=all`.
* `--(in-range|out-range)=[(n|a|d|s|p)<int>](-|<)[(n|a|d|s|p)<int>]` задает диапазоны счетчиков conntrack по входящему и исходящему направлениям. По умолчанию `--in-range=x`, `--out-range=a`.
Диапазоны задаются в формах : `mX-mY`, `mX<mY`, `-mY`, `<mY`, `mX-`, где m - режим счетчика, X - нижнее значение, Y - верхнее значение.
Режимы `x` и `a` задаются без диапазона и значения счетчика - единственной буквой. Знак `-` означает включающую верхнюю границу, `<` - исключающую.
Доступны следующие режимы счетчика :
* 'a' - всегда
* 'x' - никогда
* 'n' - номер пакета
* 'd' - номер пакета с данными
* 'b' - байт-позиция переданных данных
* 's' - tcp: relative sequence начала текущего пакета
* 'p' - tcp: relative sequence верхней границы текущего пакета (s + длина пейлоада)
nfqws2 следит за превышением верхней границы счетчиков для всех LUA инстансов.
Если во всех инстансах превышена верхняя граница по направлению или инстансы вошли по направлению в состояние cutoff добровольно,
происходит lua cutoff - выключение процессинга LUA в текущем потоке. Это нужно для экономии ресурсов процессора,
поскольку проверка единственного bool признака практически не требует никаких ресурсов.
### Типичная схема вызова инстансов внутри профиля
В рассматриваемом примере решается задача для пейлоадов tls_client_hello и http_req попробовать фейки,
отдельные для каждого типа пейлоада, а если это не работает, перейти на multidisorder для tls и multisplit для http.
Если и это не работает - крутить стратегии по кругу.
```
--filter-tcp=80,443 --filter-l7=http,tls
--in-range=-s1 --lua-desync=circular
--in-range=x
--payload=tls_client_hello
--lua-desync=fake:blob=fake_default_tls:badsum:strategy=1
--lua-desync=multidisorder:strategy=2
--payload=http_req
--lua-desync=fake:blob=fake_default_http:badsum:strategy=1
--lua-desync=multisplit:strategy=2
```
Не суть важно как работают конкретные функции, сейчас важно понять как работают внутрипрофильные фильтры и как передаются параметры LUA инстансом.
* Инстанс circular для своей работы требует начальные пакеты потока, а по умолчанию они отключены.
Поэтому включаем вплоть до первого пакета с данными tcp, который имеет relative sequence 1.
* Остальные инстансы не нуждаются во входящем трафике. Снова отключаем. Действие `--in-range=x` распространяется до конца профиля.
* Действие `--payload` распространяется на два следующих за ним инстанса.