linux 原始套接字 绑定网卡,Linux网络数据捕获之原始套接字
处于一些目的,有时需要对到达网口的所有网络数据进行捕获,系统也提供了这样的接口,稍微懂网络编程的都知道SOCK_DGRAM、SOCK_STREAM,差不多就UDP、TCP之类的吧。但是还有一个很少用的叫SOCK_RAW,原始套接字,使用它你可以捕获网卡上的所有网络数据,当然这需要超级用户权限。贴个列子吧,网上摘的,具体出处忘了
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include /* the L2 protocols */
#include
#include
#include
#define BUFFER_MAX 2048
int main(int argc, char *argv[])
{
int sock, n_read;
char buffer[BUFFER_MAX];
struct sockaddr_ll sll;
struct ifreq ifstruct;
if((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0)
{
perror( "create socket error");
return -1;
}
memset(&sll, 0, sizeof(sll));
sll.sll_family = PF_PACKET;
sll.sll_protocol = htons(ETH_P_ALL);
//get net card index ethx->index
strcpy(ifstruct.ifr_name, "eth0");
ioctl(sock, SIOCGIFINDEX, &ifstruct);
sll.sll_ifindex = ifstruct.ifr_ifindex;
//bind net card
if (bind(sock, (struct sockaddr *)&sll, sizeof(sll)) == -1)
{
perror("bind error:\n");
return -1;
}
while(1)
{
n_read = recvfrom(sock, buffer, 2048, 0, NULL, NULL);
if(n_read <= 0)
{
perror("recvfrom\n");
return -1;
}
//process packet
}
return 0;
}
其实原始套接字不仅可以捕获数据,也可以发送数据,而且是任意格式的数据,从MAC头到IP头之类的数据段都在自己的控制范围之内,什么ARP攻击、
DDoS攻击之类的都离不开原始套接字吧,不过这些封包是重点,这里篇幅有限不涉及封包了吧,只介绍如何将数据发出去
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include /* the L2 protocols */
#include
#include
#include
#define BUFFER_MAX 2048
int main(int argc, char *argv[])
{
int sockfd;
int n_write;
int n_res;
struct sockaddr_ll sll;
struct ifreq ifstruct;
char buffer[BUFFER_MAX];
char MAC_BUFFER[ETH_ALEN]= {0x00,0x18,0x82,0xab,0xd2,0xf9};
char TYPE_BUFFER[2] = {0x88,0x66};
if((sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0)
{
perror("create socket error:");
return -1;
}
n_res = 0;
n_write = 0;
memset(&sll, 0, sizeof(sll));
sll.sll_family = PF_PACKET;
sll.sll_protocol = htons(ETH_P_ALL);
//get netcard interface index ethx->ifindex
strcpy(ifstruct.ifr_name, "eth0");
ioctl(sockfd, SIOCGIFINDEX, &ifstruct);
sll.sll_ifindex = ifstruct.ifr_ifindex;
//get the local netcard mac
strcpy(ifstruct.ifr_name, "eth0");
ioctl(sockfd, SIOCGIFHWADDR, &ifstruct);
memcpy(sll.sll_addr, ifstruct.ifr_ifru.ifru_hwaddr.sa_data, ETH_ALEN);
sll.sll_halen = ETH_ALEN;
//bind the netcard
if(bind(sockfd, (struct sockaddr *)&sll, sizeof(sll)) == -1)
{
perror("bind error:");
return -1;
}
//get the netcard work mode
memset(&ifstruct, 0, sizeof(ifstruct));
strcpy(ifstruct.ifr_name, "eth0");
if(ioctl(sockfd, SIOCGIFFLAGS, &ifstruct) == -1)
{
perror("iotcl error:");
return -1;
}
//set the netcard work mode
ifstruct.ifr_flags |= IFF_PROMISC;
if(ioctl(sockfd, SIOCSIFFLAGS, &ifstruct) == -1)
{
perror("iotcl()\n");
printf("Fun:%s Line:%d\n", __func__, __LINE__);
return -1;
}
memcpy(buffer,MAC_BUFFER,ETH_ALEN);
memcpy(buffer+6,sll.sll_addr,ETH_ALEN);
memcpy(buffer+12,TYPE_BUFFER,2);
while(1)
{
n_res = sendto(sockfd, buffer, 1024,
0, (struct sockaddr *)&sll, sizeof(sll));
if(n_res < 0)
{
perror("sendto error:");
return -1;
}
n_write += n_res;
if(n_write >= 2048 * 2560)
{
break;
}
}
return 0;
}
linux 原始套接字 绑定网卡,Linux网络数据捕获之原始套接字相关推荐
- linux 原始套接字 绑定网卡,Linux原始套接字实现分析
之所以要转这篇文章,是因为这篇文章是我看到的同类博客中写得最好的,但非常可惜,这篇博客中只有一篇文章,没有什么收藏价值,故将其原文转载,以供今后学习查阅. 本文从IPV4协议栈原始套接字的分类入手,详 ...
- linux拦截raw_socket原始套接字数据包的网络数据拦截方法
前言 最近一直在寻找能拦截linux原始套接字数据包的方法,煞费苦心,终于功夫不负有心人,找到了一种方法可以实现,将这种方法分享给大家. 一.环境介绍 本次试验是基于CentOS7.6.1810,内核 ...
- linux启用NAT功能,双网卡共享网络,iptables简单实现
最近在研究linux双网卡共享网络的情况 简单来说就是一台linux有两块网卡,比如eth0及eth1,eth0可以正常连接外网,eth1连接内部网络,那么可以通过iptables实现eth1内部网络 ...
- ar8161网卡 linux,Qualcomm Atheros AR8161 Gigabit Ethernet网卡Linux下坏掉问题解决
我的戴尔(Dell)I2330R-168一体电脑的网卡在升级某个Linux内核版本后,网卡就用一会儿就坏了 ifconfig eth0 eth0: flags=4163 mtu 8192 inet ...
- linux如何查看有几个网卡,linux 查看有几块网卡
[ 引用 ifconfig -a 引用 cat /proc/net/dev [root@srmdr:/root]#ifconfig eth0 Link encap:Ethernet H ...
- linux接收网络数据并存存储,linux网络数据包数据结构 Socket Buffer
Linux网络核心数据结构是套接字缓存(socket buffer),简称skb.它代表一个要发送或处理的报文,并贯穿于整个协议栈.1.套接字缓存skb由两部分组成:(1)报文数据:它保存了实际在网络 ...
- Linux网络编程——端口复用(多个套接字绑定同一个端口)
在<绑定( bind )端口需要注意的问题>提到:一个网络应用程序只能绑定一个端口( 一个套接字只能绑定一个端口 ). 实际上,默认的情况下,如果一个网络应用程序的一个套接字 绑定了一个端 ...
- linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析
2016.7.4 今天晚上对项目顶层文件(daemon)进行了分析,对其中的TCP连接进行具体的代码级分析. 1.需求分析 首先得知道我们这里为什么要用TCP连接,我们的整个测试系统是由上位机作为客户 ...
- linux 服务器间通信,Linux 下的进程间通信:套接字和信号 | Linux 中国
原标题:Linux 下的进程间通信:套接字和信号 | Linux 中国 学习在 Linux 中进程是如何与其他进程进行同步的. -- Marty Kalin 本篇是 Linux 下(IPC)系列的第三 ...
最新文章
- Matlab | Matlab从入门到放弃(13)——基于Matlab的非线性函数的运算
- 公路多孔箱涵设计_【公路常识中篇】公路路基边坡滑坡防护设计和预防
- springmvc 源码分析
- 4款.Net报表控件优势对比分析
- oracle kill行锁,Oracle kill 锁表
- 【机器学习-西瓜书】二、模型评估:过拟合;自助法;交叉验证法
- WinEdt LaTex(四)—— 自定义新命令(newcommand、def)
- 邮递员算法问题之c++实现
- 企业研究:赢在起跑线,首个10年便建起壁垒的新国都
- 根据出生年月日计算出生了多少年,多少月,多少天
- 多元线性回归分析spss结果解读_SPSS经典线性回归分析之一——线性回归分析
- 外贸人需要准备的浏览器插件有哪些?
- ADB卸载OPPO浏览器
- Discuz如何开发关注功能
- pytorch中的Variable还有必要使用吗?
- Pandas中的resample重采样函数
- Java访问获取LDAP用户信息
- 基于深度学习的弹道目标智能分类
- 华翼宽带android客户端,实地测试 看华翼宽带是否带宽缩水_网络设备评测-中关村在线...
- 河北专接本计算机各学校分数线,2018年河北省专接本各学校录取分数线录取率...