博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用socket raw抓包
阅读量:4126 次
发布时间:2019-05-25

本文共 2074 字,大约阅读时间需要 6 分钟。

RAW SOCKET能够对较低层次的协议直接访问,网络监听技术很大程度上依赖于它。该文介绍了利用RAW SOCKET捕获网络底层数据包的步骤和方法

【原理】网卡对数据帧进行硬过滤(根据网卡的模式不同采取不同的操作,如果设置了混杂模式,则不做任何过滤直接交给下一层,否则非本机mac或者广播mac的会被直接丢弃)。在进入ip层之前,系统会检查系统中是否有通过socket(AP_PACKET,SOCK_RAW,…)创建的套接字,如果有并且协议相符,系统就给每个这样的socket接收缓冲区发送一个数据帧的拷贝。如果数据的校验和出错的话,内核直接丢弃该数据包,而不会拷贝给sock_raw的套接字。

创建套接字

发送接收ip数据包

socket(AF_INET, SOCK_RAW, IPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP)

发送接收以太网数据帧

socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))

使用SOCK_RAW发送接受的数据包含链路层的协议头。

设置网卡混杂模式

struct ifreq ifr;strcpy(ifr.ifr_name, "eth0");ifr.ifr_flags |= IFF_PROMISC;ioctl(sock, SIOCGIFFLAGS, ifr);

SIOCGIFFLAGS, SIOCSIFFLAGS 读取 或 设置 设备的 活动标志字

设备标志
IFF_UP 接口正在运行.
IFF_BROADCAST 有效的广播地址集.
IFF_DEBUG 内部调试标志.
IFF_LOOPBACK 这是自环接口.
IFF_POINTOPOINT 这是点到点的链路接口.
IFF_RUNNING 资源已分配.
IFF_NOARP 无arp协议, 没有设置第二层目的地址.
IFF_PROMISC 接口为杂凑(promiscuous)模式.
IFF_NOTRAILERS 避免使用trailer .
IFF_ALLMULTI 接收所有组播(multicast)报文.
IFF_MASTER 主负载平衡群(bundle).
IFF_SLAVE 从负载平衡群(bundle).
IFF_MULTICAST 支持组播(multicast).
IFF_PORTSEL 可以通过ifmap选择介质(media)类型.
IFF_AUTOMEDIA 自动选择介质.
IFF_DYNAMIC 接口关闭时丢弃地址.

抓包

recvfrom(sock, buffer, BUF_SIZE, 0, NULL, NULL)

最后两个参数置为NULL,表示不绑定地址,来了的数据包都接收

示例代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[]){ int socketfd; ssize_t recvlen; unsigned char buffer[1024]; socketfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); if (socketfd < 0) { print("sock create fail!\n"); return socketfd; } int id = 1; while (1) { recvlen = recvfrom(socketfd, buffer, sizeof(buffer), 0, NULL, NULL); if (recvlen < 42) { continue; } int i = 0; print("id: %d\n",id); for (i; i < sizeof(buffer); i++) { print(" %02x",buffer[i]); if ((i + 1) % 16 == 0) { print("\n"); } } id ++; print("\n\n"); }}

运行结果截图:

在这里插入图片描述

然后就可以根据ethernet,ip,tcp等各协议头部字段对报文进行解析,

例如:这个报文的前6个字节目的mac:
在这里插入图片描述
接下来的6个字节源mac:
在这里插入图片描述
再接下来的两个字节为3层协议类型:
在这里插入图片描述
0x0800 即 IP协议

以太网头部就解析完成,接下来的报文就是ip头部了,以此类推。

具体解析过程详情附代码可参照另一篇使用libpcap抓包文章。

https://blog.csdn.net/Sophisticated_/article/details/83339483

你可能感兴趣的文章
如何运行从网上下载的iWatch项目详细步骤.
查看>>
X-code7 beta error: warning: Is a directory
查看>>
Error: An App ID with identifier "*****" is not avaliable. Please enter a different string.
查看>>
X-code beta 开发iWatch项目,运行没有错误,但是某些操作一点就崩,而且找不错误的原因场景一
查看>>
Xcode 报错: Extra argument in call
查看>>
iTunes Connect 上传APP报错: Communication error. please use diagnostic mode to check connectivity.
查看>>
#import <Cocoa/Cocoa.h> 报错 Lexical or Preprocessor Issue 'Cocoa/Cocoa.h' file not found
查看>>
`MQTTClient (~> 0.2.6)` required by `Podfile`
查看>>
X-Code 报错 ld: library not found for -lAFNetworking
查看>>
Bitcode
查看>>
If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
查看>>
3.5 YOLO9000: Better,Faster,Stronger(YOLO9000:更好,更快,更强)
查看>>
iOS菜鸟学习--如何避免两个按钮同时响应
查看>>
How to access the keys in dictionary in object-c
查看>>
iOS菜鸟学习—— NSSortDescriptor的使用
查看>>
hdu 3787 hdoj 3787
查看>>
hdu 3790 hdoj 3790
查看>>
hdu 3789 hdoj 3789
查看>>
hdu 3788 hdoj 3788
查看>>
zju 1003 zoj 1003
查看>>