Commit 6d52b49b authored by bol-van's avatar bol-van
Browse files

nfqws: do not reconstruct synack-split in syn mode

parent 4b632313
Loading
Loading
Loading
Loading
+31 −29
Original line number Diff line number Diff line
@@ -1188,11 +1188,20 @@ static uint8_t dpi_desync_tcp_packet_play(bool replay, size_t reasm_offset, uint

		//ConntrackPoolDump(&params.conntrack);

		if (dp->wsize && tcp_synack_segment(dis->tcp))
		if (tcp_synack_segment(dis->tcp))
		{
			if (dp->wsize)
			{
				tcp_rewrite_winsize(dis->tcp, dp->wsize, dp->wscale);
				verdict=VERDICT_MODIFY;
			}
			if (dp->synack_split==SS_SYN)
			{
				DLOG("split SYNACK : clearing ACK bit\n");
				dis->tcp->th_flags &= ~TH_ACK;
				verdict=VERDICT_MODIFY;
			}
		}

		if (bReverse)
		{
@@ -1280,20 +1289,14 @@ static uint8_t dpi_desync_tcp_packet_play(bool replay, size_t reasm_offset, uint
			}
		}

		if (dp->synack_split!=SS_NONE && tcp_synack_segment(dis->tcp))
		if ((dp->synack_split==SS_SYNACK || dp->synack_split==SS_ACKSYN) && tcp_synack_segment(dis->tcp))
		{
			// reconstruct required

			dis->tcp->th_flags &= ~TH_ACK;
			tcp_fix_checksum(dis->tcp,dis->transport_len, dis->ip, dis->ip6);

			char ss[2],i,ct;
			if (dp->synack_split==SS_SYN)
			{
				ct=1;
				ss[0] = 'S';
			}
			else
			{
				ct=2;
			char ss[2],i;
			if (dp->synack_split==SS_SYNACK)
			{
				ss[0] = 'S';
@@ -1312,18 +1315,17 @@ static uint8_t dpi_desync_tcp_packet_play(bool replay, size_t reasm_offset, uint
				DLOG_ERR("cannot prepare split SYNACK ACK part\n");
				goto send_orig;
			}
			}
			for (int i=0;i<ct;i++)
			for (int i=0;i<2;i++)
			{
				switch(ss[i])
				{
					case 'S':
						DLOG("sending split SYNACK : SYN\n");
						DLOG("split SYNACK : SYN\n");
						if (!rawsend_rep(dp->desync_repeats,(struct sockaddr *)&dst, desync_fwmark, ifout , dis->data_pkt, dis->len_pkt))
							goto send_orig;
						break;
					case 'A':
						DLOG("sending split SYNACK : ACK\n");
						DLOG("split SYNACK : ACK\n");
						if (!rawsend_rep(dp->desync_repeats,(struct sockaddr *)&dst, desync_fwmark, ifout , pkt1, pkt1_len))
							goto send_orig;
						break;
+1 −7
Original line number Diff line number Diff line
@@ -527,13 +527,7 @@ static int win_main(const char *windivert_filter)
	WINDIVERT_ADDRESS wa;
	char ifname[IFNAMSIZ];

	if (params.daemon)
	{
		// cygwin loses current dir
		char *cwd = get_current_dir_name();
		daemonize();
		chdir(cwd);
	}
	if (params.daemon) daemonize();

	if (*params.pidfile && !writepid(params.pidfile))
	{
+8 −0
Original line number Diff line number Diff line
@@ -343,9 +343,13 @@ void print_id(void)
#endif



void daemonize(void)
{
	int pid;
#ifdef __CYGWIN__
	char *cwd = get_current_dir_name();
#endif

	pid = fork();
	if (pid == -1)
@@ -356,6 +360,10 @@ void daemonize(void)
	else if (pid != 0)
		exit(0);

#ifdef __CYGWIN__
	chdir(get_current_dir_name());
#endif

	if (setsid() == -1)
		exit(2);
	if (chdir("/") == -1)