吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 866|回复: 9
上一主题 下一主题
收起左侧

[求助] C# 如何实现 发送 MAC层数据

[复制链接]
跳转到指定楼层
楼主
Armind 发表于 2024-6-6 09:15 回帖奖励
各位大佬,小弟现在有一个项目,要仿造一款上位机软件,这个软件需要和一台硬件设备连接。我通过抓包发现原厂软件和硬件设备之间使用mac层进行通讯,交互数据
请问C#有没有什么办法可以实现数据链路层通讯?

微信截图_20240606091229.png (194.02 KB, 下载次数: 1)

微信截图_20240606091229.png

微信截图_20240606091250.png (101.2 KB, 下载次数: 0)

微信截图_20240606091250.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
limit7 发表于 2024-6-6 15:17
有点像udp
3#
limit7 发表于 2024-6-6 15:18
头像被屏蔽
4#
捷豹网络丶贱仔 发表于 2024-6-6 15:23
5#
vista_info 发表于 2024-6-6 16:34
声明:以下内容由AI创作仅供参考
----在C#中,发送MAC层(媒体访问控制层)数据通常不是直接通过高级语言实现的,因为这是操作系统和网络硬件设备驱动程序所管理的底层操作。然而,可以通过一些库或者Windows API来实现这一功能。
以下是一些可能的方法:
1. **使用WinPcap库**:
   WinPcap是一个流行的库,可以用于捕获、发送和解析网络数据包。这个库提供了发送原始网络数据包的能力,允许你指定包括MAC地址在内的数据链路层头部信息。
   安装WinPcap库后,你可以使用C#封装的WinPcap库如`SharpPcap`来发送数据包。
[C#] 纯文本查看 复制代码
   ```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发送。
  
[C#] 纯文本查看 复制代码
 ```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层数据需要你对网络协议有深入的了解,以确保正确构建和发送数据包。在开发此类功能时,务必遵守相关法律法规,不得用于非法侵入他人网络或进行其他违法活动。
6#
vcdemon 发表于 2024-6-6 17:05
kai-memory 发表于 2024-6-6 16:34
声明:以下内容由AI创作仅供参考
----在C#中,发送MAC层(媒体访问控制层)数据通常不是直接通过高级语言 ...

碉堡了,原来这个就叫mac层通信啊,学到了。那岂不是可以在自己电脑上搞两张网卡之间的通信了?
7#
flyer_2001 发表于 2024-6-6 19:29
通过socket处理打包即可,具体收发协议需要分析元软件
头像被屏蔽
8#
hjsen 发表于 2024-6-6 20:23
提示: 作者被禁止或删除 内容自动屏蔽
9#
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类似可以输入主机名,但是连接无法建立。
10#
likehanhan 发表于 2024-6-12 10:09
捷豹网络丶贱仔 发表于 2024-6-6 15:23
[mw_shl_code=csharp,true]using System;
using System.IO;
using System.Net.NetworkInformation;

44行,上下文不不存在DeviceMode,
47行不存在委托
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 12:07

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表