mirror of
https://github.com/Waujito/youtubeUnblock.git
synced 2026-01-27 04:30:35 +03:00
Add --fake-custom-sni-file option
Allows to specify fake as a binary file
This commit is contained in:
@@ -229,8 +229,11 @@ Flags that do not scoped to a specific section, used over all the youtubeUnblock
|
|||||||
- `--fake-sni-seq-len=<length>` This flag specifies **youtubeUnblock** to build a complicated construction of fake client hello packets. length determines how much fakes will be sent. Defaults to **1**.
|
- `--fake-sni-seq-len=<length>` This flag specifies **youtubeUnblock** to build a complicated construction of fake client hello packets. length determines how much fakes will be sent. Defaults to **1**.
|
||||||
|
|
||||||
- `--fake-sni-type={default|custom|random}` This flag specifies which faking message type should be used for fake packets. For `random`, the message of random length and with random payload will be sent. For `default` the default payload (sni=www.google.com) is used. And for the `custom` option, the payload from `--fake-custom-payload` section utilized. Defaults to `default`.
|
- `--fake-sni-type={default|custom|random}` This flag specifies which faking message type should be used for fake packets. For `random`, the message of random length and with random payload will be sent. For `default` the default payload (sni=www.google.com) is used. And for the `custom` option, the payload from `--fake-custom-payload` section utilized. Defaults to `default`.
|
||||||
|
|
||||||
- `--fake-custom-payload=<payload>` Useful with `--fake-sni-type=custom`. You should specify the payload for fake message manually. Use hex format: `--fake-custom-payload=0001020304` mean that 5 bytes sequence: `0x00`, `0x01`, `0x02`, `0x03`, `0x04` used as fake.
|
- `--fake-custom-payload=<payload>` Useful with `--fake-sni-type=custom`. You should specify the payload for fake message manually. Use hex format: `--fake-custom-payload=0001020304` mean that 5 bytes sequence: `0x00`, `0x01`, `0x02`, `0x03`, `0x04` used as fake.
|
||||||
|
|
||||||
|
- `--fake-custom-payload-file=<binary file containing TLS message>` Same as `--fake-custom-payload` but binary file instead of hex. The file should contain raw binary TLS message (TCP payload).
|
||||||
|
|
||||||
- `--faking-strategy={randseq|ttl|tcp_check|pastseq|md5sum}` This flag determines the strategy of fake packets invalidation. Defaults to `randseq`
|
- `--faking-strategy={randseq|ttl|tcp_check|pastseq|md5sum}` This flag determines the strategy of fake packets invalidation. Defaults to `randseq`
|
||||||
- `randseq` specifies that random sequence/acknowledgment random will be set. This option may be handled by provider which uses *conntrack* with drop on invalid *conntrack* state firewall rule enabled.
|
- `randseq` specifies that random sequence/acknowledgment random will be set. This option may be handled by provider which uses *conntrack* with drop on invalid *conntrack* state firewall rule enabled.
|
||||||
- `ttl` specifies that packet will be invalidated after `--faking-ttl=n` hops. `ttl` is better but may cause issues if unconfigured.
|
- `ttl` specifies that packet will be invalidated after `--faking-ttl=n` hops. `ttl` is better but may cause issues if unconfigured.
|
||||||
|
|||||||
44
src/args.c
44
src/args.c
@@ -309,6 +309,7 @@ enum {
|
|||||||
OPT_FAKE_SNI_SEQ_LEN,
|
OPT_FAKE_SNI_SEQ_LEN,
|
||||||
OPT_FAKE_SNI_TYPE,
|
OPT_FAKE_SNI_TYPE,
|
||||||
OPT_FAKE_CUSTOM_PAYLOAD,
|
OPT_FAKE_CUSTOM_PAYLOAD,
|
||||||
|
OPT_FAKE_CUSTOM_PAYLOAD_FILE,
|
||||||
OPT_START_SECTION,
|
OPT_START_SECTION,
|
||||||
OPT_END_SECTION,
|
OPT_END_SECTION,
|
||||||
OPT_DAEMONIZE,
|
OPT_DAEMONIZE,
|
||||||
@@ -363,6 +364,7 @@ static struct option long_opt[] = {
|
|||||||
{"fake-sni-seq-len", 1, 0, OPT_FAKE_SNI_SEQ_LEN},
|
{"fake-sni-seq-len", 1, 0, OPT_FAKE_SNI_SEQ_LEN},
|
||||||
{"fake-sni-type", 1, 0, OPT_FAKE_SNI_TYPE},
|
{"fake-sni-type", 1, 0, OPT_FAKE_SNI_TYPE},
|
||||||
{"fake-custom-payload", 1, 0, OPT_FAKE_CUSTOM_PAYLOAD},
|
{"fake-custom-payload", 1, 0, OPT_FAKE_CUSTOM_PAYLOAD},
|
||||||
|
{"fake-custom-payload-file", 1, 0, OPT_FAKE_CUSTOM_PAYLOAD_FILE},
|
||||||
{"faking-strategy", 1, 0, OPT_FAKING_STRATEGY},
|
{"faking-strategy", 1, 0, OPT_FAKING_STRATEGY},
|
||||||
{"fake-seq-offset", 1, 0, OPT_FAKE_SEQ_OFFSET},
|
{"fake-seq-offset", 1, 0, OPT_FAKE_SEQ_OFFSET},
|
||||||
{"faking-ttl", 1, 0, OPT_FAKING_TTL},
|
{"faking-ttl", 1, 0, OPT_FAKING_TTL},
|
||||||
@@ -427,6 +429,7 @@ void print_usage(const char *argv0) {
|
|||||||
printf("\t--fake-sni-seq-len=<length>\n");
|
printf("\t--fake-sni-seq-len=<length>\n");
|
||||||
printf("\t--fake-sni-type={default|random|custom}\n");
|
printf("\t--fake-sni-type={default|random|custom}\n");
|
||||||
printf("\t--fake-custom-payload=<hex payload>\n");
|
printf("\t--fake-custom-payload=<hex payload>\n");
|
||||||
|
printf("\t--fake-custom-payload-file=<binary file containing TLS message>\n");
|
||||||
printf("\t--fake-seq-offset=<offset>\n");
|
printf("\t--fake-seq-offset=<offset>\n");
|
||||||
printf("\t--faking-ttl=<ttl>\n");
|
printf("\t--faking-ttl=<ttl>\n");
|
||||||
printf("\t--faking-strategy={randseq|ttl|tcp_check|pastseq|md5sum}\n");
|
printf("\t--faking-strategy={randseq|ttl|tcp_check|pastseq|md5sum}\n");
|
||||||
@@ -796,6 +799,7 @@ int yparse_args(struct config_t *config, int argc, char *argv[]) {
|
|||||||
break;
|
break;
|
||||||
case OPT_FAKE_CUSTOM_PAYLOAD:
|
case OPT_FAKE_CUSTOM_PAYLOAD:
|
||||||
SFREE(sect_config->fake_custom_pkt);
|
SFREE(sect_config->fake_custom_pkt);
|
||||||
|
sect_config->fake_custom_pkt_sz = 0;
|
||||||
|
|
||||||
ret = parse_fake_custom_payload(optarg, §_config->fake_custom_pkt, §_config->fake_custom_pkt_sz);
|
ret = parse_fake_custom_payload(optarg, §_config->fake_custom_pkt, §_config->fake_custom_pkt_sz);
|
||||||
if (ret == -EINVAL) {
|
if (ret == -EINVAL) {
|
||||||
@@ -805,6 +809,36 @@ int yparse_args(struct config_t *config, int argc, char *argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
case OPT_FAKE_CUSTOM_PAYLOAD_FILE:
|
||||||
|
#ifdef KERNEL_SPACE
|
||||||
|
lgerr("--fake-custom-payload-file is not allowed in kernel space. Use --fake-custom-payload argument instead");
|
||||||
|
goto error;
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
SFREE(sect_config->fake_custom_pkt);
|
||||||
|
sect_config->fake_custom_pkt_sz = 0;
|
||||||
|
|
||||||
|
ret = read_file(optarg);
|
||||||
|
if (ret < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (glob_file_size > MAX_FAKE_SIZE) {
|
||||||
|
goto invalid_opt;
|
||||||
|
}
|
||||||
|
sect_config->fake_custom_pkt = malloc(glob_file_size);
|
||||||
|
if (sect_config->fake_custom_pkt != NULL) {
|
||||||
|
memcpy(sect_config->fake_custom_pkt, glob_file_buffer, glob_file_size);
|
||||||
|
sect_config->fake_custom_pkt_sz = glob_file_size;
|
||||||
|
} else {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
case OPT_FK_WINSIZE:
|
case OPT_FK_WINSIZE:
|
||||||
num = parse_numeric_option(optarg);
|
num = parse_numeric_option(optarg);
|
||||||
if (errno != 0 || num < 0) {
|
if (errno != 0 || num < 0) {
|
||||||
@@ -931,7 +965,8 @@ stop_exec:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
invalid_opt:
|
invalid_opt:
|
||||||
printf("Invalid option %s\n", long_opt[optIdx].name);
|
if (optind > 0 && optind <= argc)
|
||||||
|
lgerr("Invalid option %s\n", argv[optind - 1]);
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
error:
|
error:
|
||||||
#ifndef KERNEL_SPACE
|
#ifndef KERNEL_SPACE
|
||||||
@@ -939,7 +974,11 @@ error:
|
|||||||
#endif
|
#endif
|
||||||
if (errno) ret = -errno;
|
if (errno) ret = -errno;
|
||||||
if (ret != -EINVAL) {
|
if (ret != -EINVAL) {
|
||||||
lgerror(ret, "argparse: error thrown in %s", long_opt[optIdx].name);
|
if (optind > 0 && optind <= argc)
|
||||||
|
lgerror(
|
||||||
|
ret == 0 ? EINVAL : -ret,
|
||||||
|
"argparse: error thrown in %s", argv[optind - 1]
|
||||||
|
);
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1030,6 +1069,7 @@ static size_t print_config_section(const struct section_config_t *section, char
|
|||||||
print_cnf_buf("--sni-domains=all");
|
print_cnf_buf("--sni-domains=all");
|
||||||
} else if (section->sni_domains != NULL) {
|
} else if (section->sni_domains != NULL) {
|
||||||
print_cnf_raw("--sni-domains=");
|
print_cnf_raw("--sni-domains=");
|
||||||
|
|
||||||
for (struct domains_list *sne = section->sni_domains; sne != NULL; sne = sne->next) {
|
for (struct domains_list *sne = section->sni_domains; sne != NULL; sne = sne->next) {
|
||||||
print_cnf_raw("%s,", sne->domain_name);
|
print_cnf_raw("%s,", sne->domain_name);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user