使用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 准 ...
随机推荐
- React Native开发必备的10个插件包
Sublime Text 具有漂亮的用户界面和强大的功能,例如代码缩略图,多重选择,快捷命令等.Sublime Text 更妙的是它的可扩展性.所以,这里挑选了全栈开发必备的10款 Sublime T ...
- 【Qt编程】基于Qt的词典开发系列<六>--界面美化设计
本文讲一讲界面设计,作品要面向用户,界面设计的好坏直接影响到用户的体验.现在的窗口设计基本都是扁平化的,你可以从window XP与window 8的窗口可以明显感觉出来.当然除了窗口本身的效果,窗口 ...
- UE4 动画系统
1. 准备一套带动作的模型,并导入UE4 2. 新建一个动画蓝图,右键->Animation->AnimationBlueprint,选择继承AnimationInst ...
- SQL-Teradata基础
1.创建一个和表 pnr_1 结构一样的表 Create table pnr_2 as pnr_1 with no data 不含数据 Create table pnr_2 as pnr_1 wit ...
- 【LaTeX排版】LaTeX使用--入门基础<一>
经过两个多星期,毕业论文终于写完了.由于自己对Word软件并不是很熟悉,再加上在数模时见识过LaTex的强大之处,于是就决定用LaTex进行论文的排版.使用LaTex可以避免像Word那样换台机器而出 ...
- Netfilter的使用和实现
本文主要内容:Netfilter的原理和实现浅析,以及示例模块. 内核版本:2.6.37 Author:zhangskd @ csdn blog 概述 Netfilter为多种网络协议(IPv4.IP ...
- C语言笔试经典--求分数数列的和
题目: 求数组的和 2 3/2 5/3 8/5 13/8 21/13 ... 求前20项的和 //求分数数列的和 #include<stdio.h> // ...
- Idea(一) 安装与破解
现在idea横行的时代,没用过idea都不好意思了,于是乎,我也下载感受下. 下载安装包和破解地址: 链接: https://pan.baidu.com/s/16OeiDw942JaPXKtc9Oz1 ...
- 【程序员札记#学习&&塑形# 】2018年5月04号
回顾 工作:pendding 学习:看算法导论第一章,leetcode还在做(本身翻译错误,被误导了). 体会: 1) 浩俊之前推荐让我看的<算法导论>,昨天再回过头看,里面很多确 ...
- 《MySQL必知必会》读书笔记_4
PS:一个实际的存储过程案例 CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_delete_article_by_id`(IN `id` int) BE ...