diff --git a/lua/zapret-antidpi.lua b/lua/zapret-antidpi.lua index 19ec66c..ea1c885 100644 --- a/lua/zapret-antidpi.lua +++ b/lua/zapret-antidpi.lua @@ -729,14 +729,15 @@ function hostfakesplit(ctx, desync) local midhost if desync.arg.midhost then midhost = resolve_pos(data,desync.l7payload,desync.arg.midhost) - if not midhost then + if midhost then + DLOG("hosfakesplit: midhost marker resolved to "..midhost) + if midhost<=pos[1] or midhost>pos[2] then + DLOG("hostfakesplit: midhost is not inside the host range") + midhost = nil + end + else DLOG("hostfakesplit: cannot resolve midhost marker '"..desync.arg.midhost.."'") end - DLOG("hosfakesplit: midhost marker resolved to "..midhost) - if midhost<=pos[1] or midhost>pos[2] then - DLOG("hostfakesplit: midhost is not inside the host range") - midhost = nil - end end -- if present apply ipfrag only to real host parts. fakes and parts outside of the host must be visible to DPI. if midhost then @@ -942,7 +943,7 @@ function fakeddisorder(ctx, desync) local opts_orig = {rawsend = rawsend_opts_base(desync), reconstruct = {}, ipfrag = {}, ipid = desync.arg, fooling = {tcp_ts_up = desync.arg.tcp_ts_up}} local opts_fake = {rawsend = rawsend_opts(desync), reconstruct = reconstruct_opts(desync), ipfrag = {}, ipid = desync.arg, fooling = desync.arg} - fakepat = desync.arg.pattern and blob(desync,desync.arg.pattern) or "\x00" + local fakepat = desync.arg.pattern and blob(desync,desync.arg.pattern) or "\x00" -- second fake fake = pattern(fakepat,pos,#data-pos+1) diff --git a/lua/zapret-pcap.lua b/lua/zapret-pcap.lua index 2a10efc..16814f5 100644 --- a/lua/zapret-pcap.lua +++ b/lua/zapret-pcap.lua @@ -1,6 +1,6 @@ function pcap_write_header(file) - -- big endian, nanoseconds in timestamps, ver 2.4, max packet size - 0x4000 (16384), 0x65 - l3 packets without l2 - file:write("\xA1\xB2\x3C\x4D\x00\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x65") + -- big endian, nanoseconds in timestamps, ver 2.4, max packet size - 0xFFFF (65535), 0x65 - l3 packets without l2 + file:write("\xA1\xB2\x3C\x4D\x00\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\x00\x00\x00\x65") end function pcap_write_packet(file, raw) local sec, nsec = clock_gettime(); diff --git a/nfq2/darkmagic.c b/nfq2/darkmagic.c index 9b24027..8d8ab89 100644 --- a/nfq2/darkmagic.c +++ b/nfq2/darkmagic.c @@ -557,12 +557,15 @@ void proto_dissect_l3l4(const uint8_t *data, size_t len, struct dissect *dis, bo dis->data_pkt = data; dis->len_pkt = len; + uint16_t iplen; + if (proto_check_ipv4(data, len) && (no_payload_check || proto_check_ipv4_payload(data, len))) { dis->ip = (const struct ip *) data; dis->proto = dis->ip->ip_p; p = data; - dis->len_pkt = len = ntohs(((struct ip*)data)->ip_len); + iplen = ntohs(((struct ip*)data)->ip_len); + if (iplenlen_pkt = len = iplen; proto_skip_ipv4(&data, &len, &dis->frag, &dis->frag_off); dis->len_l3 = data-p; } @@ -570,7 +573,8 @@ void proto_dissect_l3l4(const uint8_t *data, size_t len, struct dissect *dis, bo { dis->ip6 = (const struct ip6_hdr *) data; p = data; - dis->len_pkt = len = ntohs(((struct ip6_hdr*)data)->ip6_ctlun.ip6_un1.ip6_un1_plen) + sizeof(struct ip6_hdr); + iplen = ntohs(((struct ip6_hdr*)data)->ip6_ctlun.ip6_un1.ip6_un1_plen) + sizeof(struct ip6_hdr); + if (iplenlen_pkt = len = iplen; proto_skip_ipv6(&data, &len, &dis->proto, &dis->frag, &dis->frag_off); dis->len_l3 = data-p; } diff --git a/nfq2/nfqws.c b/nfq2/nfqws.c index b6bc068..c84adc0 100644 --- a/nfq2/nfqws.c +++ b/nfq2/nfqws.c @@ -387,6 +387,8 @@ static void notify_ready(void) #endif } +// extra space for netlink headers +#define NFQ_MAX_RECV_SIZE (RECONSTRUCT_MAX_SIZE+512) static int nfq_main(void) { struct nfq_handle *h = NULL; @@ -436,7 +438,7 @@ static int nfq_main(void) goto exok; } - if (!(buf = malloc(RECONSTRUCT_MAX_SIZE)) || !(mod = malloc(RECONSTRUCT_MAX_SIZE))) + if (!(buf = malloc(NFQ_MAX_RECV_SIZE)) || !(mod = malloc(RECONSTRUCT_MAX_SIZE))) { DLOG_ERR("out of memory\n"); goto err; @@ -466,7 +468,7 @@ static int nfq_main(void) do { if (bQuit) goto quit; - while ((rd = recv(fd, buf, RECONSTRUCT_MAX_SIZE, 0)) >= 0) + while ((rd = recv(fd, buf, NFQ_MAX_RECV_SIZE, 0)) >= 0) { if (!rd) {