c# - 写入另一个我读取数据包的程序的 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:任何人都知道如何做到这一点?
解决方案
推荐阅读
- message-queue - ZeroMQ 消息队列
- laravel - 如何在当前用户中实现 setEagerLoads - Laravel
- c - C函数将函数作为参数传递,如何使用node-ffi包装这个函数?
- python-3.x - 如何从数据框中写入具有不同列名的excel?
- android - 清除待定意图
- c - C中的地址位置和地址位置的值
- python - Kivy: TypeError: object.__init__() 只接受一个参数(要初始化的实例)
- ruby - 打包器文档生成中缺少文件
- mysql - 获取存在特定值的行,如果不存在则显示具有其他值的行
- r - 如何在密度图中添加来自 geom_vline 的 x 截距作为标签?