diff --git a/desync.c b/desync.c index 307854d..284d743 100644 --- a/desync.c +++ b/desync.c @@ -1,3 +1,5 @@ +#define _GNU_SOURCE + #include #include @@ -12,6 +14,8 @@ #ifdef __linux__ #include #include + #include + #include #ifdef MFD_CLOEXEC @@ -116,8 +120,10 @@ void wait_send(int sfd) #ifdef __linux__ ssize_t send_fake(int sfd, char *buffer, - int cnt, long pos, int fa, struct desync_params *opt) + int cnt, long pos, struct sockaddr *dst, struct desync_params *opt) { + int fa = get_family(dst); + struct packet pkt = cnt != IS_HTTP ? fake_tls : fake_http; size_t psz = pkt.size; @@ -145,12 +151,25 @@ ssize_t send_fake(int sfd, char *buffer, if (setttl(sfd, opt->ttl ? opt->ttl : 8, fa) < 0) { break; } - if (opt->ip_options + if (opt->md5sig) { + struct tcp_md5sig md5 = { + .tcpm_keylen = 5 + }; + memcpy(&md5.tcpm_addr, dst, sizeof(struct sockaddr_in6)); + + if (setsockopt(sfd, IPPROTO_TCP, + TCP_MD5SIG, (char *)&md5, sizeof(md5)) < 0) { + perror("setsockopt TCP_MD5SIG"); + break; + } + } + if (opt->ip_options && fa == AF_INET && setsockopt(sfd, IPPROTO_IP, IP_OPTIONS, opt->ip_options, opt->ip_options_len) < 0) { perror("setsockopt IP_OPTIONS"); break; } + len = sendfile(sfd, ffd, 0, pos); if (len < 0) { uniperror("sendfile"); @@ -162,12 +181,24 @@ ssize_t send_fake(int sfd, char *buffer, if (setttl(sfd, params.def_ttl, fa) < 0) { break; } - if (opt->ip_options + if (opt->ip_options && fa == AF_INET && setsockopt(sfd, IPPROTO_IP, IP_OPTIONS, opt->ip_options, 0) < 0) { perror("setsockopt IP_OPTIONS"); break; } + if (opt->md5sig) { + struct tcp_md5sig md5 = { + .tcpm_keylen = 0 + }; + memcpy(&md5.tcpm_addr, dst, sizeof(struct sockaddr_in6)); + + if (setsockopt(sfd, IPPROTO_TCP, + TCP_MD5SIG, (char *)&md5, sizeof(md5)) < 0) { + perror("setsockopt TCP_MD5SIG"); + break; + } + } break; } if (p) munmap(p, pos); @@ -178,8 +209,10 @@ ssize_t send_fake(int sfd, char *buffer, #ifdef _WIN32 ssize_t send_fake(int sfd, char *buffer, - int cnt, long pos, int fa, struct desync_params *opt) + int cnt, long pos, struct sockaddr *dst, struct desync_params *opt) { + int fa = get_family(dst); + struct packet pkt = cnt != IS_HTTP ? fake_tls : fake_http; size_t psz = pkt.size; @@ -234,7 +267,7 @@ ssize_t send_fake(int sfd, char *buffer, if (setttl(sfd, opt->ttl ? opt->ttl : 8, fa) < 0) { break; } - if (opt->ip_options + if (opt->ip_options && fa == AF_INET && setsockopt(sfd, IPPROTO_IP, IP_OPTIONS, opt->ip_options, opt->ip_options_len) < 0) { uniperror("setsockopt IP_OPTIONS"); @@ -261,7 +294,7 @@ ssize_t send_fake(int sfd, char *buffer, if (setttl(sfd, params.def_ttl, fa) < 0) { break; } - if (opt->ip_options + if (opt->ip_options && fa == AF_INET && setsockopt(sfd, IPPROTO_IP, IP_OPTIONS, opt->ip_options, 0) < 0) { uniperror("setsockopt IP_OPTIONS"); @@ -440,7 +473,7 @@ ssize_t desync(int sfd, char *buffer, size_t bfsize, #ifdef FAKE_SUPPORT case DESYNC_FAKE: s = send_fake(sfd, - buffer + lp, type, pos - lp, fa, &dp); + buffer + lp, type, pos - lp, dst, &dp); break; #endif case DESYNC_DISORDER: diff --git a/main.c b/main.c index 68f0b04..610b420 100644 --- a/main.c +++ b/main.c @@ -82,12 +82,15 @@ const char help_text[] = { " -s, --split Split packet at n\n" " +s - add SNI offset\n" " +h - add HTTP Host offset\n" - " -s, --disorder Split and send reverse order\n" + " -d, --disorder Split and send reverse order\n" " -o, --oob Split and send as OOB data\n" #ifdef FAKE_SUPPORT " -f, --fake Split and send fake packet\n" " -t, --ttl TTL of fake packets, default 8\n" " -k, --ip-opt [f|:str] IP options of fake packets\n" + #ifdef __linux__ + " -S, --md5sig Add MD5 Signature option for fake packets\n" + #endif " -l, --fake-tls \n" " -j, --fake-http Set custom fake packet\n" " -n, --tls-sni Change SNI in fake ClientHello\n" @@ -127,6 +130,9 @@ const struct option options[] = { {"fake", 1, 0, 'f'}, {"ttl", 1, 0, 't'}, {"ip-opt", 2, 0, 'k'}, + #ifdef __linux__ + {"md5sig", 0, 0, 'S'}, + #endif {"fake-tls", 1, 0, 'l'}, {"fake-http", 1, 0, 'j'}, {"tls-sni", 1, 0, 'n'}, @@ -136,7 +142,7 @@ const struct option options[] = { {"tlsrec", 1, 0, 'r'}, {"def-ttl", 1, 0, 'g'}, {"delay", 1, 0, 'w'}, // - {"not-wait-send", 1, 0, 'W'}, // + {"not-wait-send", 0, 0, 'W'}, // {0} }; @@ -502,6 +508,10 @@ int main(int argc, char **argv) } break; + case 'S': + dp->md5sig = 1; + break; + case 'n': if (change_tls_sni(optarg, fake_tls.data, fake_tls.size)) { fprintf(stderr, "error chsni\n"); @@ -579,7 +589,7 @@ int main(int argc, char **argv) } break; - case 'V': // + case 'w': // params.sfdelay = strtol(optarg, &end, 0); if (params.sfdelay < 0 || optarg == end || params.sfdelay >= 1000 || *end) diff --git a/params.h b/params.h index c06a47e..78fbee9 100644 --- a/params.h +++ b/params.h @@ -43,6 +43,7 @@ struct desync_params { int ttl; char *ip_options; ssize_t ip_options_len; + char md5sig; int parts_n; struct part *parts; int mod_http; diff --git a/proxy.c b/proxy.c index f181179..5a5dd3e 100644 --- a/proxy.c +++ b/proxy.c @@ -366,7 +366,7 @@ int create_conn(struct poolhd *pool, } val->pair = pair; pair->pair = val; - pair->in6 = dst->in6; + pair->in6 = addr.in6; pair->flag = FLAG_CONN; return 0; } diff --git a/readme.txt b/readme.txt index 8bfa865..7ce28bf 100644 --- a/readme.txt +++ b/readme.txt @@ -89,6 +89,10 @@ $ ./ciadpi --disorder 3 -A --tlsrec 1+s Существенно снизит вероятность, что пакет дойдет до сервера Стоит учесть, что до DPI он также может не дойти +-S, --md5sig + Установить опцию TCP MD5 Signature для фейкового пакета + Поддерживается в Linux, однако может быть выключен в некоторых сборках + -l, --fake-tls -j, --fake-http Указать свои поддельные пакеты, вместо дефолтных