无限状态机是在学习网络的时候经常能够听到的一个词,尤其是我在用《计算机网络:自顶向下方法》学习TCP的时候,里面把每一个状态机都描述得十分清晰。简而言之,协议可以使用无限状态机来进行描述,接下来使用Netzob工具对官方提供的抓包pcap例子进行状态机的推断。下面介绍三种创建状态机的方式。
一、生成一个状态机链
在这里我们将生成一个能够说明指令和响应的顺序的基本状态机,每一个包发送后,都将导致状态的改变,因此取名为状态机链。
# Create a session of messages session = Session(messages_session1) # Abstract this session according to the inferred symbols abstractSession = session.abstract(list(symbols.values())) # Generate an automata according to the observed sequence of messages/symbols automata = Automata.generateChainedStatesAutomata(abstractSession, list(symbols.values())) # Print the dot representation of the automata dotcode = automata.generateDotCode() print(dotcode)
1、使用session.abstract()函数抽象得到abstractSession
2、 Automata.generateChainedStatesAutomata()函数能够通过symbols和abstractSession得到状态机链
3、使用generateDotCode()函数创建dotcode以便更好观察状态机
获得的状态机最终会被存放到dotcode内,这样做能够生成一个图像来显示状态机。运行上述代码得到的结果如下:
二、生成一个单一状态机
这次我们不将PCAP包转换成一系列的状态机,而是产生一个能够接收所有观察到的发送包引起状态变化的独特状态。对于每一个发送的包(例如:‘CMDencrypt’),我们都期待有一个特殊的响应(例如:‘REDencrypt’),使用如下代码完成上述工作:
# Create a session of messages session = Session(messages_session1) # Abstract this session according to the inferred symbols abstractSession = session.abstract(list(symbols.values())) # Generate an automata according to the observed sequence of messages/symbols automata = Automata.generateOneStateAutomata(abstractSession, list(symbols.values())) # Print the dot representation of the automata dotcode = automata.generateDotCode() print(dotcode)
1、使用session.abstract()函数抽象得到abstractSession
2、 Automata.generateOneStateAutomata()函数能够通过symbols和abstractSession得到状态机链
3、使用generateDotCode()函数创建dotcode以便更好观察状态机
获得的状态机最终也存放到dotcode来画出一个图以便观察,运行上述代码所得到的结果如下:
三、生成一个基于PTA的状态机
最后我们从第一和第三个数据包中,以PTA(Prefix-Tree Acceptor)的策略将状态机进行合并,形成一个状态机,代码如下:
# Create sessions of messages messages_session1 = PCAPImporter.readFile("target_src_v1_session1.pcap").values() messages_session3 = PCAPImporter.readFile("target_src_v1_session3.pcap").values() session1 = Session(messages_session1) session3 = Session(messages_session3) # Abstract this session according to the inferred symbols abstractSession1 = session1.abstract(list(symbols.values())) abstractSession3 = session3.abstract(list(symbols.values())) # Generate an automata according to the observed sequence of messages/symbols automata = Automata.generatePTAAutomata([abstractSession1, abstractSession3], list(symbols.values())) # Print the dot representation of the automata dotcode = automata.generateDotCode() print(dotcode)
1、使用session.abstract()函数抽象得到abstractSession
2、 Automata.generatePTAAutomata()函数能够通过symbols和abstractSession得到状态机链
3、使用generateDotCode()函数创建dotcode以便更好观察状态机
运行结果如下: