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__
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:

27
proxy.c
View File

@ -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;
}

View File

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