mirror of
https://github.com/bol-van/zapret.git
synced 2024-11-26 20:20:53 +03:00
Compare commits
2 Commits
01bf4a62fc
...
f5ba30b47b
Author | SHA1 | Date | |
---|---|---|---|
|
f5ba30b47b | ||
|
bc1aaec754 |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -299,7 +299,7 @@ sequence number.
|
|||||||
In `split2` mode this creates partially in-window packet. OS receives only in-window part.
|
In `split2` mode this creates partially in-window packet. OS receives only in-window part.
|
||||||
In `disorder2` mode OS receives fake and real part of the second segment but does not pass received data to the socket until first
|
In `disorder2` mode OS receives fake and real part of the second segment but does not pass received data to the socket until first
|
||||||
segment is received. First segment overwrites fake part of the second segment. Then OS passes original data to the socket.
|
segment is received. First segment overwrites fake part of the second segment. Then OS passes original data to the socket.
|
||||||
All unix OS preserve last received data. This may not be the case for Windows servers and may not work.
|
All unix OS except Solaris preserve last received data. This is not the case for Windows servers and `disorder` with `seqovl` will not work.
|
||||||
Disorder requires `seqovl` to be less than `split_pos`. Either statically defined or automatically calculated.
|
Disorder requires `seqovl` to be less than `split_pos`. Either statically defined or automatically calculated.
|
||||||
Otherwise desync is not possible and will not happen.
|
Otherwise desync is not possible and will not happen.
|
||||||
Method allows to avoid separate fakes. Fakes and real data are mixed.
|
Method allows to avoid separate fakes. Fakes and real data are mixed.
|
||||||
|
@ -393,11 +393,14 @@ seqovl байт со смещенным в минус sequence number на ве
|
|||||||
Для disorder2 overlap идет на 2-ю часть пакета. Обязательно, чтобы seqovl был меньше split_pos, иначе
|
Для disorder2 overlap идет на 2-ю часть пакета. Обязательно, чтобы seqovl был меньше split_pos, иначе
|
||||||
все отосланное будет передано в сокет сразу же, включая фейк, ломая протокол прикладного уровня.
|
все отосланное будет передано в сокет сразу же, включая фейк, ломая протокол прикладного уровня.
|
||||||
При соблюдении этого условия 2-я часть пакета является полностью in-window,
|
При соблюдении этого условия 2-я часть пакета является полностью in-window,
|
||||||
поэтому серверная ОС принимает ее целиком, включая фейк. Но поскольку начальная часть данных из 1 пакета еще не принята,
|
поэтому серверная ОС принимает ее целиком, включая фейк. Но поскольку начальная часть данных из 1 пакета
|
||||||
то фейк и реальные данные остаются в памяти ядра, не отправляясь в серверное приложение. Как только приходит 1-я часть пакета,
|
еще не принята, то фейк и реальные данные остаются в памяти ядра, не отправляясь в серверное приложение.
|
||||||
она переписывает фейковую часть в памяти ядра. Ядро получает данные из 1 и 2 части, поэтому далее
|
Как только приходит 1-я часть пакета, она переписывает фейковую часть в памяти ядра.
|
||||||
идет отправка в сокет приложения. Таково поведение всех unix ОС - оставлять последние принятые данные.
|
Ядро получает данные из 1 и 2 части, поэтому далее идет отправка в сокет приложения.
|
||||||
Для windows серверов может быть наоборот, поэтому не факт, что такой вариант будет на них работать.
|
Таково поведение всех unix ОС, кроме solaris - оставлять последние принятые данные.
|
||||||
|
Windows оставляет старые данные, поэтому disorder с seqovl будет приводить к зависаниям соединения
|
||||||
|
при работе с Windows серверами. Solaris практически мертв, windows серверов очень немного.
|
||||||
|
Можно использовать листы при необходимости.
|
||||||
Метод позволяет обойтись без fooling и TTL. Фейки перемешаны с реальным данными.
|
Метод позволяет обойтись без fooling и TTL. Фейки перемешаны с реальным данными.
|
||||||
split/disorder вместо split2/disorder2 по-прежнему добавляют дополнительные отдельные фейки.
|
split/disorder вместо split2/disorder2 по-прежнему добавляют дополнительные отдельные фейки.
|
||||||
|
|
||||||
|
17
nfq/desync.c
17
nfq/desync.c
@ -7,6 +7,7 @@
|
|||||||
#include "hostlist.h"
|
#include "hostlist.h"
|
||||||
#include "conntrack.h"
|
#include "conntrack.h"
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
@ -1133,14 +1134,14 @@ static uint8_t dpi_desync_tcp_packet_play(bool replay, size_t reasm_offset, uint
|
|||||||
if (!ip_frag(pkt_orig, pkt_orig_len, ipfrag_pos, ident, pkt1, &pkt1_len, pkt2, &pkt2_len))
|
if (!ip_frag(pkt_orig, pkt_orig_len, ipfrag_pos, ident, pkt1, &pkt1_len, pkt2, &pkt2_len))
|
||||||
return verdict;
|
return verdict;
|
||||||
|
|
||||||
DLOG("sending 1st ip fragment 0-%zu len=%zu : ", ipfrag_pos-1, ipfrag_pos)
|
DLOG("sending 1st ip fragment 0-%zu ip_payload_len=%zu : ", ipfrag_pos-1, ipfrag_pos)
|
||||||
hexdump_limited_dlog(pkt1,pkt1_len,IP_MAXDUMP); DLOG("\n")
|
hexdump_limited_dlog(pkt1,pkt1_len,IP_MAXDUMP); DLOG("\n")
|
||||||
if (!rawsend((struct sockaddr *)&dst, desync_fwmark, ifout , pkt2, pkt2_len))
|
if (!rawsend((struct sockaddr *)&dst, desync_fwmark, ifout , pkt1, pkt1_len))
|
||||||
return verdict;
|
return verdict;
|
||||||
|
|
||||||
DLOG("sending 2nd ip fragment %zu-%zu len=%zu : ", ipfrag_pos, transport_len-1, transport_len-ipfrag_pos)
|
DLOG("sending 2nd ip fragment %zu-%zu ip_payload_len=%zu : ", ipfrag_pos, transport_len-1, transport_len-ipfrag_pos)
|
||||||
hexdump_limited_dlog(pkt2,pkt2_len,IP_MAXDUMP); DLOG("\n")
|
hexdump_limited_dlog(pkt2,pkt2_len,IP_MAXDUMP); DLOG("\n")
|
||||||
if (!rawsend((struct sockaddr *)&dst, desync_fwmark, ifout , pkt1, pkt1_len))
|
if (!rawsend((struct sockaddr *)&dst, desync_fwmark, ifout , pkt2, pkt2_len))
|
||||||
return verdict;
|
return verdict;
|
||||||
|
|
||||||
return VERDICT_DROP;
|
return VERDICT_DROP;
|
||||||
@ -1536,14 +1537,14 @@ static uint8_t dpi_desync_udp_packet_play(bool replay, size_t reasm_offset, uint
|
|||||||
if (!ip_frag(pkt_orig, pkt_orig_len, ipfrag_pos, ident, pkt1, &pkt1_len, pkt2, &pkt2_len))
|
if (!ip_frag(pkt_orig, pkt_orig_len, ipfrag_pos, ident, pkt1, &pkt1_len, pkt2, &pkt2_len))
|
||||||
return verdict;
|
return verdict;
|
||||||
|
|
||||||
DLOG("sending 1st ip fragment 0-%zu len=%zu : ", ipfrag_pos-1, ipfrag_pos)
|
DLOG("sending 1st ip fragment 0-%zu ip_payload_len=%zu : ", ipfrag_pos-1, ipfrag_pos)
|
||||||
hexdump_limited_dlog(pkt1,pkt1_len,IP_MAXDUMP); DLOG("\n")
|
hexdump_limited_dlog(pkt1,pkt1_len,IP_MAXDUMP); DLOG("\n")
|
||||||
if (!rawsend((struct sockaddr *)&dst, desync_fwmark, ifout , pkt2, pkt2_len))
|
if (!rawsend((struct sockaddr *)&dst, desync_fwmark, ifout , pkt1, pkt1_len))
|
||||||
return verdict;
|
return verdict;
|
||||||
|
|
||||||
DLOG("sending 2nd ip fragment %zu-%zu len=%zu : ", ipfrag_pos, transport_len-1, transport_len-ipfrag_pos)
|
DLOG("sending 2nd ip fragment %zu-%zu ip_payload_len=%zu : ", ipfrag_pos, transport_len-1, transport_len-ipfrag_pos)
|
||||||
hexdump_limited_dlog(pkt2,pkt2_len,IP_MAXDUMP); DLOG("\n")
|
hexdump_limited_dlog(pkt2,pkt2_len,IP_MAXDUMP); DLOG("\n")
|
||||||
if (!rawsend((struct sockaddr *)&dst, desync_fwmark, ifout , pkt1, pkt1_len))
|
if (!rawsend((struct sockaddr *)&dst, desync_fwmark, ifout , pkt2, pkt2_len))
|
||||||
return verdict;
|
return verdict;
|
||||||
|
|
||||||
return ct_new_postnat_fix_udp(ctrack, ip, ip6hdr, udphdr, len_pkt);
|
return ct_new_postnat_fix_udp(ctrack, ip, ip6hdr, udphdr, len_pkt);
|
||||||
|
Loading…
Reference in New Issue
Block a user