OpenDPI-1.3.0源代码分析:
1.OpenDPI_demo中的main函数:
该main函数主要由七个子函数组成,他们分别为:
1.1parseOptions:处理给定的参数,比如运行时指定的:-f ./http.pcap,分析参数是否正确。该函数不是非常重要,但如果我们改写程序时想要程序能有新的功能,可以在这里添加类似开关的代码,如定义一些宏。
1.2setupDetection:非常重要的初始化函数,其会的初始化整个程序的最重要的数据结构:ip
oque_struct,所有协议的回调函数都是在这里进行绑定的,下面两个函数会的进行重点分析:
除了初始化ipoque_struct外,还会的给几个全局变量分配内存,这些全局变量包括:
osdpi_ids:所有id对应的变量,每个id用来连接一个IP与一个表示该IP的ID
osdpi_flows:所有flow对应的变量,每个flows用来连接一个flow与一个表示该flow的KEY
protocol_counter,protocol_counter_bytes:与协议相关的计数器,类型为数组
1.3openPcapFile:常规的打开pcap文件
1.4runPcapLoop:处理pcap的主循环,这个程序的灵魂,其会的最终通过回调函数来调用各个协议的分析函数。
1.5closePcapFile:常规的关闭pcap文件
1.6printResults:输出统计结果的数据,请注意观察下面的两个循环:
你会发现最终我们的结果存在与prot_long_str,protocol_counter,protocol_counter_bytes以及osdpi_flows这几个全局变量中,所以这几个变量我们在分析的时候需要着重分析。这些全局变量的初始化详见1.2
1.7terminateDetection:处理程序的善后工作,比如free掉我们在1.2里建立的那几个全局变量。换句话说,如果我们在程序运行中间使用了ctrl+c中断了程序,那么就会造成内存泄漏。
2.setupDetection()
2.1该函数为整个程序的初始化设定函数,所有回调函数的绑定,全局变量的定义都来自这个函数。下面我们来分析一下其几个重要的函数调用
2.2ipoque_init_detection_module
该函数:
返回值:一个ipoque_detection_module_struct的指针,其指向的对象为该程序的核心数据结构。整个程序有且只有一个该结构
参数1:tick_per_second 这里的实参为1000,指每秒的时钟滴答(具体干什么用的不清楚,好像是用来说明cpu每秒多少个时钟滴答的)
参数2:ipoque_malloc,指定的用来分配内存的类似于malloc的函数
参数3:ipoque_debug_printf,指定的用来进行debug下的print的函数
总的来说,该函数就是用malloc函数分配了一个ipoque_detection_module_struct,该结构体中的许多成员被设定成了默认值。并返回指向该结构体的指针。注意,该函数并未让该结构体绑定回调函数。
2.3ipoque_set_protocol_detection_bitmask2
所有的回调函数都有该函数进行绑定,大部分标志位(bitmask)的处理,也由该函数进行初始化。
下面进行具体的分析
2.3.1调用IPOQUE_BITMASK_SET,使所有标志位使能:
2.3.2一个size:
这里的callback_buffer_size是指的回调函数的个数,为了安全起见我们现在先设置其为0,其作用可以见我下面要分析的runPcapLoop函数
2.3.3接下来就是具体协议的绑定了,你会的看到非常多的ifndef这样的预处理语句:
终于,我们在这里就能看到期待已久的与具体协议有关的内容了。让我们来看一下他到底做了些什么:
注意IPOQUE_COMPARE_PROTOCOL_TO_BITMASK这个宏,在这里他的意思是:如果
在detection_bitmask中设置了IPOQUE_PROTOCOL_MPEG这个标志位,那么就跳转到hack_do_http_detection去进行处理。正如之前看到的,detection_bitmask应该被设置为全1了,所以其会转到hack_do_http_detection
注意,该函数在hack_to_http_detection之前会有许多的这样的语句,因为这些协议都可以视为需要使用http_detection,所以只要有一个这样的协议定义了,就得执行http_detection
再来看看hack_to_http_detection到底做了什么吧:
iapp免费源码分享网站
首先,当然是绑定具体的处理函数啦。这些处理函数到底做了什么我们先不管,以后我会的花大量的时间分析这些处理函数,这里我们先看看其接下来做了什么。
Ipq_selection_bitmask是指如果这些协议被定义了的话,如果我们需要使用被绑定的ipoque_search_http_tcp函数,我们就需要该packet为IPV4或者IPV6,且需要拥有PAYLOAD才行。这个在我们分析完runPcapLoop后你就会清楚它是干啥的了。
接下来是对于标志位的处理:
detection_bitmask:需要detective的protocol
excluded_protocol_bitmask:排除在外不需要detective的protocol
这两个标志位在runPcapLoop就能看到其作用了,这需要与osdpi_flows连起来看才行。
在hack_do_http_detection的最后,我们看到了一句:
嗯,终于对于http的回调函数以及一些标志位的设置告一段落了。http之所以这么长是由于有太多的协议都会使用他,所以对于这些协议,我们都得用http的处理函数去处理一遍
然后其它的协议就是依样画葫芦了,比如接下来的SSL:
嗯,先是判定这个协议要不要检测,然后绑定回调函数,设置这个函数在什么时候要用,然后设置那几个标志位。是的,接下来的大部分初始化函数就只是做了这么几件事罢了,直到一些新的代码的出现:
正如注释说的一样,下面是为一些特殊的packet绑定的回调函数,这些特殊的packet主要有四种:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。