精华内容
下载资源
问答
  • 博客文章<<pcap_file_save_as_by_condition>>对应的实验工程 功能:将一个指定的离线pcap包,按照指定的捕获过滤器,另存为指定的pcap文件。另存后的pcap文件中只有自己关系的包信息。 工程预览: ...
  • 这时,想从原始的离线pcap文件中,按照自己设定的条件另存出一个pcap文件,里面只有自己关心的包信息。 以前就想写个这样的工具,可是没动手…,今天要用到这样的功能时,还得现写一个。 自己有个小想法,就动手搞。...

    前言

    今天在分析一个大包时,原始包是随便抓下来的,只有一部分包需要分析,而且怀疑分析时丢包了。
    这时,想从原始的离线pcap文件中,按照自己设定的条件另存出一个pcap文件,里面只有自己关心的包信息。
    以前就想写个这样的工具,可是没动手…,今天要用到这样的功能时,还得现写一个。
    自己有个小想法,就动手搞。整出来以后,如果以后要用到,那要方便很多。

    工程下载点

    src_pcap_file_save_as_by_condition.7z

    工程运行效果

    ================================================================================
    [test_pcap_save_as_by_condition][1.0.0.1][2018-11-05 16:09]
    ================================================================================
    psz_src_pcap_file = /var/log/test.pcap
    psz_dst_pcap_file_save_to = /var/log/test_save_to.pcap
    psz_capture_filter_condition = tcp port 5432 and host 192.168.16.128
    if need stop grab packet, please press 'q'
    >> thread_proc_grab_packet
    pcap_lib_version = libpcap version 1.7.4
    ok : pcap_open_offline(/var/log/test.pcap)
    pcap version is 2.4
    ok : is Ethernet support
    ok : pcap_compile(tcp port 5432 and host 192.168.16.128)
    ok : pcap_setfilter(tcp port 5432 and host 192.168.16.128)
    pcap now ...
    ok : open dump file : /var/log/test_save_to.pcap
    dump... /var/log/test_save_to.pcap [106]bytes
    dump... /var/log/test_save_to.pcap [188]bytes
    dump... /var/log/test_save_to.pcap [258]bytes
    
    ...
    
    pcap_loop exec over = 0, 
    dump... /var/log/test_save_to.pcap [461155206]Bytes
    close dump file : /var/log/test_save_to.pcap
    << thread_proc_grab_packet
    if need stop grab packet, please press 'q'
    q
    bye
    THE END
    
    

    工程预览

    // @file \pcap_file_save_as_by_condition\src\main.cpp
    // @brief 
    
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    
    #include <string>
    #include <iostream>
    
    #include "const_define.h"
    #include "pcap.h"
    
    #define PROG_NAME "test_pcap_save_as_by_condition"
    #define PROG_VER "1.0.0.1"
    #define PROG_CODE_LAST_TIME "2018-11-05 16:09"
    
    #ifndef MAX_PATH
    #define MAX_PATH 260
    #endif // #ifndef MAX_PATH
    
    #ifndef MAX_FILTER_LEN
    #define MAX_FILTER_LEN 260
    #endif // #ifndef MAX_FILTER_LEN
    
    #define CONTEXT_SAVE_PCAP_PACKET_VERSION_V1 1000
    
    // context : dump pcap packet to file
    typedef struct _tag_context_save_pcap_packet_v1 {
    	char sz_src_pcap_file[MAX_PATH]; // file base name, e.g. pcap_
    	char sz_dst_pcap_file_save_to[MAX_PATH]; // file base name, e.g. pcap_1.pcap
    
    	// tcp port 23 and host 10.0.0.5
    	// tcp port 5432 and host 192.168.16.128
    	// host 192.168.16.128 and port 5432
    	char sz_capture_filter[MAX_FILTER_LEN];
    
    	pcap_t* h_pcap; // the device pcap handle
    	pcap_dumper_t* p_dumper; // dump file handle
    	int i_max_packet_recv_by_pcap; // for packet recv number by pcap_loop
    
    	bool b_cmd_quit; // quit command
    
    	_tag_context_save_pcap_packet_v1() {
    		clear();
    	}
    	
    	void clear()
    	{
    		memset(sz_src_pcap_file, 0, sizeof(sz_src_pcap_file));
    		memset(sz_dst_pcap_file_save_to, 0, sizeof(sz_dst_pcap_file_save_to));
    		memset(sz_capture_filter, 0, sizeof(sz_capture_filter));
    		
    		h_pcap = NULL;
    		p_dumper = NULL;
    		i_max_packet_recv_by_pcap = -1;
    		
    		b_cmd_quit = false;
    	}
    } TAG_CONTEXT_SAVE_PCAP_PACKET_V1;
    
    typedef struct _tag_context_save_pcap_packet {
    	int iTagVer; // this version number to determine below member
    	TAG_CONTEXT_SAVE_PCAP_PACKET_V1 v1;
    
    	_tag_context_save_pcap_packet()
    	{
    		iTagVer = CONTEXT_SAVE_PCAP_PACKET_VERSION_V1;
    		v1.clear();
    	}
    } TAG_CONTEXT_SAVE_PCAP_PACKET;
    
    void* thread_proc_grab_packet(void* pctx);
    
    void callback_pcap_handler(
    	u_char *user,
    	const struct pcap_pkthdr *h,
    	const u_char *bytes);
    
    int main(int argc, char* argv[])
    {
    	TAG_CONTEXT_SAVE_PCAP_PACKET context_save_pcap_packet;
    	pthread_t pthread_grab_packet = 0;
    	char c_input = '\0';
    
    	const char* psz_src_pcap_file = NULL;
    	const char* psz_dst_pcap_file_save_to = NULL;
    	const char* psz_capture_filter_condition = NULL;
    
    	MYLOG_D("================================================================================\n");
    	MYLOG_D("[%s][%s][%s]\n", PROG_NAME, PROG_VER, PROG_CODE_LAST_TIME);
    	MYLOG_D("================================================================================\n");
    
    	do {
    		if (argc != 4) {
    			MYLOG_D("usage : %s '%s' '%s' '%s'\n", PROG_NAME, "src_pacp_file", "dst_pcap_file_save_to", "capture_filter_condition");		
    			MYLOG_D("%s\n", 
    				"e.g. ./test_pcap_save_as_by_condition /var/log/test.pcap /var/log/test_save_to.pcap 'tcp port 5432 and host 192.168.16.128'");
    		
    			break;
    		}
    
    		psz_src_pcap_file = argv[1];
    		psz_dst_pcap_file_save_to = argv[2];
    		psz_capture_filter_condition = argv[3];
    
    		MYLOG_D("psz_src_pcap_file = %s\n", psz_src_pcap_file);
    		MYLOG_D("psz_dst_pcap_file_save_to = %s\n", psz_dst_pcap_file_save_to);
    		MYLOG_D("psz_capture_filter_condition = %s\n", psz_capture_filter_condition);
    
    		// initial context
    		context_save_pcap_packet.v1.clear();
    		context_save_pcap_packet.v1.i_max_packet_recv_by_pcap = -1;
    		strcpy(context_save_pcap_packet.v1.sz_src_pcap_file, psz_src_pcap_file);
    		strcpy(context_save_pcap_packet.v1.sz_dst_pcap_file_save_to , psz_dst_pcap_file_save_to);
    		strcpy(context_save_pcap_packet.v1.sz_capture_filter , psz_capture_filter_condition);
    
    		pthread_create(&pthread_grab_packet, NULL, thread_proc_grab_packet, (void*)&context_save_pcap_packet);
    
    		do {
    			MYLOG_D("if need stop grab packet, please press 'q'\n");
    			std::cin >> c_input;
    			if ('q' == c_input) {
    				MYLOG_D("bye\n");
    				break;
    			}
    		} while (1);
    
    		context_save_pcap_packet.v1.b_cmd_quit = true;
    		if (NULL != context_save_pcap_packet.v1.h_pcap) {
    			pcap_breakloop(context_save_pcap_packet.v1.h_pcap);
    		}
    		pthread_join(pthread_grab_packet, NULL);
    		pthread_grab_packet = 0;
    	} while (0);
    	
        MYLOG_D("THE END\n");
        return EXIT_SUCCESS;
    }
    
    /** run result
    ================================================================================
    [test_pcap_save_as_by_condition][1.0.0.1][2018-11-05 16:09]
    ================================================================================
    psz_src_pcap_file = /var/log/test.pcap
    psz_dst_pcap_file_save_to = /var/log/test_save_to.pcap
    psz_capture_filter_condition = tcp port 5432 and host 192.168.16.128
    if need stop grab packet, please press 'q'
    >> thread_proc_grab_packet
    pcap_lib_version = libpcap version 1.7.4
    ok : pcap_open_offline(/var/log/test.pcap)
    pcap version is 2.4
    ok : is Ethernet support
    ok : pcap_compile(tcp port 5432 and host 192.168.16.128)
    ok : pcap_setfilter(tcp port 5432 and host 192.168.16.128)
    pcap now ...
    ok : open dump file : /var/log/test_save_to.pcap
    dump... /var/log/test_save_to.pcap [106]bytes
    dump... /var/log/test_save_to.pcap [188]bytes
    dump... /var/log/test_save_to.pcap [258]bytes
    
    ...
    
    pcap_loop exec over = 0, 
    dump... /var/log/test_save_to.pcap [461155206]Bytes
    close dump file : /var/log/test_save_to.pcap
    << thread_proc_grab_packet
    if need stop grab packet, please press 'q'
    q
    bye
    THE END
    */
    
    void* thread_proc_grab_packet(void* pctx)
    {
    	int iRc = 0;
        bpf_u_int32 net = 0;        /* The IP of our sniffing device */
        char errbuf[PCAP_ERRBUF_SIZE];
        int i_pcap_major_ver = 0;
        int i_pcap_minor_ver = 0;
        struct bpf_program my_bpf_program;
        bool b_valid_bpf = false;
    	std::string str;
    	TAG_CONTEXT_SAVE_PCAP_PACKET* p_context = NULL;
    
    	MYLOG_D(">> thread_proc_grab_packet\n");
    	do {
    		if (NULL == pctx) {
    			MYLOG_D("context can't be NULL\n");
    			break;
    		}
    
    		p_context = (TAG_CONTEXT_SAVE_PCAP_PACKET*)pctx;
    		str = pcap_lib_version();
    		MYLOG_D("pcap_lib_version = %s\n", str.c_str());
    		// pcap_lib_version = libpcap version 1.7.4
    
    		// open offline pcap file
    		p_context->v1.h_pcap = pcap_open_offline(p_context->v1.sz_src_pcap_file, errbuf);
    		if (NULL == p_context->v1.h_pcap) {
    			MYLOG_E("error : pcap_open_offline(%s, %s)\n", p_context->v1.sz_src_pcap_file, errbuf);
    			break;
    		}
    		
    		MYLOG_E("ok : pcap_open_offline(%s)\n", p_context->v1.sz_src_pcap_file);
    	
    		i_pcap_major_ver = pcap_major_version(p_context->v1.h_pcap);
    		i_pcap_minor_ver = pcap_minor_version(p_context->v1.h_pcap);
    	
    		// pcap version is 2.4
    		MYLOG_D("pcap version is %d.%d\n", i_pcap_major_ver, i_pcap_minor_ver);
    		
    		if (pcap_datalink(p_context->v1.h_pcap) != DLT_EN10MB) {
    			MYLOG_E("pcap Device doesn't provide Ethernet headers - not supported\n");
    			break;
    		}
    		MYLOG_D("ok : is Ethernet support\n");
    	
    		// compile BPF
    		if (pcap_compile(p_context->v1.h_pcap, &my_bpf_program, p_context->v1.sz_capture_filter, 0, net) == -1) {
    			MYLOG_D("Couldn't parse filter [%s]: %s\n", 
    				p_context->v1.sz_capture_filter, 
    				pcap_geterr(p_context->v1.h_pcap));
    			
    			break;
    		}
    		
    		b_valid_bpf = true;
    		MYLOG_D("ok : pcap_compile(%s)\n", p_context->v1.sz_capture_filter);
    	
    		// set BPF filter
    		if (pcap_setfilter(p_context->v1.h_pcap, &my_bpf_program) == -1) {
    			MYLOG_E("Couldn't install filter %s: %s\n", 
    				p_context->v1.sz_capture_filter, 
    				pcap_geterr(p_context->v1.h_pcap));
    			break;
    		}
    		MYLOG_D("ok : pcap_setfilter(%s)\n", p_context->v1.sz_capture_filter);
    	
    		MYLOG_D("pcap now ...\n");
    		
    		// pcap_dispatch only entry callback once
    		// pcap_loop can entry callback per packet/1 times :)
    		iRc = pcap_loop(
    			p_context->v1.h_pcap, 
    			p_context->v1.i_max_packet_recv_by_pcap, // packet number to capture
    			callback_pcap_handler, // call back function
    			(u_char*)p_context); // user data, my pcap opt context
    			
    		MYLOG_D("pcap_loop exec over = %d, %s\n", iRc, pcap_geterr(p_context->v1.h_pcap));
    		if (NULL != p_context->v1.p_dumper) {
    			MYLOG_D("dump... %s [%ld]Bytes\n",
    				p_context->v1.sz_dst_pcap_file_save_to, 
    				pcap_dump_ftell(p_context->v1.p_dumper));
    
    			pcap_dump_flush(p_context->v1.p_dumper);
    			pcap_dump_close(p_context->v1.p_dumper);
    
    			MYLOG_D("close dump file : %s\n", 
    				p_context->v1.sz_dst_pcap_file_save_to);
    
    			p_context->v1.p_dumper = NULL;
    		}
    	} while (0);
    	
    	if (b_valid_bpf) {
    		b_valid_bpf = false;
    		pcap_freecode(&my_bpf_program);
    	}
    	
    	if (NULL != p_context->v1.h_pcap) {
    		pcap_close(p_context->v1.h_pcap);
    		p_context->v1.h_pcap = NULL;
    	}
    
    	MYLOG_D("<< thread_proc_grab_packet\n");
    	MYLOG_D("if need stop grab packet, please press 'q'\n");
    
    	return (void*)NULL;
    }
    
    void callback_pcap_handler(
    	u_char *user,
    	const struct pcap_pkthdr *h,
    	const u_char *bytes)
    {
    	// if pcap_dispatch grab 6 packet, only entry here once
    	TAG_CONTEXT_SAVE_PCAP_PACKET* p_context = NULL;
    
    	do {
    		if (NULL == user) {
    			break;
    		}
    
    		p_context = (TAG_CONTEXT_SAVE_PCAP_PACKET*)user;
    		if (CONTEXT_SAVE_PCAP_PACKET_VERSION_V1 != p_context->iTagVer) {
    			break;
    		}
    
    		if ((NULL == p_context->v1.p_dumper) && (NULL != p_context->v1.h_pcap)) {
    			p_context->v1.p_dumper = pcap_dump_open(p_context->v1.h_pcap, p_context->v1.sz_dst_pcap_file_save_to);
    			MYLOG_D("%s : open dump file : %s\n", 
    				(NULL != p_context->v1.p_dumper) ? "ok" : "failed", 
    				p_context->v1.sz_dst_pcap_file_save_to);
    		}
    
    		if (NULL != p_context->v1.p_dumper) {
    			pcap_dump((u_char*)p_context->v1.p_dumper, h, bytes);
    			
    			MYLOG_D("dump... %s [%ld]bytes\n",
    				p_context->v1.sz_dst_pcap_file_save_to, 
    				pcap_dump_ftell(p_context->v1.p_dumper));
    		}
    	} while (0);
    }
    
    
    
    // @file const_define.h
    
    #if not defined(__CONST_DEFINE_H__)
    #define __CONST_DEFINE_H__
    
    #include <string.h>
    #include <stdint.h>
    #include <syslog.h>
    
    #include <string>
    #include <list>
    
    typedef unsigned int uint;
    typedef unsigned short ushort;
    typedef unsigned long long ull;
    
    #ifndef SAFE_DELETE
    #define SAFE_DELETE(p) \
        if (NULL != (p)) { \
            delete (p); \
            (p) = NULL; \
        }
    #endif // #ifndef SAFE_DELETE
    
    #ifndef SAFE_DELETE_ARY
    #define SAFE_DELETE_ARY(p) \
        if (NULL != (p)) { \
            delete[] (p); \
            (p) = NULL; \
        }
    #endif // #ifndef SAFE_DELETE
    
    #define TITLE_LINE80 "================================================================================"
    #define LINE80 "--------------------------------------------------------------------------------"
    
    #if not defined(MYLOG_D)
    
    // 为了用gdb调试时, 不被printf干扰, 在调试时, 定义USE_SYSLOG, 发行时去掉定义USE_SYSLOG
    // #define USE_SYSLOG
    
    #ifdef USE_SYSLOG
    #define MYLOG_V(fmt, ...) \
    	syslog(LOG_INFO, "[%s : %s.%d : %s()] : " fmt, "MYLOG_V", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);
    
    #define MYLOG_D(fmt, ...) \
    	syslog(LOG_INFO, "[%s : %s.%d : %s()] : " fmt, "MYLOG_D", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);
    
    #define MYLOG_I(fmt, ...) \
    	syslog(LOG_INFO, "[%s : %s.%d : %s()] : " fmt, "MYLOG_I", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);
    
    #define MYLOG_W(fmt, ...) \
    	syslog(LOG_INFO, "[%s : %s.%d : %s()] : " fmt, "MYLOG_W", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);
    
    #define MYLOG_E(fmt, ...) \
    	syslog(LOG_INFO, "[%s : %s.%d : %s()] : " fmt, "MYLOG_E", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);
    
    #define MYLOG_F(fmt, ...) \
    	syslog(LOG_INFO, "[%s : %s.%d : %s()] : " fmt, "MYLOG_F", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);
    #else // #ifdef USE_SYSLOG
    #define MYLOG_V printf
    #define MYLOG_D printf
    #define MYLOG_I printf
    #define MYLOG_W printf
    #define MYLOG_E printf
    #define MYLOG_F printf
    #endif // #ifdef USE_SYSLOG
    
    #endif // #if not defined(MYLOG_D)
    
    #define MAX_MSG_LENGTH (1024 * 4)
    
    #endif // #if not defined(__CONST_DEFINE_H__)
    
    
    
    # ==============================================================================
    # @file makefile
    # ==============================================================================
    # @note 
    # howto build project
    # 		make BIN_NAME="bin_name_by_you_want" rebuild
    # makefile code need tab key not sapce key
    
    MY_MAKE_FILE_PATH_NAME = $(MAKEFILE_LIST)
    
    # macro from Makefile command line
    # BIN_NAME
    
    # macro to C project
    MAKE_FILE_MACRO__BIN_NAME="make_file_macro__bin_name"
    
    # var define on Makefile
    BIN = output_not_give_bin_name
    IS_BUILD_TYPE_VALID = 0
    
    ifdef BIN_NAME
    	IS_BUILD_TYPE_VALID = 1
    	BIN = $(BIN_NAME)
    	MAKE_FILE_MACRO__BIN_NAME=$(BIN_NAME)
    else
    	IS_BUILD_TYPE_VALID = 0
    endif
    
    LINE80 = --------------------------------------------------------------------------------
    
    # CC = g++ -std=c++98
    CC = g++
    
    # -Werror is "warning as error"
    CFLAGS = -Wall -Werror -g
    
    INC = -I. -I../third_party/libpcap/inc/ -I../third_party/libpcap/inc/pcap/
    
    # libpcap component is link to ../third_party/libpcap/lib/libpcap.a
    # when ldd after rebuild, can't see any libpcap*.so
    LIBPATH = -L. -L/usr/lib/ -L/usr/local/lib/ -L../third_party/libpcap/lib/
    
    ifeq (1, $(IS_BUILD_TYPE_VALID))
    	LIBS = -lstdc++ -pthread -lpcap
    else
    	LIBS =
    endif
    
    DEPEND_CODE_DIR = ../common/ \
    
    DEPEND_CODE_SRC = $(shell find $(DEPEND_CODE_DIR) -name '*.cpp')
    DEPEND_CODE_OBJ = $(DEPEND_CODE_SRC:.cpp=.o)
    
    ROOT_CODE_SRC = $(shell find ./ -name '*.cpp')
    ROOT_CODE_OBJ = $(ROOT_CODE_SRC:.cpp=.o)
    
    SUB_CODE_DIR = ./empty_dir
    SUB_CODE_SRC = $(shell find $(SUB_CODE_DIR) -name '*.cpp')
    SUB_CODE_OBJ = $(SUB_CODE_SRC:.cpp=.o)
    
    .PHONY: help
    help:
    	clear
    	@echo "usage:"
    	@echo
    	@echo "build project by given bin name"
    	@echo "make BIN_NAME=\"bin_name_by_you_want\" rebuild"
    	@echo
    
    .PHONY: clean
    clean:
    	clear
    
    	@echo
    	@echo
    	@echo
    	@echo
    	@echo
    	@echo
    	@echo
    	@echo
    	@echo
    	@echo
    
    	@echo
    	@echo
    	@echo
    	@echo
    	@echo
    	@echo
    	@echo
    	@echo
    	@echo
    	@echo
    
    	@echo
    	@echo
    	@echo
    	@echo
    	@echo
    
    	@echo "make clean begin"
    	@echo $(LINE80)
    
    	@echo "@file $(MY_MAKE_FILE_PATH_NAME)"
    	@echo "IS_BUILD_TYPE_VALID = $(IS_BUILD_TYPE_VALID)"
    	@echo "BIN = $(BIN)"
    
    	@echo $(LINE80)
    
    	rm -f $(ROOT_CODE_OBJ) $(DEPEND_CODE_OBJ) $(SUB_CODE_OBJ)
    
    ifeq (1, $(IS_BUILD_TYPE_VALID))
    	rm -f ./$(BIN)
    endif
    
    	@echo "make clean over"
    
    .PHONY: all
    all:$(BIN)
    	@echo $(LINE80)
    	@echo make all
    	chmod 777 ./$(BIN)
    	find . -name "$(BIN)"
    
    $(BIN) : $(ROOT_CODE_OBJ) $(DEPEND_CODE_OBJ) $(SUB_CODE_OBJ)
    	$(CC) $(CFLAGS) -o $@ $^ $(SHLIBS) $(INC) $(LIBPATH) $(LIBS)
    
    .cpp.o:
    	$(CC) -c $(CFLAGS) -DMAKE_FILE_MACRO__BIN_NAME="\"$(MAKE_FILE_MACRO__BIN_NAME)\"" $^ -o $@ $(INC) $(LIBPATH) $(LIBS)
    
    .PHONY: rebuild
    rebuild:
    	make -f $(MY_MAKE_FILE_PATH_NAME) clean
    
    ifeq (1, $(IS_BUILD_TYPE_VALID))
    	@echo $(LINE80)
    	make -f $(MY_MAKE_FILE_PATH_NAME) all
    	chmod 775 ./$(BIN)
    	ldd ./$(BIN)
    else
    	@echo $(LINE80)
    	@echo "error : Makefile command line input error, please see help"	
    	@echo "please run => make help"	
    	@echo $(LINE80)
    endif
    
    
    
    #!/bin/bash
    # ==============================================================================
    # @file build_all_project.sh
    # ==============================================================================
    
    make BIN_NAME="test_pcap_save_as_by_condition" rebuild
    
    
    
    展开全文
  • WinPcap Pcap_findalldevs_ex() pcap_if

    千次阅读 2015-12-22 12:46:39
    ⑴typedef struct pcap_if pcap_if_t cap_if在incs/pcap.h文件的72行有定义 ⑵pcap_if结构里面的数据域:struct pcap_if { pcap_if * next; //指向下一个元素的指针;如果是NULL,表示链表结束。 char * name ;...

    ①pcap_if 结构:


    typedef struct pcap_if pcap_if_t

    cap_if在incs/pcap.h文件的72行有定义
    ⑵pcap_if结构里面的数据域:

    struct pcap_if
    {
     pcap_if *  next; //指向下一个元素的指针;如果是NULL,表示链表结束。
     char *  name  ;//一个指向字符串的指针,该字符串是winpcap为网络接口卡分配的名字,作为一个参数传递给pcap_open_live(),用于打开网卡
     char *description;//   textual description of interface, or NULL
     pcap_addr * addresses ;//指向接口的地址列表的第一个元素
     u_int flags;//标志是不是回送网卡。 PCAP_IF_INTERFACE 标志。当接口是回送接口(loopback)标志是PCAP_IF_LOOPBACK
      }

    ②pcap_addr结构:代表一个接口地址,在pcap.h中定义
    数据域:
    pcap_addr * next
    //if not NULL, a pointer to the next element in the list; NULL for the last element of the list
    sockaddr * addr
    //a pointer to a struct sockaddr containing an address
    sockaddr * netmask
    // if not NULL, a pointer to a struct sockaddr that contains the netmask corresponding to the address pointed to by addr.
    sockaddr *broadaddr
    // if not NULL, a pointer to a struct sockaddr that contains the broadcast address corre­ sponding to the address pointed to by addr; may be null if the interface doesn’t support broadcasts
    sockaddr * dstaddr
    // if not NULL, a pointer to a struct sockaddr that contains the destination address corre­ sponding to the address pointed to by addr; may be null if the interface isn’t a point- to-point interface
    ⑶函数说明

    pcap_findalldevs_ex(char *source, struct pcap_rmtauth *auth, pcap_if_t **alldevs, char *errbuf  )
    

    pcap_findalldevs_ex函数获得网络设备的一个列表,并且这个列表可以被pcap_open()打开。
    Pcap_findalldevs_ex()是pcap_findalldevs()的超集,后者是以前的老函数,它只能列出在本地机器的设备。相反,pcap_findalldevs_ex可以列出远程及其上面的设备。除此之外,它还可以列出某个给定的具体目录下面的所有的pcap文件的列表。而且,pcap_findalldevs_ex()还是平台独立的,因为它依靠标准的pcap_findalldevs()来在本地机器上获得地址 。和pcap_findalldevs()获得接口名称(alldevs->name )已经可以直接作为参数传递给pcap_open()进行调用。但是pcap_findalldevs_ex()不能,它得到的结果必须要先用Pcap_createsrcstr()进行格式化,然后把source 标识符传递给pcap_open()。
    如果该函数必须列出远程机器上的接口,它打开一个新的控制连接来连接远程机器,然后获得接口,完成后就释放连接。但是,如果该函数检测到远程机器是处于非活动状态,这个连接不会被释放。
    参数说明:
    Source : 指定从哪获取网络接口设备列表。它和pcap_open()使用通用的语法。它是一个字符串,用来存放源位置(source location),例如:source 可以是”rpcap://”,表示本地适配器;也可以是”rpcap://host:port”,表示远程主机上面的适配器;还可以是pcap文件,例如”rpcap://c:/myfolder/”。

    auth:指向pcap_rmtauth结构的指针,用来保存连接到远程主机上授权信息。在查询本地机器时,此参数没什么意义,可以为NULL。

    alldevs: 指向pcap_if_t结构的指针,该指针不需要初始化,它会在函数的调用过程中进行初始化。此函数返回时,该指针被设置为所获得的设备接口列表的第一个元素,列表的每一个元素都是Pcap_if_t结构。

    返回值:成功返回0,alldevs返回设备列表,alldevs不会为NULL。否则返回-1,那就是说系统没有任何接口可以列举的。出错的消息在errbuf里面返回,错误可能由下面的原因造成的:

    注意:
    接口列表一定要手动释放,通过调用pcap_freealldevs()函数。

    Source参数的语法:
    ⑴两个宏定义:
    #define PCAP_SRC_FILE_STRING “ file://”
    #define PCAP_SRC_IF_STRING “rpcap://”
    此两个宏在remote-ext.h里面定义。
    (2)详细描述
    下面列举出了能够被pcap_open()函数打开的格式:
    file://path_and_filename [打开一个本地文件]
    rpcap://devicename [打开本地机器上面的可以打开的设备,不使用rpcap协议]
    rpcap://host/devicename [打开远程机子上可以打开的设备]
    rpcap://host:port/devicename [打开远程机器上面选择的设备,用一个非标准端口作为rpcap]
    adaptername [打开一个本地适配器,kept for compability,不推荐]
    (NULL) [打开第一个本地适配器,kept for compability,不推荐]

    Pcap_findalldevs_ex()允许的格式如下:

    file://folder/ [列出指定目录的所有文件]
    rpcap:// [列出本地的适配器]
    rpcap://host:port/ [列出远程机器上的可以列出的设备]

    关于host和port参数,可以为数字或者字母。由于支持IPV6,它们可以是下面的格式:
    host (literal): e.g. host.foo.bar
    host (numeric IPv4): e.g. 10.11.12.13
    host (numeric IPv4, IPv6 style): e.g. [10.11.12.13]
    host (numeric IPv6): e.g. [1:2:3::4]
    port: can be either numeric (e.g. ‘80’) or literal (e.g. ‘http’)

    展开全文
  • 请问调用pcap_open_offline 之后再使用pcap_next_ex 但是报bogus savefile header的问题怎么解决呢
  • pcap_loop, pcap_dispatch - process packets from a live capture or savefile 处理抓取的数据包 函数原型 #include <pcap/pcap.h> typedef void (*pcap_handler)(u_char *user, const struct pcap_pkthdr *...

    pcap_loop, pcap_dispatch - process packets from a live capture or savefile
    处理抓取的数据包

    函数原型
    #include <pcap/pcap.h>
    typedef void (*pcap_handler)(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes);
    int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user);
    int pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user);

    pcap_loop()处理捕获给定的cnt个数据包,如果给定的参数cnt是-1或0,则表示将无限的捕获数据包。
    回调函数pcap_handler处理具体的数据包,
    回调函数有三个参数:
    u_char *user参数是pcap_loop通过user(第三个参数)传递给pcap_handler的;
    const struct pcap_pkthdr *h参数表示包的时间戳和长度;
    const u_char *bytes参数表示h中长度的数据。

    pcap_loop() processes packets from a live capture or ``savefile'' until cnt packets are processed, the end of the ``savefile'' is reached when reading from a ``savefile'', pcap_breakloop(3PCAP) is called, or an error occurs. It does not return when live packet buffer timeouts occur. A value of -1 or 0 for cnt is equivalent to infinity, so that packets are processed until another ending condition occurs. 

    callback specifies a pcap_handler routine to be called with three arguments: a u_char pointer which is passed in the user argument to pcap_loop() or pcap_dispatch(), a const struct pcap_pkthdr pointer pointing to the packet time stamp and lengths, and a const u_char pointer to the first caplen (as given in the struct pcap_pkthdr a pointer to which is passed to the callback routine) bytes of data from the packet. The struct pcap_pkthdr and the packet data are not to be freed by the callback routine, and are not guaranteed to be valid after the callback routine returns; if the code needs them to be valid after the callback, it must make a copy of them. 

    展开全文
  • pcap_findalldevs_ex(char *source, structpcap_rmtauth*auth,pcap_if_t**alldevs, char *errbuf) 功能 创建一个网络设备列表,它们可以由pcap_open()打开。 返回值:0表示查找成功。-1表示查找失败 ...

     

    功能:

    int pcap_findalldevs_ex (char *source, struct pcap_rmtauth *auth, pcap_if_t **alldevs, char *errbuf)
    功能创建一个网络设备列表,它们可以由 pcap_open()打开。 

            返回值:0表示查找成功。-1表示查找失败

     

     

    参数介绍:

          1、“ source”指定是本地适配器或者远程适配器,它告诉函数必须在哪里进行查找,并且使用与pcap_open()相同的语法。

               本地适配器:'rpcap://'

               远程适配器:'rpcap://host:port'

               抓包文件。'file://c:/myfolder/'.

            可以填写以下两个参数。

           2、struct pcap_rmtauth  *auth             (auth参数可以为NULL.)

                  struct pcap_rmtauth的定义如下:

    struct pcap_rmtauth
    {
        int type;            //简要身份验证所需的类型。
        char *username;      //用户名
        char *password;      //密码
    };

         3、pcap_if_t **alldevs

                   alldevs参数用于存放获取的适配器数据。如果查找失败,alldevs的值为NULL.

         4、char *errbuf

                   errbuf参数存放查找失败的信息。

    展开全文
  • 详解 pcap_findalldevs_ex

    千次阅读 2019-10-04 13:57:11
    pcap是packet capture的缩写。意为抓包。 功能:查找所有网络设备 原型:int pcap_findalldevs_ex(char* source, struct pcap_rmtauth *auth, pcap_if_t** alldevs, char* errbuf ); 返回值:0表示查找成功。-1...
  • pcap_compile手册

    2020-07-07 14:31:48
    The resulting filter program can then be applied to some stream of packets to determine which packets will be supplied topcap_loop(3PCAP),pcap_dispatch(3PCAP),pcap_next(3PCAP), orpcap_ne...
  • pcap_open_offline

    千次阅读 2018-09-25 11:26:11
    pcap_open_offline可以打开离线文件. 剩下的步骤和直接抓包分析是一样的, 可能得去掉pcap_activate等只适合实际网卡的API. 在做实验的过程中,居然发现vs2017(15.8.28010.0)也可以对变量名进行重构, 方便很多啊. ...
  • pcap_t *pp_read_pack = pcap_open_offline(inFile.c_str(), errbuf); assert(pp_read_pack); //读pcap文件 struct pcap_pkthdr ppHdr; //pcap数据包头,16字节 const u_char *pkt; while...
  • 使用pcap_findalldevs_ex 编程出现问题

    千次阅读 2012-08-29 19:44:54
    使用pcap_findalldevs_ex 编程出现问题 分类: C/C++/MFC 2011-10-12 14:42 353人阅读 评论(0) 收藏 举报  使用pcap_findalldevs_ex()函数编程,在文档中是这样介绍这个函数的: This function is a ...
  • pcap_t

    2014-03-25 00:15:00
    认识pcap_t 实例 handle = { fd = 7, // 文件描述符 snapshot = 8192, // 可以接收的最大长度 linktype = 1, // LINKTYPE_ETHERNET 1 链路层的类型 tzoff = 0, /* timezone offset */ offset = 2, /* offset for p...
  • Not using PCAP_FRAMES 解释(snort中)

    千次阅读 2011-04-18 18:30:00
    “Not using PCAP_FRAMES”, A.k.a When good verbosity goes bad在启动snort的时候,会提示:Not using PCAP_FRAMES上网查了一些资料,其中最经典的是下面的一个帖子,来自...
  • 最近在G+上无意发现一个一个好东西——Pcap_DNSProxy,这是一个运行在Windows上的DNS服务程序,主要功能是防止DNS污染。以前我都是在linux系统上使用Pdnsd搭建防污染的DNS服务器,现在家用的Windows电脑单也可以轻松...
  • pcap:packet capture! libpcap使用总结!libpcap 是一个开发sniffer的工具包。pcap:packet capture!libpcap的数据类型定义:struct pcap_addr:网卡地址描述{ pcap_addr * next; sockaddr * a
  • pcap:packet capture! libpcap使用总结!libpcap 是一个开发sniffer的工具包。pcap:packet capture!libpcap的数据类型定义:struct pcap_addr:网卡地址描述{ pcap_addr * next; sockaddr * add
  • pcap_捕获以太网数据包(二)

    千次阅读 2006-10-25 14:37:00
    与上个例子不同的是这个例子中采用pcap_loop()作为捕包函数,同时调用回调函数pcap_packet_call_back()对数据包进行分析。/*****************************************************************************
  • 对于类似这类问题,移动-lpcap到命令行的末尾 具体原因请看https://stackoverflow.com/questions/45135/linker-order-gcc
  • ./tcpdump -i wlan0 -p -vv -s 0 ./tcpdump -i any -p -vv -s 0 1|msm8953_64:/data/local/test # ./tcpdump -i rmnet_data0 -p -vv -s 0 tcpdump: listening on rmnet_data0, link-...tcpdump: pcap_loop: cooked-mo.
  • libpcap版本1.3.0-PRE-GIT #include #include #include #define __USE_BSD #include ...#define Debug(format, ...) fprintf(stderr, "%s:%d: "format "\n", __FILE__, __LINE__, ##__VA_ARGS__)
  • /usr/local/lib/libpcap.so: undefined reference to `pcap_parse’ collect2: ld returned 1 exit status 由于才更新了ubuntu11.04,故原来装的libpcap有点问题也情有可原,但是怎么办才好呢 网上逛了一圈...
  • pcap文件格式解析

    2021-04-23 17:20:44
    def rdpcap(pcap_file): with open(pcap_file, "rb") as f: # 读取抓包文件 content = f.read() pcap_header = content[:24] # 切片获取pcap头部 print(pcap_header) content = content[24:] while conte.
  • pcap2flowchart:将pcap文件转换成流程图 该程序将读取包含SIP / RTP / DNS / Diameter / M2UA协议的pcap格式的信令数据,并将其转换为呼叫跟踪流程图。... 输出文件名将是带有your_pcap_file的第一个时间戳的PNG格式。
  • print("___________以下为\"__file__\"参数执行结果___________") #”__file__“参数 #获取脚本所在目录, 在脚本所在目录执行时返回路径为空 pathdirname = os.path.dirname(__file__) print ("pathdirname ...
  • 注意事项 : 1.仅限linux/uninx 使用 2.不需要任何第三方库,仅用标准库 3.格式为公开格式,可以whireshark 直接打开 ...class Pcap: ... self.pcap_file = open(filename, 'wb') self.pcap_file.write(struct.pack
  • PCAP 文件格式协议分析

    千次阅读 2011-12-15 11:44:33
    PCAP 文件格式协议分析 时间:2010-02-09 11:20来源:未知 ... pcap文件格式 结构 文件头 格式如结构体 pcap_file_header 数据包头 1 格式如 pcap_pkthdr 数据包 数据 包 数据包头 n-1 格式如 pcap_pkthdr 数据包
  • pcap文件格式及写pcap文件

    千次阅读 2019-05-13 10:10:09
    一、pcap文件格式(该部分引用网络资料) pcap文件格式及文件解析 第一部分:PCAP包文件格式 (一)、基本格式: 文件头 数据包头 数据报 ... struct pcap_file_header { bpf_u_int32 magic; u_short version_majo...
  • wireshark--pcap包格式分析

    千次阅读 2013-09-17 13:48:16
    格式如结构体pcap_file_header  数据包头1   格式如pcap_pkthdr  数据包  数据包  数据包头n-1   格式如pcap_pkthdr  数据包  数据包  数据包头n   格式如pcap_...
  • pcap文件格式

    2017-01-31 19:03:30
    工作原因需要对抓到的数据解析后在存成pcap格式的文件,这里对pcap文件格式做简单分析 一 基本格式: 文件头 数据包头 数据报数据包头数据报…… ... sturct pcap_file_header { DWORD magic; DWORD vers

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,050
精华内容 3,220
关键字:

pcap_file