我正在尝试对我的设备及其软件通信协议进行逆向工程。设备通过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);
}
(调用代码仅用于调试目的,所以永远不要无限循环)。
提前谢谢!