📄 pcap_filter.c
字号:
/*
* Copyright (c) 1999 - 2002
* Politecnico di Torino. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that: (1) source code distributions
* retain the above copyright notice and this paragraph in its entirety, (2)
* distributions including binary code include the above copyright notice and
* this paragraph in its entirety in the documentation or other materials
* provided with the distribution, and (3) all advertising materials mentioning
* features or use of this software display the following acknowledgement:
* ``This product includes software developed by the Politecnico
* di Torino, and its contributors.'' Neither the name of
* the University nor the names of its contributors may be used to endorse
* or promote products derived from this software without specific prior
* written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#include <stdlib.h>
#include <stdio.h>
#include <pcap.h>
#define MAX_PRINT 80
#define MAX_LINE 16
void dispatcher_handler(u_char *,
const struct pcap_pkthdr *, const u_char *);
void usage();
void main(int argc, char **argv) {
pcap_t *fp;
char error[PCAP_ERRBUF_SIZE];
char *device=NULL;
char *ifilename=NULL;
char *ofilename=NULL;
char *filter=NULL;
int i=0;
pcap_dumper_t *dumpfile;
struct bpf_program fcode;
bpf_u_int32 SubNet,NetMask;
if (argc == 1)
{
usage();
return;
}
for(i=1;i<argc;i+=2){
switch (argv[i] [1])
{
case 'i':
{
device=argv[i+1];
};
break;
case 'f':
{
ifilename=argv[i+1];
};
break;
case 'o':
{
ofilename=argv[i+1];
};
break;
case 'p':
{
filter=argv[i+1];
};
break;
}
}
//open a capture from the network
if (device != NULL){
if ( (fp= pcap_open_live(device, 1514, 1, 20, error) ) == NULL)
{
fprintf(stderr,"\nUnable to open the adapter.\n");
return;
}
}
//open a capture from file
else if (ifilename != NULL){
if ( (fp = pcap_open_offline(ifilename, NULL) ) == NULL)
{
fprintf(stderr,"\nUnable to find input file.\n");
return;
}
}
else usage();
if(filter!=NULL){
//obtain the subnet
if(device!=NULL){
if(pcap_lookupnet(device, &SubNet, &NetMask, error)<0){
fprintf(stderr,"\nUnable to obtain the netmask.\n");
return;
}
}
else NetMask=0xffffff; //If reading from file, we suppose to be in a C class network
//compile the filter
if(pcap_compile(fp, &fcode, filter, 1, NetMask)<0){
fprintf(stderr,"\nError compiling filter: wrong syntax.\n");
return;
}
//set the filter
if(pcap_setfilter(fp, &fcode)<0){
fprintf(stderr,"\nError setting the filter\n");
return;
}
}
//open the dump file
if (ofilename != NULL){
dumpfile=pcap_dump_open(fp, ofilename);
if(dumpfile==NULL){
fprintf(stderr,"\nError opening output file\n");
return;
}
}
else usage();
//start the capture
pcap_loop(fp, 0, dispatcher_handler, (unsigned char *)dumpfile);
}
//Callback function called by libpcap for every incoming packet
void dispatcher_handler(u_char *dumpfile,
const struct pcap_pkthdr *header, const u_char *pkt_data)
{
u_int i=0;
//save the packet on the dump file
pcap_dump(dumpfile,header,pkt_data);
}
void usage()
{
printf("\npf - generic packet filter.\nWritten by Loris Degioanni (loris@netgroup-serv.polito.it).");
printf("\nUsage:\npf [-i interface] | [-f input_file_name] -o output_file_name -p packet_filter\n\n");
exit(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -