🧩 Π’ΠΈΠΏ payload ΠΈ распознаваниС ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ²

О Ρ‡Ρ‘ΠΌ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ°

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Β«Ρ‚ΠΈΠΏ payloadΒ» Π² Zapret 2, Ρ‡Π΅ΠΌ ΠΎΠ½ отличаСтся ΠΎΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠ°ΠΊ nfqws2 распознаёт ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ ΠΏΠΎ сигнатурам, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Π±Ρ‹Π²Π°ΡŽΡ‚ ΠΈ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ --payload. Π’Π°ΠΊΠΆΠ΅ β€” ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ свой Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π½Π° Lua. Π€ΠΈΠ»ΡŒΡ‚Ρ€ --payload β€” ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ профиля рядом с --filter-*; Π³Π΄Π΅ поля l7payload/l7proto Π»Π΅ΠΆΠ°Ρ‚ Π² Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚Π° β€” см. структура desync ΠΈ диссСкта.

TL;DR

  • Π’ΠΈΠΏ payload (l7payload) β€” это распознанноС содСрТимоС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°: tls_client_hello, http_req, quic_initial ΠΈ Ρ‚. Π΄. ΠŸΡƒΡΡ‚ΠΎΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ β€” empty, нСраспознанный β€” unknown.
  • ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΏΠΎΡ‚ΠΎΠΊΠ° (l7proto) β€” ярлык Π½Π° всё соСдинСниС; ставится ΠΏΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ извСстному ΠΏΠ΅ΠΉΠ»ΠΎΠ°Π΄Ρƒ ΠΈ дСрТится Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°, Π΄Π°ΠΆΠ΅ Ссли дальшС ΠΈΠ΄ΡƒΡ‚ unknown-ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹.
  • Π€ΠΈΠ»ΡŒΡ‚Ρ€ --payload ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚, ΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌ примСнится ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ --lua-desync. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ known (всё, ΠΊΡ€ΠΎΠΌΠ΅ empty ΠΈ unknown).
  • БпСцзначСния Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°: all β€” любой ΠΏΠ΅ΠΉΠ»ΠΎΠ°Π΄, known β€” Π½Π΅ empty ΠΈ Π½Π΅ unknown. ΠŸΡ€Π΅Ρ„ΠΈΠΊΡ ~ β€” инвСрсия.
  • РаспознаваниС сигнатурноС ΠΈ ΠΆΠΈΠ²Ρ‘Ρ‚ Π² C-ядрС. Π‘Π²ΠΎΠΉ Ρ‚ΠΈΠΏ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ Lua-Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ (detect_payload_str), Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ Π½Π΅ Π²ΠΈΠ΄Π΅Π½ C-Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρƒ --payload β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ payload-Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°ΠΌ самих desync-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ‚ΠΈΠΏ payload (ΠΈ Ρ‡Π΅ΠΌ ΠΎΠ½ отличаСтся ΠΎΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°)

Π­Ρ‚ΠΎ Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… понятия, ΠΈ ΠΈΡ… постоянно ΠΏΡƒΡ‚Π°ΡŽΡ‚.

Π’ΠΈΠΏ payload (Π² Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚Π° β€” ΠΏΠΎΠ»Π΅ desync.l7payload) β€” это распознанный Ρ‚ΠΈΠΏ содСрТимого ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°. НапримСр, Π² TLS-соСдинСнии ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ tls_client_hello, ΠΎΡ‚Π²Π΅Ρ‚ сСрвСра β€” tls_server_hello, Π° дальшС ΠΈΠ΄ΡƒΡ‚ ΡƒΠΆΠ΅ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ нСльзя, β€” ΠΈΡ… Ρ‚ΠΈΠΏ unknown.

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΏΠΎΡ‚ΠΎΠΊΠ° (ΠΏΠΎΠ»Π΅ desync.l7proto, Π° Π² Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ… профиля β€” --filter-l7) β€” это ярлык Π½Π° всё соСдинСниС Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ. Он присваиваСтся, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ встрСтился ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ извСстный ΠΏΠ΅ΠΉΠ»ΠΎΠ°Π΄, ΠΈ остаётся с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Π΅Π³ΠΎ сущСствования β€” Π΄Π°ΠΆΠ΅ Ссли ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΈΠΏ unknown.

ΠŸΡ€ΠΎΡ‰Π΅ говоря

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΏΠΎΡ‚ΠΎΠΊΠ° β€” ΠΊΠ°ΠΊ Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΠ° Π½Π° Π΄Π²Π΅Ρ€ΠΈ всСго Β«Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π°Β»: повСсили ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· («это TLSΒ») ΠΈ Π½Π΅ мСняСм. Π’ΠΈΠΏ payload β€” ΠΊΠ°ΠΊ ярлык Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π°: Ρƒ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ tls_client_hello, Ρƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ unknown. Одно соСдинСниС (tls) β†’ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ payload.

Π”Π²Π° особых Ρ‚ΠΈΠΏΠ° payload Π΅ΡΡ‚ΡŒ всСгда:

  • empty β€” ΠΏΠ°ΠΊΠ΅Ρ‚ Π±Π΅Π· ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, «пустой» ACK).
  • unknown β€” Π΄Π°Π½Π½Ρ‹Π΅ Π΅ΡΡ‚ΡŒ, Π½ΠΎ ΠΈΡ… Ρ‚ΠΈΠΏ Π½Π΅ распознан (Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Π°Ρ сСрСдина соСдинСния, нСизвСстный ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»).

ПолноС описаниС, Π³Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ поля l7payload ΠΈ l7proto Π»Π΅ΠΆΠ°Ρ‚ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π°, β€” Π² структура desync ΠΈ диссСкта.


Как nfqws2 распознаёт ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹

РаспознаваниС сигнатурноС: C-ядро nfqws2 смотрит Π½Π° Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½Ρ‹Π΅ Π±Π°ΠΉΡ‚Ρ‹ Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΏΠ΅ΠΉΠ»ΠΎΠ°Π΄Π° (ΠΈΠ»ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²) ΠΈ ΠΏΠΎ Π½ΠΈΠΌ опрСдСляСт Ρ‚ΠΈΠΏ. Π­Ρ‚ΠΎ происходит Π½Π° быстрой сторонС C-ΠΊΠΎΠ΄Π° Π΅Ρ‰Ρ‘ Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Lua (см. схСма ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°).

Π’ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ… ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ payload ΠΈ ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ° доступны Π΄Π²Π° спСцзначСния:

  • all β€” совпадаСт с Π»ΡŽΠ±Ρ‹ΠΌ ΠΏΠ΅ΠΉΠ»ΠΎΠ°Π΄ΠΎΠΌ (Π² Ρ‚ΠΎΠΌ числС empty ΠΈ unknown);
  • known β€” совпадаСт со всСм, Ρ‡Ρ‚ΠΎ Π½Π΅ empty ΠΈ Π½Π΅ unknown (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ распознанными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ).

Π’Π°Π±Π»ΠΈΡ†Π° распознаваСмых Ρ‚ΠΈΠΏΠΎΠ²

НиТС β€” ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠ° nfqws2 ΡƒΠΌΠ΅Π΅Ρ‚ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ, Π½Π° ΠΊΠ°ΠΊΠΎΠΌ транспортС (L4) ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ payload Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½ΠΈΡ… Π±Ρ‹Π²Π°ΡŽΡ‚.

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΏΠΎΡ‚ΠΎΠΊΠ°L4Π’ΠΈΠΏΡ‹ payload Π²Π½ΡƒΡ‚Ρ€ΠΈ
httpTCPhttp_req, http_reply
tlsTCPtls_client_hello, tls_server_hello
xmppTCPxmpp_stream, xmpp_starttls, xmpp_proceed, xmpp_features
mtprotoTCPmtproto_initial
btTCPbt_handshake
quicUDPquic_initial
wireguardUDPwireguard_initiation, wireguard_response, wireguard_cookie, wireguard_keepalive
dhtUDPdht
utp_btUDPutp_bt_handshake
discordUDPdiscord_ip_discovery
stunUDPstun
dnsUDPdns_query, dns_response
dtlsUDPdtls_client_hello, dtls_server_hello
(любой)ICMPipv4, ipv6, icmp

ΠžΡΠΎΠ±Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ipv4 / ipv6 / icmp

Π­Ρ‚ΠΎ Ρ‚ΠΈΠΏΡ‹ payload для ICMP-ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ². ipv4 ΠΈ ipv6 Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° ICMP нСсёт ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Ρ‘Π½Π½Ρ‹ΠΉ исходный ΠΏΠ°ΠΊΠ΅Ρ‚ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ICMP Β«destination unreachableΒ» с куском исходного соСдинСния). Π’ΠΎ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… случаях ICMP ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ payload icmp. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ICMP β€” структура desync ΠΈ диссСкта.


Π€ΠΈΠ»ΡŒΡ‚Ρ€ --payload

--payload β€” ΠΏΠΎΠ»Π΅ профиля, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚, ΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌ примСнятся ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ --lua-desync-инстансы. Пока --payload Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½, ΠΎΠ½ дСйствуСт Π½Π° всС ΠΈΠ΄ΡƒΡ‰ΠΈΠ΅ Π·Π° Π½ΠΈΠΌ инстансы (ΠΊΠ°ΠΊ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒΠ½Ρ‹Π΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹, см. схСма ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°).

Бинтаксис

# Один Ρ‚ΠΈΠΏ
--payload=tls_client_hello
 
# НСсколько Ρ‚ΠΈΠΏΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· Π·Π°ΠΏΡΡ‚ΡƒΡŽ
--payload=http_req,http_reply
 
# ВсС извСстныС Ρ‚ΠΈΠΏΡ‹ (Π½Π΅ empty ΠΈ Π½Π΅ unknown) β€” это ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
--payload=known
 
# Π’ΠΎΠΎΠ±Ρ‰Π΅ всС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ empty ΠΈ unknown
--payload=all
 
# Π˜Π½Π²Π΅Ρ€ΡΠΈΡ: всё, ΠšΠ ΠžΠœΠ• ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ
--payload=~empty

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ β€” known

Если --payload Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ known. Π’ΠΎΡ‚ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° (lua/zapret-lib.lua):

function payload_match_filter(l7payload, l7payload_filter, def)
	local argpl = l7payload_filter or def or "known"
	local neg = string.sub(argpl,1,1)=="~"
	local pl = neg and string.sub(argpl,2) or argpl
	return neg ~= (in_list(pl, "all") or in_list(pl, l7payload) or in_list(pl, "known") and l7payload~="unknown" and l7payload~="empty")
end

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (known) Ρ„ΠΈΠ»ΡŒΡ‚Ρ€:

  • βœ… пропускаСт любой распознанный payload (tls_client_hello, mtproto_initial, http_req, …);
  • ❌ Π½Π΅ пропускаСт unknown;
  • ❌ Π½Π΅ пропускаСт empty.

Π˜Π½Π²Π΅Ρ€ΡΠΈΡ Ρ‡Π΅Ρ€Π΅Π· ~ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ «всё, ΠΊΡ€ΠΎΠΌΠ΅Β»: --payload=~empty β€” любой нСпустой ΠΏΠ°ΠΊΠ΅Ρ‚, --payload=~unknown β€” всё, ΠΊΡ€ΠΎΠΌΠ΅ нСраспознанного.

--payload (C-ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ) vs payload-Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ инстанса (Lua)

--payload Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ профиля обрабатываСтся быстрым C-ΠΊΠΎΠ΄ΠΎΠΌ. Π£ ΠΌΠ½ΠΎΠ³ΠΈΡ… desync-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π΅ΡΡ‚ΡŒ свой Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ payload= β€” это Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ ΡƒΠΆΠ΅ Π½Π° сторонС Lua. ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°: Π΄Π΅Ρ€ΠΆΠΈΡ‚Π΅ основной Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ Π½Π° --payload профиля (быстрСС), Π° payload= инстанса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ для Ρ‚ΠΎΠ½ΠΊΠΎΠΉ донастройки. Π Π°Π·Π½ΠΈΡ†Π° станСт Π²Π°ΠΆΠ½ΠΎΠΉ Π½ΠΈΠΆΠ΅, Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΏΡ€ΠΎ кастомныС Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€Ρ‹.


Π‘Π²ΠΎΠΉ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π½Π° Lua (detect_payload_str)

Иногда Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π½Π΅Ρ‚ Π² спискС распознаваСмых, Π½ΠΎ Ρƒ Π΅Π³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π΅ΡΡ‚ΡŒ характСрная подстрока. Π’ΠΎΠ³Π΄Π° Ρ‚ΠΈΠΏ payload ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ самому β€” ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΌ Lua-Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ. Π’ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π΅ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€-функция detect_payload_str:

function detect_payload_str(ctx, desync)
    -- arg: pattern    β€” подстрока для поиска Π² desync.dis.payload
    -- arg: payload    β€” ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ desync.l7payload, Ссли подстрока Π½Π°ΠΉΠ΄Π΅Π½Π°
    -- arg: undetected β€” ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ, Ссли подстрока НЕ Π½Π°ΠΉΠ΄Π΅Π½Π° (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ)
end

Π›ΠΎΠ³ΠΈΠΊΠ° простая: функция ΠΈΡ‰Π΅Ρ‚ подстроку pattern Π² ΠΏΠ΅ΠΉΠ»ΠΎΠ°Π΄Π΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π° (desync.dis.payload); Ссли Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ β€” присваиваСт desync.l7payload = desync.arg.payload; ΠΈΠ½Π°Ρ‡Π΅, Ссли Π·Π°Π΄Π°Π½ undetected, присваиваСт desync.l7payload = desync.arg.undetected.

ΠšΠ°ΡΡ‚ΠΎΠΌΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π½Π΅ Π²ΠΈΠ΄Π΅Π½ C-ΠΊΠΎΠ΄Ρƒ ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρƒ --payload

Π’Π°ΠΊΠΈΠ΅ Lua-Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ силы для C-ΠΊΠΎΠ΄Π°: ядро Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎ вашСм ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π΅ ΠΈ вашСм Ρ‚ΠΈΠΏΠ΅ payload. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ вашС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ нСльзя ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π² --payload (это C-ΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€). Но Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² payload-Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ… (payload=) ΠΌΠ½ΠΎΠ³ΠΈΡ… desync-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ β€” ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΡƒΠΆΠ΅ Π½Π° сторонС Lua, послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ваш Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π». Π‘Ρ…Π΅ΠΌΠ° такая: сначала инстанс detect_payload_str проставляСт l7payload, Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ инстанс с payload=ваш_Ρ‚ΠΈΠΏ Π½Π° Π½Π΅Π³ΠΎ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚.


ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°: MTProto (Telegram)

Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π³Π΄Π΅ Π²Π°ΠΆΠ½Π° Ρ€Π°Π·Π½ΠΈΡ†Π° Β«ΠΏΠ°ΠΊΠ΅Ρ‚ vs ΠΏΠΎΡ‚ΠΎΠΊΒ». Π’ соСдинСнии MTProto распознаётся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚:

ΠŸΠ°ΠΊΠ΅Ρ‚l7payloadΠŸΡ€ΠΎΠΉΠ΄Ρ‘Ρ‚ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ known?
ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈmtproto_initialβœ… Π”Π°
ΠŸΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹unknown❌ НСт

НуТно Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ payload=unknown? ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅Ρ‚. Для ΠΎΠ±Ρ…ΠΎΠ΄Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Telegram, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, достаточно ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ mtproto_initial, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ:

  1. DPI Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Ρ‡Π°Π»ΠΎ соСдинСния (сигнатуру MTProto);
  2. послС initial Π΄Π°Π½Π½Ρ‹Π΅ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Ρ‹ β€” DPI ΠΈΡ… Π½Π΅ парсит;
  3. Ссли initial ΠΏΡ€ΠΎΡˆΡ‘Π» β€” соСдинСниС установлСно.
# Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ β€” ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ initial
nfqws2 --filter-l7=mtproto \
  --payload=mtproto_initial \
  --lua-desync=fake:blob=0x00000000:repeats=3

Если ΠΆΠ΅ Π½ΡƒΠΆΠ½Ρ‹ всС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ MTProto (initial + ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅), ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ unknown явно ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ all:

# Π―Π²Π½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ unknown-ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠΌ
nfqws2 --filter-l7=mtproto \
  --payload=mtproto_initial --lua-desync=fake:blob=... \
  --payload=unknown --lua-desync=send:ip_ttl=3
 
# Или Ρ€Π°Π·ΠΎΠΌ всС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹
nfqws2 --filter-l7=mtproto \
  --payload=all \
  --lua-desync=fake:blob=...

Π”Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·Π±ΠΎΡ€ распознавания Telegram β€” Π² распознаваниС mtproto.


πŸ“š Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅


πŸ€– Π­Ρ‚ΠΈ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ β€” ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡƒΡ‡Π°Ρ‚ΡŒ Π½Π° Π½ΠΈΡ… ИИ

ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Ρ‚Ρ€Π΅Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ИИ Π½Π° Π½Π°ΡˆΠΈΡ… ΡΡ‚Π°Ρ‚ΡŒΡΡ…. Π˜ΡΡ…ΠΎΠ΄Π½ΠΎΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ скачиваниС всСго рСпозитория ΠΎΠ΄Π½ΠΈΠΌ zip-Π°Ρ€Ρ…ΠΈΠ²ΠΎΠΌ доступны Π² Forgejo: исходник этой Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ Β· вСсь Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ.