Remove --dst, fix auto, ignore tls minor version in alert

This commit is contained in:
ruti 2024-06-08 17:51:51 +03:00
parent 4b13c2127a
commit 05a248de6f
5 changed files with 28 additions and 96 deletions

View File

@ -90,41 +90,14 @@ int mode_add_get(struct sockaddr_ina *dst, int m)
}
int ext_connect(struct poolhd *pool, struct eval *val,
struct sockaddr_ina *dst, int next, int m)
{
assert(m >= 0 && m < params.dp_count && dst && val);
struct desync_params *dp = &params.dp[m];
if (dp->to_ip) {
struct sockaddr_ina addr = { .in6 = dp->addr };
if (!addr.in.sin_port) {
addr.in.sin_port = dst->in.sin_port;
}
return create_conn(pool, val, &addr, next);
}
return create_conn(pool, val, dst, next);
}
int connect_hook(struct poolhd *pool, struct eval *val,
struct sockaddr_ina *dst, int next)
{
int m = mode_add_get(dst, -1);
val->cache = (m == 0);
m = m < 0 ? 0 : m;
val->attempt = m;
val->attempt = m < 0 ? 0 : m;
if (params.late_conn) {
val->type = EV_DESYNC;
if (resp_error(val->fd, 0, val->flag) < 0) {
perror("send");
return -1;
}
val->in6 = dst->in6;
return 0;
}
return ext_connect(pool, val, dst, next, m);
return create_conn(pool, val, dst, next);
}
@ -132,8 +105,8 @@ int reconnect(struct poolhd *pool, struct eval *val, int m)
{
struct eval *client = val->pair;
if (ext_connect(pool, client,
(struct sockaddr_ina *)&val->in6, EV_DESYNC, m)) {
if (create_conn(pool, client,
(struct sockaddr_ina *)&val->in6, EV_DESYNC)) {
return -1;
}
val->pair = 0;
@ -179,11 +152,10 @@ int on_torst(struct poolhd *pool, struct eval *val)
for (; m < params.dp_count; m++) {
struct desync_params *dp = &params.dp[m];
if (!(dp->detect & DETECT_TORST)) {
continue;
if (!dp->detect) {
return -1;
}
if ((!dp->hosts || check_host(dp->hosts, val->pair)) &&
(!dp->proto || check_proto_tcp(dp->proto, val))) {
if (dp->detect & DETECT_TORST) {
break;
}
}
@ -206,33 +178,27 @@ int on_response(struct poolhd *pool, struct eval *val,
for (; m < params.dp_count; m++) {
struct desync_params *dp = &params.dp[m];
switch (0) {
default:
if ((dp->detect & DETECT_HTTP_LOCAT)
&& is_http_redirect(req, qn, resp, sn)) {
break;
}
else if ((dp->detect & DETECT_TLS_INVSID)
&& neq_tls_sid(req, qn, resp, sn)) {
break;
}
else if ((dp->detect & DETECT_TLS_ALERT)
&& is_tls_alert(resp, sn)) {
break;
}
else if (dp->detect & DETECT_HTTP_CLERR) {
int code = get_http_code(resp, sn);
if (code > 400 && code < 451 && code != 429) {
break;
}
}
continue;
if (!dp->detect) {
return -1;
}
if ((!dp->hosts || check_host(dp->hosts, val->pair)) &&
(!dp->proto || check_proto_tcp(dp->proto, val))) {
if ((dp->detect & DETECT_HTTP_LOCAT)
&& is_http_redirect(req, qn, resp, sn)) {
break;
}
else if ((dp->detect & DETECT_TLS_INVSID)
&& neq_tls_sid(req, qn, resp, sn)) {
break;
}
else if ((dp->detect & DETECT_TLS_ALERT)
&& is_tls_alert(resp, sn)) {
break;
}
else if (dp->detect & DETECT_HTTP_CLERR) {
int code = get_http_code(resp, sn);
if (code > 400 && code < 451 && code != 429) {
break;
}
}
}
if (m < params.dp_count) {
return reconnect(pool, val, m);
@ -382,10 +348,6 @@ int on_desync(struct poolhd *pool, struct eval *val,
}
val->attempt = m;
if (params.late_conn && val->recv_count == n) {
return ext_connect(pool, val,
(struct sockaddr_ina *)&val->in6, EV_DESYNC, m);
}
return on_desync_again(pool, val, buffer, bfsize);
}

15
main.c
View File

@ -74,7 +74,6 @@ const char help_text[] = {
#ifdef TCP_FASTOPEN_CONNECT
" -F, --tfo Enable TCP Fast Open\n"
#endif
" -L, --late-conn Waiting for request before connecting\n"
" -A, --auto[=t,r,c,s,a,n] Try desync params after this option\n"
" Detect: torst,redirect,cl_err,sid_inv,alert,none\n"
" -u, --cache-ttl <sec> Lifetime of cached desync params for IP\n"
@ -83,7 +82,6 @@ const char help_text[] = {
#endif
" -K, --proto[=t,h] Protocol whitelist: tls,http\n"
" -H, --hosts <file|:str> Hosts whitelist\n"
" -D, --dst <ip[:port]> Custom destination IP\n"
" -s, --split <n[+s]> Split packet at n\n"
" +s - add SNI offset\n"
" +h - add HTTP Host offset\n"
@ -121,7 +119,6 @@ const struct option options[] = {
#ifdef TCP_FASTOPEN_CONNECT
{"tfo ", 0, 0, 'F'},
#endif
{"late-conn", 0, 0, 'L'},
{"auto", 2, 0, 'A'},
{"cache-ttl", 1, 0, 'u'},
#ifdef TIMEOUT_SUPPORT
@ -129,7 +126,6 @@ const struct option options[] = {
#endif
{"proto", 2, 0, 'K'},
{"hosts", 1, 0, 'H'},
{"dst", 1, 0, 'D'},
{"split", 1, 0, 's'},
{"disorder", 1, 0, 'd'},
{"oob", 1, 0, 'o'},
@ -536,10 +532,6 @@ int main(int argc, char **argv)
// desync options
case 'L':
params.late_conn = 1;
break;
case 'F':
params.tfo = 1;
break;
@ -646,13 +638,6 @@ int main(int argc, char **argv)
}
break;
case 'D':
if (get_addr_with_port(optarg, (struct sockaddr_ina *)&dp->addr) < 0)
invalid = 1;
else
dp->to_ip = 1;
break;
case 's':
case 'd':
case 'o':

View File

@ -346,8 +346,9 @@ bool neq_tls_sid(char *req, size_t qn, char *resp, size_t sn)
bool is_tls_alert(char *resp, size_t sn) {
return (sn >= 7
&& !memcmp(resp, "\x15\x03\x01\x00\x02\x02", 6));
return (sn >= 7
&& resp[0] == 0x15 && resp[1] == 0x03
&& !memcmp(resp + 3, "\x00\x02\x02", 3));
}
/*

View File

@ -70,9 +70,6 @@ struct desync_params {
char *file_ptr;
ssize_t file_size;
char to_ip;
struct sockaddr_in6 addr;
};
struct params {
@ -83,7 +80,6 @@ struct params {
int def_ttl;
char custom_ttl;
char late_conn;
char tfo;
unsigned int timeout;
long cache_ttl;

View File

@ -39,10 +39,6 @@ $ ./ciadpi --disorder 3 -A --tlsrec 1+s
Если сервер его поддерживает, то первый пакет будет отправлен сразу вместе с SYN
Поддерживается только в Linux (4.11+)
-L, --late-conn
Выполнять настоящее подключение только после получения первого пакета от клиента
Полезно при сочетании --hosts с --dst
-A, --auto[=t,r,c,s,a,n]
Автоматический режим
Если произошло событие, похожее на блокировку или поломку,
@ -77,10 +73,6 @@ $ ./ciadpi --disorder 3 -A --tlsrec 1+s
Ограничить область действия параметров списком доменов
Домены должны быть разделены новой строкой или пробелом
-D, --dst <ip>
Заменить адрес назначения из запроса на указанный
Полезно совмещать с --auto и --hosts
-s, --split <n[+s]>
Разбить запрос по указанному смещению
После числа можно добавить флаг:
@ -241,10 +233,6 @@ TCP может отсылать данные вне основного пото
--hosts list.txt --auto=none --disorder 3
Не применять запутывание для доменов из list.txt
--late-conn --hosts ':one.one.one.one' --dst 1.1.1.1 --disorder 3 --auto=none --auto=torst --timeout 3 --tlsrec 1+s
Для указанного домена применять disorder, подключаясь только на указанный IP и игнорируя адрес из запроса.
Для остальных ничего не делать, однако если обнаружится блокировка, то попробовать применить tlsrec.
--auto=torst --hosts list.txt --disorder 3
По умолчанию ничего не делать, использовать disorder при условии, что произошла блокировка и домен входит в list.txt.