网络抓包以及进行简单数据分析

  经过了好几天的网络编程学习,熟悉了套接字的使用,今天需要我们做的是:实现简单的抓包软件并且对数据进行简单分析,实现校验和使用的回滚算法的编写:

  下面是简单的抓包软件及分析数据的代码,通过这个程序,我们可以更深层次的了解网络的运行机制,以及数据是怎样在网络中进行传送:

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <sys/socket.h>
  4 #include <netinet/in.h>
  5 #include <linux/ip.h>
  6 #include <linux/udp.h>
  7 #include <linux/if_ether.h>
  8
  9 void show_mac(unsigned char *data);
 10 void show_ip(unsigned char *data);
 11 void show_udp(unsigned char *data);
 12 void show_app(unsigned char *data);
 13
 14 int main()
 15 {
 16     /*接收所有经过该网卡的包*/
 17     int fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
 18     if(fd < 0) {
 19         perror("socket");
 20         return 1;
 21     }
 22
 23     int ret = 0;
 24     int i = 0;
 25     unsigned char buff[1024] = {0};
 26     while(1) {
 27         memset(buff, 0, 1024);
 28         ret = read(fd, buff, 1024);//将接收的包存在数组里面
 29         printf("%d\n", strlen(buff));
 30         if(ret < 0) {
 31             perror("read");
 32             continue;
 33         }
 34     if(ret < 42) {//不处理错误的包
 35         continue;
 36     }
 37     printf("socrce ip is:\t %x\t%x\t%x\t%x\n",
 38             buff[14 + 12], buff[14 + 13],
 39             buff[14 + 14], buff[14 + 15]);
 40     printf("dest ip is:\t %x\t%x\t%x\t%x\n",
 41             buff[14 + 16], buff[14 + 17],
 42             buff[14 + 18], buff[14 + 19]);
 43
 44     if(buff[14 + 19] != 102) {//只处理发给本机的包
 45         continue;
 46     }
 47
 48     for(i = 0; i < ret; i++) {
 49         printf("%x\t", buff[i]);
 50         if(i % 8 == 0) {
 51             printf("\n");
 52         }
 53     }
 54     printf("\n\n\n");
 55     show_mac(buff);
 56     break;
 57
 58     }
 59
 60     return 0;
 61 }
 62
 63 void show_mac(unsigned char *data)
 64 {
 65     printf("----------------eth--------------------\n");
 66     struct ethhdr *eth = (struct ethhdr *)data;
 67     printf("destination eth addr: %x:%x:%x:%x:%x:%x\n",
 68         eth->h_dest[0], eth->h_dest[1],
 69         eth->h_dest[2], eth->h_dest[3],
 70         eth->h_dest[4], eth->h_dest[5]);
 71     printf("source eth addr: %x:%x:%x:%x:%x:%x\n",
 72         eth->h_source[0], eth->h_source[1],
 73         eth->h_source[2], eth->h_source[3],
 74         eth->h_source[4], eth->h_source[5]);
 75     printf("protocol is: %04x\n", ntohs(eth->h_proto));
 76     if(ntohs(eth->h_proto) == 0x0800) {
 77         show_ip(data + sizeof(struct ethhdr));
 78     }
 79     else {
 80         printf("unkonw mac protocol\n");
 81     }
 82
 83 }
 84
 85 void show_ip(unsigned char *data)
 86 {
 87     printf("----------------ip--------------------\n");
 88     struct iphdr *ip = (struct iphdr *)data;
 89     printf("version is %d\n", ip->version);
 90     printf("head len is %d\n", ip->ihl * 4);
 91     printf("total len is %d\n", ntohs(ip->tot_len));
 92     printf("ttl is %d\n", ip->ttl);
 93     printf("protocol is %d\n", ip->protocol);
 94     printf("check is %x\n", ip->check);
 95     printf("saddr is %s\n", inet_ntoa(ip->saddr));
 96     printf("daddr is %s\n", inet_ntoa(ip->daddr));
 97     if(ip->protocol == 17) {
 98         show_udp(data + sizeof(struct iphdr));
 99     }
100     else {
101         printf("unkown ip procotol\n");
102     }
103
104 }
105
106 void show_udp(unsigned char *data)
107 {
108     printf("----------------udp--------------------\n");
109     struct udphdr *udp = (struct udphdr *)data;
110     printf("source port %d\n", htons(udp->source));
111     printf("dest port %d\n", htons(udp->dest));
112     printf("udp len %d\n", htons(udp->len));
113     printf("check %x\n", htons(udp->check));
114
115     show_app(data + sizeof(struct udphdr));
116 }
117
118 void show_app(unsigned char *data)
119 {
120     printf("data is %s\n", data);
121 }

  下面是校验和回滚算法的代码:

 1 #include <stdio.h>
 2 #include <linux/if_ether.h>
 3
 4 unsigned short check_sum(unsigned char *data, int len);
 5
 6 int main()
 7 {
 8     //7af7
 9     unsigned char data[1024] = {
10     0x45, 0x00,
11     0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
12     0x00, 0x00, 0xc0, 0xa8, 0x1f, 0x44, 0xc0, 0xa8,
13     0x1f, 0x41
14     };
15
16     printf("check sum is %x\n", check_sum(data, 20));
17 }
18
19 unsigned short check_sum(unsigned char *data, int len)
20 {
21     unsigned long sum = 0;
22     unsigned long ret = 0;
23     unsigned short *tmp = (unsigned short *)data;
24     unsigned short buff[1024] = {0};
25
26     //以两字节为单位反复累加
27     while(len > 1) {
28         sum = sum +  *tmp++;
29         len = len - 2;
30     }
31
32     //如果是单数,加最后一个
33     if(len) {
34         sum = sum + *tmp;
35     }
36
37     //将累加和的高位与低位相加,直至高位为0(回滚)
38     ret = (sum & 0x00ff0000) >> 16;
39     if(ret != 0) {
40         sum = sum + ret;
41            ret = (sum & 0x00ff0000) >> 16;
42     }
43
44     return ntohs(~sum);
45 }
时间: 2024-08-02 22:41:53

网络抓包以及进行简单数据分析的相关文章

iOS系统网络抓包方法

在进行iOS开发过程中,经常会遇到各种各样的网络访问问题,以前苦于没有抓包工具,很多网络问题解决起来很痛苦.现在终于好了,本文提供两种方式进行网络抓包: 1. 网络共享 + 可视化抓包工具 基本原理 原理比较简单,ios设备通过代理方式共享连接mac电脑的无线网卡,使用抓包工具抓包,然后进行分析(我们推荐使用Wireshark,在MAC系统上也可以使用Paros工具). 现在以MAC系统下Paros工具为例,详细描述下抓包过程: 操作步骤 1)  首先将MAC电脑的以太网共享给airport,使

工欲善其事,必先利其器 – 网络抓包

抓包(packet capture)就是将网络传输发送与接收的数据包进行截获.分析,甚至可以用来转发,重传等等,抓包可使用的场景很多,排错.验证.测试.核对等,我就举几个例子来说明吧. 场景一.在一台存储上启用了SNMP服务,随后想通过验证UDP161/162的侦听状态来确认服务是否确实启动了. 详情:最简单的方式就是用进入存储的OS运行类似netstat –anop查看UDP端口状态,还有些同学会条件反射的说telnet一下呗或者用nmap的工具做端口扫描,但是最后发现结果是Open | Fi

python编写网络抓包分析脚本

python编写网络抓包分析脚本 写网络抓包分析脚本,一个称手的sniffer工具是必不可少的,我习惯用Ethereal,简单,易用,基于winpcap的一个开源的软件 Ethereal自带许多协议的 decoder,但是它的架构并不灵活,如果你要加入一个自己定义的的解码器,得去修改Ethereal的代码,再重新编译,相当的烦琐 对于一般的明文协议,没有什么问题,但是对于加密协议,比如网络游戏,客户端程序一般会在刚连接上的时候,发送一个随机密钥,而后的报文都会用这个密钥进 行加密,诸如此类.要想

网络抓包工具Charles的介绍与使用

在复杂的App开发过程中,我们会涉及各种复杂的网络操作,各种API的调用和数据接收.如果我们只是通过控制台来查看网络的输入输出,就会非常麻烦.在Mac上有一款非常优秀的网络抓包工具--Charles,在iOS开发中也是常常用到.今天我们就来介绍如何安装使用Charles.关于Charles安装包.破解包和证书我已经上传至网盘:http://pan.baidu.com/s/1numMoTr    .大家可以下载直接安装.操作步骤如下: (1)直接安装dmg文件,安装过程很简单,就不赘述了.由于Ch

iOS系统设备网络抓包工具介绍:越狱和不越狱的办法

对终端进行抓包是客户端测试中的一种重要手段.本文主要介绍了ios设备(iphone.ipad和ipodtouch)的几种常用的抓包方法. 一.准备条件 需要进行抓包的设备必须经过root,俗称越狱,主要利用redsn0w和各种iOSFirmwares进行,如越狱不用更换固件版本,只需使用 redsn0w安装Cydia即可,网上有详细教程,此处省略.安装完毕,在3G或WiFi环境下启动Cydia,确认身份为“开发者”,如下图. 通过Cydia源,用户可以下载和安装比appstore更高权限的软件,

网络抓包工具 Fiddler

网络抓包工具 Fiddler 下载网址 http://www.telerik.com/fiddler 简单介绍 Fiddler是一个http协议调试代理工具,它能够记录并检查全部你的电脑和互联网之间的http通讯,设置断点.查看全部的"进出"Fiddler的数据(指cookie,html,js,css等文件,这些都能够让你胡乱改动的意思). Fiddler 要比其它的网络调试器要更加简单.由于它不只暴露http通讯还提供了一个用户友好的格式. 能够在调试HTTP中使用.也能够用来进行爬

MAC下最好用的抓包工具charles简单操作教程,charles mac入门

Charles for Ma是 mac 平台上一款非常强大的抓包神器,可以让开发者监视查看所有连接互联网的 HTTP 通信,包括请求,响应和 HTTP 头信息等等,charles mac让您的 Internet 连接调试任务更加快速和轻松!今天小编给大家带来了charles简单操作教程,算是charles mac入门吧,感兴趣的可以来看看! 1.抓浏览器网页请求 其实浏览器的请求一般用浏览器的开发者工具就可以,当然charles也可以做到,使用方法呢,也很简单 将你链接的网络,配置网页代理,注意

HttpWatch网络抓包工具的使用

HttpWatch网络抓包工具是专为IE浏览器集成的一款网络拽包工具. 是一款强大的网页数据分析软件,是最好用的抓包工具,httpwatch可以抓到上传视屏图片的包,一般的抓包软件是抓不到的.打开IE浏览器,选择工具“再选择“HttpWatch Professional”即可.建议用专业版进行网络数据抓取. 网络爬虫是捜索引擎抓取系统的重要组成部分.爬虫技术可以应用在很多方面,当然是好的方面.用HttpWatch结合网络爬虫技术就可以很轻松的实现网络数据的抓取. 然后实现一些应用. (1)下载H

网络抓包指南

网络抓包指南 1.交换机配置流量镜像接口 1.1登录交换机备份相关配置,执行以下操作 mirroring-group 2 mirroring-port GigabitEthernet 1/0/4 to GigabitEthernet 1/0/14 GigabitEthernet 1/0/18 to GigabitEthernet 1/0/21 both mirroring-group 2 monitor-port GigabitEthernet 1/0/17 quit save ### Giga