diff --git a/nfq2/conntrack.c b/nfq2/conntrack.c index ae44b6d..79e9b74 100644 --- a/nfq2/conntrack.c +++ b/nfq2/conntrack.c @@ -148,7 +148,7 @@ static void ConntrackApplyPos(t_ctrack *t, bool bReverse, const struct dissect * if (scale != SCALE_NONE) direct->scale = scale; direct->mss = tcp_find_mss(dis->tcp); } - else if (direct->scale != SCALE_NONE) + else // apply scale only outside of the SYN stage direct->winsize_calc <<= direct->scale; @@ -367,8 +367,8 @@ void ConntrackPoolDump(const t_conntrack *p) t->track.pos.client.seq0, t->track.pos.client.seq_last - t->track.pos.client.seq0, t->track.pos.client.pos - t->track.pos.client.seq0, t->track.pos.server.seq0, t->track.pos.server.seq_last - t->track.pos.server.seq0, t->track.pos.server.pos - t->track.pos.server.seq0, t->track.pos.client.mss, t->track.pos.server.mss, - t->track.pos.client.winsize, t->track.pos.client.scale == SCALE_NONE ? -1 : t->track.pos.client.scale, - t->track.pos.server.winsize, t->track.pos.server.scale == SCALE_NONE ? -1 : t->track.pos.server.scale); + t->track.pos.client.winsize, t->track.pos.client.scale, + t->track.pos.server.winsize, t->track.pos.server.scale); else printf("rseq=%u client.pos=%u rack=%u server.pos=%u", t->track.pos.client.seq_last, t->track.pos.client.pos, diff --git a/nfq2/conntrack_base.h b/nfq2/conntrack_base.h index a581676..bb6658d 100644 --- a/nfq2/conntrack_base.h +++ b/nfq2/conntrack_base.h @@ -29,7 +29,7 @@ typedef struct uint16_t winsize; // last seen window size uint16_t mss; uint32_t winsize_calc; // calculated window size - uint8_t scale; // last seen window scale factor. SCALE_NONE if none + uint8_t scale; // last seen window scale factor bool rseq_over_2G; } t_ctrack_position; diff --git a/nfq2/desync.c b/nfq2/desync.c index 44c942c..3489ec4 100644 --- a/nfq2/desync.c +++ b/nfq2/desync.c @@ -1679,52 +1679,82 @@ static bool feed_dns_response(const uint8_t *a, size_t len) if (!params.cache_hostname) return true; // check of minimum header length and response flag - uint16_t k, off, dlen, qcount = a[4]<<8 | a[5], acount = a[6]<<8 | a[7]; + uint16_t k, typ, off, dlen, qcount = a[4]<<8 | a[5], acount = a[6]<<8 | a[7]; char s_ip[INET6_ADDRSTRLEN]; const uint8_t *b = a, *p; const uint8_t *e = b + len; size_t nl; char name[256] = ""; - if (len<12 || !(a[2]&0x80)) return false; + if (!qcount || !acount || len<12 || !(a[2]&0x80)) return false; a+=12; len-=12; - for(k=0;k