public static byte[] RewriteUdpHeader(byte[] packet, UInt16 port, RewriteType type) { byte IHL = (byte)(packet[0] << 4); IHL = (byte)(IHL >> 4); int ip_header_len; if (IHL > 5) { ip_header_len = (IHL * 32) / 8; } else { ip_header_len = 20; } int port_index = ip_header_len + 0; if (type == RewriteType.Source) { port_index = ip_header_len + 0; } if (type == RewriteType.Destination) { port_index = ip_header_len + 2; } byte[] bdst_port = BitConverter.GetBytes(port); packet[port_index] = bdst_port[1]; packet[port_index + 1] = bdst_port[0]; return(RewriteIpUdpChecksum(packet)); }
//******************************************************************************// public static byte[] RewriteIpHeader(byte[] packet, IPAddress ip_address, RewriteType type) { int repl_index = 12; if (type == RewriteType.Source) { repl_index = 12; } if (type == RewriteType.Destination) { repl_index = 16; } byte IHL = (byte)(packet[0] << 4); IHL = (byte)(IHL >> 4); int ip_header_len; if (IHL > 5) { ip_header_len = (IHL * 32) / 8; } else { ip_header_len = 20; } byte[] source_ip = ip_address.GetAddressBytes(); byte[] checksum = new byte[2]; Array.Copy(source_ip, 0, packet, repl_index, 4); Array.Copy(checksum, 0, packet, 10, 2); byte[] header = new byte[ip_header_len]; Array.Copy(packet, 0, header, 0, ip_header_len); ushort ip_checksum = ComputeChecksum(header, 0, ip_header_len); checksum = BitConverter.GetBytes(ip_checksum); Array.Reverse(checksum); Array.Copy(checksum, 0, packet, 10, 2); return(packet); }