Skip to content

Commit

Permalink
Add more offset flags
Browse files Browse the repository at this point in the history
  • Loading branch information
ruti committed Oct 15, 2024
1 parent dbc8541 commit b95926d
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 44 deletions.
66 changes: 42 additions & 24 deletions desync.c
Original file line number Diff line number Diff line change
Expand Up @@ -417,14 +417,44 @@ ssize_t send_late_oob(int sfd, char *buffer,
}


static long gen_offset(long pos, int flag,
ssize_t n, long lp, int type, int hp, int len)
{
if (flag & (OFFSET_SNI | OFFSET_HOST)) {
if (!hp || ((flag & OFFSET_SNI) && type != IS_HTTPS)) {
return -1;
}
pos += hp;

if (flag & OFFSET_END)
pos += len;
else if (flag & OFFSET_MID)
pos += (len / 2);
else if (flag & OFFSET_RAND)
pos += (rand() % len);
}
else if (flag & OFFSET_RAND) {
pos += lp + (rand() % (n - lp));
}
else if (flag & OFFSET_MID) {
pos += (n / 2);
}
else if (pos < 0 || (flag & OFFSET_END)) {
pos += n;
}
return pos;
}


ssize_t desync(int sfd, char *buffer, size_t bfsize,
ssize_t n, ssize_t offset, struct sockaddr *dst, int dp_c)
{
struct desync_params dp = params.dp[dp_c];

char *host = 0;
int len = 0, type = 0;
int len = 0, type = 0, host_pos = 0;
int fa = get_family(dst);

// parse packet
if ((len = parse_tls(buffer, n, &host))) {
type = IS_HTTPS;
Expand All @@ -435,7 +465,9 @@ ssize_t desync(int sfd, char *buffer, size_t bfsize,
if (len && host) {
LOG(LOG_S, "host: %.*s (%zd)\n",
len, host, host - buffer);
host_pos = host - buffer;
}

// modify packet
if (type == IS_HTTP && dp.mod_http) {
LOG(LOG_S, "modify HTTP: n=%zd\n", n);
Expand All @@ -450,12 +482,12 @@ ssize_t desync(int sfd, char *buffer, size_t bfsize,
struct part part = dp.tlsrec[i];

long pos = part.pos + i * 5;
if (part.flag == OFFSET_SNI) {
pos += (host - buffer - 5);
}
else if (pos < 0) {
pos += n;
if (pos < 0 || part.flag) {
pos -= 5;
}
pos = gen_offset(pos,
part.flag, n, lp, type, host_pos, len);

if (pos < lp) {
LOG(LOG_E, "tlsrec cancel: %ld < %ld\n", pos, lp);
break;
Expand All @@ -481,30 +513,16 @@ ssize_t desync(int sfd, char *buffer, size_t bfsize,
for (int i = 0; i < dp.parts_n; i++) {
struct part part = dp.parts[i];

// change pos
long pos = part.pos;
if (part.flag == OFFSET_SNI) {
if (type != IS_HTTPS)
continue;
else
pos += (host - buffer);
}
else if (part.flag == OFFSET_HOST) {
if (type != IS_HTTP)
continue;
else
pos += (host - buffer);
}
else if (pos < 0 || part.flag == OFFSET_END) {
pos += n;
}
long pos = gen_offset(part.pos,
part.flag, n, lp, type, host_pos, len);

// after EAGAIN
if (offset && pos <= offset) {
continue;
}
else if (pos < 0 || pos > n || pos < lp) {
LOG(LOG_E, "split cancel: pos=%ld-%ld, n=%zd\n", lp, pos, n);
break;
continue;
}
// send part
ssize_t s = 0;
Expand Down
46 changes: 30 additions & 16 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -376,21 +376,34 @@ int parse_offset(struct part *part, const char *str)
{
char *end = 0;
long val = strtol(str, &end, 0);
if (*end == '+') switch (*(end + 1)) {
case 's':
part->flag = OFFSET_SNI;
break;
case 'h':
part->flag = OFFSET_HOST;
break;
case 'e':
part->flag = OFFSET_END;
break;
default:
return -1;
}
else if (*end) {
return -1;
if (*end == '+') {
switch (*(end + 1)) {
case 's':
part->flag = OFFSET_SNI;
break;
case 'h':
part->flag = OFFSET_HOST;
break;
case 'e': //
part->flag = OFFSET_END;
break;
case 'n':
break;
default:
return -1;
}
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->pos = val;
return 0;
Expand Down Expand Up @@ -908,7 +921,8 @@ int main(int argc, char **argv)
clear_params();
return -1;
}

srand((unsigned int)time(0));

int status = run((struct sockaddr_ina *)&params.laddr);
clear_params();
return status;
Expand Down
10 changes: 6 additions & 4 deletions params.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,12 @@
#define FAKE_SUPPORT 1
#define TIMEOUT_SUPPORT 1
#endif

#define OFFSET_SNI 1
#define OFFSET_HOST 2
#define OFFSET_END 3

#define OFFSET_END 1
#define OFFSET_MID 2
#define OFFSET_RAND 4
#define OFFSET_SNI 8
#define OFFSET_HOST 16

#define DETECT_HTTP_LOCAT 1
#define DETECT_TLS_ERR 2
Expand Down

0 comments on commit b95926d

Please sign in to comment.