使用libpcap过滤arp
上一篇博客简单讲述了libpcap的工作流程及简单使用,今天我们需要做的是继续使用libpcap抓取我们感兴趣的流量,并进行简单的解析:
测试环境是centos 7
下面贴一张arp帧结构图:

下面我们实现的是通过pcap过滤抓取arp报文,解析其中的Ethernet address 和proctocal address并打印出来
分析是arp request还是reply,前面就不做过多解释,代码比较简单,直接贴:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include <pcap.h>
#include <arpa/inet.h> #define MAXBYTES2CAPTURE 2048
#define ARP_REQUEST 1
#define ARP_REPLY 2 typedef struct arphdr {
u_int16_t htype; //hardware type
u_int16_t ptype; //protocol type
u_char hlen; //hardware address length
u_char plen; //protocol address length
u_int16_t oper; //operation code
u_char sha[]; //sendHardware address
u_char spa[]; //sender ip address
u_char tha[]; //target hardware address
u_char tpa[]; //target ip address
} arphdr_t; int main(int argc, char **argv)
{
int i = ;
bpf_u_int32 net = ;
bpf_u_int32 mask = ;
struct bpf_program filter; /*place to store the filter program*/
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t *handle = NULL; /*interface handle*/
struct pcap_pkthdr pkthdr; /**/
const unsigned char *packet = NULL; /*received raw data*/
arphdr_t *arpheader = NULL; /*point to arp header*/ if (argc != ) {
printf("USAGE: arpsniffer <interface>\n");
exit();
} memset(errbuf, , PCAP_ERRBUF_SIZE);
/*open network device for packet capture*/
handle = pcap_open_live(argv[], MAXBYTES2CAPTURE, , , errbuf);
if (handle == NULL) {
fprintf(stderr, "Couldn't open device %s: %s\n", argv[], errbuf);
exit();
} /*look up device network addr and mask*/
if (pcap_lookupnet(argv[], &net, &mask, errbuf) == -) {
fprintf(stderr, "Couldn't get netmask for device %s: %s\n", argv[], errbuf);
exit();
} /*complie the filter expression of filter program*/
pcap_compile(handle, &filter, "arp", , mask); pcap_setfilter(handle, &filter); while() {
/*Get one packet if null continue wait*/
if ((packet = pcap_next(handle, &pkthdr)) == NULL) {
continue;
} arpheader = (struct arphdr *)(packet + ); /*Point to the ARP header*/
printf("\n------------- ARP --------------\n");
printf("Received Packet Size: %d bytes\n", pkthdr.len);
printf("Hardware type: %s\n", (ntohs(arpheader->htype) == )?"Ethernet":"Unknown");
printf("Protocol type: %s\n", (ntohs(arpheader->ptype) == 0x0800)?"IPv4":"Unknown");
printf("Operation : %s\n", (ntohs(arpheader->oper) == ARP_REQUEST)?"ARP_REQUEST":"ARP_REPLY"); /*If is Ethernet and IPv4 print packet contents*/
if (ntohs(arpheader->htype) == && ntohs(arpheader->ptype) == 0x0800) {
printf("\nSoucre MAC:%02x:%02x:%02X:%02x:%02x:%02x\n",
arpheader->sha[], arpheader->sha[],
arpheader->sha[], arpheader->sha[],
arpheader->sha[], arpheader->sha[]);
printf("Soucre IP:%d.%d.%d.%d\n",
arpheader->spa[], arpheader->spa[],
arpheader->spa[], arpheader->spa[]);
printf("\nDestination MAC:%02x:%02x:%02X:%02x:%02x:%02x\n",
arpheader->tha[], arpheader->tha[],
arpheader->tha[], arpheader->tha[],
arpheader->tha[], arpheader->tha[]);
printf("Destination IP:%d.%d.%d.%d\n",
arpheader->tpa[], arpheader->tpa[],
arpheader->tpa[], arpheader->tpa[]);
}
}
return ;
}
下面是运行结果:
[root@localhost pcap_arp]# ./pcap enp0s3 ------------- ARP --------------
Received Packet Size: bytes
Hardware type: Ethernet
Ptotocol type: IPv4
Operation : ARP_REQUEST Soucre MAC:b0::FE::5a:5b
Soucre IP:192.168.16.139 Destination MAC:::::e7:
Destination IP:192.168.16.125 ------------- ARP --------------
Received Packet Size: bytes
Hardware type: Ethernet
Ptotocol type: IPv4
Operation : ARP_REPLY Soucre MAC:::::e7:
Soucre IP:192.168.16.125 Destination MAC:b0::FE::5a:5b
Destination IP:192.168.16.139
Makefile:
#
#design of ARP sniffer
# CFLAGS = -g
LDFLAGS = -lpcap OBJS = test.o
TARGET = pcap RM = rm -f $(TARGET):$(OBJS)
$(CC) $(LDFLAGS) -o $@ $^ %.o:%.c
$(CC) $(CFLAGS) -c -o $@ $< .PHONY:clean clean:
$(RM) $(TARGET) $(OBJS)
使用libpcap过滤arp的更多相关文章
- 基于ARP的局域网IP劫持——C语言实现
我站在 烈烈风中 恨不能 荡尽绵绵心痛 望苍天 四方云动 剑在手 问天下谁是英雄 ——<霸王别姬> 阅读这篇文章之前,请确认已经熟悉ARP报文伪造的方法,可参考< ...
- Python黑帽编程 3.2 ARP监控
Python黑帽编程 3.2 ARP监控 在第3.1节<ARP欺骗>中,我们学习了ARP的基本原理,使用Python实现了我们自己的ARP欺骗工具.在上一节的基础上,我们来实现一个ARP监 ...
- Python黑客编程ARP欺骗
Python灰帽编程 3.1 ARP欺骗 ARP欺骗是一种在局域网中常用的攻击手段,目的是让局域网中指定的(或全部)的目标机器的数据包都通过攻击者主机进行转发,是实现中间人攻击的常用手段,从而实现数据 ...
- 图解ARP协议(三)ARP防御篇-如何揪出“内鬼”并“优雅的还手”
一.ARP防御概述 通过之前的文章,我们已经了解了ARP攻击的危害,黑客采用ARP软件进行扫描并发送欺骗应答,同处一个局域网的普通用户就可能遭受断网攻击.流量被限.账号被窃的危险.由于攻击门槛非常低, ...
- Wireshark命令行工具tshark
Wireshark命令行工具tshark 1.目的 写这篇博客的目的主要是为了方便查阅,使用wireshark可以分析数据包,可以通过编辑过滤表达式来达到对数据的分析:但我的需求是,怎么样把Data部 ...
- iptables命令、规则、参数详解
表 (table)包含4个表:4个表的优先级由高到低:raw-->mangle-->nat-->filterraw---RAW表只使用在PREROUTING链和OUTPUT链上 ...
- Wireshark命令行工具tshark详解(含例子)-01
Wireshark命令行工具tshark使用小记 1.目的 写这篇博客的目的主要是为了方便查阅,使用wireshark可以分析数据包,可以通过编辑过滤表达式来达到对数据的分析:但我的需求是,怎么样把D ...
- TCP/IP详解卷1 - wireshark抓包分析
TCP/IP详解卷1 - 系列文 TCP/IP详解卷1 - 思维导图(1) TCP/IP详解卷1 - wireshark抓包分析 引言 在初学TCP/IP协议时,会觉得协议是一种很抽象的东西,通过wi ...
- 结合Wireshark捕获分组深入理解TCP/IP协议栈
摘要: 本文剖析了浏览器输入URL到整个页面显示的整个过程,以百度首页为例,结合Wireshark俘获分组进行详细分析整个过程,从而更好地了解TCP/IP协议栈. 一.俘获分组 1.1 准 ...
随机推荐
- android Gradle的几个基本概念
什么是Gradle? Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言. Gr ...
- Android实训案例(七)——四大组件之一Service初步了解,实现通话录音功能,抽调接口
Service Service的神奇之处,在于他不需要界面,一切的操作都在后台操作,所以很多全局性(手机助手,语音助手)之类的应用很长需要这个,我们今天也来玩玩 我们新建一个工程--ServiceDe ...
- CCT之CAMERA TUNNING调试学习总结
原创链接:点击打开链接 对于MT6589平台camera调试的学习总结,camera调试学习的是对于raw类sensor的调试,对于yuv格式的sensor是由FAE帮助我们调试的. 首先在调试一个c ...
- Android监听电池状态
监听电池状态只需要接收Intent.ACTION_BATTERY_CHANGED的广播即可,当电池状态发生变化时会发出广播. 1.运行状态如下图: (1)连接USB时的状态 (2)断开USB时的状态 ...
- ExtJS:文件上传实例
ExtJS:文件上传实例 var ext_dateFormat = 'Y-m-d H:i:s'; var dateFormat = 'yyyy-MM-dd HH:mm:ss'; var date = ...
- PhotoShop 图像处理 算法 汇总
不定期更新 ...... 直接点标题即可链接到原文. OpenCV 版:OpenCV 图像处理 图层混合算法: PS图层混合算法之一(不透明度,正片叠底,颜色加深,颜色减淡)PS图层混合算法之二(线性 ...
- Boyer-Moore算法
1.概述 在用于查找子字符串的算法当中,BM(Boyer-Moore)算法是目前相当有效又容易理解的一种,一般情况下,比KMP算法快3-5倍. BM算法在移动模式串的时候是从左到右,而进行比较的时候是 ...
- obj-c编程06:反射与元编程初步
我们知道对于现如今的动态语言比如ruby而言,反射和元编程以及支持的非常灵活了,你完全可以跳过常规的手段,而利用反射来查询或调用对象的私有方法.而obj-c对反射的支持略显小繁琐,而且在开了ARC后同 ...
- git使用中checkout生成临时br的问题(吓出一身冷汗啊)
git中几天前漫不经心的使用了git checkout ver_hash的命令,结果push到远程库都提示everything is up-to-date,实际神马都没提交上去啊!但看本地log中的确 ...
- 前端技术之_CSS详解第六天--完结
前端技术之_CSS详解第六天--完结 一.复习第五天的知识 a标签的伪类4个: a:link 没有被点击过的链接 a:visited 访问过的链接 a:hover 悬停 a:active 按下鼠标不松 ...