在Linux下如何利用C语言来实现一个Sniffer
应用程序从网络层抓包其实并不难!
Example 1.
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char **argv) {
int sock, n;
char buffer[2048];
unsigned char *iphead, *ethhead;
if ( (sock=socket(PF_PACKET, SOCK_RAW,
htons(ETH_P_IP)))0) {
perror(socket);
exit(1);
}
while (1) {
printf(----------n);
n = recvfrom(sock,buffer,2048,0,NULL,NULL);
printf(%d bytes readn,n);
/* Check to see if the packet contains at least
* complete Ethernet (14), IP (20) and TCP/UDP
* (8) headers.
*/
if (n42) {
perror(recvfrom():);
printf(Incomplete packet (errno is %d)n,
errno);
close(sock);
exit(0);
}
ethhead = buffer;
printf(Source MAC address:
%02x:%02x:%02x:%02x:%02x:%02xn,
ethhead[0],ethhead[1],ethhead[2],
ethhead[3],ethhead[4],ethhead[5]);
printf(Destination MAC address:
%02x:%02x:%02x:%02x:%02x:%02xn,
ethhead[6],ethhead[7],ethhead[8],
ethhead[9],ethhead[10],ethhead[11]);
iphead = buffer+14; /* Skip Ethernet header */
if (*iphead==0x45) { /* Double check for IPv4
* and no options present */
printf(Source host %d.%d.%d.%dn,
iphead[12],iphead[13],
iphead[14],iphead[15]);
printf(Dest host %d.%d.%d.%dn,
iphead[16],iphead[17],
iphead[18],iphead[19]);
printf(Source,Dest ports %d,%dn,
(iphead[20]8)+iphead[21],
(iphead[22]8)+iphead[23]);
printf(Layer-4 protocol %dn,iphead[9]);
}
}
}
PF_PACKET协议簇可以让一个应用程序把数据包变成似乎从网络层接收的样子,但是没有办法抓到那些不是发向自己主机的包。正如我们前面看到的,网卡丢弃所有不含有主机MAC地址的数据包,这是因为网卡处于非混杂模式,即每个网卡只处理源地址是它自己的帧!
只有三个例外:如果一个帧的目的MAC地址是一个受限的广播地址(255.255.255.255)那么它将被所有的网卡接收:如果一个帧的目的地址是组播地址,那么它将被那些打开组播接收功能的网卡所接收;网卡如被设置成混杂模式,那么它将接收所有流经它的数据包最后一种情况当然是我们最感兴趣的了,把网卡设置成混杂模式,我们只需要发出一个特殊的ioctl()调用在那个网卡上打开一个socket,因为这是一个具有危险性的操作,所以这个调用只有具有root权限的用户才可完成,假设那个“sock”包含一个已经打开的socket。
一个 Sniffer 实现 语言 如何 利用 Linux 相关文章:
- 关于spiflash存储器读写一个字节的问题方案(11-27)
- 第1节:单片机到底是学什么?我的两个比喻和一个规则(11-22)
- 汇编入门学习笔记 (三) —— 第一个程序(11-09)
- DIY一个MSP430F149最小系统的设计(07-22)
- 视频显示卡直接写屏的一个实例(09-14)
- 单片机c语言教程:建立你的第一个KeilC51项目(09-11)