- 论坛徽章:
- 0
|
我看到了两篇文章:
http://blog.chinaunix.net/space. ... =blog&id=142804
http://blog.chinaunix.net/space. ... og&cuid=1895542
这个链接里面都有。
这个程序抓包打印后的结果是错误的,可是我不知道错在哪里了。
程序清单:- /*
- * Low level network programming in Linux using PF_PACKET
- * Need root privileges
- */
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <sys/errno.h>
- #include <sys/socket.h>
- #include <sys/ioctl.h>
- #include <netinet/ip.h>
- #include <arpa/inet.h>
- #include <linux/if_arp.h> //#include <linux/if_ether.h> //#include <linux/if_packet.h>
- #include <unistd.h>
- #define RED "\e[31m\e[1m"
- #define GREEN "\E[32m\E[1m"
- #define YELLOW "\E[33m\E[1m"
- #define BLUE "\E[34m\E[1m"
- #define NORMAL "\e[m"
- int get_nic_index(int fd, const char* nic_name)
- {
- struct ifreq ifr;
- if (nic_name == NULL)
- return -1;
- memset(&ifr, 0, sizeof(ifr));
- strncpy(ifr.ifr_name, nic_name, IFNAMSIZ);
- if (ioctl(fd, SIOCGIFINDEX, &ifr) == -1) {
- perror(GREEN"SIOCGIFINDEX ioctl error"NORMAL);
- return -1;
- }
- return ifr.ifr_ifindex;
- }
- int set_Iface_promisc(int fd, int dev_id)
- {
- struct packet_mreq mr;
- memset(&mr, 0, sizeof(mr));
- mr.mr_ifindex = dev_id;
- mr.mr_type = PACKET_MR_PROMISC;
- if (setsockopt(fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP,&mr,sizeof(mr))==-1) {
- return -1;
- }
- return 0;
- }
- int set_nic_promisc(int sockfd, const char *nic_name)
- {
- struct ifreq ethreq;
- strncpy(ethreq.ifr_name, nic_name, IFNAMSIZ);
- ioctl(sockfd, SIOCGIFFLAGS, ðreq);
- ethreq.ifr_flags |= IFF_PROMISC;
- ioctl(sockfd, SIOCSIFFLAGS, ðreq);
- return 0;
- }
- int main(int argc, char **argv)
- {
- if (argc != 3) {
- printf("usage: ./a.out <nic_name> <packets num to be capture>\n");
- exit(1);
- }
- int pktfd;
- int maxpak = 0, ipak = 0;
- int fromlen;
- char buffer[BUFSIZ];
- struct iphdr *iph;
- struct sockaddr_ll sll;
- /* Low level socket */
- pktfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
- if (pktfd == -1) {
- perror(RED"Unable to create low level socket"NORMAL);
- return -1;
- }
- memset(&sll, 0, sizeof(sll));
- sll.sll_family = AF_PACKET;
- sll.sll_protocol = htons(ETH_P_ALL);
- sll.sll_ifindex = get_nic_index(pktfd, argv[1]);
- if (bind(pktfd, (struct sockaddr *) &sll, sizeof(sll)) != 0) {
- perror(YELLOW"bind error"NORMAL);
- goto FAIL;
- }
- set_nic_promisc(pktfd, argv[1]);
- //if (set_Iface_promisc(pktfd, sll.sll_ifindex) == -1) {
- // fprintf(stderr, BLUE"set promisc failed! \n"NORMAL);
- // goto FAIL;
- //}
- maxpak = atoi(argv[2]);
- while (!maxpak || ipak < maxpak) {
- fromlen = recv(pktfd, buffer, BUFSIZ, MSG_TRUNC);
- printf("Buffer Length: %d bytes\n", fromlen);
- iph = (struct iphdr *) (buffer + sizeof(struct ethhdr));
- printf("IP Packet from: %s\n", inet_ntoa(*(struct in_addr*)&iph->saddr));
- printf("IP Packet To: %s\n", inet_ntoa(*(struct in_addr*)&iph->daddr));
- printf("IP Protocol: %#x\n", iph->protocol);
- printf("Buffer Content: %s\n\n", buffer);
- ipak++;
- }
- return 0;
- FAIL:
- close(pktfd);
- return -1;
- }
复制代码 执行:
./a.out ppp0 20
然后我在浏览器里面刷新了bbs.chinaunix.net,得到的结果这个无论从IP地址还是Protocol(6, 17)看来都是明显错误的。希望有牛人可以帮忙看看,因为我读手册(man packet)发现好像貌似没有什么问题。
谢谢了。 |
|