diff --git a/desync.c b/desync.c index 284d743..51b1205 100644 --- a/desync.c +++ b/desync.c @@ -120,10 +120,17 @@ void wait_send(int sfd) #ifdef __linux__ ssize_t send_fake(int sfd, char *buffer, - int cnt, long pos, struct sockaddr *dst, struct desync_params *opt) + int cnt, long pos, int fa, struct desync_params *opt) { - int fa = get_family(dst); - + struct sockaddr_in6 addr = {}; + socklen_t addr_size = sizeof(addr); + if (opt->md5sig) { + if (getpeername(sfd, + (struct sockaddr *)&addr, &addr_size) < 0) { + uniperror("getpeername"); + return -1; + } + } struct packet pkt = cnt != IS_HTTP ? fake_tls : fake_http; size_t psz = pkt.size; @@ -155,7 +162,7 @@ ssize_t send_fake(int sfd, char *buffer, struct tcp_md5sig md5 = { .tcpm_keylen = 5 }; - memcpy(&md5.tcpm_addr, dst, sizeof(struct sockaddr_in6)); + memcpy(&md5.tcpm_addr, &addr, addr_size); if (setsockopt(sfd, IPPROTO_TCP, TCP_MD5SIG, (char *)&md5, sizeof(md5)) < 0) { @@ -191,7 +198,7 @@ ssize_t send_fake(int sfd, char *buffer, struct tcp_md5sig md5 = { .tcpm_keylen = 0 }; - memcpy(&md5.tcpm_addr, dst, sizeof(struct sockaddr_in6)); + memcpy(&md5.tcpm_addr, &addr, addr_size); if (setsockopt(sfd, IPPROTO_TCP, TCP_MD5SIG, (char *)&md5, sizeof(md5)) < 0) { @@ -209,10 +216,8 @@ ssize_t send_fake(int sfd, char *buffer, #ifdef _WIN32 ssize_t send_fake(int sfd, char *buffer, - int cnt, long pos, struct sockaddr *dst, struct desync_params *opt) + int cnt, long pos, int fa, struct desync_params *opt) { - int fa = get_family(dst); - struct packet pkt = cnt != IS_HTTP ? fake_tls : fake_http; size_t psz = pkt.size; @@ -473,7 +478,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, dst, &dp); + buffer + lp, type, pos - lp, fa, &dp); break; #endif case DESYNC_DISORDER: diff --git a/proxy.c b/proxy.c index bd15fd2..81a9f1d 100644 --- a/proxy.c +++ b/proxy.c @@ -372,7 +372,7 @@ int create_conn(struct poolhd *pool, } val->pair = pair; pair->pair = val; - pair->in6 = addr.in6; + pair->in6 = dst->in6; pair->flag = FLAG_CONN; return 0; } @@ -506,18 +506,14 @@ int mode_add_get(struct sockaddr_ina *dst, int m) int len; time_t t; struct elem *val; - struct sockaddr_ina val_addr = *dst; - if (val_addr.sa.sa_family == AF_INET6) { - map_fix(&val_addr, 0); - } - if (val_addr.sa.sa_family == AF_INET) { - data = (char *)(&val_addr.in.sin_addr); - len = sizeof(val_addr.in.sin_addr); + if (dst->sa.sa_family == AF_INET) { + data = (char *)(&dst->in.sin_addr); + len = sizeof(dst->in.sin_addr); } else { - data = (char *)(&val_addr.in6.sin6_addr); - len = sizeof(val_addr.in6.sin6_addr); + data = (char *)(&dst->in6.sin6_addr); + len = sizeof(dst->in6.sin6_addr); } int i = mem_index(params.mempool, data, len); if (m == 0 && i >= 0) { @@ -579,11 +575,9 @@ static inline int on_request(struct poolhd *pool, struct eval *val, return -1; } if (error) { - if (val->flag == FLAG_S4 - && resp_error(val->fd, error, FLAG_S4) < 0) { - uniperror("send"); - } - else if (resp_s5_error(val->fd, error) < 0) { + if ((val->flag == FLAG_S4 + && resp_error(val->fd, error, FLAG_S4) < 0) + || (resp_s5_error(val->fd, error) < 0)) { uniperror("send"); } return -1; @@ -593,7 +587,8 @@ static inline int on_request(struct poolhd *pool, struct eval *val, error = create_conn(pool, val, &dst, EV_CONNECT, dp.mss); if (error) { - if (resp_error(val->fd, error, val->flag) < 0) + int en = get_e(); + if (resp_error(val->fd, en ? en : error, val->flag) < 0) uniperror("send"); return -1; } diff --git a/readme.txt b/readme.txt index 4381c72..a9fddcd 100644 --- a/readme.txt +++ b/readme.txt @@ -47,7 +47,7 @@ $ ./ciadpi --disorder 3 -A --tlsrec 1+s Можно указывать несколько групп параметров, раделяя их данным флагом Если соединение успешно прошло, то параметры для данного IP будут закешированны Параметры, которые можно вынести в отдельную группу: - split, disorder, oob, fake, ttl, ip-opt, md5sig, mod-http, tlsrec + tr, split, disorder, oob, fake, ttl, ip-opt, md5sig, mod-http, tlsrec -u, --cache-ttl Время жизни значения в кеше, по умолчанию 100800 (28 часов) @@ -59,7 +59,7 @@ $ ./ciadpi --disorder 3 -A --tlsrec 1+s -P, --tr Поиск строки в первом ответе от сервера, начиная с s и заканчивая e - Является триггером для --auto + Является триггером для --auto в указнной группе -s, --split Разбить запрос по указанному смещению @@ -123,6 +123,7 @@ $ ./ciadpi --disorder 3 -A --tlsrec 1+s Установить опцию MSS для TCP соединения Можно использовать для того, чтобы вынудить сервер разбить свой ответ При низких значениях сильно сказывается на скорости + Поддерживается только в Linux ------- Сборка: