From 15ca6043b8f571b45beb8e910c29ef1adf60b240 Mon Sep 17 00:00:00 2001 From: ruti <> Date: Mon, 24 Mar 2025 15:30:54 +0000 Subject: [PATCH] Add global delay This reverts commit 7561bb68f840020bd753848dade7cb7794511f7f. This reverts commit dd4ee517fefd1192bb18bbc85b1f0de7c46cbbfa. This reverts commit 02daba5eab392deecf8227ba60f686b7f0f8dbaf. --- README.md | 6 +---- desync.c | 14 +++++------ main.c | 72 +++++++++++++++++++++++-------------------------------- params.h | 2 +- 4 files changed, 39 insertions(+), 55 deletions(-) diff --git a/README.md b/README.md index 6cf3210..fc9307f 100644 --- a/README.md +++ b/README.md @@ -95,20 +95,16 @@ ciadpi --fake -1 --ttl 8 -s, --split Разбить запрос по указанной позиции - Позиция имеет вид offset[:repeats:skip][+flag1[flag2]][,delay_ms] + Позиция имеет вид offset[:repeats:skip][+flag1[flag2]] Флаги: +s: добавить смещение SNI +h: добавить смещение Host +n: нулевое смещение Дополнительные флаги: +e: конец; +m: середина - Если указано значение delay_ms > 0, после отправки каждой из частей, описываемых данным ключом, - добавляется задержка delay_ms миллисекунд перед отправкой следующей части - После последней части (когда больше нет данных для отправки) задержка не добавляется Примеры: 0+sm - разбить запрос в середине SNI 1:3:5 - разбить по позициям 1, 6 и 11 - 1+s,5 - разбить по позиции 1 и в середине SNI, задержка 5 мс после каждой части Ключ можно указывать несколько раз, чтобы разбить запрос по нескольким позициям Если offset отрицательный и не имеет флагов, то к нему прибавляется размер пакета diff --git a/desync.c b/desync.c index 5d1d292..73910d8 100644 --- a/desync.c +++ b/desync.c @@ -531,7 +531,7 @@ ssize_t desync(struct poolhd *pool, size_t bfsize = buff->size; ssize_t offset = buff->offset; ssize_t skip = val->pair->round_sent; - int part_skip = val->pair->part_sent; + unsigned int part_skip = val->pair->part_sent; if (!skip && params.debug) { init_proto_info(buffer, *np, &info); @@ -552,7 +552,7 @@ ssize_t desync(struct poolhd *pool, long lp = offset; struct part part; int i = 0, r = 0; - int curr_part = -1; + unsigned int curr_part = 0; for (; r > 0 || i < dp.parts_n; r--) { if (r <= 0) { @@ -560,11 +560,12 @@ ssize_t desync(struct poolhd *pool, r = part.r; i++; } curr_part++; + long pos = gen_offset(part.pos, part.flag, buffer, n, lp, &info); pos += (long )part.s * (part.r - r); if ((skip && pos <= skip) - && curr_part < part_skip && !(part.flag & OFFSET_START)) { + && curr_part <= part_skip && !(part.flag & OFFSET_START)) { continue; } if (offset && pos < offset) { @@ -609,7 +610,7 @@ ssize_t desync(struct poolhd *pool, break; } LOG(LOG_S, "split: pos=%ld-%ld (%zd), m: %s\n", lp, pos, s, demode_str[part.m]); - val->pair->part_sent = curr_part + 1; + val->pair->part_sent = curr_part; if (s == ERR_WAIT) { set_timer(pool, val, params.await_int); @@ -628,9 +629,8 @@ ssize_t desync(struct poolhd *pool, } lp = pos; - if (part.delay > 0 && lp < n) { - LOG(LOG_S, "delay: %d ms\n", part.delay); - set_timer(pool, val, part.delay); + if (params.wait_send && lp < n) { + set_timer(pool, val, params.await_int); return lp - offset; } } diff --git a/main.c b/main.c index afc0f64..76dd057 100644 --- a/main.c +++ b/main.c @@ -97,7 +97,7 @@ static const char help_text[] = { " -j, --ipset IP whitelist\n" " -V, --pf Ports range whitelist\n" " -R, --round Number of request to which desync will be applied\n" - " -s, --split Position format: offset[:repeats:skip][+flag1[flag2]][,delay_ms]\n" + " -s, --split Position format: offset[:repeats:skip][+flag1[flag2]]\n" " Flags: +s - SNI offset, +h - HTTP host offset, +n - null\n" " Additional flags: +e - end, +m - middle\n" " -d, --disorder Split and send reverse order\n" @@ -178,6 +178,7 @@ const struct option options[] = { {"tlsrec", 1, 0, 'r'}, {"udp-fake", 1, 0, 'a'}, {"def-ttl", 1, 0, 'g'}, + {"wait-send", 0, 0, 'Z'}, // {"await-int", 1, 0, 'W'}, // #ifdef __linux__ {"drop-sack", 0, 0, 'Y'}, @@ -490,49 +491,32 @@ int parse_offset(struct part *part, const char *str) } } if (*end == '+') { - end++; - if (*end) { - switch (*end) { - case 's': - part->flag = OFFSET_SNI; - break; - case 'h': - part->flag = OFFSET_HOST; - break; - case 'n': - break; - default: - return -1; - } - end++; + switch (*(end + 1)) { + case 's': + part->flag = OFFSET_SNI; + break; + case 'h': + part->flag = OFFSET_HOST; + break; + case 'n': + break; + default: + return -1; } - if (*end && *end != ',') { - switch (*end) { - case 'e': - part->flag |= OFFSET_END; - break; - case 'm': - part->flag |= OFFSET_MID; - break; - case 'r': // - part->flag |= OFFSET_RAND; - break; - case 's': // - part->flag |= OFFSET_START; - default: - return -1; - } - end++; + switch (*(end + 2)) { + case 'e': + part->flag |= OFFSET_END; + break; + case 'm': + part->flag |= OFFSET_MID; + break; + case 'r': // + part->flag |= OFFSET_RAND; + break; + case 's': // + part->flag |= OFFSET_START; } } - if (*end == ',') { - end++; - long delay = strtol(end, &end, 0); - if (delay < 0 || delay > INT_MAX) { - return -1; - } - part->delay = delay; - } part->pos = val; return 0; } @@ -1084,7 +1068,11 @@ int main(int argc, char **argv) dp->drop_sack = 1; break; - case 'W': + case 'Z': + params.wait_send = 1; + break; + + case 'W': params.await_int = atoi(optarg); break; diff --git a/params.h b/params.h index 076c5b2..23fba1e 100644 --- a/params.h +++ b/params.h @@ -62,7 +62,6 @@ struct part { int flag; long pos; int r, s; - int delay; }; struct packet { @@ -103,6 +102,7 @@ struct params { int dp_count; struct desync_params *dp; int await_int; + bool wait_send; int def_ttl; bool custom_ttl;