我想用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
}