0

自分でスニファーを書いているときに、イーサネットについて話している場合にのみ開始する例を1つ見つけました。他のDLT_typesは無視されています。それらはpcap-bpf.hにあります。欠落しているpcap_resolve_dlt()を実装しようとする行をいくつか書きました。これは本当に厄介なコード(1)で、機能しているようですが、次のように対応する番号にスペースを入れる必要がある厄介なバグに遭遇しました。

user@debian:~/tmp$ ./resolve_dlt 114
DLT_LTALK       114
user@debian:~/tmp$ ./resolve_dlt 14
DLT_ATM_RFC1483 11
user@debian:~/tmp$ ./resolve_dlt " 14"
DLT_RAW         14

たぶん、アプローチ自体は完全に間違っているので、pcap-bpf.hを直接grepする必要があります。

1)http://nopaste.info/4a2470cc83.html、strstr()を使用

敬具、

チャールズ

タグ:C libpcap DLT_

4

3 に答える 3

0

トークン貼り付け演算子を使用して、この作業を少し改善することができます。

#include <stdlib.h>
#include <stdio.h>
#include <pcap-bpf.h>

#define TAB_ENTRY(x) { x, #x }

struct {
    long dlt_code;
    const char *dlt_name;
} dlt_tab[] = {
    TAB_ENTRY(DLT_NULL),
    TAB_ENTRY(DLT_EN10MB),
    TAB_ENTRY(DLT_EN3MB),
    TAB_ENTRY(DLT_AX25),
    TAB_ENTRY(DLT_PRONET),
    TAB_ENTRY(DLT_CHAOS),
    TAB_ENTRY(DLT_IEEE802),
    TAB_ENTRY(DLT_ARCNET),
    TAB_ENTRY(DLT_SLIP),
    TAB_ENTRY(DLT_PPP),
    TAB_ENTRY(DLT_FDDI),
    TAB_ENTRY(DLT_ATM_RFC1483),
    TAB_ENTRY(DLT_RAW),
    TAB_ENTRY(DLT_RAW),
    TAB_ENTRY(DLT_SLIP_BSDOS),
    TAB_ENTRY(DLT_PPP_BSDOS),
    TAB_ENTRY(DLT_SLIP_BSDOS),
    TAB_ENTRY(DLT_PPP_BSDOS),
    TAB_ENTRY(DLT_ATM_CLIP),
    TAB_ENTRY(DLT_REDBACK_SMARTEDGE),
    TAB_ENTRY(DLT_PPP_SERIAL),
    TAB_ENTRY(DLT_PPP_ETHER),
    TAB_ENTRY(DLT_SYMANTEC_FIREWALL),
    TAB_ENTRY(DLT_C_HDLC),
    TAB_ENTRY(DLT_C_HDLC),
    TAB_ENTRY(DLT_IEEE802_11),
    TAB_ENTRY(DLT_FRELAY),
    TAB_ENTRY(DLT_LOOP),
    TAB_ENTRY(DLT_LOOP),
    TAB_ENTRY(DLT_ENC),
    TAB_ENTRY(DLT_ENC),
    TAB_ENTRY(DLT_LINUX_SLL),
    TAB_ENTRY(DLT_LTALK),
    TAB_ENTRY(DLT_ECONET),
    TAB_ENTRY(DLT_IPFILTER),
    TAB_ENTRY(DLT_PFLOG),
    TAB_ENTRY(DLT_CISCO_IOS),
    TAB_ENTRY(DLT_PRISM_HEADER),
    TAB_ENTRY(DLT_AIRONET_HEADER),
    TAB_ENTRY(DLT_HHDLC),
    TAB_ENTRY(DLT_IP_OVER_FC),
    TAB_ENTRY(DLT_SUNATM),
    TAB_ENTRY(DLT_RIO),
    TAB_ENTRY(DLT_PCI_EXP),
    TAB_ENTRY(DLT_AURORA),
    TAB_ENTRY(DLT_IEEE802_11_RADIO),
    TAB_ENTRY(DLT_TZSP),
    TAB_ENTRY(DLT_ARCNET_LINUX),
    TAB_ENTRY(DLT_JUNIPER_MLPPP),
    TAB_ENTRY(DLT_JUNIPER_MLFR),
    TAB_ENTRY(DLT_JUNIPER_ES),
    TAB_ENTRY(DLT_JUNIPER_GGSN),
    TAB_ENTRY(DLT_JUNIPER_MFR),
    TAB_ENTRY(DLT_JUNIPER_ATM2),
    TAB_ENTRY(DLT_JUNIPER_SERVICES),
    TAB_ENTRY(DLT_JUNIPER_ATM1),
    TAB_ENTRY(DLT_APPLE_IP_OVER_IEEE1394),
    TAB_ENTRY(DLT_MTP2_WITH_PHDR),
    TAB_ENTRY(DLT_MTP2),
    TAB_ENTRY(DLT_MTP3),
    TAB_ENTRY(DLT_SCCP),
    TAB_ENTRY(DLT_DOCSIS),
    TAB_ENTRY(DLT_LINUX_IRDA),
    TAB_ENTRY(DLT_IBM_SP),
    TAB_ENTRY(DLT_IBM_SN),
    TAB_ENTRY(DLT_USER0),
    TAB_ENTRY(DLT_USER1),
    TAB_ENTRY(DLT_USER2),
    TAB_ENTRY(DLT_USER3),
    TAB_ENTRY(DLT_USER4),
    TAB_ENTRY(DLT_USER5),
    TAB_ENTRY(DLT_USER6),
    TAB_ENTRY(DLT_USER7),
    TAB_ENTRY(DLT_USER8),
    TAB_ENTRY(DLT_USER9),
    TAB_ENTRY(DLT_USER10),
    TAB_ENTRY(DLT_USER11),
    TAB_ENTRY(DLT_USER12),
    TAB_ENTRY(DLT_USER13),
    TAB_ENTRY(DLT_USER14),
    TAB_ENTRY(DLT_USER15),
    TAB_ENTRY(DLT_IEEE802_11_RADIO_AVS),
    TAB_ENTRY(DLT_JUNIPER_MONITOR),
    TAB_ENTRY(DLT_BACNET_MS_TP),
    TAB_ENTRY(DLT_PPP_PPPD),
    TAB_ENTRY(DLT_PPP_PPPD),
    TAB_ENTRY(DLT_PPP_PPPD),
    TAB_ENTRY(DLT_JUNIPER_PPPOE),
    TAB_ENTRY(DLT_JUNIPER_PPPOE_ATM),
    TAB_ENTRY(DLT_GPRS_LLC),
    TAB_ENTRY(DLT_GPF_T),
    TAB_ENTRY(DLT_GPF_F),
    TAB_ENTRY(DLT_GCOM_T1E1),
    TAB_ENTRY(DLT_GCOM_SERIAL),
    TAB_ENTRY(DLT_JUNIPER_PIC_PEER),
    TAB_ENTRY(DLT_ERF_ETH),
    TAB_ENTRY(DLT_ERF_POS),
    TAB_ENTRY(DLT_LINUX_LAPD),
    TAB_ENTRY(DLT_JUNIPER_ETHER),
    TAB_ENTRY(DLT_JUNIPER_PPP),
    TAB_ENTRY(DLT_JUNIPER_FRELAY),
    TAB_ENTRY(DLT_JUNIPER_CHDLC),
    TAB_ENTRY(DLT_MFR),
    TAB_ENTRY(DLT_JUNIPER_VP),
    TAB_ENTRY(DLT_A429),
    TAB_ENTRY(DLT_A653_ICM),
    TAB_ENTRY(DLT_USB),
    TAB_ENTRY(DLT_BLUETOOTH_HCI_H4),
    TAB_ENTRY(DLT_IEEE802_16_MAC_CPS),
    TAB_ENTRY(DLT_USB_LINUX),
    TAB_ENTRY(DLT_CAN20B),
    TAB_ENTRY(DLT_IEEE802_15_4_LINUX),
    TAB_ENTRY(DLT_PPI),
    TAB_ENTRY(DLT_IEEE802_16_MAC_CPS_RADIO),
    TAB_ENTRY(DLT_JUNIPER_ISM),
    TAB_ENTRY(DLT_IEEE802_15_4),
    TAB_ENTRY(DLT_SITA),
    TAB_ENTRY(DLT_ERF),
    TAB_ENTRY(DLT_RAIF1),
    TAB_ENTRY(DLT_IPMB),
    TAB_ENTRY(DLT_JUNIPER_ST),
    TAB_ENTRY(DLT_BLUETOOTH_HCI_H4_WITH_PHDR)
};

int main(int argc, char *argv[])
{
    char *endptr = NULL;
    long code;
    int i, found;

    if (argc > 1)
        code = strtol(argv[1], &endptr, 0);

    if (!endptr || endptr == argv[1]) {
        fprintf(stderr, "Usage: %s <dlt_code>\n", argv[0]);
        exit(2);
    }

    found = 0;
    for (i = 0; i < (sizeof dlt_tab / sizeof dlt_tab[0]); i++) {
        if (dlt_tab[i].dlt_code == code) {
            found = 1;
            break;
        }
    }

    if (!found) {
        printf("%ld not found\n", code);
        exit(1);
    }

    printf("%ld is %s\n", code, dlt_tab[i].dlt_name);
    return 0;
}

例:

$ ./bpf 12
12 is DLT_RAW
$ ./bpf 120
120 is DLT_AIRONET_HEADER

DLT_RAW(12はLinuxシステム上にあり、14ではないことに注意してください)。

于 2011-01-18T03:53:20.787 に答える
0

strstr(dlt[i],argv[1]) を実行しているため、最初の「14」は「DLT_ATM_RFC1483」のテキストと一致しますが、テキスト「14」は「DLT_RAW 14」のテキストと一致します。

于 2011-01-18T00:44:32.900 に答える
0

少なくとも libpcap/WinPcap の新しいバージョンではpcap_datalink_val_to_name、DLT_ 値を DLT_ 名にマップするために使用できます。 resolve_dlt最初の引数で strtol() を使用し、結果を に渡すことができますpcap_datalink_val_to_name(もちろん、エラーのチェックと int に収まらない値のチェックの後)。

于 2011-07-26T05:27:56.673 に答える