diff --git a/conev.h b/conev.h index 8b5b017..38c1b22 100644 --- a/conev.h +++ b/conev.h @@ -35,15 +35,12 @@ enum eid { EV_IGNORE, EV_TUNNEL, EV_PRE_TUNNEL, - EV_REDIRECT, EV_DESYNC }; #define FLAG_S4 1 #define FLAG_S5 2 #define FLAG_CONN 4 -#define FLAG_AUTH 8 -#define FLAG_ANSWER 16 #ifndef CONEV_H char *eid_name[] = { @@ -53,7 +50,6 @@ char *eid_name[] = { "EV_IGNORE", "EV_TUNNEL", "EV_PRE_TUNNEL", - "EV_REDIRECT", "EV_DESYNC" }; #endif diff --git a/desync.c b/desync.c index 9298b32..f56875e 100644 --- a/desync.c +++ b/desync.c @@ -71,7 +71,7 @@ int setttl(int fd, int ttl, int family) { static inline void delay(long ms) { struct timespec time = { - .tv_nsec = ms * 1000000 + .tv_nsec = ms * 1e6 }; nanosleep(&time, 0); } @@ -181,9 +181,7 @@ int desync(int sfd, char *buffer, size_t bfsize, ssize_t n, struct sockaddr *dst, int dp_c) { struct desync_params dp = params.dp[dp_c]; - if (dp.redirect) { - dst = (struct sockaddr *)&dp.ext_proxy; - } + char *host = 0; int len = 0, type = 0; int fa = get_family(dst); diff --git a/main.c b/main.c index b2da8d3..53064eb 100644 --- a/main.c +++ b/main.c @@ -71,7 +71,6 @@ const char help_text[] = { " -K, --desync-known Desync only HTTP and TLS with SNI\n" " -A, --auto Try desync params after this option\n" " -u, --cache-ttl Lifetime of cached desync params for IP\n" - " -q, --redirect Redirect to external SOCKS5 proxy\n" " -s, --split Split packet at n\n" " +s - add SNI offset\n" " +h - add HTTP Host offset\n" @@ -120,7 +119,6 @@ const struct option options[] = { {"tlsrec", 1, 0, 'r'}, {"def-ttl", 1, 0, 'g'}, {"delay", 1, 0, 'w'}, // - {"redirect", 1, 0, 'q'}, {0} }; @@ -517,15 +515,7 @@ int main(int argc, char **argv) || params.sfdelay >= 1000 || *end) invalid = 1; break; - - case 'q': - if (get_addr(optarg, (struct sockaddr_ina *)&dp->ext_proxy) < 0) - invalid = 1; - else - dp->redirect = 1; - break; - - + case 0: break; diff --git a/mpool.c b/mpool.c index 10d14c2..091ac0d 100644 --- a/mpool.c +++ b/mpool.c @@ -102,9 +102,9 @@ void mem_delete(struct mphdr *hdr, int pos) hdr->max = max; hdr->values = new; } - hdr->max = max; - hdr->values = new; } + free(hdr->values[pos]); + if (pos < hdr->count) { void *p = &hdr->values[pos]; void *n = &hdr->values[pos + 1]; diff --git a/params.h b/params.h index ed32c8f..09a36eb 100644 --- a/params.h +++ b/params.h @@ -25,8 +25,6 @@ struct part { }; struct desync_params { - char redirect; - struct sockaddr_in6 ext_proxy; int ttl; int parts_n; struct part *parts; diff --git a/proxy.c b/proxy.c index 2c16eeb..f795985 100644 --- a/proxy.c +++ b/proxy.c @@ -507,7 +507,7 @@ static inline int on_request(struct poolhd *pool, struct eval *val, if (n) uniperror("ss recv"); return -1; } - int e = 0, s5e = 0, m; + int e = 0, s5e = 0; if (*buffer == S_VER5) { if (val->flag != FLAG_S5) { @@ -533,21 +533,7 @@ static inline int on_request(struct poolhd *pool, struct eval *val, return -1; } if (!e) { - m = mode_add_get(&dst, -1); - int next = EV_CONNECT; - - if (m >= 0) { - struct desync_params *dp = ¶ms.dp[m]; - if (dp->redirect) { - next = EV_REDIRECT; - e = create_conn(pool, val, - (struct sockaddr_ina *)&dp->ext_proxy, next); - val->pair->in6 = dst.in6; - } - } - if (next == EV_CONNECT) { - e = create_conn(pool, val, &dst, next); - } + e = create_conn(pool, val, &dst, EV_CONNECT); } if (e) { if (s5e) { @@ -558,6 +544,7 @@ static inline int on_request(struct poolhd *pool, struct eval *val, } return -1; } + int m = mode_add_get(&dst, -1); if (m >= 0) { val->attempt = m; } @@ -570,7 +557,6 @@ static inline int on_request(struct poolhd *pool, struct eval *val, int try_again(struct poolhd *pool, struct eval *val) { struct eval *client = val->pair; - int e = 0; int m = client->attempt + 1; if (m >= params.dp_count) { @@ -578,17 +564,8 @@ int try_again(struct poolhd *pool, struct eval *val) (struct sockaddr_ina *)&val->in6, 0); return -1; } - struct desync_params *dp = ¶ms.dp[m]; - if (dp->redirect) { - e = create_conn(pool, client, - (struct sockaddr_ina *)&dp->ext_proxy, EV_REDIRECT); - client->pair->in6 = val->in6; - } - else { - e = create_conn(pool, client, - (struct sockaddr_ina *)&val->in6, EV_DESYNC); - } - if (e) { + if (create_conn(pool, client, + (struct sockaddr_ina *)&val->in6, EV_DESYNC)) { return -1; } val->pair = 0; @@ -688,17 +665,12 @@ static inline int on_connect(struct poolhd *pool, struct eval *val, int e) { int error = 0; socklen_t len = sizeof(error); - struct eval *pair = val->pair; if (e) { if (getsockopt(val->fd, SOL_SOCKET, SO_ERROR, (char *)&error, &len)) { uniperror("getsockopt SO_ERROR"); return -1; } - if (unie(error) == ECONNREFUSED) { - e = try_again(pool, val); - if (!e) error = 0; - } } else { if (mod_etype(pool, val, POLLOUT, 0)) { @@ -708,8 +680,8 @@ static inline int on_connect(struct poolhd *pool, struct eval *val, int e) val->type = EV_TUNNEL; val->pair->type = EV_DESYNC; } - if (resp_error(pair->fd, - error, pair->flag) < 0) { + if (resp_error(val->pair->fd, + error, val->pair->flag) < 0) { uniperror("send"); return -1; } @@ -717,90 +689,6 @@ static inline int on_connect(struct poolhd *pool, struct eval *val, int e) } -static inline int on_redirect(struct poolhd *pool, struct eval *val, - char *buffer, size_t bfsize) -{ - struct eval *pair = val->pair; - int e = -1; - - switch (val->flag) { - case FLAG_CONN:; - char a[3] = "\5\1\0"; - if (send(val->fd, &a, sizeof(a), 0) < 0) { - uniperror("rr: send"); - break; - } - if (mod_etype(pool, val, POLLOUT, 0)) { - uniperror("mod_etype"); - break; - } - val->flag = FLAG_AUTH; - return 0; - - case FLAG_AUTH:; - ssize_t n = recv(val->fd, buffer, bfsize, 0); - if (n < 2) { - break; - } - if (!(buffer[0] == 5 && buffer[1] == 0)) { - LOG(LOG_E, "rr: auth error: 0x%x\n", buffer[1]); - break; - } - struct s5_req r = {.ver = 5, .cmd = S_CMD_CONN}; - - switch (val->in.sin_family) { - case AF_INET: - r.atp = S_ATP_I4; - r.i4 = val->in.sin_addr; - r.p4 = val->in.sin_port; - break; - case AF_INET6: - r.atp = S_ATP_I6; - r.i6 = val->in6.sin6_addr; - r.p6 = val->in6.sin6_port; - break; - default: - return -1; - } - if (send(val->fd, &r, sizeof(r), 0) < 0) { - uniperror("rr: send"); - break; - } - val->flag = FLAG_ANSWER; - return 0; - - case FLAG_ANSWER: - n = recv(val->fd, buffer, bfsize, 0); - if (n < sizeof(struct s5_rep)) { - uniperror("rr: recv"); - break; - } - struct s5_rep *rr = (struct s5_rep *)buffer; - if (rr->ver != 5 || rr->code != 0) { - LOG(LOG_E, "rr: socks returned: %d\n", rr->code); - break; - } - val->flag = FLAG_CONN; - val->type = EV_TUNNEL; - pair->type = EV_DESYNC; - e = 0; - } - char is_first = (val->attempt == pair->attempt); - - if (!e && !is_first) { - return on_desync(pool, val->pair, buffer, bfsize); - } - else if (e) { - e = try_again(pool, val); - } - if (is_first && resp_error(pair->fd, - e, pair->flag) < 0) { - return -1; - } - return e; -} - - int event_loop(int srvfd) { size_t bfsize = params.bfsize; @@ -870,11 +758,6 @@ int event_loop(int srvfd) del_event(pool, val); continue; - case EV_REDIRECT: - if (on_redirect(pool, val, buffer, bfsize)) - del_event(pool, val); - continue; - case EV_DESYNC: if (on_desync(pool, val, buffer, bfsize)) del_event(pool, val); diff --git a/readme.txt b/readme.txt index 04b4b07..5fc6cf5 100644 --- a/readme.txt +++ b/readme.txt @@ -37,22 +37,14 @@ $ ./ciadpi --disorder 3 -A --tlsrec 1+s -A, --auto Автоматический режим - Если будет выполнено одно из следующих условий, + Если сервер сразу сбросил подключение после первого запроса, то будут применены параметры обхода, следующие за данной опцией - Условия: - - Сервер сбросил подключение, не отправив ответ - - Сервер прислал RST на этапе подключения - - Резервный прокси отказывает в соединении Можно указывать несколько групп параметров, раделяя их данным флагом Если соединение успешно прошло, то параметры для данного IP будут закешированны -u, --cache-ttl Время жизни значения в кеше, указывается в секундах --q, --redirect - Перенаправить подключение на другой SOCKS5 прокси - Имеет смысл указывать после --auto, для перенаправление только заблокированных ресурсов - -s, --split Разбить запрос по указанному смещению После числа можно добавить флаг: