--md5sig, --ip-opt for IPv4 only

This commit is contained in:
ruti 2024-03-26 17:15:34 +03:00
parent b0d624136e
commit e031e7d235
5 changed files with 59 additions and 11 deletions

View File

@ -1,3 +1,5 @@
#define _GNU_SOURCE
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@ -12,6 +14,8 @@
#ifdef __linux__ #ifdef __linux__
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/sendfile.h> #include <sys/sendfile.h>
#include <fcntl.h>
#include <desync.h> #include <desync.h>
#ifdef MFD_CLOEXEC #ifdef MFD_CLOEXEC
@ -116,8 +120,10 @@ void wait_send(int sfd)
#ifdef __linux__ #ifdef __linux__
ssize_t send_fake(int sfd, char *buffer, 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; struct packet pkt = cnt != IS_HTTP ? fake_tls : fake_http;
size_t psz = pkt.size; 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) { if (setttl(sfd, opt->ttl ? opt->ttl : 8, fa) < 0) {
break; 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, && setsockopt(sfd, IPPROTO_IP, IP_OPTIONS,
opt->ip_options, opt->ip_options_len) < 0) { opt->ip_options, opt->ip_options_len) < 0) {
perror("setsockopt IP_OPTIONS"); perror("setsockopt IP_OPTIONS");
break; break;
} }
len = sendfile(sfd, ffd, 0, pos); len = sendfile(sfd, ffd, 0, pos);
if (len < 0) { if (len < 0) {
uniperror("sendfile"); uniperror("sendfile");
@ -162,12 +181,24 @@ ssize_t send_fake(int sfd, char *buffer,
if (setttl(sfd, params.def_ttl, fa) < 0) { if (setttl(sfd, params.def_ttl, fa) < 0) {
break; break;
} }
if (opt->ip_options if (opt->ip_options && fa == AF_INET
&& setsockopt(sfd, IPPROTO_IP, && setsockopt(sfd, IPPROTO_IP,
IP_OPTIONS, opt->ip_options, 0) < 0) { IP_OPTIONS, opt->ip_options, 0) < 0) {
perror("setsockopt IP_OPTIONS"); perror("setsockopt IP_OPTIONS");
break; 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; break;
} }
if (p) munmap(p, pos); if (p) munmap(p, pos);
@ -178,8 +209,10 @@ ssize_t send_fake(int sfd, char *buffer,
#ifdef _WIN32 #ifdef _WIN32
ssize_t send_fake(int sfd, char *buffer, 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; struct packet pkt = cnt != IS_HTTP ? fake_tls : fake_http;
size_t psz = pkt.size; 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) { if (setttl(sfd, opt->ttl ? opt->ttl : 8, fa) < 0) {
break; break;
} }
if (opt->ip_options if (opt->ip_options && fa == AF_INET
&& setsockopt(sfd, IPPROTO_IP, IP_OPTIONS, && setsockopt(sfd, IPPROTO_IP, IP_OPTIONS,
opt->ip_options, opt->ip_options_len) < 0) { opt->ip_options, opt->ip_options_len) < 0) {
uniperror("setsockopt IP_OPTIONS"); uniperror("setsockopt IP_OPTIONS");
@ -261,7 +294,7 @@ ssize_t send_fake(int sfd, char *buffer,
if (setttl(sfd, params.def_ttl, fa) < 0) { if (setttl(sfd, params.def_ttl, fa) < 0) {
break; break;
} }
if (opt->ip_options if (opt->ip_options && fa == AF_INET
&& setsockopt(sfd, IPPROTO_IP, IP_OPTIONS, && setsockopt(sfd, IPPROTO_IP, IP_OPTIONS,
opt->ip_options, 0) < 0) { opt->ip_options, 0) < 0) {
uniperror("setsockopt IP_OPTIONS"); uniperror("setsockopt IP_OPTIONS");
@ -440,7 +473,7 @@ ssize_t desync(int sfd, char *buffer, size_t bfsize,
#ifdef FAKE_SUPPORT #ifdef FAKE_SUPPORT
case DESYNC_FAKE: case DESYNC_FAKE:
s = send_fake(sfd, s = send_fake(sfd,
buffer + lp, type, pos - lp, fa, &dp); buffer + lp, type, pos - lp, dst, &dp);
break; break;
#endif #endif
case DESYNC_DISORDER: case DESYNC_DISORDER:

16
main.c
View File

@ -82,12 +82,15 @@ const char help_text[] = {
" -s, --split <n[+s]> Split packet at n\n" " -s, --split <n[+s]> Split packet at n\n"
" +s - add SNI offset\n" " +s - add SNI offset\n"
" +h - add HTTP Host offset\n" " +h - add HTTP Host offset\n"
" -s, --disorder <n[+s]> Split and send reverse order\n" " -d, --disorder <n[+s]> Split and send reverse order\n"
" -o, --oob <n[+s]> Split and send as OOB data\n" " -o, --oob <n[+s]> Split and send as OOB data\n"
#ifdef FAKE_SUPPORT #ifdef FAKE_SUPPORT
" -f, --fake <n[+s]> Split and send fake packet\n" " -f, --fake <n[+s]> Split and send fake packet\n"
" -t, --ttl <num> TTL of fake packets, default 8\n" " -t, --ttl <num> TTL of fake packets, default 8\n"
" -k, --ip-opt [f|:str] IP options of fake packets\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 <f|:str>\n" " -l, --fake-tls <f|:str>\n"
" -j, --fake-http <f|:str> Set custom fake packet\n" " -j, --fake-http <f|:str> Set custom fake packet\n"
" -n, --tls-sni <str> Change SNI in fake ClientHello\n" " -n, --tls-sni <str> Change SNI in fake ClientHello\n"
@ -127,6 +130,9 @@ const struct option options[] = {
{"fake", 1, 0, 'f'}, {"fake", 1, 0, 'f'},
{"ttl", 1, 0, 't'}, {"ttl", 1, 0, 't'},
{"ip-opt", 2, 0, 'k'}, {"ip-opt", 2, 0, 'k'},
#ifdef __linux__
{"md5sig", 0, 0, 'S'},
#endif
{"fake-tls", 1, 0, 'l'}, {"fake-tls", 1, 0, 'l'},
{"fake-http", 1, 0, 'j'}, {"fake-http", 1, 0, 'j'},
{"tls-sni", 1, 0, 'n'}, {"tls-sni", 1, 0, 'n'},
@ -136,7 +142,7 @@ const struct option options[] = {
{"tlsrec", 1, 0, 'r'}, {"tlsrec", 1, 0, 'r'},
{"def-ttl", 1, 0, 'g'}, {"def-ttl", 1, 0, 'g'},
{"delay", 1, 0, 'w'}, // {"delay", 1, 0, 'w'}, //
{"not-wait-send", 1, 0, 'W'}, // {"not-wait-send", 0, 0, 'W'}, //
{0} {0}
}; };
@ -502,6 +508,10 @@ int main(int argc, char **argv)
} }
break; break;
case 'S':
dp->md5sig = 1;
break;
case 'n': case 'n':
if (change_tls_sni(optarg, fake_tls.data, fake_tls.size)) { if (change_tls_sni(optarg, fake_tls.data, fake_tls.size)) {
fprintf(stderr, "error chsni\n"); fprintf(stderr, "error chsni\n");
@ -579,7 +589,7 @@ int main(int argc, char **argv)
} }
break; break;
case 'V': // case 'w': //
params.sfdelay = strtol(optarg, &end, 0); params.sfdelay = strtol(optarg, &end, 0);
if (params.sfdelay < 0 || optarg == end if (params.sfdelay < 0 || optarg == end
|| params.sfdelay >= 1000 || *end) || params.sfdelay >= 1000 || *end)

View File

@ -43,6 +43,7 @@ struct desync_params {
int ttl; int ttl;
char *ip_options; char *ip_options;
ssize_t ip_options_len; ssize_t ip_options_len;
char md5sig;
int parts_n; int parts_n;
struct part *parts; struct part *parts;
int mod_http; int mod_http;

View File

@ -366,7 +366,7 @@ int create_conn(struct poolhd *pool,
} }
val->pair = pair; val->pair = pair;
pair->pair = val; pair->pair = val;
pair->in6 = dst->in6; pair->in6 = addr.in6;
pair->flag = FLAG_CONN; pair->flag = FLAG_CONN;
return 0; return 0;
} }

View File

@ -89,6 +89,10 @@ $ ./ciadpi --disorder 3 -A --tlsrec 1+s
Существенно снизит вероятность, что пакет дойдет до сервера Существенно снизит вероятность, что пакет дойдет до сервера
Стоит учесть, что до DPI он также может не дойти Стоит учесть, что до DPI он также может не дойти
-S, --md5sig
Установить опцию TCP MD5 Signature для фейкового пакета
Поддерживается в Linux, однако может быть выключен в некоторых сборках
-l, --fake-tls <file|:str> -l, --fake-tls <file|:str>
-j, --fake-http <file|:str> -j, --fake-http <file|:str>
Указать свои поддельные пакеты, вместо дефолтных Указать свои поддельные пакеты, вместо дефолтных