当前位置:首页 » 操作系统 » pcap源码

pcap源码

发布时间: 2022-06-16 11:30:32

① http协议解析 请求行的信息怎么提取 c语言源码

实现步骤:
1)用Wireshark软件抓包得到test.pcap文件
2)程序:分析pcap文件头 -> 分析pcap_pkt头 -> 分析帧头 -> 分析ip头 -> 分析tcp头 -> 分析http信息
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<time.h>
#define BUFSIZE 10240
#define STRSIZE 1024
typedef long bpf_int32;
typedef unsigned long bpf_u_int32;
typedef unsigned short u_short;
typedef unsigned long u_int32;
typedef unsigned short u_int16;
typedef unsigned char u_int8;
//pacp文件头结构体
struct pcap_file_header
{
bpf_u_int32 magic; /* 0xa1b2c3d4 */
u_short version_major; /* magjor Version 2 */
u_short version_minor; /* magjor Version 4 */
bpf_int32 thiszone; /* gmt to local correction */
bpf_u_int32 sigfigs; /* accuracy of timestamps */
bpf_u_int32 snaplen; /* max length saved portion of each pkt */
bpf_u_int32 linktype; /* data link type (LINKTYPE_*) */
};
//时间戳
struct time_val
{
long tv_sec; /* seconds 含义同 time_t 对象的值 */
long tv_usec; /* and microseconds */
};
//pcap数据包头结构体
struct pcap_pkthdr
{
struct time_val ts; /* time stamp */
bpf_u_int32 caplen; /* length of portion present */
bpf_u_int32 len; /* length this packet (off wire) */
};
//数据帧头
typedef struct FramHeader_t
{ //Pcap捕获的数据帧头
u_int8 DstMAC[6]; //目的MAC地址
u_int8 SrcMAC[6]; //源MAC地址
u_short FrameType; //帧类型
} FramHeader_t;
//IP数据报头
typedef struct IPHeader_t
{ //IP数据报头
u_int8 Ver_HLen; //版本+报头长度
u_int8 TOS; //服务类型
u_int16 TotalLen; //总长度
u_int16 ID; //标识
u_int16 Flag_Segment; //标志+片偏移
u_int8 TTL; //生存周期
u_int8 Protocol; //协议类型
u_int16 Checksum; //头部校验和
u_int32 SrcIP; //源IP地址
u_int32 DstIP; //目的IP地址
} IPHeader_t;
//TCP数据报头
typedef struct TCPHeader_t
{ //TCP数据报头
u_int16 SrcPort; //源端口
u_int16 DstPort; //目的端口
u_int32 SeqNO; //序号
u_int32 AckNO; //确认号
u_int8 HeaderLen; //数据报头的长度(4 bit) + 保留(4 bit)
u_int8 Flags; //标识TCP不同的控制消息
u_int16 Window; //窗口大小
u_int16 Checksum; //校验和
u_int16 UrgentPointer; //紧急指针
}TCPHeader_t;
//
void match_http(FILE *fp, char *head_str, char *tail_str, char *buf, int total_len); //查找 http 信息函数
//
int main()
{
struct pcap_file_header *file_header;
struct pcap_pkthdr *ptk_header;
IPHeader_t *ip_header;
TCPHeader_t *tcp_header;
FILE *fp, *output;
int pkt_offset, i=0;
int ip_len, http_len, ip_proto;
int src_port, dst_port, tcp_flags;
char buf[BUFSIZE], my_time[STRSIZE];
char src_ip[STRSIZE], dst_ip[STRSIZE];
char host[STRSIZE], uri[BUFSIZE];
//初始化
file_header = (struct pcap_file_header *)malloc(sizeof(struct pcap_file_header));
ptk_header = (struct pcap_pkthdr *)malloc(sizeof(struct pcap_pkthdr));
ip_header = (IPHeader_t *)malloc(sizeof(IPHeader_t));
tcp_header = (TCPHeader_t *)malloc(sizeof(TCPHeader_t));
memset(buf, 0, sizeof(buf));
//
if((fp = fopen(“test.pcap”,”r”)) == NULL)
{
printf(“error: can not open pcap file\n”);
exit(0);
}
if((output = fopen(“output.txt”,”w+”)) == NULL)
{
printf(“error: can not open output file\n”);
exit(0);
}
//开始读数据包
pkt_offset = 24; //pcap文件头结构 24个字节
while(fseek(fp, pkt_offset, SEEK_SET) == 0) //遍历数据包
{
i++;
//pcap_pkt_header 16 byte
if(fread(ptk_header, 16, 1, fp) != 1) //读pcap数据包头结构
{
printf(“\nread end of pcap file\n”);
break;
}
pkt_offset += 16 + ptk_header->caplen; //下一个数据包的偏移值
strftime(my_time, sizeof(my_time), “%Y-%m-%d %T”, localtime(&(ptk_header->ts.tv_sec))); //获取时间
// printf(“%d: %s\n”, i, my_time);
//数据帧头 14字节
fseek(fp, 14, SEEK_CUR); //忽略数据帧头
//IP数据报头 20字节
if(fread(ip_header, sizeof(IPHeader_t), 1, fp) != 1)
{
printf(“%d: can not read ip_header\n”, i);
break;
}
inet_ntop(AF_INET, (void *)&(ip_header->SrcIP), src_ip, 16);
inet_ntop(AF_INET, (void *)&(ip_header->DstIP), dst_ip, 16);
ip_proto = ip_header->Protocol;
ip_len = ip_header->TotalLen; //IP数据报总长度
// printf(“%d: src=%s\n”, i, src_ip);
if(ip_proto != 0×06) //判断是否是 TCP 协议
{
continue;
}
//TCP头 20字节
if(fread(tcp_header, sizeof(TCPHeader_t), 1, fp) != 1)
{
printf(“%d: can not read ip_header\n”, i);
break;
}
src_port = ntohs(tcp_header->SrcPort);
dst_port = ntohs(tcp_header->DstPort);
tcp_flags = tcp_header->Flags;
// printf(“%d: src=%x\n”, i, tcp_flags);
if(tcp_flags == 0×18) // (PSH, ACK) 3路握手成功后
{
if(dst_port == 80) // HTTP GET请求
{
http_len = ip_len – 40; //http 报文长度
match_http(fp, “Host: “, “\r\n”, host, http_len); //查找 host 值
match_http(fp, “GET “, “HTTP”, uri, http_len); //查找 uri 值
sprintf(buf, “%d: %s src=%s:%d dst=%s:%d %s%s\r\n”, i, my_time, src_ip, src_port, dst_ip, dst_port, host, uri);
//printf(“%s”, buf);
if(fwrite(buf, strlen(buf), 1, output) != 1)
{
printf(“output file can not write”);
break;
}
}
}
} // end while
fclose(fp);
fclose(output);
return 0;
}
//查找 HTTP 信息
void match_http(FILE *fp, char *head_str, char *tail_str, char *buf, int total_len)
{
int i;
int http_offset;
int head_len, tail_len, val_len;
char head_tmp[STRSIZE], tail_tmp[STRSIZE];
//初始化
memset(head_tmp, 0, sizeof(head_tmp));
memset(tail_tmp, 0, sizeof(tail_tmp));
head_len = strlen(head_str);
tail_len = strlen(tail_str);
//查找 head_str
http_offset = ftell(fp); //记录下HTTP报文初始文件偏移
while((head_tmp[0] = fgetc(fp)) != EOF) //逐个字节遍历
{
if((ftell(fp) – http_offset) > total_len) //遍历完成
{
sprintf(buf, “can not find %s \r\n”, head_str);
exit(0);
}
if(head_tmp[0] == *head_str) //匹配到第一个字符
{
for(i=1; i<head_len; i++) //匹配 head_str 的其他字符
{
head_tmp[i]=fgetc(fp);
if(head_tmp[i] != *(head_str+i))
break;
}
if(i == head_len) //匹配 head_str 成功,停止遍历
break;
}
}
// printf(“head_tmp=%s \n”, head_tmp);
//查找 tail_str
val_len = 0;
while((tail_tmp[0] = fgetc(fp)) != EOF) //遍历
{
if((ftell(fp) – http_offset) > total_len) //遍历完成
{
sprintf(buf, “can not find %s \r\n”, tail_str);
exit(0);
}
buf[val_len++] = tail_tmp[0]; //用buf 存储 value 直到查找到 tail_str
if(tail_tmp[0] == *tail_str) //匹配到第一个字符
{
for(i=1; i<tail_len; i++) //匹配 head_str 的其他字符
{
tail_tmp[i]=fgetc(fp);
if(tail_tmp[i] != *(tail_str+i))
break;
}
if(i == tail_len) //匹配 head_str 成功,停止遍历
{
buf[val_len-1] = 0; //清除多余的一个字符
break;
}
}
}
// printf(“val=%s\n”, buf);
fseek(fp, http_offset, SEEK_SET); //将文件指针 回到初始偏移
}

② pcap文件用什么软件查看。

pcap文件是wireshark配置脚本文件。可以用Wireshark软件打开。
下面是打开pcap文件的步骤:
1、Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。
2、网络封包分析软件的功能可想象成 "电工技师使用电表来量测电流、电压、电阻" 的工作 - 只是将场景移植到网络上,并将电线替换成网络线。
3、在过去,网络封包分析软件是非常昂贵,或是专门属于营利用的软件。Ethereal的出现改变了这一切。在GNUGPL通用许可证的保障范围底下,使用者可以以免费的代价取得软件与其源代码,并拥有针对其源代码修改及客制化的权利。Ethereal是目前全世界最广泛的网络封包分析软件之一。
备注:需要下载Wireshark软件才能打开。

③ C#.C/C++.net抓包抓网络协议包(WinPcap),该如何编写,求源码,求注释,求指教!

您好,要添加一个预处理定义,你需要打开Project菜单,选择Settings,然后选择C/C++选项卡,在General类下,你必须在Preprocessor
Definitions下的文本框中添加定义。

要在一个VC++6.0工程中,添加一,个新的库,你必须打开Project菜单,选择Settings,然后选择Link选项卡,然后把新库的名字添加到Object/Library
moles下的文本框中

要向VC++6.0中添加一个新的库所在的路径,你必须打开Tool菜单,选择Options,然后选择Directories选项卡,在Show
directories下拉框中选择Library
files,并且将新的路径添加到Directories中去

要向VC++6.0中添加一个新的包含文件所在的路径,你必须打开Tool菜单,选择Options,然后选择Directories选项卡,在Show
directories下拉框中选择Include
files,并且将新的路径添加到Directories中去

范例程序

我们一共了一些范例程序来显示WinPcap API的用法。这些程序的源代码,以及编译运行这些代码所需的所有文件,都可以在 Developer's
Pack找到。作为教程,在这里,我们提供了浏览器式的代码:这样,在每个函数和变量之间的跳转会比较方便。更多完整的范例程序,请参阅 WinPcap
教程.

// NOTE: remember to include WPCAP and HAVE_REMOTE among
your preprocessor
definitions.
(工程->设置->c/c++->预处理程序定义
中添加WPCAP和HAVE_REMOTE)

如果连接有问题,把lib复制到工程目录下用下面方法:
#pragma
comment(lib,"wpcap.lib")
#pragma comment(lib,"packet.lib")

④ 求助python pcap模块问题

这个东西可能是两个原因。一个就是少安装了pcap对应的驱动程序,第二个可能是操作系统版本问题。 你可以在一个xp操作系统上试验。 另外pcap应该有新版本。支持python2.7的。如果没有自己下源码编译一下。 不过,还是建议你用linux来做试验。这样

⑤ linux下使用libpcap进行数据捕获,能够将捕获到的数据包保存为pcap文件

libpcap和winpcap最大的不同就是 内核缓冲区,用户缓冲区等都不能设置,没有提供这样的函数,要编译libpcap源码。
另外,linux Fedora 下使用libpcap时,找不到pcap.h,查找发现安装了libpcap的库但是没有头文件。解决办法是:
1.如何查看是否安装libpcap? #rpm -aq libpcap
2.查找libpcap源,yum search pcap
3.安装libpcap, yum install libpcap-devel.i386

⑥ 哪里可以下载到支持python2.7的pcapy呢望山下载的都是支持python2.5的。跪求支持python2.7的pcapy。

1.用google搜:
Pcapy - Corelabs site
可以找到该网页。
2.去下载里面的zip的源码包,比如
pcapy-0.10.8.zip
3.然后解压,运行cmd,手动执行:
setup.py install
4。如果不会安装,那么参考:
【总结】Python安装第三方的库、package的方法

(此处不给贴地址,请自己用google搜帖子标题,即可找到帖子地址)

⑦ 如何通过源码安装升级libpcap

安装libcap开发包后,再试试看 sudo apt-get install libpcap-dev sudo apt-get install libnids-dev sudo apt-get install libnet1-dev

⑧ ubuntu下没有没有pcap.h头文件,怎么办

今天在ubuntu下进行安装wireshark,费了很多时间,过程中出了很多错误,但最终安装成功了,这里写下自己的安装步骤和方法,供大家参考。
安装编译工具:
$sudo apt-get install build-essential
为了成功编译Wireshark,您需要安装GTK+的开发文件和GLib库(libraries)。
$sudo apt-get install libgtk2.0-dev libglib2.0-dev
安装Checkinstall以便管理您系统中直接由源代码编译安装的软件。
$sudo apt-get install checkinstall
wireshark源码 (页面中的source code)
下载后的文件名:wireshark-1.2.2.tar.bz2
cd到文件目录解压:$tar -xvf wireshark-1.2.2.tar.bz2
$cd wireshark-1.2.2
编译安装命令如下:
$./configure
$make
$sudo make install
其中make编译时间会比较长,这样下来就基本安装了。
下面是我这篇文章的关键,也是用ubuntu安装的过程中极有可能遇到的问题,且都是在进行./configure编译过程中出现,两个问题如下:
---------------------------------------------------------------------------------------------------------
问题1:
view plain to clipboardprint?
./configure执行到最后出错
checking for perl... /usr/bin/perl
checking for bison... no
checking for byacc... no
checking for yacc... no
configure: error: I couldn't find yacc (or bison or ...); make sure it's installed and in your path
./configure执行到最后出错
checking for perl... /usr/bin/perl
checking for bison... no
checking for byacc... no
checking for yacc... no
configure: error: I couldn't find yacc (or bison or ...); make sure it's installed and in your path
解决办法:
view plain to clipboardprint?
sudo apt-get install flex bison
sudo apt-get install flex bison
yacc(Yet Another Compiler Compiler),是Unix/Linux上一个用来生成编译器的编译器(编译器代码生成器)。
如想深入了解google下。
问题2:
view plain to clipboardprint?
configure: error: Header file pcap.h not found; if you installed libpcap from source, did you also do "make install-incl", and if you installed a binary package of libpcap, is there also a developer's package of libpcap,
and did you also install that package?
configure: error: Header file pcap.h not found; if you installed libpcap from source, did you also do "make install-incl", and if you installed a binary package of libpcap, is there also a developer's package of libpcap,
and did you also install that package?
问题原因是ubuntu下缺少pcap.h等文件。
解决方法:
编译安装libpcap.
在www.tcpmp.org页面中可下载源码:libpcap-1.0.0.tar.gz
cd到文件目录:
view plain to clipboardprint?
$tar -xvf libpcap-1.0.0.tar.gz
$cd libpcap-1.0.0.tar.gz
$./configure
$make
$sudo make install
$tar -xvf libpcap-1.0.0.tar.gz
$cd libpcap-1.0.0.tar.gz
$./configure
$make
$sudo make install
----------------------------------------------------------------------------------------------------------------------------------------------------
采用上面的方法后再回到文章前面的步骤:
$cd wireshark-1.2.2编译安装:
$./configure
$make
$sudo make install
这样就安装好了。
启动方法:进入wireshark-1.2.2,输入命令:view plain to clipboardprint?
$sudo ./wireshark
$sudo ./wireshark
这里如果不用sudo,则wireshark找不到网络设备接口,这主要与权限有关,启动时注意下就行。

⑨ 请教tshark源码整合

tshark是wireshark的指令形式,有些情况下抓取网络包但是不想调用图形界面时,可以用tshark
1、下载libpcap源代码

http://www.tcpmp.org/

libpcap-x.x.x.tar.gz libpcap安装源文件

2. 解压缩libpcap

tar zxvf libpcap-x.x.x.tar.gz

进入到解压缩后的文件夹中 cd libpcap- x.x.x

3. 安装flex

apt-get install flex

4. 安装bison

apt-get install biso

5. 安装libpcap

./configure

make

make install

6. 安装tshark

apt-get install tshark

7、指令应用

tshark是wireshark命令行形式

1)指定要监听的接口

-i <接口名称>

比如-i eth2.如果不用-i指定监听的接口,则默认为接口列表中第一个非回环接口(-D打印接口列表)

2)可监听的接口列表

-D 打印接口列表

3)设置cap过滤条件

-f <过滤参数设置>

A. 设置监听的协议类型:-f udp/tcp/http 注:协议类型必须为小写

B. 设置源ip: -f“src host x.x.x.x”

C. 设置源端口: -f“src port xx”

D. 设置源ip和源端口: -f “srchost x.x.x.x and src port xx”

E. 设置目的ip: -f“dst host x.x.x.x”

F. 设置目的端口: -f“dst port xx”

G. 设置目的ip和端口: -f “dsthost x.x.x.x and port xx”

注:设置ip或端口时,必须用双引号

4)设置抓包数

-c <包数量> ,比如-c 15 表示抓15个包就停止

5) 设置cap包容量

-a filesize:NUM

其中NUM为filesize的包容量,用此命令需要用-w命令指定保存的文件包。NUM单位为KB

6)保存文件

-w <文件名称>

-w后面是要保存到的文件名字,也可以指定路径

7) 在屏幕中显示抓包的内容

-S

8)指定数据包的最大长度

-s <数据包长度>,单位为bytes

其他指令请参照在线帮助

热点内容
动态规划01背包算法 发布:2024-11-05 22:17:40 浏览:849
nasm编译器如何安装 发布:2024-11-05 22:01:13 浏览:180
登录密码在微信的哪里 发布:2024-11-05 22:00:29 浏览:739
c防止反编译工具 发布:2024-11-05 21:56:14 浏览:247
安卓虚拟机怎么用 发布:2024-11-05 21:52:48 浏览:344
php时间搜索 发布:2024-11-05 20:58:36 浏览:479
燕山大学编译原理期末考试题 发布:2024-11-05 20:13:54 浏览:528
华为电脑出现临时服务器 发布:2024-11-05 20:05:08 浏览:408
斗战神免费挖矿脚本 发布:2024-11-05 19:53:25 浏览:665
网吧服务器分别是什么 发布:2024-11-05 19:45:32 浏览:392