clear params before exit, update readme.txt

This commit is contained in:
ruti 2024-03-26 22:43:41 +03:00
parent e031e7d235
commit d4e3ac5a85
4 changed files with 91 additions and 18 deletions

87
main.c
View File

@ -25,6 +25,9 @@
#define VERSION 7 #define VERSION 7
#define MPOOL_INC 16 #define MPOOL_INC 16
char oob_char[1] = "a";
char ip_option[1] = "\0";
struct packet fake_tls = { struct packet fake_tls = {
sizeof(tls_data), tls_data sizeof(tls_data), tls_data
@ -33,20 +36,14 @@ fake_http = {
sizeof(http_data), http_data sizeof(http_data), http_data
}, },
oob_data = { oob_data = {
1, "a" sizeof(oob_char), oob_char
}; };
char ip_option[1] = "\0";
struct params params = { struct params params = {
.sfdelay = 3, .sfdelay = 3,
.wait_send = 1, .wait_send = 1,
.def_ttl = 0,
.custom_ttl = 0,
.de_known = 0,
.tfo = 0,
.timeout = 0,
.cache_ttl = 100800, .cache_ttl = 100800,
.ipv6 = 1, .ipv6 = 1,
.resolve = 1, .resolve = 1,
@ -300,6 +297,55 @@ void *add(void **root, int *n, size_t ss)
} }
void clear_params(void)
{
#ifdef _WIN32
WSACleanup();
#endif
if (params.mempool) {
mem_destroy(params.mempool);
params.mempool = 0;
}
if (params.spos) {
for (int i = 0; i < params.spos_n; i++) {
struct spos s = params.spos[i];
if (!s.data) continue;
free(s.data);
s.data = 0;
}
free(params.spos);
params.spos = 0;
}
if (params.dp) {
for (int i = 0; i < params.dp_count; i++) {
struct desync_params s = params.dp[i];
if (s.ip_options != ip_option) {
free(s.ip_options);
s.ip_options = ip_option;
}
if (!s.parts) {
free(s.parts);
s.parts = 0;
}
}
free(params.dp);
params.dp = 0;
}
if (fake_tls.data != tls_data) {
free(fake_tls.data);
fake_tls.data = tls_data;
}
if (fake_http.data != http_data) {
free(fake_http.data);
fake_http.data = http_data;
}
if (oob_data.data != oob_char) {
free(oob_data.data);
oob_data.data = oob_char;
}
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
#ifdef _WIN32 #ifdef _WIN32
@ -343,6 +389,7 @@ int main(int argc, char **argv)
struct desync_params *dp = add((void *)&params.dp, struct desync_params *dp = add((void *)&params.dp,
&params.dp_count, sizeof(struct desync_params)); &params.dp_count, sizeof(struct desync_params));
if (!dp) { if (!dp) {
clear_params();
return -1; return -1;
} }
while (!invalid && (rez = getopt_long_only( while (!invalid && (rez = getopt_long_only(
@ -357,9 +404,11 @@ int main(int argc, char **argv)
break; break;
case 'h': case 'h':
printf(help_text); printf(help_text);
clear_params();
return 0; return 0;
case 'v': case 'v':
printf("%d\n", VERSION); printf("%d\n", VERSION);
clear_params();
return 0; return 0;
case 'i': case 'i':
@ -418,6 +467,7 @@ int main(int argc, char **argv)
dp = add((void *)&params.dp, &params.dp_count, dp = add((void *)&params.dp, &params.dp_count,
sizeof(struct desync_params)); sizeof(struct desync_params));
if (!dp) { if (!dp) {
clear_params();
return -1; return -1;
} }
break; break;
@ -447,6 +497,7 @@ int main(int argc, char **argv)
struct spos *spos = add((void *)&params.spos, struct spos *spos = add((void *)&params.spos,
&params.spos_n, sizeof(struct spos)); &params.spos_n, sizeof(struct spos));
if (!spos) { if (!spos) {
clear_params();
return -1; return -1;
} }
sscanf(optarg, "%zi:%zi:%zn", &spos->start, &spos->end, &val); sscanf(optarg, "%zi:%zi:%zn", &spos->start, &spos->end, &val);
@ -457,7 +508,7 @@ int main(int argc, char **argv)
spos->data = ftob(&optarg[val], &spos->size); spos->data = ftob(&optarg[val], &spos->size);
if (!spos->data) { if (!spos->data) {
uniperror("read/parse"); uniperror("read/parse");
return -1; invalid = 1;
} }
} }
break; break;
@ -470,6 +521,7 @@ int main(int argc, char **argv)
struct part *part = add((void *)&dp->parts, struct part *part = add((void *)&dp->parts,
&dp->parts_n, sizeof(struct part)); &dp->parts_n, sizeof(struct part));
if (!part) { if (!part) {
clear_params();
return -1; return -1;
} }
if (parse_offset(part, optarg)) { if (parse_offset(part, optarg)) {
@ -504,7 +556,7 @@ int main(int argc, char **argv)
} }
if (!dp->ip_options) { if (!dp->ip_options) {
uniperror("read/parse"); uniperror("read/parse");
return -1; invalid = 1;
} }
break; break;
@ -515,6 +567,7 @@ int main(int argc, char **argv)
case 'n': case 'n':
if (change_tls_sni(optarg, fake_tls.data, fake_tls.size)) { if (change_tls_sni(optarg, fake_tls.data, fake_tls.size)) {
fprintf(stderr, "error chsni\n"); fprintf(stderr, "error chsni\n");
clear_params();
return -1; return -1;
} }
printf("sni: %s\n", optarg); printf("sni: %s\n", optarg);
@ -524,7 +577,7 @@ int main(int argc, char **argv)
fake_tls.data = ftob(optarg, &fake_tls.size); fake_tls.data = ftob(optarg, &fake_tls.size);
if (!fake_tls.data) { if (!fake_tls.data) {
uniperror("read/parse"); uniperror("read/parse");
return -1; invalid = 1;
} }
break; break;
@ -532,7 +585,7 @@ int main(int argc, char **argv)
fake_http.data = ftob(optarg, &fake_http.size); fake_http.data = ftob(optarg, &fake_http.size);
if (!fake_http.data) { if (!fake_http.data) {
uniperror("read/parse"); uniperror("read/parse");
return -1; invalid = 1;
} }
break; break;
@ -540,7 +593,7 @@ int main(int argc, char **argv)
oob_data.data = ftob(optarg, &oob_data.size); oob_data.data = ftob(optarg, &oob_data.size);
if (!oob_data.data) { if (!oob_data.data) {
uniperror("read/parse"); uniperror("read/parse");
return -1; invalid = 1;
} }
break; break;
@ -570,6 +623,7 @@ int main(int argc, char **argv)
part = add((void *)&dp->tlsrec, part = add((void *)&dp->tlsrec,
&dp->tlsrec_n, sizeof(struct part)); &dp->tlsrec_n, sizeof(struct part));
if (!part) { if (!part) {
clear_params();
return -1; return -1;
} }
if (parse_offset(part, optarg) if (parse_offset(part, optarg)
@ -604,15 +658,18 @@ int main(int argc, char **argv)
break; break;
case '?': case '?':
clear_params();
return -1; return -1;
default: default:
printf("?: %c\n", rez); printf("?: %c\n", rez);
clear_params();
return -1; return -1;
} }
} }
if (invalid) { if (invalid) {
fprintf(stderr, "invalid value: -%c %s\n", rez, optarg); fprintf(stderr, "invalid value: -%c %s\n", rez, optarg);
clear_params();
return -1; return -1;
} }
s.in.sin_port = port; s.in.sin_port = port;
@ -623,17 +680,17 @@ int main(int argc, char **argv)
} }
if (!params.def_ttl) { if (!params.def_ttl) {
if ((params.def_ttl = get_default_ttl()) < 1) { if ((params.def_ttl = get_default_ttl()) < 1) {
clear_params();
return -1; return -1;
} }
} }
params.mempool = mem_pool(MPOOL_INC); params.mempool = mem_pool(MPOOL_INC);
if (!params.mempool) { if (!params.mempool) {
uniperror("mem_pool"); uniperror("mem_pool");
clear_params();
return -1; return -1;
} }
int status = run(&s); int status = run(&s);
#ifdef _WIN32 clear_params();
WSACleanup();
#endif
return status; return status;
} }

13
mpool.c
View File

@ -113,3 +113,16 @@ void mem_delete(struct mphdr *hdr, int pos)
} }
hdr->count--; hdr->count--;
} }
void mem_destroy(struct mphdr *hdr)
{
for (int i = 0; i < hdr->count; i++) {
struct elem *e = hdr->values[i];
if (!e) {
continue;
}
free(e);
hdr->values[i] = 0;
}
}

View File

@ -16,3 +16,4 @@ struct mphdr *mem_pool(int count);
int mem_index(struct mphdr *hdr, char *str, int len); int mem_index(struct mphdr *hdr, char *str, int len);
struct elem *mem_add(struct mphdr *hdr, char *str, int len, int pos); struct elem *mem_add(struct mphdr *hdr, char *str, int len, int pos);
void mem_delete(struct mphdr *hdr, int pos); void mem_delete(struct mphdr *hdr, int pos);
void mem_destroy(struct mphdr *hdr);

View File

@ -47,7 +47,7 @@ $ ./ciadpi --disorder 3 -A --tlsrec 1+s
Можно указывать несколько групп параметров, раделяя их данным флагом Можно указывать несколько групп параметров, раделяя их данным флагом
Если соединение успешно прошло, то параметры для данного IP будут закешированны Если соединение успешно прошло, то параметры для данного IP будут закешированны
Параметры, которые можно вынести в отдельную группу: Параметры, которые можно вынести в отдельную группу:
split, disorder, oob, fake, ttl, ip-opt, mod-http, tlsrec split, disorder, oob, fake, ttl, ip-opt, md5sig, mod-http, tlsrec
-u, --cache-ttl <sec> -u, --cache-ttl <sec>
Время жизни значения в кеше, по умолчанию 100800 (28 часов) Время жизни значения в кеше, по умолчанию 100800 (28 часов)
@ -88,10 +88,12 @@ $ ./ciadpi --disorder 3 -A --tlsrec 1+s
Установить опции для фейкового IP пакета Установить опции для фейкового IP пакета
Существенно снизит вероятность, что пакет дойдет до сервера Существенно снизит вероятность, что пакет дойдет до сервера
Стоит учесть, что до DPI он также может не дойти Стоит учесть, что до DPI он также может не дойти
В Windows поддержка может быть отключена
-S, --md5sig -S, --md5sig
Установить опцию TCP MD5 Signature для фейкового пакета Установить опцию TCP MD5 Signature для фейкового пакета
Поддерживается в Linux, однако может быть выключен в некоторых сборках Большинство серверов (в основном на Linux) отбрасывают пакеты с данной опцией
Поддерживается только в Linux, может быть выключен в некоторых сборках ядра (< 3.9, Android)
-l, --fake-tls <file|:str> -l, --fake-tls <file|:str>
-j, --fake-http <file|:str> -j, --fake-http <file|:str>