|
|
@ -518,8 +518,8 @@ static void send_native_fragment(HANDLE w_filter, WINDIVERT_ADDRESS addr, |
|
|
|
ppTcpHdr->SeqNum = htonl(ntohl(ppTcpHdr->SeqNum) + fragment_size); |
|
|
|
} |
|
|
|
|
|
|
|
addr.PseudoIPChecksum = 0; |
|
|
|
addr.PseudoTCPChecksum = 0; |
|
|
|
addr.IPChecksum = 0; |
|
|
|
addr.TCPChecksum = 0; |
|
|
|
|
|
|
|
WinDivertHelperCalcChecksums( |
|
|
|
packet, packetLen, &addr, 0 |
|
|
@ -527,7 +527,7 @@ static void send_native_fragment(HANDLE w_filter, WINDIVERT_ADDRESS addr, |
|
|
|
WinDivertSend( |
|
|
|
w_filter, packet, |
|
|
|
packetLen, |
|
|
|
&addr, NULL |
|
|
|
NULL, &addr |
|
|
|
); |
|
|
|
memcpy(packet, &packet_bak, orig_packetLen); |
|
|
|
//printf("Sent native fragment of %d size (step%d)\n", packetLen, step);
|
|
|
@ -1001,7 +1001,7 @@ int main(int argc, char *argv[]) { |
|
|
|
if (do_native_frag && !(do_fragment_http || do_fragment_https)) { |
|
|
|
puts("\nERROR: Native fragmentation is enabled but fragment sizes are not set.\n" |
|
|
|
"Fragmentation has no effect."); |
|
|
|
exit(EXIT_FAILURE); |
|
|
|
die(); |
|
|
|
} |
|
|
|
|
|
|
|
if (max_payload_size) |
|
|
@ -1038,8 +1038,8 @@ int main(int argc, char *argv[]) { |
|
|
|
signal(SIGINT, sigint_handler); |
|
|
|
|
|
|
|
while (1) { |
|
|
|
if (WinDivertRecv(w_filter, packet, sizeof(packet), &addr, &packetLen)) { |
|
|
|
debug("Got %s packet, len=%d!\n", addr.Direction ? "inbound" : "outbound", |
|
|
|
if (WinDivertRecv(w_filter, packet, sizeof(packet), &packetLen, &addr)) { |
|
|
|
debug("Got %s packet, len=%d!\n", addr.Outbound ? "outbound" : "inbound", |
|
|
|
packetLen); |
|
|
|
should_reinject = 1; |
|
|
|
should_recalc_checksum = 0; |
|
|
@ -1052,35 +1052,35 @@ int main(int argc, char *argv[]) { |
|
|
|
packet_type = unknown; |
|
|
|
|
|
|
|
// Parse network packet and set it's type
|
|
|
|
if ((packet_v4 = WinDivertHelperParsePacket(packet, packetLen, &ppIpHdr, |
|
|
|
NULL, NULL, NULL, &ppTcpHdr, NULL, &packet_data, &packet_dataLen))) |
|
|
|
{ |
|
|
|
packet_type = ipv4_tcp_data; |
|
|
|
} |
|
|
|
else if ((packet_v6 = WinDivertHelperParsePacket(packet, packetLen, NULL, |
|
|
|
&ppIpV6Hdr, NULL, NULL, &ppTcpHdr, NULL, &packet_data, &packet_dataLen))) |
|
|
|
{ |
|
|
|
packet_type = ipv6_tcp_data; |
|
|
|
} |
|
|
|
else if ((packet_v4 = WinDivertHelperParsePacket(packet, packetLen, &ppIpHdr, |
|
|
|
NULL, NULL, NULL, &ppTcpHdr, NULL, NULL, NULL))) |
|
|
|
{ |
|
|
|
packet_type = ipv4_tcp; |
|
|
|
} |
|
|
|
else if ((packet_v6 = WinDivertHelperParsePacket(packet, packetLen, NULL, |
|
|
|
&ppIpV6Hdr, NULL, NULL, &ppTcpHdr, NULL, NULL, NULL))) |
|
|
|
{ |
|
|
|
packet_type = ipv6_tcp; |
|
|
|
} |
|
|
|
else if ((packet_v4 = WinDivertHelperParsePacket(packet, packetLen, &ppIpHdr, |
|
|
|
NULL, NULL, NULL, NULL, &ppUdpHdr, &packet_data, &packet_dataLen))) |
|
|
|
{ |
|
|
|
packet_type = ipv4_udp_data; |
|
|
|
} |
|
|
|
else if ((packet_v6 = WinDivertHelperParsePacket(packet, packetLen, NULL, |
|
|
|
&ppIpV6Hdr, NULL, NULL, NULL, &ppUdpHdr, &packet_data, &packet_dataLen))) |
|
|
|
if (WinDivertHelperParsePacket(packet, packetLen, &ppIpHdr, |
|
|
|
&ppIpV6Hdr, NULL, NULL, NULL, &ppTcpHdr, &ppUdpHdr, &packet_data, &packet_dataLen, |
|
|
|
NULL, NULL)) |
|
|
|
{ |
|
|
|
packet_type = ipv6_udp_data; |
|
|
|
if (ppIpHdr) { |
|
|
|
packet_v4 = 1; |
|
|
|
if (ppTcpHdr) { |
|
|
|
packet_type = ipv4_tcp; |
|
|
|
if (packet_data) { |
|
|
|
packet_type = ipv4_tcp_data; |
|
|
|
} |
|
|
|
} |
|
|
|
else if (ppUdpHdr && packet_data) { |
|
|
|
packet_type = ipv4_udp_data; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
else if (ppIpV6Hdr) { |
|
|
|
packet_v6 = 1; |
|
|
|
if (ppTcpHdr) { |
|
|
|
packet_type = ipv6_tcp; |
|
|
|
if (packet_data) { |
|
|
|
packet_type = ipv6_tcp_data; |
|
|
|
} |
|
|
|
} |
|
|
|
else if (ppUdpHdr && packet_data) { |
|
|
|
packet_type = ipv6_udp_data; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
debug("packet_type: %d, packet_v4: %d, packet_v6: %d\n", packet_type, packet_v4, packet_v6); |
|
|
@ -1090,7 +1090,7 @@ int main(int argc, char *argv[]) { |
|
|
|
/* Got a TCP packet WITH DATA */ |
|
|
|
|
|
|
|
/* Handle INBOUND packet with data and find HTTP REDIRECT in there */ |
|
|
|
if (addr.Direction == WINDIVERT_DIRECTION_INBOUND && packet_dataLen > 16) { |
|
|
|
if (!addr.Outbound && packet_dataLen > 16) { |
|
|
|
/* If INBOUND packet with DATA (tcp.Ack) */ |
|
|
|
|
|
|
|
/* Drop packets from filter with HTTP 30x Redirect */ |
|
|
@ -1114,7 +1114,7 @@ int main(int argc, char *argv[]) { |
|
|
|
/* Handle OUTBOUND packet on port 443, search for something that resembles
|
|
|
|
* TLS handshake, send fake request. |
|
|
|
*/ |
|
|
|
else if (addr.Direction == WINDIVERT_DIRECTION_OUTBOUND && |
|
|
|
else if (addr.Outbound && |
|
|
|
((do_fragment_https ? packet_dataLen == https_fragment_size : 0) || |
|
|
|
packet_dataLen > 16) && |
|
|
|
ppTcpHdr->DstPort != htons(80) && |
|
|
@ -1158,7 +1158,7 @@ int main(int argc, char *argv[]) { |
|
|
|
} |
|
|
|
} |
|
|
|
/* Handle OUTBOUND packet on port 80, search for Host header */ |
|
|
|
else if (addr.Direction == WINDIVERT_DIRECTION_OUTBOUND && |
|
|
|
else if (addr.Outbound && |
|
|
|
packet_dataLen > 16 && |
|
|
|
(do_http_allports ? 1 : (ppTcpHdr->DstPort == htons(80))) && |
|
|
|
find_http_method_end(packet_data, |
|
|
@ -1302,7 +1302,7 @@ int main(int argc, char *argv[]) { |
|
|
|
/* Else if we got TCP packet without data */ |
|
|
|
else if (packet_type == ipv4_tcp || packet_type == ipv6_tcp) { |
|
|
|
/* If we got INBOUND SYN+ACK packet */ |
|
|
|
if (addr.Direction == WINDIVERT_DIRECTION_INBOUND && |
|
|
|
if (!addr.Outbound && |
|
|
|
ppTcpHdr->Syn == 1 && ppTcpHdr->Ack == 1) { |
|
|
|
//printf("Changing Window Size!\n");
|
|
|
|
/*
|
|
|
@ -1342,7 +1342,7 @@ int main(int argc, char *argv[]) { |
|
|
|
else if ((do_dnsv4_redirect && (packet_type == ipv4_udp_data)) || |
|
|
|
(do_dnsv6_redirect && (packet_type == ipv6_udp_data))) |
|
|
|
{ |
|
|
|
if (addr.Direction == WINDIVERT_DIRECTION_INBOUND) { |
|
|
|
if (!addr.Outbound) { |
|
|
|
if ((packet_v4 && dns_handle_incoming(&ppIpHdr->DstAddr, ppUdpHdr->DstPort, |
|
|
|
packet_data, packet_dataLen, |
|
|
|
&dns_conn_info, 0)) |
|
|
@ -1372,7 +1372,7 @@ int main(int argc, char *argv[]) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
else if (addr.Direction == WINDIVERT_DIRECTION_OUTBOUND) { |
|
|
|
else if (addr.Outbound) { |
|
|
|
if ((packet_v4 && dns_handle_outgoing(&ppIpHdr->SrcAddr, ppUdpHdr->SrcPort, |
|
|
|
&ppIpHdr->DstAddr, ppUdpHdr->DstPort, |
|
|
|
packet_data, packet_dataLen, 0)) |
|
|
@ -1410,7 +1410,7 @@ int main(int argc, char *argv[]) { |
|
|
|
if (should_recalc_checksum) { |
|
|
|
WinDivertHelperCalcChecksums(packet, packetLen, &addr, (UINT64)0LL); |
|
|
|
} |
|
|
|
WinDivertSend(w_filter, packet, packetLen, &addr, NULL); |
|
|
|
WinDivertSend(w_filter, packet, packetLen, NULL, &addr); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|