你可以先将你抓到的包保存到文件
主要代码:
/* 回调函数,用来处理数据包 */
void packet_handler(u_char *dumpfile, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
/* 保存数据包到堆文件 */
pcap_dump(dumpfile, header, pkt_data);
}
然后用wireshark 这款软件,打开文件你保存抓包信息的文件,查看你抓到的包
Wireshark(前称Ethereal)是一个网络封包分析软件。
你还可以参考我的空间,来研究抓包和保存数据包到文件。地址
回答完毕。
最怕一级的新百度成员不处理问题 。
WinPcap 这是什么文件 能删除么
一.Winpcap简介
Winpcap是UNIX下的libpcap移植到windows下的产物,他是一个free and open source的项目。Winpcap工作于驱动(Driver)层,所以能以很高的效率进行网络操作。
Winpcap提供了以下强大的功能:
1.捕获原始的数据包
2.设置filter,只捕获自己敢兴趣的数据包
3.方便的把捕获的数据包输出到文件和从文件输入
4.发送原始的数据包
5.统计网络流量
6.…..(其它还有很多,我不知道了)
二.Winpcap的安装使用方法
1.到下载winpcap的安装包,程序员开发包。
2.执行安装包,这样你的机子就能运行winpcap程序了
3.解压开发包,在VC的option的include和lib中加入winpcap的
include和lib
4. 在你的程序中加入#include <pcap.h>, #include <remote-ext.h>.然后在工程的setting中加入预定义宏:WPCAP,HAVE_REMOTE.导入wpcap.lib库
5.就可以编写wpcap程序了
三.Winpcap的一些基本的功能的实现
一)捕获数据包
1. 枚举所有的可用的设备[pcap_findalldevs_ex](可选)
2. 通过名字打开一个设备[pcap_open()]
在这里可以打开一个文件,只是在打开这个文件之前需要通过pcap_createsrcstr创建相应的name string
3. 设置Filter[pcap_compile, pcap_setfilter] (可选)
4. 捕获数据
有几种捕获数据的方法(捕获数据的数据都是最原始的数据包,即包含数据链路层的数据头)
a. 是以回调的方式[ pcap_loop,pcap_dispatch() ].
这两种方法基本相同,底层收集数据包,当满足一定的条件(timeout 或者缓冲区满),就会调用回调函数,把收集到的原始数据包s,交给用户。他们返回的数据缓冲区包含多个包
b. pcap_next_ex()的方式
每当一个包到到达以后,pcap_next_ex就会返回,返回的数据缓冲区里只包涵一个包。
二)发送包
Winpcap中有发送单个包和发送多个包的方法。这里只说说发送单个包
1. 通过名字打开一个设备[pcap_open]
2. 自己构造一个原始数据包(这个数据包会不经过任何处理就发送出去,所以必须把包中的各个字段设置好。另外这个数据包是包含数据链路层报头的)
3. 使用pcap_sendpacket()发送数据包
三)统计网络流量
1. 通过名字打开一个设备[pcap_open]
通过 read_timeout来设置统计的时间间隔
2. 设置filter[pcap_compile, pcap_setfilter] (可选)
3. 设置设备的为统计模式[ pcap_setmode(MODE_STAT);]
4. 开始统计,pcap_loop/pcap_dispatch()
5.在回调函数中的参数中就包含了统计信息,如下图:
aspectratio="t" v:ext="edit">
四. 总结
这些东西都是我在学习winpcap的过程中的一些经验和总结。由于我学习winpcap的时间很匆忙,只是按照step by step guide来学习的,所以我对于winpcap的理解也就只能局限与此,希望能在以后有机会深入学习
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//下面是一个应用winpcap写的一个网络流量统计的例子,
// nettraffic.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <pcap.h>
#include <remote-ext.h>
#include <iostream>
#include <winsock2.h>
using namespace std;
//------------------------------------------------------------------------
//------------------------------------------------------------------------
void dispatcher_handler(u_char* user_data, const struct pcap_pkthdr * pkthdr, const u_char *pktdata);
//------------------------------------------------------------------------
int main(int argc, char* argv[])
{
int i;
pcap_if_t* alldevs;
pcap_if_t* dev;
char errorbuf[PCAP_ERRBUF_SIZE];
int choice;
pcap_t* stathandle;
WSADATA wsadata;
struct timeval timestamp;
if( WSAStartup( MAKEWORD(2,2), &wsadata) != 0 )
{
cerr<<"WSAStartup failed [ "<<WSAGetLastError() <<" ]"<<endl;
return (-1);
}
//enum all device
if( pcap_findalldevs_ex( PCAP_SRC_IF_STRING, NULL, &alldevs, errorbuf ) == -1 )
{
WSACleanup();
cerr<<"pcap_findalldevs_ex failed! ("<<errorbuf<<")"<<endl;
return (-1);
}
for( i=0,dev = alldevs; dev != NULL; dev = dev->next )
{
cout<<++i<<'\t'<<dev->name<<endl;
}
if( i== 0 )
{
WSACleanup();
cerr<<"no device found!"<<endl;
return (-2);
}
//let user choice
while( 1)
{
cout<<"please choice a device:";
cin>>choice;
if( choice >= 1 && choice <=i )
break;
cerr<<"input error, you shall choice a device from upon list"<<endl;
}
//move to the choice device
for( i=0, dev = alldevs; i<choice-1; i++,dev = dev->next );
if( (stathandle = pcap_open( dev->name,
100,
PCAP_OPENFLAG_PROMISCUOUS,
500,
NULL, errorbuf ) ) == NULL )
{
cerr<<"open device failed! [device:"<<dev->name<<"] "
<<errorbuf<<endl;
pcap_freealldevs( alldevs );
WSACleanup();
return (-3);
}
cout<<"is Stat "<<dev->name<<" ..."<<endl;
pcap_freealldevs( alldevs );
pcap_setmode( stathandle, MODE_STAT );
timestamp.tv_sec = 0;
timestamp.tv_usec = 0;
pcap_loop( stathandle, 0, dispatcher_handler,(unsigned char*)×tamp );
pcap_close( stathandle );
return 0;
}
//------------------------------------------------------------------------
void dispatcher_handler(u_char* user_data, const struct pcap_pkthdr * pkthdr, const u_char *pktdata)
{
static struct timeval tstamp = *( (struct timeval*)user_data );
LARGE_INTEGER Bps,Pps;
unsigned long delay;
char strtime[32];
delay = (pkthdr->ts.tv_sec - tstamp.tv_sec)*1000000 - tstamp.tv_usec + pkthdr->ts.tv_usec;
Pps.QuadPart = ((*(LONGLONG*)(pktdata)) * 1000000 ) / delay;
Bps.QuadPart = ((*(LONGLONG*)(pktdata + 8)) * 1000000 ) / delay;
struct tm* ltime = localtime( &(pkthdr->ts.tv_sec) );
strftime( strtime, sizeof(strtime),"%H:%M:%S", ltime);
printf("%s:", strtime );
printf("\tPps=%I64u\tBps=%I64u\r\n",Pps.QuadPart,Bps.QuadPart);
tstamp = pkthdr->ts;
}
软件路由器的设计与实现(基于Winpcap接口)
利用WINPCAP抓到的是最底层的以太网帧,然后根据帧的类型字段确定当个数据包里是IP、ARP还是RARP或其它 然后根据IP的类型字段再确定下层封装的包类型 先把封包的逻辑结构弄清楚了 再调用相应函数 如果是在贴吧拷的代码 会不会别人没有写UDP那部
首先谢谢你的回答,我们的要求是做一个课程设计,我不会,我想请问网上是否有相关的JAVA源码。
我想请教一下关于winpcap加载失败的问题
winpcap的安装过程实际上就是复制了两个文件到系统文件夹里面而已啊。。。
一个是packet.dll一个是wpcap.dll...开机的时候不用加载的..
比如一个网络抓包软件,比如P2P终结者要使用winpcap了,那么程序会调用wpcap.dll不是系统开机加载。更多
那你能帮我解决一下我的上网问题么?呵呵 好吗?
你都不把你的上网问题说清楚啊?怎么解决呢?你是上不了网么?
具体说一下
能加一下QQ吗?说的时候方便些:572722236
我的422329691 有什么可以讨论 共同进步
如何开发一个简单防火墙软件
好像winpcap不能做防火墙吧?你查一下,我记得是这样的
既然要做简单的防火墙那就自己定义几个规则啊,如不允许IP地址为某某的包,或者不允行端口号为某某某的包
这样做成后把规则组合起来就有实用效果了。如禁止收发邮件(把smtp和pop3端口封了)
一般做界面是不会做成exe再调用的。做成一个对话框调用时这样
CYourDlg dlg;//定义一个对话框类
dlg.DoMoal();//显示
如何在VC中配置winPcap开发环境
VC6.0中使用winpcap
1.下载winpcap的安装包,程序员开发包。(两个包)
2.执行安装包,这样你的机子就能运行winpcap程序了
3.解压开发包,在VC的option的include和lib中加入winpcap的include和lib
4. 在工程的setting中导入wpcap.lib和Packet.lib库
VC .net中使用winpcap
1、在项目-〉属性 -〉C++ -〉常规标签的附加包含目录中包含WinPcap的Include目录
2、在项目-〉属性 -〉链接器 -〉输入标签的附加依赖项中添加lib库文件
在Microsoft的VC++中使用wpcap.dll创建应用的步骤如下:
在需要调用wpcap.dll动态连接库的功能和函数的所有源代码文件的开头引用头文件pcap.h;
如果应用程序使用了Winpcap的Win32相关函数,记住在预处理定义中需要引用WPCAP;
在编译连接选项Link中设置包括wpcap.lib库文件,wpcap.lib在Winpcap开发补丁中找到;
在编译连接选项中设置包含winsock库函数(比如wsock32.lib)。这个文件由C编译器提供,包含了Windows环境下的socket函数,有些libpcap函数也需要调用它。
还要记住:
为了增加预处理定义,必须在Project菜单中选择Settings,在tab控件中选择C/C++页面,在Category下拉框中选择General,在Preprocessor Definitions文本框中加入预定义。
为了在Microsoft VC++项目中增加一个新库连接,需要从菜单Project中选择Settings,再在tab控件中选择Link,然后在Objcet/library modules编辑框中加入要加入的新连接库名字。
为了在Microsoft VC++项目中加入一个新的库文件搜索路径,必须从Tools菜单中选择Options,然后在tab控件中选择Directories页面,在Show Directories for下拉框中选择Library files,在Directories列表框中加入到要加入的库文件路径。
为了在Microsoft VC++中加入一条路径以便编译器能够找到包含文件,需要从Tools菜单中选择Options,在tab控件中选择Directories页面,从Show Directories for下拉框中选择Include files,在Directories列表框中加入到要加入的包含头文件路径。
一) 首先安装winpcap驱动,可以到winpcap官方网站上下载:http://www.winpcap.org/install/default.htm
安装winpcap驱动后:
1. C:\WINDOWS\system32目录下自动生成: wpcap.dll,packet.dll
2. C:\WINDOWS\system32\drivers下自动生成:npf.sys
(二)winpcap-4.0.3配置环境:
在项目->XX属性,选择配置属性:
1. c/c++->常规\附加包含目录:D:\WpdPack-4.0.3\Include
->预处理器\预处理器定义:WPCAP
2. 链接器->常规\附加库目录:D:\WpdPack-4.0.3\Lib
->输入\附加依赖项: Packet.lib wpcap.lib ws2_32.lib
(三)新建一个空WIN32控制台项目,添加。C文件:
#include "pcap.h"
int main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
int inum;
int i=0;
pcap_t *adhandle;
int res;
char errbuf[PCAP_ERRBUF_SIZE];
struct tm *ltime;
char timestr[16];
struct pcap_pkthdr *header;
const u_char *pkt_data;
time_t local_tv_sec;
/* Retrieve the device list */
if(pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
return -1;
}
/* Print the list */
for(d=alldevs; d; d=d->next)
{
printf("%d. %s", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else
printf(" (No description available)\n");
}
if(i==0)
{
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return -1;
}
printf("Enter the interface number (1-%d):",i);
scanf("%d", &inum);
if(inum < 1 || inum > i)
{
printf("\nInterface number out of range.\n");
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}
/* Jump to the selected adapter */
for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
/* Open the adapter */
if ((adhandle= pcap_open_live(d->name, // name of the device
65536, // portion of the packet to capture.
// 65536 grants that the whole packet will be captured on all the MACs.
1, // promiscuous mode (nonzero means promiscuous)
1000, // read timeout
errbuf // error buffer
)) == NULL)
{
fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}
printf("\nlistening on %s...\n", d->description);
/* At this point, we don't need any more the device list. Free it */
pcap_freealldevs(alldevs);
/* Retrieve the packets */
while((res = pcap_next_ex( adhandle, &header, &pkt_data)) >= 0){
if(res == 0)
/* Timeout elapsed */
continue;
/* convert the timestamp to readable format */
local_tv_sec = header->ts.tv_sec;
ltime=localtime(&local_tv_sec);
strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);
printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len);
}
if(res == -1){
printf("Error reading the packets: %s\n", pcap_geterr(adhandle));
return -1;
}
pcap_close(adhandle);
return 0;
}
编译,运行!
(三)在工具\选项\项目\VC++项目\可执行文件添加: D: \WpdPack-4.0.3\Include D:\WpdPack-4.0.3\Lib
D:\WpdPack-4.0.3\Include(包含文件)和D:\WpdPack-4.0.3\Lib(库文件)
C:\Program Files\WinPcap,winpcap是什么?
不是。这个是vc里面的类,是个网络监控的。比如咱们用的下在线电影时,要用软件嗅探出电影的地址,那种软件实际就是调用了这个类的一些功能的。
网络抓包,怎么用Java程序登录百度
一、实验内容描述
本实验是用java实现的网络抓包程序,在windows环境下安装winpcap4.0和jpcap6.0后,下载eclipse和jigloo插件(一种在eclipse底下作图形化开发的工具),将其安装好,然后就可以进行java的网络抓包图形化开发了。
二、原理与关键技术
网络抓包技术原理
网络层上有各种各样的数据包,它们以不同的帧格式在网络层上进行传输,但是在传输时它们都遵循相同的格式,即有相同的长度,如果一种协议的帧格式达不到这种长度,就让其补齐,以达到我们的要求。
网络抓包关键技术
无论是在windows操作系统下还是在linux操作系统下,要想捕获网络上的数据包,必须要对网卡进行控制,因为本机的数据报从网络上来到本机是通过网卡然后再保存到本地缓冲区上的,所以要抓获网包就必须调用网卡驱动中的对外函数,在linux系统中有net.h文件,可以调用net.h文件中的函数来操作网卡,可以直接编程实现,但为了更方便的使用,可以安装一个叫libpcap的软件,这样调用函数更好用,而在windows系统中,因为源代码不对外公开,所以要安装一个叫winpcap的软件,这样用C或VC++就可以实现了,但因为我用的是java语言来实现的,所以无论是在哪个系统都要安装一个叫jpcap的软件,它本身就把底层的函数又封装了一下,这样就可以让java来使用了。
三、设计与实现
1.基于java的设计方案
我的这个网络抓包程序是图形化操作界面,在菜单栏点击抓包按钮后选择网卡和过滤字还有最长字长,点击开始,然后就可以开始抓包了,在主界面中就会显示出一行又一行的数据,这些数据就是抓获到的数据包。
具体实现
安装winpcap4.0和jpcap6.0
2.下载eclipse3.3和jigloo,jigloo是eclipse底下的插件,是用来支持eclipse底下的java 图形化开发的。
3.编写java抓包程序:
4.建立三个文件,一个主程序,一个抓包程序,一个抓包选项程序对话框程序
5.第一个程序:主程序如下
packagenetcap;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjavax.swing.JSeparator;
importjavax.swing.JMenuItem;
importjavax.swing.JMenu;
importjavax.swing.JMenuBar;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjavax.swing.table.*;
importnetcap.*;
importjpcap.*;
importjpcap.packet.*;
importjava.util.*;
importjava.sql.Timestamp;
/**
*ThiscodewaseditedorgeneratedusingCloudGarden'sJigloo
*SWT/SwingGUIBuilder,whichisfreefornon-commercial
*use.IfJiglooisbeingusedcommercially(ie,byacorporation,
*companyorbusinessforanypurposewhatever)thenyou
*shouldpurchasealicenseforeachdeveloperusingJigloo.
*Pleasevisit
*UseofJiglooimpliesacceptanceoftheselicensingterms.
*ACOMMERCIALLICENSEHASNOTBEENPURCHASEDFOR
*THISMACHINE,SOJIGLOOORTHISCODECANNOTBEUSED
*LEGALLYFORANYCORPORATEORCOMMERCIALPURPOSE.
*/
publicclassJFrameMainextendsjavax.swing.JFrameimplementsActionListener{
privateJMenuItemexitMenuItem;
privateJSeparatorjSeparator2;
privateJMenuItemsaveAsMenuItem;
privateJMenuItemsaveMenuItem;
privateJMenuItemstopMenuItem;
privateJMenuItemstartMenuItem;
privateJMenuMenu;
privateJMenuBarjMenuBar1;
JTabletabledisplay=null;
Vectorrows,columns;
DefaultTableModeltabModel;
JScrollPanescrollPane;
JLabelstatusLabel;
Netcaptorcaptor=newNetcaptor();
/**
*Auto-generatedmainmethodtodisplaythisJFrame
*/
publicstaticvoidmain(String[]args){
JFrameMaininst=newJFrameMain();
inst.setVisible(true);
}
publicJFrameMain(){
super();
initGUI();
}
privatevoidinitGUI(){
try{
setSize(400,300);
{
jMenuBar1=newJMenuBar();
setJMenuBar(jMenuBar1);
{
Menu=newJMenu();
jMenuBar1.add(Menu);
Menu.setText("/u6293/u5305");
Menu.setPreferredSize(newjava.awt.Dimension(35,21));
{
startMenuItem=newJMenuItem();
Menu.add(startMenuItem);
startMenuItem.setText("开始");
startMenuItem.setActionCommand("start");
startMenuItem.addActionListener(this);
}
{
stopMenuItem=newJMenuItem();
Menu.add(stopMenuItem);
stopMenuItem.setText("停止");
stopMenuItem.setActionCommand("stop");
stopMenuItem.addActionListener(this);
}
{
saveMenuItem=newJMenuItem();
Menu.add(saveMenuItem);
saveMenuItem.setText("保存");
}
{
saveAsMenuItem=newJMenuItem();
Menu.add(saveAsMenuItem);
saveAsMenuItem.setText("保存为...");
}
{
jSeparator2=newJSeparator();
Menu.add(jSeparator2);
}
{
exitMenuItem=newJMenuItem();
Menu.add(exitMenuItem);
exitMenuItem.setText("Exit");
exitMenuItem.setActionCommand("exit");
exitMenuItem.addActionListener(this);
}
}
}
rows=newVector();
columns=newVector();
columns.addElement("数据报时间");
columns.addElement("源IP地址");
columns.addElement("目的IP地址");
columns.addElement("首部长度");
columns.addElement("数据长度");
columns.addElement("是否分段");
columns.addElement("分段偏移量");
columns.addElement("首部内容");
columns.addElement("数据内容");
tabModel=newDefaultTableModel();
tabModel.setDataVector(rows,columns);
tabledisplay=newJTable(tabModel);
scrollPane=newJScrollPane(tabledisplay);
this.getContentPane().add(newJScrollPane(tabledisplay),BorderLayout.CENTER);
statusLabel=newJLabel("06610班张琛雨066100583");
this.getContentPane().add(statusLabel,BorderLayout.SOUTH);
}catch(Exceptione){
e.printStackTrace();
}
}
publicvoidactionPerformed(ActionEventevent){
Stringcmd=event.getActionCommand();
if(cmd.equals("start")){
captor.capturePacketsFromDevice();
captor.setJFrame(this);
}
elseif(cmd.equals("stop")){
captor.stopCapture();
}
elseif(cmd.equals("exit")){
System.exit(0);
}
}
publicvoiddealPacket(Packetpacket)
{
try
{
Vectorr=newVector();
Stringstrtmp;
Timestamptimestamp=newTimestamp((packet.sec*1000)+(packet.usec/1000));
r.addElement(timestamp.toString());//数据报时间
r.addElement(((IPPacket)packet).src_ip.toString());//源IP地址
r.addElement(((IPPacket)packet).dst_ip.toString());//目的IP地址
r.addElement(packet.header.length);//首部长度
r.addElement(packet.data.length);//数据长度
r.addElement(((IPPacket)packet).dont_frag==true?"分段":"不分段");//是否不分段
r.addElement(((IPPacket)packet).offset);//数据长度
strtmp="";
for(inti=0;i<packet.header.length;i++){
strtmp+=Byte.toString(packet.header[i]);
}
r.addElement(strtmp);//首部内容
strtmp="";
for(inti=0;i<packet.data.length;i++){
strtmp+=Byte.toString(packet.data[i]);
}
r.addElement(strtmp);//数据内容
rows.addElement(r);
tabledisplay.addNotify();
}
catch(Exceptione)
{
}
}
}
转载请注明出处51数据库 » 调用winpcap的软件 winpcap怎么使用