最近一直在做Peach对应用程序的自动化模糊测试,但是网上的资料少之又少,官网的说明虽然很详细,但是sample相对较少,很多功能都是需要自己去摸索的。
最近因为项目需要,研究了一下pit的结构,以及通过publisher中的TcpClient属性来与外界交互,具体如下:
<?xml version="1.0" encoding="utf-8"?>
<Peach author="wx">
<DataModel name="Mocov1">
<Block name="block">
<Number name="Type" size="8" value="4"/>
</Block>
</DataModel>
<DataModel name="Mocov2">
<Blob name="Data1" length="4" value="12"/>
</DataModel>
<DataModel name="TheTest">
<String name="value" value="32" />
</DataModel>
<DataModel name="DataResponse">
<String name="Response" value="" />
</DataModel>
<StateModel name="TheState" initialState="State1">
<State name="State1">
<Action type="output" publisher="notUse">
<DataModel ref="Mocov1" />
</Action>
<Action type="input" publisher="rec">
<DataModel ref="DataResponse"/>
</Action>
<Action type="changeState" ref="State2" when="int(StateModel.states['State1'].actions[1].dataModel['Response'].InternalValue) == 0"/>
<Action type="changeState" ref="State3" when="int(StateModel.states['State1'].actions[1].dataModel['Response'].InternalValue) == 1"/>
</State>
<State name="State2">
<Action type="output" publisher="ParsedFile">
<DataModel ref="Mocov1"/>
<Data name="LoadFromFile" fileName="C:/Mocov/51001.txt" />
</Action>
</State>
<State name="State3">
<Action type="output" publisher="NotParsedFile">
<DataModel ref="Mocov2"/>
<Data name="LoadFromFile" fileName="C:/Mocov/4522.txt" />
</Action>
</State>
</StateModel>
<Test name="Default">
<StateModel ref="TheState"/>
<Publisher name="notUse" class="Console" />
<Publisher name="ParsedFile" class="FilePerIteration">
<Param name="FileName" value="C:/Mocov/seed/parsed/parsed_{0}.mocov"/>
</Publisher>
<Publisher name="NotParsedFile" class="FilePerIteration">
<Param name="FileName" value="C:/Mocov/seed/notparsed/not_parsed_{0}.mocov"/>
</Publisher>
<Publisher name="rec" class="TcpClient">
<Param name="Host" value=##HOST## />
<Param name="Port" value=##PORT##/>
</Publisher>
</Test>
</Peach>
这是一个比较完整的pit文件,通过Tcp协议,接受来自服务器的数据,这里的服务器我是在外部写了一个py程序,通过建立socket与Peach内置的socket进程进行通信。
在这里,我主要是想说明一下pit的逻辑:
-
<publisher name="rec">
:
这是一个与外界通信的publisher;首先,TcpClient将从服务器接收到的数据利用StateModel中的"action type=input
"放入到 datamodel中的DataResponse
中。这里要注意:在对应的state-->action
中,一定要标明其对应的publisher是哪个,不然对于pit的解析程序来说,是不能自动对应的,这样就会将该action作为一个正常的动作执行。例如,对于action[1]
,若是不指定publisher
,则程序会变异Mocov1
的数据,而不是将其作为输出到HOST -
action[3/4]
<Action type="changeState" ref="State2" when="int(StateModel.states['State1'].actions[2].dataModel['Response'].InternalValue) == 0"/>
:
这句语句执行的是一个判断,即when
属性后跟着一个py
判断句,判断由网络传进来的数据是否为0
,若是,则执行state2
.state2/3
这里也要注意action与publisher的对应 - 最后,
publisher
对应的action-->input
是指接受来自HOST
的数据,output
向HOST
输出数据。 - 需要注意,在
initialState
中必须要存在一个不需要任何条件就可以执行的action,不然会报错。
网友评论