mirror of
https://github.com/hufrea/byedpi.git
synced 2025-01-03 04:49:47 +00:00
--md5sig, --ip-opt for IPv4 only
This commit is contained in:
parent
b0d624136e
commit
e031e7d235
47
desync.c
47
desync.c
@ -1,3 +1,5 @@
|
|||||||
|
#define _GNU_SOURCE
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@ -12,6 +14,8 @@
|
|||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <sys/sendfile.h>
|
#include <sys/sendfile.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
#include <desync.h>
|
#include <desync.h>
|
||||||
|
|
||||||
#ifdef MFD_CLOEXEC
|
#ifdef MFD_CLOEXEC
|
||||||
@ -116,8 +120,10 @@ void wait_send(int sfd)
|
|||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
ssize_t send_fake(int sfd, char *buffer,
|
ssize_t send_fake(int sfd, char *buffer,
|
||||||
int cnt, long pos, int fa, struct desync_params *opt)
|
int cnt, long pos, struct sockaddr *dst, struct desync_params *opt)
|
||||||
{
|
{
|
||||||
|
int fa = get_family(dst);
|
||||||
|
|
||||||
struct packet pkt = cnt != IS_HTTP ? fake_tls : fake_http;
|
struct packet pkt = cnt != IS_HTTP ? fake_tls : fake_http;
|
||||||
size_t psz = pkt.size;
|
size_t psz = pkt.size;
|
||||||
|
|
||||||
@ -145,12 +151,25 @@ ssize_t send_fake(int sfd, char *buffer,
|
|||||||
if (setttl(sfd, opt->ttl ? opt->ttl : 8, fa) < 0) {
|
if (setttl(sfd, opt->ttl ? opt->ttl : 8, fa) < 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (opt->ip_options
|
if (opt->md5sig) {
|
||||||
|
struct tcp_md5sig md5 = {
|
||||||
|
.tcpm_keylen = 5
|
||||||
|
};
|
||||||
|
memcpy(&md5.tcpm_addr, dst, sizeof(struct sockaddr_in6));
|
||||||
|
|
||||||
|
if (setsockopt(sfd, IPPROTO_TCP,
|
||||||
|
TCP_MD5SIG, (char *)&md5, sizeof(md5)) < 0) {
|
||||||
|
perror("setsockopt TCP_MD5SIG");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (opt->ip_options && fa == AF_INET
|
||||||
&& setsockopt(sfd, IPPROTO_IP, IP_OPTIONS,
|
&& setsockopt(sfd, IPPROTO_IP, IP_OPTIONS,
|
||||||
opt->ip_options, opt->ip_options_len) < 0) {
|
opt->ip_options, opt->ip_options_len) < 0) {
|
||||||
perror("setsockopt IP_OPTIONS");
|
perror("setsockopt IP_OPTIONS");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
len = sendfile(sfd, ffd, 0, pos);
|
len = sendfile(sfd, ffd, 0, pos);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
uniperror("sendfile");
|
uniperror("sendfile");
|
||||||
@ -162,12 +181,24 @@ ssize_t send_fake(int sfd, char *buffer,
|
|||||||
if (setttl(sfd, params.def_ttl, fa) < 0) {
|
if (setttl(sfd, params.def_ttl, fa) < 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (opt->ip_options
|
if (opt->ip_options && fa == AF_INET
|
||||||
&& setsockopt(sfd, IPPROTO_IP,
|
&& setsockopt(sfd, IPPROTO_IP,
|
||||||
IP_OPTIONS, opt->ip_options, 0) < 0) {
|
IP_OPTIONS, opt->ip_options, 0) < 0) {
|
||||||
perror("setsockopt IP_OPTIONS");
|
perror("setsockopt IP_OPTIONS");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (opt->md5sig) {
|
||||||
|
struct tcp_md5sig md5 = {
|
||||||
|
.tcpm_keylen = 0
|
||||||
|
};
|
||||||
|
memcpy(&md5.tcpm_addr, dst, sizeof(struct sockaddr_in6));
|
||||||
|
|
||||||
|
if (setsockopt(sfd, IPPROTO_TCP,
|
||||||
|
TCP_MD5SIG, (char *)&md5, sizeof(md5)) < 0) {
|
||||||
|
perror("setsockopt TCP_MD5SIG");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (p) munmap(p, pos);
|
if (p) munmap(p, pos);
|
||||||
@ -178,8 +209,10 @@ ssize_t send_fake(int sfd, char *buffer,
|
|||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
ssize_t send_fake(int sfd, char *buffer,
|
ssize_t send_fake(int sfd, char *buffer,
|
||||||
int cnt, long pos, int fa, struct desync_params *opt)
|
int cnt, long pos, struct sockaddr *dst, struct desync_params *opt)
|
||||||
{
|
{
|
||||||
|
int fa = get_family(dst);
|
||||||
|
|
||||||
struct packet pkt = cnt != IS_HTTP ? fake_tls : fake_http;
|
struct packet pkt = cnt != IS_HTTP ? fake_tls : fake_http;
|
||||||
size_t psz = pkt.size;
|
size_t psz = pkt.size;
|
||||||
|
|
||||||
@ -234,7 +267,7 @@ ssize_t send_fake(int sfd, char *buffer,
|
|||||||
if (setttl(sfd, opt->ttl ? opt->ttl : 8, fa) < 0) {
|
if (setttl(sfd, opt->ttl ? opt->ttl : 8, fa) < 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (opt->ip_options
|
if (opt->ip_options && fa == AF_INET
|
||||||
&& setsockopt(sfd, IPPROTO_IP, IP_OPTIONS,
|
&& setsockopt(sfd, IPPROTO_IP, IP_OPTIONS,
|
||||||
opt->ip_options, opt->ip_options_len) < 0) {
|
opt->ip_options, opt->ip_options_len) < 0) {
|
||||||
uniperror("setsockopt IP_OPTIONS");
|
uniperror("setsockopt IP_OPTIONS");
|
||||||
@ -261,7 +294,7 @@ ssize_t send_fake(int sfd, char *buffer,
|
|||||||
if (setttl(sfd, params.def_ttl, fa) < 0) {
|
if (setttl(sfd, params.def_ttl, fa) < 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (opt->ip_options
|
if (opt->ip_options && fa == AF_INET
|
||||||
&& setsockopt(sfd, IPPROTO_IP, IP_OPTIONS,
|
&& setsockopt(sfd, IPPROTO_IP, IP_OPTIONS,
|
||||||
opt->ip_options, 0) < 0) {
|
opt->ip_options, 0) < 0) {
|
||||||
uniperror("setsockopt IP_OPTIONS");
|
uniperror("setsockopt IP_OPTIONS");
|
||||||
@ -440,7 +473,7 @@ ssize_t desync(int sfd, char *buffer, size_t bfsize,
|
|||||||
#ifdef FAKE_SUPPORT
|
#ifdef FAKE_SUPPORT
|
||||||
case DESYNC_FAKE:
|
case DESYNC_FAKE:
|
||||||
s = send_fake(sfd,
|
s = send_fake(sfd,
|
||||||
buffer + lp, type, pos - lp, fa, &dp);
|
buffer + lp, type, pos - lp, dst, &dp);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case DESYNC_DISORDER:
|
case DESYNC_DISORDER:
|
||||||
|
16
main.c
16
main.c
@ -82,12 +82,15 @@ const char help_text[] = {
|
|||||||
" -s, --split <n[+s]> Split packet at n\n"
|
" -s, --split <n[+s]> Split packet at n\n"
|
||||||
" +s - add SNI offset\n"
|
" +s - add SNI offset\n"
|
||||||
" +h - add HTTP Host offset\n"
|
" +h - add HTTP Host offset\n"
|
||||||
" -s, --disorder <n[+s]> Split and send reverse order\n"
|
" -d, --disorder <n[+s]> Split and send reverse order\n"
|
||||||
" -o, --oob <n[+s]> Split and send as OOB data\n"
|
" -o, --oob <n[+s]> Split and send as OOB data\n"
|
||||||
#ifdef FAKE_SUPPORT
|
#ifdef FAKE_SUPPORT
|
||||||
" -f, --fake <n[+s]> Split and send fake packet\n"
|
" -f, --fake <n[+s]> Split and send fake packet\n"
|
||||||
" -t, --ttl <num> TTL of fake packets, default 8\n"
|
" -t, --ttl <num> TTL of fake packets, default 8\n"
|
||||||
" -k, --ip-opt [f|:str] IP options of fake packets\n"
|
" -k, --ip-opt [f|:str] IP options of fake packets\n"
|
||||||
|
#ifdef __linux__
|
||||||
|
" -S, --md5sig Add MD5 Signature option for fake packets\n"
|
||||||
|
#endif
|
||||||
" -l, --fake-tls <f|:str>\n"
|
" -l, --fake-tls <f|:str>\n"
|
||||||
" -j, --fake-http <f|:str> Set custom fake packet\n"
|
" -j, --fake-http <f|:str> Set custom fake packet\n"
|
||||||
" -n, --tls-sni <str> Change SNI in fake ClientHello\n"
|
" -n, --tls-sni <str> Change SNI in fake ClientHello\n"
|
||||||
@ -127,6 +130,9 @@ const struct option options[] = {
|
|||||||
{"fake", 1, 0, 'f'},
|
{"fake", 1, 0, 'f'},
|
||||||
{"ttl", 1, 0, 't'},
|
{"ttl", 1, 0, 't'},
|
||||||
{"ip-opt", 2, 0, 'k'},
|
{"ip-opt", 2, 0, 'k'},
|
||||||
|
#ifdef __linux__
|
||||||
|
{"md5sig", 0, 0, 'S'},
|
||||||
|
#endif
|
||||||
{"fake-tls", 1, 0, 'l'},
|
{"fake-tls", 1, 0, 'l'},
|
||||||
{"fake-http", 1, 0, 'j'},
|
{"fake-http", 1, 0, 'j'},
|
||||||
{"tls-sni", 1, 0, 'n'},
|
{"tls-sni", 1, 0, 'n'},
|
||||||
@ -136,7 +142,7 @@ const struct option options[] = {
|
|||||||
{"tlsrec", 1, 0, 'r'},
|
{"tlsrec", 1, 0, 'r'},
|
||||||
{"def-ttl", 1, 0, 'g'},
|
{"def-ttl", 1, 0, 'g'},
|
||||||
{"delay", 1, 0, 'w'}, //
|
{"delay", 1, 0, 'w'}, //
|
||||||
{"not-wait-send", 1, 0, 'W'}, //
|
{"not-wait-send", 0, 0, 'W'}, //
|
||||||
{0}
|
{0}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -502,6 +508,10 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'S':
|
||||||
|
dp->md5sig = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
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");
|
||||||
@ -579,7 +589,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'V': //
|
case 'w': //
|
||||||
params.sfdelay = strtol(optarg, &end, 0);
|
params.sfdelay = strtol(optarg, &end, 0);
|
||||||
if (params.sfdelay < 0 || optarg == end
|
if (params.sfdelay < 0 || optarg == end
|
||||||
|| params.sfdelay >= 1000 || *end)
|
|| params.sfdelay >= 1000 || *end)
|
||||||
|
1
params.h
1
params.h
@ -43,6 +43,7 @@ struct desync_params {
|
|||||||
int ttl;
|
int ttl;
|
||||||
char *ip_options;
|
char *ip_options;
|
||||||
ssize_t ip_options_len;
|
ssize_t ip_options_len;
|
||||||
|
char md5sig;
|
||||||
int parts_n;
|
int parts_n;
|
||||||
struct part *parts;
|
struct part *parts;
|
||||||
int mod_http;
|
int mod_http;
|
||||||
|
2
proxy.c
2
proxy.c
@ -366,7 +366,7 @@ int create_conn(struct poolhd *pool,
|
|||||||
}
|
}
|
||||||
val->pair = pair;
|
val->pair = pair;
|
||||||
pair->pair = val;
|
pair->pair = val;
|
||||||
pair->in6 = dst->in6;
|
pair->in6 = addr.in6;
|
||||||
pair->flag = FLAG_CONN;
|
pair->flag = FLAG_CONN;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -89,6 +89,10 @@ $ ./ciadpi --disorder 3 -A --tlsrec 1+s
|
|||||||
Существенно снизит вероятность, что пакет дойдет до сервера
|
Существенно снизит вероятность, что пакет дойдет до сервера
|
||||||
Стоит учесть, что до DPI он также может не дойти
|
Стоит учесть, что до DPI он также может не дойти
|
||||||
|
|
||||||
|
-S, --md5sig
|
||||||
|
Установить опцию TCP MD5 Signature для фейкового пакета
|
||||||
|
Поддерживается в Linux, однако может быть выключен в некоторых сборках
|
||||||
|
|
||||||
-l, --fake-tls <file|:str>
|
-l, --fake-tls <file|:str>
|
||||||
-j, --fake-http <file|:str>
|
-j, --fake-http <file|:str>
|
||||||
Указать свои поддельные пакеты, вместо дефолтных
|
Указать свои поддельные пакеты, вместо дефолтных
|
||||||
|
Loading…
Reference in New Issue
Block a user