C# - 将数据从一个SerialPort重新发送到另一个

时间:2016-01-15 10:17:23

标签: c# serial-port reverse-engineering man-in-the-middle

我正在尝试对我的设备及其软件通信协议进行逆向工程。设备通过COM端口连接,所以我的想法是创建一对连接的虚拟COM端口,将其软件连接到其中一个,然后将所有数据从第二个虚拟COM端口重新发送到设备,反之亦然,同时记录所有内容过去了。也就是说,某种中间人。

但是,即使我可以监视来自设备和软件的某些数据,它们似乎也没有正确识别对方。但是,如果我尝试将它们直接连接到彼此,它们就会这样做。我想这个问题出现在重发部分。

我的代码目前看起来像这样:

public class ComMitm : IDisposable
{
    public SerialPort VirtualPort { get; }
    public SerialPort DevicePort { get; }

    public ICollection<string> Log { get; } = new List<string>();

    public ComMitm(string virtualPort, string devicePort)
    {
        VirtualPort = new SerialPort(virtualPort, 9600, Parity.None, 8, StopBits.One);
        DevicePort = new SerialPort(devicePort, 9600, Parity.None, 8, StopBits.One);

        VirtualPort.DataReceived += (sender, args) => { ResendData(VirtualPort, DevicePort); };
        DevicePort.DataReceived += (sender, args) => { ResendData(DevicePort, VirtualPort); };
    }

    public void StartListening()
    {
        VirtualPort.Open();
        DevicePort.Open();
    }

    private void ResendData(SerialPort fromPort, SerialPort toPort)
    {
        var data = fromPort.ReadExisting();
        toPort.Write(data);
        string logText = $"{fromPort.PortName} -> {toPort.PortName}: {data}"; 
        Console.WriteLine(logText);
        Log.Add(logText);
    }

    public void Dispose()
    {
        VirtualPort?.Dispose();
        DevicePort?.Dispose();
    }
}

我称之为:

using (var mitm = new ComMitm("COM1", "COM8"))
{
  mitm.StartListening();
  do
  {
    Thread.Sleep(1000);
  } while (true);
}

(调用代码仅用于调试目的,所以永远不要无限循环)。

提前谢谢!

0 个答案:

没有答案