Armind 发表于 2024-6-6 09:15

C# 如何实现 发送 MAC层数据

各位大佬,小弟现在有一个项目,要仿造一款上位机软件,这个软件需要和一台硬件设备连接。我通过抓包发现原厂软件和硬件设备之间使用mac层进行通讯,交互数据
请问C#有没有什么办法可以实现数据链路层通讯?

limit7 发表于 2024-6-6 15:17

有点像udp

limit7 发表于 2024-6-6 15:18

一般和机器通信不是用串口么

捷豹网络丶贱仔 发表于 2024-6-6 15:23

vista_info 发表于 2024-6-6 16:34

声明:以下内容由AI创作仅供参考
----在C#中,发送MAC层(媒体访问控制层)数据通常不是直接通过高级语言实现的,因为这是操作系统和网络硬件设备驱动程序所管理的底层操作。然而,可以通过一些库或者Windows API来实现这一功能。
以下是一些可能的方法:
1. **使用WinPcap库**:
   WinPcap是一个流行的库,可以用于捕获、发送和解析网络数据包。这个库提供了发送原始网络数据包的能力,允许你指定包括MAC地址在内的数据链路层头部信息。
   安装WinPcap库后,你可以使用C#封装的WinPcap库如`SharpPcap`来发送数据包。
   ```csharp
   using SharpPcap;
   using PacketDotNet;
   // 创建一个发送器
   var sender = new OfflinePacketDevice("eth0");
   // 打开设备
   sender.Open();
   // 创建一个以太网包
   var ethernetPacket = new EthernetPacket(new PhysicalAddress("00:11:22:33:44:55"), // 目标MAC
                                          new PhysicalAddress("AA:BB:CC:DD:EE:FF"), // 源MAC
                                          EthernetPacketType.None); // 类型
   // 添加你的数据
   byte[] payload = { /* 你的数据 */ };
   ethernetPacket.PayloadData = payload;
   // 发送数据包
   sender.SendPacket(ethernetPacket);
   // 关闭设备
   sender.Close();
   ```
2. **使用Windows的`iphlpapi.dll`和`ws2_32.dll`**:
   可以通过P/Invoke调用这些Windows API来发送原始网络数据包。
3. **使用.NET的`Socket`类**:
   虽然Socket类本身不直接支持发送MAC层的数据,但它允许你发送和接收原始网络数据包。你可以手动构建包含MAC地址的数据包,然后通过Socket发送。
```csharp
   using System.Net.Sockets;
   using System.Net.NetworkInformation;
   var socket = new Socket(AddressFamily.Packet, SocketType.Raw, ProtocolType.IP);
   socket.Bind(new LingerOption(true, 0));
   socket.IOControl((IOControlCode)0x8910, new byte[] { 0, 0, 0, 0 }, null);
   var macAddress = new PhysicalAddress(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 });
   var ethernetHeader = new byte[] {
       // 以太网帧头部,包含目标MAC、源MAC和类型
   };
   // 将以太网头部和你的数据组合
   byte[] packet = ethernetHeader.Concat(yourData).ToArray();
   // 发送数据包
   socket.SendTo(packet, new SocketPacketSocketOption(macAddress));
   ```
   注意:在发送之前,你需要构建正确的以太网帧头部,包括目标MAC地址、源MAC地址和帧类型。
在实际应用中,直接操作MAC层通常需要管理员权限,并且可能会受到操作系统和网络硬件的限制。此外,发送MAC层数据需要你对网络协议有深入的了解,以确保正确构建和发送数据包。在开发此类功能时,务必遵守相关法律法规,不得用于非法侵入他人网络或进行其他违法活动。

vcdemon 发表于 2024-6-6 17:05

kai-memory 发表于 2024-6-6 16:34
声明:以下内容由AI创作仅供参考
----在C#中,发送MAC层(媒体访问控制层)数据通常不是直接通过高级语言 ...

碉堡了,原来这个就叫mac层通信啊,学到了。那岂不是可以在自己电脑上搞两张网卡之间的通信了?

flyer_2001 发表于 2024-6-6 19:29

通过socket处理打包即可,具体收发协议需要分析元软件

hjsen 发表于 2024-6-6 20:23

goblack 发表于 2024-6-6 21:29

vcdemon 发表于 2024-6-6 17:05
碉堡了,原来这个就叫mac层通信啊,学到了。那岂不是可以在自己电脑上搞两张网卡之间的通信了?

TCP/IP本身就是通讯协议的一种。。。除了IP协议,还有许许多多的与TCP/UDP这种IP协议同级别的协议。互联网路由器支持的会转发的基本上都是IP相关的。而本地局域网,特别是同交换机这样的同广播域,自定义一个非标准协议进行本地的广播、单播通讯是可以实现的。

做个实验:两台Windows计算机,开启局域网共享,在IP协议处禁用IPV4及IPV6,在正确配置的时候仍然能够正常的访问网上邻居进行文件共享,或者使用shutdown -m关闭一台或者一批计算机,但是依赖IP的一些应用比如两台机器之间就无法互相远程桌面、远程协助这种,虽然与shutdown类似可以输入主机名,但是连接无法建立。

likehanhan 发表于 2024-6-12 10:09

捷豹网络丶贱仔 发表于 2024-6-6 15:23
using System;
using System.IO;
using System.Net.NetworkInformation;


44行,上下文不不存在DeviceMode,
47行不存在委托
页: [1]
查看完整版本: C# 如何实现 发送 MAC层数据