使用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 ...
随机推荐
- 使用java代码批量删除新浪微博
首先开骂,新浪微博@#@!,不经我同意就转发各种微博,制造垃圾,还不提供微博批量删除功能,摆明了的流氓行为,可耻可恨,遭人唾弃! SSLClient.java import org.apache.ht ...
- BZOJ4321queue2——DP/递推
题目描述 n 个沙茶,被编号 1~n.排完队之后,每个沙茶希望,自己的相邻的两 人只要无一个人的编号和自己的编号相差为 1(+1 或-1)就行: 现在想知道,存在多少方案满足沙茶们如此不苛刻的条件. ...
- 微信小程序——部署云函数【三】
部署login云函数 不部署的话,点击获取openid会报错,报错如下 解决方案呢,很明显的已经告诉我们了 搭建云环境 开通 同意协议 新建环境 每个小程序账号可以创建两个免费环境 确定 部署后再次请 ...
- Android EditView 获取焦点 不弹出软键盘
很简单的做法: 找到AndroidManifest.xml文件 然后在对应的activity中增加android:windowSoftInputMode="adjustPan" & ...
- LOJ6433 [PKUSC2018] 最大前缀和 【状压DP】
题目分析: 容易想到若集合$S$为前缀时,$S$外的所有元素的排列的前缀是小于$0$的,DP可以做到,令排列前缀个数小于0的是g[S]. 令f[S]表示$S$是前缀,转移可以通过在前面插入元素完成. ...
- Windows如何使用bin文件下的命令
开发人员安装了一些软件,例如git.maven.gradle等,需要用到对应的bin文件夹下的相应的命令. 如果直接使用,会报错“不是内部或外部命令,也不是可运行的程序或批处理文件” 一.这时往往会配 ...
- MT【259】2016天津压轴题之最佳逼近
(2016天津压轴题)设函数$f(x)=(x-1)^3-ax-b,x\in R$, 其中$a,b\in R$(1)求$f(x)$的单调区间.(2)若$f(x)$存在极值点$x_0$,且$f(x_1)= ...
- Android 2019最新面试实战总结
Android: 今日头条屏幕适配的原理? 1:首先计算出 density,计算公式:当前设备屏幕总宽度(单位为像素)/ 设计图总宽度(单位为 dp) = densitydensity 的意思就是 1 ...
- luogu5012 水の数列 (并查集+线段树)
如果我们能求出来每个区间个数的最大分值,那就可以用线段树维护这个东西 然后出答案了 然后这个的求法和(luogu4269)Snow Boots G非常类似,就是我们把数大小排个序,每次都拿<=x ...
- Centos7下源码编译安装python3.6
测试环境: 操作步骤: 1. 下载Python源码包(python3.6.0) 官网下载地址:https://www.python.org/downloads/ 搜狐下载地址:http://mirro ...