使用WinPcap(SharpPcap)实现ARP抓包以实现设备IP搜索功能
在监控摄像机安装后,往往需要设置IP等信息,在IP不知道的情况下,IP搜索是一个很常见也必须的功能。
考虑到设备IP和当前局域网可能不在同一个网段,ARP是一个不错的选择。
首先安装WinPcap软件
使用C#开发还需要以下dll:
SharpPcap.dll
PacketDotNet.dll
请自己百度下载。
设计逻辑:
用户电脑开始搜索IP时,首先发送一个arp请求然后用户电脑开始监听,监控摄像机等设备监听到后发送一个arp包,包含ip等信息回复,用户电脑监听到后解析
首先要获取当前计算机的网卡及ip和mac物理地址
- ManagementObjectSearcher ms = new ManagementObjectSearcher(@"SELECT DeviceID FROM Win32_NetworkAdapter WHERE ((MACAddress Is Not NULL) AND (Manufacturer <> 'Microsoft'))");//WHERE PNPDeviceID LIKE 'PCI%'
- if (ms.Get().Count < )
- {
- MessageBox.Show("不存在真实网卡");
- return;
- }
- devices1 = LibPcapLiveDeviceList.Instance;
- if (devices1.Count < )
- {
- MessageBox.Show("无法获取网卡");
- return;
- }
- PhysicalAddress pmac = PhysicalAddress.Parse("FF-FF-FF-FF-FF-FF");
- destinationIP = IPAddress.Broadcast;
- //遍历网卡
- foreach (var device in devices1)
- {
- if (!device.Description.ToLower().Contains("vmware") && !device.Description.ToLower().Contains("virtual"))//排除虚拟机网卡
- {
- DeviceNoticeThread = new Thread(new ThreadStart(() =>
- {
- if (device.Addresses.Count > )
- {
- foreach (var address in device.Addresses)
- {
- if (address.Addr.type == SharpPcap.LibPcap.Sockaddr.AddressTypes.AF_INET_AF_INET6)
- {
- if (address.Addr.ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
- {
- localIP = address.Addr.ipAddress;
- break;
- }
- }
- }
- }
- foreach (var address in device.Addresses)
- {
- if (address.Addr.type == SharpPcap.LibPcap.Sockaddr.AddressTypes.HARDWARE)
- {
- localMAC = address.Addr.hardwareAddress;
- }
- }
- var ethernetPacket = new EthernetPacket(localMAC, pmac, EthernetPacketType.Arp);
- var arpPacket = new ARPPacket(getBas("FFFFFFFFFFFF"));
- ethernetPacket.PayloadPacket = arpPacket;
- device.Open();
- device.SendPacket(ethernetPacket);
- }));
- DeviceCaptureThread = new Thread(new ThreadStart(() =>
- {
- device.OnPacketArrival += new PacketArrivalEventHandler(device_OnPacketArrival);
- device.Open(DeviceMode.Normal, );
- string filter = "arp";
- device.Filter = filter;
- device.StartCapture();
- }));
- DeviceCaptureThread.IsBackground = true;
- DeviceCaptureThread.Start();
- DeviceNoticeThread.IsBackground = true;
- DeviceNoticeThread.Start();
- }
- }
- getBas函数是拼出arp包内容,这里暂定长度40,内容自己拼
- private ByteArraySegment getBas(string mac)
- {
- byte[] bas = new byte[];
- bas[] = ;//硬件类型 - 以太网类型值0x1
- bas[] = ;
- bas[] = ;//上层协议类型 - IP协议(0x0800)
- bas[] = ;
- bas[] = ;//MAC地址长度
- bas[] = ;//IP地址长度
- bas[] = ;//操作码 - 0x1表示ARP请求包,0x2表示应答包
- bas[] = ;
- string sendermac = localMAC.ToString().Trim();
- if (sendermac.Length == )
- {
- for (int i = ; i < ; i++)
- {
- bas[i + ] = Convert.ToByte(sendermac.Substring(i * , ), );//发送方mac
- }
- }
- string[] senderip = localIP.ToString().Trim().Split('.');
- if (senderip.Length == )
- {
- for (int i = ; i < senderip.Length; i++)
- {
- bas[i + ] = Convert.ToByte(senderip[i]);//发送方ip
- }
- }
- string receivermac = mac;
- if (receivermac.Length == )
- {
- for (int i = ; i < ; i++)
- {
- bas[i + ] = Convert.ToByte(receivermac.Substring(i * , ), );//接收方mac
- }
- }
- string[] receiverip = destinationIP.ToString().Trim().Split('.');
- if (receiverip.Length == )
- {
- for (int i = ; i < receiverip.Length; i++)
- {
- bas[i + ] = Convert.ToByte(receiverip[i]);//接收方ip
- }
- }
- string strpadding = "自定义头," + Convert2Hex(localIP.ToString().Trim()) + "," + sendermac;
- byte[] padding = Encoding.UTF8.GetBytes(strpadding.PadRight(, '\0'));//自定义数据
- for (int i = ; i < ; i++)
- {
- bas[i + ] = padding[i];
- }
- return new ByteArraySegment(bas);
- }
监听到arp包且长度一致暂定80,根据实际情况改,且头一致,就可以解析显示了
- private void device_OnPacketArrival(object sender, CaptureEventArgs e)
- {
- if (bStopOnPacketArrival) return;
- try
- {
- Packet packet = Packet.ParsePacket(e.Device.LinkType, e.Packet.Data);
- if (packet is EthernetPacket)
- {
- EthernetPacket ep = (EthernetPacket)packet;
- if (ep.PayloadPacket is ARPPacket)
- {
- ARPPacket ap = (ARPPacket)ep.PayloadPacket;
- if (ep.Type == EthernetPacketType.Arp && ap.Operation == ARPOperation.Response)
- {
- byte[] data = ep.Bytes;
- if (data.Length == )
- {
- }
- }
- }
- }
- }
- catch (System.Exception ex)
- {
- log.ErrorFormat("解析arp包失败!错误信息:{0}", ex.Message);
- }
- }
使用WinPcap(SharpPcap)实现ARP抓包以实现设备IP搜索功能的更多相关文章
- 使用WinPcap(SharpPcap)实现ARP抓包以实现设备IP修改功能
参考上一篇: 使用WinPcap(SharpPcap)实现ARP抓包以实现设备IP搜索功能 搜索出设备后,需要修改设备IP网关掩码等信息 继续采用ARP包 getBas类似之前的,根据用户电脑的网卡物 ...
- ARP抓包实战小结-TCP/IP协议学习
2011-12-26 21:36:47 图1 一,环境说明 硬件连线.PC与2440开发板直接用网线连接. PC的ip地址:192.168.0.107.2440开发板的ip地址:192.168.0.1 ...
- C#使用sharppcap实现网络抓包-----2
虽然网上已经有了SharpSniffer 这一个SharpSniffer还是原创的无他,唯为学习工程文件下载:SharpSniffer.rar 1.创建套接字2.绑定到本机3.设置IOControl4 ...
- Wireshark抓包笔录--之指定IP地址筛选捕获结果
Wireshark安装 1.去官网下载相应的安装包 地址如下:https://www.wireshark.org/ 2.安装步骤,一路next,需要同意的地方点同意 3.安装完成后打开软件,如下: W ...
- C#使用sharppcap实现网络抓包
sharppcap dll的下载地址: http://sourceforge.net/directory/os:windows/?q=sharppcap 具体使用详细步骤: http://www.co ...
- Fiddler抓包【7】_次要功能和第三方插件
1.替换HTTP Request Host 应用场景:进行开发时,线上去测试跳转调试 替换命令:urlreplace news.baidu.com www.baidu.com: 清除命令:urlrep ...
- C winpcap 网络抓包 并获取IP TCP 协议的相关信息
以太网协议分析函数: void ethernet_protocol_packet_handle (u_char *argument, const struct pcap_pkthdr *packet_ ...
- 网络协议抓包分析——ARP地址解析协议
前言 计算机之间可以相互通信的前提是要知道对方的地址,才可以发送信息给其他计算机,就像别人要联系你也得先知道你的电话号码一样.这里的地址因为网络分层的原因就包括IP地址和MAC地址(即网卡地址.硬件地 ...
- wireshark抓包,安装及简单使用
跟着实验室师兄尝试做流量分析,趁着离期末考试还有几天,尽快把环境搭好. 采集:自动化测试monkeyrunner,ok 抓包 charles/Wireshark,ok 限制其他应用运行App Moun ...
随机推荐
- oracle判断是否包含字符串的方法
首先想到的就是contains,contains用法如下: select * from students where contains(address, ‘beijing’) 但是,使用contai ...
- react使用setstate注意的两点
1.this.state里的属性不修改,或是只修改一个,那么不修改的剩下的属性不会被变动. this.state={ name:"Aliece", age:19, msg:&quo ...
- 基于MMSE的预测
本文的目的是预测随机变量的输出值. 既然有预测值,那么我们就需要一个判断基准(criterion)用于判断该预测值与该随机变量的实际输出之间的差值,这里采用的判断基准就是MSE(mean-square ...
- HTML5-Audio-基础篇
播放音频文件 //control属性添加播放.暂停和音量控件<audio controls> <source src="horse.ogg" type=" ...
- Server socket
用法都一样 区别: self.request TCP self.requsst 代表具体的链接 UDP self.requst 代表一个小元组(元组里面: 第一个元素 客户端发来的数据 ,第 ...
- hashlib 模块用来进行hash
hashlib的基本概述: python中的 hashlib 模块用来进行hash 或者md5加密,而且这种加密是不可逆的,所以这种算法又被称为摘要算法, 其支持Opennssl库提供的所有算法,包括 ...
- Matplotlib学习---用matplotlib画柱形图,堆积柱形图,横向柱形图(bar chart)
这里利用Nathan Yau所著的<鲜活的数据:数据可视化指南>一书中的数据,学习画图. 数据地址:http://datasets.flowingdata.com/hot-dog-cont ...
- Min_25
可以用来筛出一个积性函数的前缀和.这个积性函数要满足当\(x\)是质数时,\(f(x)\)可以快速求出,\(f(x^k)\)也可以快速算出. 首先我们要处理出一个\(g(x)=\sum_{x\in p ...
- [HNOI2015]落忆枫音 解题报告
[HNOI2015]落忆枫音 设每个点入度是\(d_i\),如果不加边,答案是 \[ \prod_{i=2}^nd_i \] 意思是我们给每个点选一个父亲 然后我们加了一条边,最后如果还这么统计,那么 ...
- js 触摸的Event--获取触摸位置
继上一篇js原生拖拽之后,现在又来写一下移动端touch列表,获取触摸位置.pc端的event事件,鼠标的位置信息在上一篇,点此进入上一篇. touch有3个事件:touchstart,touchmo ...