首页 > 解决方案 > 写入另一个我读取数据包的程序的 TCP 流

问题描述

我设法读取了另一个我没有源代码的程序的传入和传出数据包(在这里完成: https ://www.codeproject.com/Articles/17031/A-Network-Sniffer-in-C) . 现在我还想写入该流或添加我自己的数据包,以便服务器接受它们作为有效的 tcp 数据包。

有没有办法获取该网络流或将原始数据包作为有效的 tcp 数据包写入服务器?

详细信息:我正在使用其服务器读取程序的流量:

mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Unspecified);

mainSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);

IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList
.Where((addr) => addr.AddressFamily == AddressFamily.InterNetwork)
.Where((addr) => addr.GetAddressBytes()[0] != 127)
.First();

mainSocket.Bind(new IPEndPoint(ipAddress, 0));

byte[] byTrue = new byte[4] { 1, 0, 0, 0 };
            byte[] byOut = new byte[4];

mainSocket.IOControl(IOControlCode.ReceiveAll, byTrue, byOut);

byteData = new byte[4096];

mainSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);

在 OnReceive 中,我将数据解析为 IPPackets 和 TCPPackets 以分析目标 IP 和端口以确定我的相关数据包和流。

现在我想通过将 tcp 流作为 NetworkStream 或通过将特定数据包发送到服务器 IP:Port 来将数据包写入此流。

到目前为止我尝试了什么:

public static void DoSomething(string targetIP, int targetPort)
{
IPAddress targetIPAddress = IPAddress.Parse(targetIP);
IPEndPoint target = new IPEndPoint(targetIPAddress, targetPort);

TcpClient tcpClient = new TcpClient();
tcpClient.Connect(target);
NetworkStream netStream = tcpClient.GetStream();

var packet = {0x6d, 0x4b, 0x4e, 0x09, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}

if (netStream.CanWrite)
{
     netStream.Write(packet, 0, packet.Length);
}
else
{
     Console.WriteLine("You cannot write data to this stream.");
      tcpClient.Close();
      netStream.Close();
      return;
}

}

或分包

mainSocket.Connect(target);
mainSocket.Send(packet);

我想发送数据包,因此它看起来像是在现有网络流中发送的。如果它更容易,我也很高兴 c、c++/cpp、c#、java、js、autoit 中的答案......

非常感谢,周末愉快

编辑:我设法编写了一个类似于其他程序包的发送 tcp 数据包。但根据 Wireshark 的说法,这些包裹被标记为“乱序”。这种“乱序”数据包通常被接受和解释吗?我该怎么做才能以正确的顺序设置数据包?

这就是我发送数据包的方法:

ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

struct sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr(ip);
clientService.sin_port = htons(port);

iResult = connect(ConnectSocket, (SOCKADDR*)&clientService, szeof(clientService));

iResult = send(ConnectSocket, buf, 5, 0);

因此,据我从 jdweng 的评论中了解到,没有办法获取现有的流吗?我想像抓取指向另一个程序的流的指针并将其转换为流,这样我的程序就可以写入同一个流。那或类似的可能吗?

BUMP:任何人都知道如何做到这一点?

标签: c#socketsnetworkingtcpstream

解决方案


推荐阅读