【发布时间】:2019-10-17 06:11:08
【问题描述】:
对于我的学校项目,我们必须做一个中间人。但是我们没有成功获取 HTTP 内容。我写了一些东西来重新组装 tcp 有效负载数据,但我只得到 HTTP Header 而不是源代码。我在wireshark上看到数据是未压缩的,但我不知道这是什么意思。
这是我的代码 TcpSession 类
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();
}
}
包组装器
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);
}
}
}
【问题讨论】: