手动剖析Wireshark源中的数据包

时间:2018-07-21 13:28:33

标签: c wireshark tshark wireshark-dissector

我想用Wireshark源代码剖析UMTS的RRC UL-DCCH消息。我可以通过终端中的以下命令使用TShark来做到这一点:

tshark -o \"uat:user_dlts:\\\"User 0 (DLT=147)\\\",\\\"rrc.ul.dcch\\\",\\\"0\\\",\\\"\\\",\\\"0\\\",\\\"\\\"\" -r my.pcap

其中my.pcap是使用RRC UL-DCCH消息十六进制流制作的pcap文件。因此,我可以看到树状图,就像Wireshark的输出结果一样。

现在,我想用Wireshark源手动模拟TShark流程(我知道epan模块是为此目的),但是该模块需要先前层的信息,这些信息应该粘贴在{{1 }}个字节,我也不想这样做,也不知道该如何替换RRC UL-DCCH(在rrc.ul.dcch命令中)作为epan模块的输入,而不是以前所有的层信息。

是否有接口类或其他解决方案来解决此问题?

为了进行剖析,我使用以下代码来使用Wireshark源:

main.cpp

TShark

上面使用的函数位于:

capture.c

int err_code;
char *err_info;

ws_capture_init();
ws_capture_t *cap = ws_capture_open_offline("my.pcap", 0, &err_code, &err_info);
my_assert(cap, "Error %d: %s\n", err_code, err_info);

printf("File size: %" PRIu64 " B\n", ws_capture_file_size(cap));

ws_dissect_init();
ws_dissect_t *dissector = ws_dissect_capture(cap);
assert(dissector);

printf("Reading file: %s\n", ws_capture_filename(cap));

ws_dissect_free(dissector);
ws_capture_close(cap);

ws_dissect_finalize();
ws_capture_finalize();

dissect.c

int ws_capture_init(void) {
    init_process_policies();
    wtap_init();
    /* Register all libwiretap plugin modules. */
    register_all_wiretap_modules();
    /*wtap_register_plugin_types(); [> Types known to libwiretap <]*/

#ifdef _WIN32
    /* Start windows sockets */
    WSAStartup( MAKEWORD( 1, 1 ), &wsaData );
#endif /* _WIN32 */

#ifdef WITH_ONLINE_CAPTURE
    char *progfile = init_progfile_dir(NULL, NULL);
    (void)progfile;
#endif

    return 0;
}

ws_capture_t *ws_capture_open_offline(const char *path, int flags, int *err, char **err_info) {
    assert(flags == 0);
    int _err = 0;
    char *_err_info = NULL;
    Buffer buf;
    capture_file cfile;
    cap_file_init(&cfile);
    cfile.filename = g_strdup(path);
    /*if ((flags & WS_CAPTURE_SEQUENTIAL) == WS_CAPTURE_SEQUENTIAL) {*/
    ws_buffer_init(&buf, 1500);
    gboolean do_random = (strcmp(path, "-") == 0) ? FALSE : TRUE;

    cfile.wth = wtap_open_offline(cfile.filename, WTAP_TYPE_AUTO, &_err, &_err_info, do_random);
    if (cfile.wth == NULL) {
        PROVIDE_ERRORS;
        return NULL;
    }


    cfile.count = 0;
    timestamp_set_precision(TS_PREC_AUTO);

    cfile.frames = new_frame_data_sequence();

    ws_capture_t *cap = g_malloc0(sizeof *cap);
    cap->cfile = cfile;
    cap->buf = buf;

    return cap;
}

const char *ws_capture_filename(ws_capture_t *cap)
{
    return cap->cfile.filename;
}

void ws_capture_close(ws_capture_t *cap) {
    if (!cap) return;
    if (cap->cfile.frames) {
        // FIXME: crashes in some instances, for now it only leaks memory
        /*free_frame_data_sequence(cap->cfile.frames);*/
        cap->cfile.frames = NULL;
    }
    cap->cfile.frames = NULL;

    if (cap->cfile.wth)
        wtap_close(cap->cfile.wth);
    if (cap->is_live)
        ws_capture_live_close(cap);
    /*if (cf->is_tempfile) ws_unlink(cf->filename);*/
    g_free(cap->cfile.filename);

    wtap_phdr_cleanup(&cap->cfile.phdr);
    ws_buffer_free(&cap->cfile.buf);
    cap->cfile.wth = NULL;
    dfilter_free(cap->cfile.rfcode);
    ws_buffer_free(&cap->buf);
    g_free(cap);
}

void ws_capture_finalize(void) {

#ifdef _WIN32
    WSACleanup();
#endif
}

0 个答案:

没有答案