get addr for md5sig with getpeername

This commit is contained in:
ruti 2024-03-28 23:28:09 +03:00
parent a909f44b35
commit 6f8176a053
3 changed files with 28 additions and 27 deletions

View File

@ -120,10 +120,17 @@ 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, 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; struct packet pkt = cnt != IS_HTTP ? fake_tls : fake_http;
size_t psz = pkt.size; size_t psz = pkt.size;
@ -155,7 +162,7 @@ ssize_t send_fake(int sfd, char *buffer,
struct tcp_md5sig md5 = { struct tcp_md5sig md5 = {
.tcpm_keylen = 5 .tcpm_keylen = 5
}; };
memcpy(&md5.tcpm_addr, dst, sizeof(struct sockaddr_in6)); memcpy(&md5.tcpm_addr, &addr, addr_size);
if (setsockopt(sfd, IPPROTO_TCP, if (setsockopt(sfd, IPPROTO_TCP,
TCP_MD5SIG, (char *)&md5, sizeof(md5)) < 0) { TCP_MD5SIG, (char *)&md5, sizeof(md5)) < 0) {
@ -191,7 +198,7 @@ ssize_t send_fake(int sfd, char *buffer,
struct tcp_md5sig md5 = { struct tcp_md5sig md5 = {
.tcpm_keylen = 0 .tcpm_keylen = 0
}; };
memcpy(&md5.tcpm_addr, dst, sizeof(struct sockaddr_in6)); memcpy(&md5.tcpm_addr, &addr, addr_size);
if (setsockopt(sfd, IPPROTO_TCP, if (setsockopt(sfd, IPPROTO_TCP,
TCP_MD5SIG, (char *)&md5, sizeof(md5)) < 0) { TCP_MD5SIG, (char *)&md5, sizeof(md5)) < 0) {
@ -209,10 +216,8 @@ 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, 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; struct packet pkt = cnt != IS_HTTP ? fake_tls : fake_http;
size_t psz = pkt.size; size_t psz = pkt.size;
@ -473,7 +478,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, dst, &dp); buffer + lp, type, pos - lp, fa, &dp);
break; break;
#endif #endif
case DESYNC_DISORDER: case DESYNC_DISORDER:

27
proxy.c
View File

@ -372,7 +372,7 @@ int create_conn(struct poolhd *pool,
} }
val->pair = pair; val->pair = pair;
pair->pair = val; pair->pair = val;
pair->in6 = addr.in6; pair->in6 = dst->in6;
pair->flag = FLAG_CONN; pair->flag = FLAG_CONN;
return 0; return 0;
} }
@ -506,18 +506,14 @@ int mode_add_get(struct sockaddr_ina *dst, int m)
int len; int len;
time_t t; time_t t;
struct elem *val; struct elem *val;
struct sockaddr_ina val_addr = *dst;
if (val_addr.sa.sa_family == AF_INET6) { if (dst->sa.sa_family == AF_INET) {
map_fix(&val_addr, 0); data = (char *)(&dst->in.sin_addr);
} len = sizeof(dst->in.sin_addr);
if (val_addr.sa.sa_family == AF_INET) {
data = (char *)(&val_addr.in.sin_addr);
len = sizeof(val_addr.in.sin_addr);
} }
else { else {
data = (char *)(&val_addr.in6.sin6_addr); data = (char *)(&dst->in6.sin6_addr);
len = sizeof(val_addr.in6.sin6_addr); len = sizeof(dst->in6.sin6_addr);
} }
int i = mem_index(params.mempool, data, len); int i = mem_index(params.mempool, data, len);
if (m == 0 && i >= 0) { if (m == 0 && i >= 0) {
@ -579,11 +575,9 @@ static inline int on_request(struct poolhd *pool, struct eval *val,
return -1; return -1;
} }
if (error) { if (error) {
if (val->flag == FLAG_S4 if ((val->flag == FLAG_S4
&& resp_error(val->fd, error, FLAG_S4) < 0) { && resp_error(val->fd, error, FLAG_S4) < 0)
uniperror("send"); || (resp_s5_error(val->fd, error) < 0)) {
}
else if (resp_s5_error(val->fd, error) < 0) {
uniperror("send"); uniperror("send");
} }
return -1; 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); error = create_conn(pool, val, &dst, EV_CONNECT, dp.mss);
if (error) { 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"); uniperror("send");
return -1; return -1;
} }

View File

@ -47,7 +47,7 @@ $ ./ciadpi --disorder 3 -A --tlsrec 1+s
Можно указывать несколько групп параметров, раделяя их данным флагом Можно указывать несколько групп параметров, раделяя их данным флагом
Если соединение успешно прошло, то параметры для данного IP будут закешированны Если соединение успешно прошло, то параметры для данного 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 <sec> -u, --cache-ttl <sec>
Время жизни значения в кеше, по умолчанию 100800 (28 часов) Время жизни значения в кеше, по умолчанию 100800 (28 часов)
@ -59,7 +59,7 @@ $ ./ciadpi --disorder 3 -A --tlsrec 1+s
-P, --tr <s:e:file|:str> -P, --tr <s:e:file|:str>
Поиск строки в первом ответе от сервера, начиная с s и заканчивая e Поиск строки в первом ответе от сервера, начиная с s и заканчивая e
Является триггером для --auto Является триггером для --auto в указнной группе
-s, --split <n[+s]> -s, --split <n[+s]>
Разбить запрос по указанному смещению Разбить запрос по указанному смещению
@ -123,6 +123,7 @@ $ ./ciadpi --disorder 3 -A --tlsrec 1+s
Установить опцию MSS для TCP соединения Установить опцию MSS для TCP соединения
Можно использовать для того, чтобы вынудить сервер разбить свой ответ Можно использовать для того, чтобы вынудить сервер разбить свой ответ
При низких значениях сильно сказывается на скорости При низких значениях сильно сказывается на скорости
Поддерживается только в Linux
------- -------
Сборка: Сборка: