For my school project we have to do a man in the middle. But we don't succeed in getting HTTP content. I wrote a little thing to reassemble tcp payload data but I only get the HTTP Header and not the source code. I see that on wireshark data are uncompressed but I don't know what this mean.
This is my code TcpSession class
public class TcpSession : IDisposable
{
private MemoryStream _clientBuffer;
private MemoryStream _serverBuffer;
public TcpSession()
{
_clientBuffer = new MemoryStream();
_serverBuffer = new MemoryStream();
}
public void WritePacket(TcpPacket packet, bool toServer)
{
if (toServer)
{
_clientBuffer.Write(packet.PayloadData, 0, packet.PayloadData.Length);
}
else
{
_serverBuffer.Write(packet.PayloadData, 0, packet.PayloadData.Length);
}
}
public byte[] GetBuffer(bool toServer)
{
if (toServer)
{
return _clientBuffer.ToArray();
}
return _serverBuffer.ToArray();
}
public void Dispose()
{
_clientBuffer?.Dispose();
_serverBuffer?.Dispose();
}
}
PacketAssembler
public class PacketAssembler
{
public delegate void OnPacketReassembledDelegate(TcpSession session);
public OnPacketReassembledDelegate OnPacketReassembled;
private Dictionary<int, TcpSession> _tcpSessions;
public PacketAssembler()
{
_tcpSessions = new Dictionary<int, TcpSession>();
}
public void AddPacket(TcpPacket packet, bool toServer)
{
// Client port (unique) is used for the dictionary.
int port = toServer ? packet.SourcePort : packet.DestinationPort;
if (packet.Syn) // Connection established
{
if (!_tcpSessions.ContainsKey(port))
{
_tcpSessions.Add(port, new TcpSession());
}
}
else if (packet.Psh) // Push data
{
_tcpSessions[port].WritePacket(packet, toServer);
}
else if (packet.Rst) // reset the session
{
_tcpSessions.Remove(port);
}
else if (packet.Fin) // End the session
{
OnPacketReassembled(_tcpSessions[port]);
_tcpSessions.Remove(port);
}
}
}
Have you checked out packetnet-connections? https://github.com/chmorgan/packetnet-connections