本發(fā)明屬于軟件技術(shù)領(lǐng)域,特別涉及一種測(cè)試用例生成方法及裝置。
背景技術(shù):
隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,工業(yè)控制領(lǐng)域的設(shè)備與設(shè)備之間依托著強(qiáng)大的互聯(lián)網(wǎng)也變得越來越緊密。各個(gè)工控設(shè)備之間一般地基于互聯(lián)網(wǎng)協(xié)議進(jìn)行數(shù)據(jù)交互與通信。例如,Modbus/TCP協(xié)議在工控行業(yè)得到了廣泛的應(yīng)用,它已不僅僅是一個(gè)PLC的通訊協(xié)議,在智能儀表、變頻器等許多智能設(shè)備都有相當(dāng)廣泛的應(yīng)用。雖然將工業(yè)控制設(shè)備連接到網(wǎng)絡(luò)能夠較為方便的實(shí)現(xiàn)遠(yuǎn)程管理和監(jiān)控,但在通信的同時(shí)也暴露了控制設(shè)備本身,從而使得控制設(shè)備容易受到惡意軟件和黑客的惡意攻擊,一旦工業(yè)控制網(wǎng)絡(luò)信息安全出現(xiàn)漏洞,將對(duì)工業(yè)生產(chǎn)運(yùn)行造成重大隱患。因此,如何減少工控網(wǎng)絡(luò)通信協(xié)議的安全隱患是一個(gè)亟待解決的問題。
目前對(duì)于協(xié)議安全的測(cè)試主要采用的方法為模糊測(cè)試方法。模糊測(cè)試是一種黑盒測(cè)試技術(shù)或隨機(jī)測(cè)試技術(shù),是協(xié)議安全測(cè)試的一種方式,它的基本原理是將大量的畸形數(shù)據(jù)輸入到目標(biāo)程序中,并監(jiān)視目標(biāo)程序執(zhí)行過程中產(chǎn)生的任何異常,記錄下導(dǎo)致異常的輸入數(shù)據(jù),從而定位目標(biāo)程序中缺陷的位置,發(fā)現(xiàn)可能存在的安全漏洞。
模糊測(cè)試中最為關(guān)鍵的是生成模糊測(cè)試數(shù)據(jù)的階段,也即測(cè)試用例的生成。然而,由于模糊測(cè)試具有盲目性,現(xiàn)有的模糊測(cè)試在生成測(cè)試用例時(shí)是在輸入數(shù)據(jù)空間內(nèi)任意取值,自動(dòng)產(chǎn)生和發(fā)送大量隨機(jī)的值,這樣產(chǎn)生的測(cè)試用例很大一部分在還沒有進(jìn)入到目標(biāo)程序內(nèi)部就被拒絕了,也即產(chǎn)生了許多無用的測(cè)試用例,導(dǎo)致隨機(jī)測(cè)試產(chǎn)生的測(cè)試時(shí)間長(zhǎng),大量冗余測(cè)試輸入,測(cè)試效率較低。此外,現(xiàn)有的模糊測(cè)試生成的測(cè)試用例大多是針對(duì)互聯(lián)網(wǎng)網(wǎng)絡(luò)協(xié)議的測(cè)試用例,對(duì)于工控協(xié)議,例如Modbus/TCP協(xié)議,并沒有專用的測(cè)試用例生成方法,使得Modbus/TCP協(xié)議的測(cè)試不具有針對(duì)性,測(cè)試效率較低。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提供了一種測(cè)試用例生成方法及裝置,用以解決現(xiàn)有技術(shù)中在采用模糊測(cè)試方法對(duì)Modbus協(xié)議進(jìn)行測(cè)試時(shí),測(cè)試用例盲目性大,不具有針對(duì)性,測(cè)試效率低的缺陷。
第一方面,本發(fā)明提供了一種測(cè)試用例生成方法,用于生成針對(duì)Modbus協(xié)議的測(cè)試用例,所述方法包括:
在預(yù)存的若干個(gè)功能碼中選取一個(gè)作為目標(biāo)功能碼;其中,所述若干個(gè)功能碼,為Modbus協(xié)議規(guī)定的執(zhí)行不同功能操作的數(shù)據(jù)包所對(duì)應(yīng)的若干個(gè)功能碼;
根據(jù)Modbus協(xié)議規(guī)定,獲取與所述目標(biāo)功能碼對(duì)應(yīng)的數(shù)據(jù)包中各個(gè)字段的定義;
選取功能碼字段以及各個(gè)字段中用于控制測(cè)試用例通信功能的字段作為不可變字段,將其余字段作為可變字段;將所述不可變字段設(shè)置為預(yù)設(shè)值,以使所述測(cè)試用例支持基于Modbus協(xié)議進(jìn)行通信;對(duì)所述可變字段中的至少一個(gè)字段進(jìn)行隨機(jī)變異,以生成與所述至少一個(gè)字段的定義不符或數(shù)據(jù)設(shè)置不符的測(cè)試用例。
可選地,所述對(duì)所述可變字段中的至少一個(gè)字段進(jìn)行隨機(jī)變異,以生成與所述至少一個(gè)字段的定義不符或數(shù)據(jù)設(shè)置不符的測(cè)試用例的步驟,包括:
對(duì)所有可變字段的數(shù)據(jù)進(jìn)行隨機(jī)變異,以生成與所述可變字段數(shù)據(jù)的定義不符的測(cè)試用例。
可選地,所述對(duì)所述可變字段中的至少一個(gè)字段進(jìn)行隨機(jī)變異,以生成與所述至少一個(gè)字段的定義不符或數(shù)據(jù)設(shè)置不符的測(cè)試用例的步驟,包括:
將所述可變字段中的一部分字段的數(shù)據(jù)逐一地或組合地設(shè)置為預(yù)設(shè)值,所述預(yù)設(shè)值包括所述字段定義的取值范圍內(nèi)的最大值、最小值或中間值;
對(duì)所述可變字段中的另一部分字段的數(shù)據(jù)進(jìn)行隨機(jī)取值變異,以生成與所述另一部分字段數(shù)據(jù)的定義不符的測(cè)試用例。
可選地,所述對(duì)所述可變字段中的至少一個(gè)字段進(jìn)行隨機(jī)變異,以生成與所述至少一個(gè)字段的定義不符或數(shù)據(jù)設(shè)置不符的測(cè)試用例的步驟,包括:
將所述可變字段中用于表示單元標(biāo)識(shí)符字段、功能碼字段以及數(shù)據(jù)域長(zhǎng)度的長(zhǎng)度字段設(shè)置為預(yù)設(shè)值,對(duì)所述單元標(biāo)識(shí)符字段、功能碼字段以及數(shù)據(jù)域中的任一項(xiàng)或其組合進(jìn)行變異而加長(zhǎng)或者壓縮實(shí)際長(zhǎng)度,以生成實(shí)際長(zhǎng)度與所述長(zhǎng)度字段的預(yù)設(shè)值不匹配的測(cè)試用例。
可選地,所述隨機(jī)變異包括數(shù)據(jù)元素刪除變異,數(shù)據(jù)元素重復(fù)變異,有效值變異,或在各字段定義的數(shù)值范圍內(nèi)的數(shù)值邊界變異。
第二方面,本發(fā)明提供了一種測(cè)試用例生成裝置,用于生成針對(duì)Modbus協(xié)議的測(cè)試用例,所述裝置包括:
功能碼選擇單元,用于在預(yù)存的若干個(gè)功能碼中選取一個(gè)作為目標(biāo)功能碼;其中,所述若干個(gè)功能碼,為Modbus協(xié)議規(guī)定的執(zhí)行不同功能操作的數(shù)據(jù)包所對(duì)應(yīng)的若干個(gè)功能碼;
獲取單元,用于根據(jù)Modbus協(xié)議規(guī)定,獲取與所述目標(biāo)功能碼對(duì)應(yīng)的數(shù)據(jù)包中各個(gè)字段的定義;
字段選擇變異單元,用于選取功能碼字段以及各個(gè)字段中用于控制測(cè)試用例通信功能的字段作為不可變字段,將其余字段作為可變字段;將所述不可變字段設(shè)置為預(yù)設(shè)值,以使所述測(cè)試用例支持基于Modbus協(xié)議進(jìn)行通信;對(duì)所述可變字段中的至少一個(gè)字段進(jìn)行隨機(jī)變異,以生成與所述至少一個(gè)字段的定義不符或數(shù)據(jù)設(shè)置不符的測(cè)試用例。
可選地,所述字段選擇變異單元,還用于對(duì)所有可變字段的數(shù)據(jù)進(jìn)行隨機(jī)變異,以生成與所述可變字段數(shù)據(jù)的定義不符的測(cè)試用例。
可選地,所述字段選擇變異單元,還用于:
將所述可變字段中的一部分字段的數(shù)據(jù)逐一地或組合地設(shè)置為預(yù)設(shè)值,所述預(yù)設(shè)值包括所述字段定義的取值范圍內(nèi)的最大值、最小值或中間值;
對(duì)所述可變字段中的另一部分字段的數(shù)據(jù)進(jìn)行隨機(jī)取值變異,以生成與所述另一部分字段數(shù)據(jù)的定義不符的測(cè)試用例。
可選地,所述字段選擇變異單元,還用于:
將所述可變字段中用于表示單元標(biāo)識(shí)符字段、功能碼字段以及數(shù)據(jù)域長(zhǎng)度的長(zhǎng)度字段設(shè)置為預(yù)設(shè)值,對(duì)所述單元標(biāo)識(shí)符字段、功能碼字段以及數(shù)據(jù)域中的任一項(xiàng)或其組合進(jìn)行變異而加長(zhǎng)或者壓縮實(shí)際長(zhǎng)度,以生成實(shí)際長(zhǎng)度與所述長(zhǎng)度字段的預(yù)設(shè)值不匹配的測(cè)試用例。
可選地,所述隨機(jī)變異包括數(shù)據(jù)元素刪除變異,數(shù)據(jù)元素重復(fù)變異,有效值變異,或在各字段定義的數(shù)值范圍內(nèi)的數(shù)值邊界變異。
本發(fā)明提供了一種測(cè)試用例生成方法及裝置,該方法中,首先選擇MODBUS協(xié)議的某一功能對(duì)應(yīng)的功能碼,再獲取具有該功能的數(shù)據(jù)包中包含的各個(gè)字段的定義,在各個(gè)字段中選擇控制MODBUS協(xié)議通信的字段作為不可變字段,其余為可變字段,并對(duì)至少一個(gè)可變字段進(jìn)行變異,從而生成與這些發(fā)生變異的字段定義不符或數(shù)據(jù)設(shè)置不符的測(cè)試用例??梢岳斫獾氖?,由于本發(fā)明提供的方法中將控制MODBUS協(xié)議通信的字段作為不可變字段,只對(duì)可變字段進(jìn)行變異,從而能夠避免生成無法基于MODBUS協(xié)議進(jìn)行通信的無效的冗余測(cè)試用例,有效提高測(cè)試效率,此外本發(fā)明提供的方法生成的是針對(duì)MODBUS協(xié)議的測(cè)試用例,因此更具有針對(duì)性,進(jìn)一步提高測(cè)試的效率。
附圖說明
為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些示例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明提供的一種測(cè)試用例生成方法流程圖;
圖2為本發(fā)明提供的被測(cè)設(shè)備正常抓包示意圖;
圖3為本發(fā)明提供的被測(cè)設(shè)備在接收到測(cè)試用例后異常抓包示意圖;
圖4(a)-4(b)為本發(fā)明提供的被測(cè)設(shè)備在接收測(cè)試用例前后的TCP通訊連接狀態(tài)示意圖。
圖5為本發(fā)明提供的一種測(cè)試用例生成裝置結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人在沒有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
為便于理解,首先對(duì)本發(fā)明中涉及的Modbus總線協(xié)議以及該協(xié)議規(guī)定的數(shù)據(jù)格式進(jìn)行詳細(xì)說明。
Modbus/TCP為應(yīng)用層報(bào)文傳輸協(xié)議,主要應(yīng)用于在不同類型的總線或網(wǎng)絡(luò)連接下的客戶機(jī)與服務(wù)器之間的通信。Modbus/TCP數(shù)據(jù)幀包含報(bào)文頭、功能碼域和數(shù)據(jù)域三個(gè)部分。
其中,這里的功能碼用于在客戶端向服務(wù)器設(shè)備發(fā)送報(bào)文時(shí),指示服務(wù)器執(zhí)行的操作類型。功能碼具體可以分為公共功能碼、用戶定義功能碼和保留功能碼,表1列出了部分常用的公共功能碼。
表1Modbus協(xié)議中部分公共功能碼的定義
基于上述內(nèi)容,第一方面,本發(fā)明提供了一種測(cè)試用例生成方法,用于生成測(cè)試Modbus協(xié)議的測(cè)試用例,如圖1所示,包括:
S101、在預(yù)存的若干個(gè)功能碼中選取一個(gè)作為目標(biāo)功能碼;其中,所述若干個(gè)功能碼,為Modbus協(xié)議規(guī)定的執(zhí)行不同功能操作的數(shù)據(jù)包所對(duì)應(yīng)的若干個(gè)功能碼;
S102、根據(jù)Modbus協(xié)議規(guī)定,獲取與所述目標(biāo)功能碼對(duì)應(yīng)的數(shù)據(jù)包中各個(gè)字段的定義;
S103、選取功能碼字段以及各個(gè)字段中用于控制測(cè)試用例通信功能的字段作為不可變字段,將其余字段作為可變字段;將所述不可變字段設(shè)置為預(yù)設(shè)值,以使所述測(cè)試用例支持基于Modbus協(xié)議進(jìn)行通信;對(duì)所述可變字段中的至少一個(gè)字段進(jìn)行隨機(jī)變異,以生成與所述至少一個(gè)字段的定義不符或數(shù)據(jù)設(shè)置不符的測(cè)試用例。
本發(fā)明提供的測(cè)試用例生成方法,首先選擇MODBUS協(xié)議的某一功能對(duì)應(yīng)的功能碼,再獲取具有該功能的數(shù)據(jù)包中包含的各個(gè)字段的定義,在各個(gè)字段中選擇控制MODBUS協(xié)議通信的字段作為不可變字段,其余為可變字段,并對(duì)至少一個(gè)可變字段進(jìn)行變異,從而生成與這些發(fā)生變異的字段定義不符或數(shù)據(jù)設(shè)置不符的測(cè)試用例。可以理解的是,由于本發(fā)明提供的方法中將控制MODBUS協(xié)議通信的字段作為不可變字段,只對(duì)可變字段進(jìn)行變異,從而能夠避免生成無法基于MODBUS協(xié)議進(jìn)行通信的無效的冗余測(cè)試用例,有效提高測(cè)試效率,此外本發(fā)明提供的方法生成的是針對(duì)MODBUS協(xié)議的測(cè)試用例,因此更具有針對(duì)性,進(jìn)一步提高測(cè)試的效率。
可以理解的是,在具體實(shí)施時(shí),上述方法實(shí)施例的步驟S103可以通過多種方式來實(shí)現(xiàn),下面對(duì)其中幾個(gè)可選的實(shí)施例進(jìn)行詳細(xì)說明。
示例一、對(duì)所有可變字段的數(shù)據(jù)進(jìn)行隨機(jī)變異,以生成與可變字段數(shù)據(jù)的定義不符的測(cè)試用例。
具體來說,功能碼字段是用于當(dāng)從客戶機(jī)向服務(wù)器設(shè)備發(fā)送報(bào)文時(shí),指示服務(wù)器將執(zhí)行哪種功能操作的字段,由于本發(fā)明主要針對(duì)Modbus的各個(gè)功能進(jìn)行測(cè)試,因此在這里需要保持功能碼字段。下面以功能碼字段為0x17的讀寫多寄存器功能的測(cè)試用例生成方法為例,詳細(xì)說明本發(fā)明提供的方法如何生成讀寫多寄存器功能的測(cè)試用例。
表2中示出了功能碼字段為0x17時(shí)數(shù)據(jù)包的應(yīng)用數(shù)據(jù)單元ADU各個(gè)字段的定義(包括報(bào)文頭、功能碼域和數(shù)據(jù)域)。
表2讀寫多寄存器功能應(yīng)用數(shù)據(jù)單元ADU字段定義
在表2的這些字段中,這里的協(xié)議標(biāo)識(shí)符是不可變的,因?yàn)閰f(xié)議標(biāo)識(shí)符通過0值識(shí)別Modbus協(xié)議。當(dāng)然特殊地,也可以生成將協(xié)議標(biāo)識(shí)符設(shè)置為非零值的測(cè)試用例,在本發(fā)明中先暫時(shí)不考慮這一類特殊的測(cè)試用例。
這里的單元標(biāo)識(shí)符對(duì)模糊測(cè)試結(jié)果影響不大,因此設(shè)置為可變不可變均可。由于TCP/IP利用IP地址尋址Modbus服務(wù)器,因此將單元標(biāo)識(shí)符設(shè)置為固定值,例如,可以設(shè)置為使用值0xFF,當(dāng)然也可以設(shè)置為其它值。
事務(wù)處理標(biāo)識(shí)符與單元表示符類似,同樣對(duì)模糊測(cè)試結(jié)果影響不大,因此設(shè)置為可變不可變均可。事務(wù)處理標(biāo)識(shí)符用于在請(qǐng)求與響應(yīng)之間建立聯(lián)系,在同一時(shí)刻標(biāo)識(shí)符必須是唯一的。由于Modbus/Tcp中可以向同一個(gè)服務(wù)器發(fā)送多個(gè)請(qǐng)求而不需等待服務(wù)器的證實(shí),服務(wù)器接收的請(qǐng)求數(shù)量取決于其容量,因此,這里可以根據(jù)設(shè)備的類型,將事務(wù)處理標(biāo)識(shí)符設(shè)置為1~16中的某一值。另外,事務(wù)處理標(biāo)識(shí)符也可以設(shè)置為遞增的形式,從而形成多個(gè)測(cè)試用例。
基于上述對(duì)于這幾個(gè)字段的定義的敘述,在這里我們認(rèn)為上述字段可以用于控制Modbus/Tcp協(xié)議的通信,因此本實(shí)施例中,將上述幾個(gè)字段設(shè)置為不可變字段,并為這些不可變字段分別賦予相應(yīng)的預(yù)設(shè)值,以使生成的測(cè)試用例能夠基于Modbus/Tcp協(xié)議進(jìn)行正常的通信。再將表2中除這些字段以外的字段全部進(jìn)行隨機(jī)變異,從而能夠生成與可變字段的定義不符的測(cè)試用例,用于對(duì)Modbus/Tcp協(xié)議的讀寫多寄存器功能進(jìn)行測(cè)試。
示例二、將可變字段中的一部分字段的數(shù)據(jù)逐一地或組合地設(shè)置為預(yù)設(shè)值,預(yù)設(shè)值包括字段定義的取值范圍內(nèi)的最大值、最小值或中間值;對(duì)可變字段中的另一部分字段的數(shù)據(jù)進(jìn)行隨機(jī)取值變異,以生成與另一部分字段數(shù)據(jù)的定義不符的測(cè)試用例。
具體來說,還以讀寫多寄存器功能的測(cè)試用例生成方法為例,首先,與示例一類似的是,先從表2中選擇功能碼字段、協(xié)議標(biāo)識(shí)符字段、單元標(biāo)識(shí)符字段以及事務(wù)處理標(biāo)識(shí)符字段作為不可變字段,將其設(shè)置為預(yù)設(shè)值,從而保證生成的測(cè)試用例能夠基于Modbus/Tcp協(xié)議進(jìn)行正常的通信。再表2中n個(gè)可變字段中選出m個(gè)字段,然后將這m個(gè)字段逐一地或組合地設(shè)置為預(yù)設(shè)值,其中,這里的預(yù)設(shè)值可以為該字段在取值范圍內(nèi)具有代表性的值,例如最大值、最小值或中間值。最后對(duì)另外n-m個(gè)字段進(jìn)行隨機(jī)取值變異,從而以生成與這n-m個(gè)字段數(shù)據(jù)的定義不符的測(cè)試用例。其中,這里可以將m個(gè)字段中各個(gè)字段取不同的預(yù)設(shè)值,然后進(jìn)行排列組合,從而可以生成多個(gè)測(cè)試用例。例如,若m=2,則被選擇的兩個(gè)字段分別在取值范圍內(nèi)取最大值、最小值或中間值,則排列組合就是9種情況,生成9個(gè)測(cè)試用例。
不難理解的是,對(duì)于示例一提供的方法來說,對(duì)于某一字段包含的內(nèi)容進(jìn)行隨機(jī)變異時(shí),只有很小的概率才能將該字段內(nèi)容變異為取值范圍內(nèi)具有代表性的值,例如最大值、最小值或中間值。這樣就很難對(duì)字段內(nèi)容為代表性值的情況進(jìn)行測(cè)試。因此,示例二提供的生成方法可以作為示例一方法的一種補(bǔ)充,使得本發(fā)明提供的方法測(cè)試的覆蓋范圍更大,從而提高測(cè)試的有效性。
示例三、將可變字段中用于表示單元標(biāo)識(shí)符字段、功能碼字段以及數(shù)據(jù)域長(zhǎng)度的長(zhǎng)度字段設(shè)置為預(yù)設(shè)值,對(duì)單元標(biāo)識(shí)符字段、功能碼字段以及數(shù)據(jù)域中的任一項(xiàng)或其組合進(jìn)行變異而加長(zhǎng)或者壓縮實(shí)際長(zhǎng)度,以生成實(shí)際長(zhǎng)度與長(zhǎng)度字段的預(yù)設(shè)值不匹配的測(cè)試用例。這里仍然以讀寫多寄存器的功能碼為例,如表2所示,對(duì)于讀寫多寄存器的功能碼來說,單元標(biāo)識(shí)符、功能碼和數(shù)據(jù)域長(zhǎng)度的長(zhǎng)度值為11+N*2個(gè)字節(jié)。這里的長(zhǎng)度值的作用在于指示報(bào)文的長(zhǎng)度,即使將報(bào)文分成多個(gè)信息包來傳輸,長(zhǎng)度信息能夠使接收者識(shí)別報(bào)文邊界。如果對(duì)單元標(biāo)識(shí)符字段、功能碼字段以及數(shù)據(jù)域中的任一項(xiàng)或其組合進(jìn)行變異而加長(zhǎng)或者壓縮實(shí)際長(zhǎng)度,使實(shí)際長(zhǎng)度與上述設(shè)置的長(zhǎng)度值不符,則即可生成長(zhǎng)度異常的測(cè)試用例。在這種情況下,接收者無法正確識(shí)別實(shí)際的報(bào)文邊界,就會(huì)出現(xiàn)接收異常,從而可以對(duì)長(zhǎng)度異常的情況進(jìn)行測(cè)試。
可以理解的是,上述這種方法主要是針對(duì)有約束條件的情況,例如數(shù)據(jù)包中的長(zhǎng)度字段在Modbus協(xié)議規(guī)約中是指后續(xù)字節(jié)的長(zhǎng)度,需要根據(jù)字節(jié)長(zhǎng)度計(jì)算結(jié)果才能確定,而當(dāng)故意加長(zhǎng)或縮短Modbus數(shù)據(jù)包并且長(zhǎng)度字段的值固定時(shí),目標(biāo)程序中如果沒有對(duì)約束條件進(jìn)行容錯(cuò),就容易出問題,從而可以對(duì)這樣的情況進(jìn)行測(cè)試。
綜上所述,本發(fā)明關(guān)于如何選擇出其余至少一部分字段變異,即到底選哪部分字段進(jìn)行變異:
功能碼作為第一級(jí)分類,不同的功能碼后續(xù)跟的字段不同;
對(duì)于每一種功能碼,后續(xù)跟的字段不同,再具體確定哪些字段不可變和可變;不可變字段保持不變,而對(duì)于可變的字段:
可以全部變異,即第二級(jí)分類,優(yōu)點(diǎn)是測(cè)試全面,如示例一所述;
也可以選擇某些字段在其取值范圍內(nèi)取預(yù)設(shè)值,如示例二所述;
也可以選擇某些字段根據(jù)約束性關(guān)系取預(yù)設(shè)值,例如長(zhǎng)度。具體選哪些字段設(shè)預(yù)設(shè)值就是第三級(jí)分類。
所以測(cè)試用例會(huì)根據(jù)這三級(jí)分類呈現(xiàn)出像樹形結(jié)構(gòu)一樣的分布。
具體的說,10個(gè)功能碼就有10個(gè)一級(jí)子節(jié)點(diǎn),對(duì)每個(gè)一級(jí)子節(jié)點(diǎn),根據(jù)第二級(jí)分類,都會(huì)有可變字段全部變異的測(cè)試用例;
對(duì)每個(gè)一級(jí)子節(jié)點(diǎn),根據(jù)第三級(jí)分類,都會(huì)有可變字段中某些字段取預(yù)設(shè)值的測(cè)試用例,且預(yù)設(shè)值可以是在其取值范圍內(nèi)取預(yù)設(shè)值,也可以根據(jù)約束性關(guān)系取預(yù)設(shè)值。
需要說明的是,上述方法實(shí)施例中的變異均可以通過多種隨機(jī)算法來實(shí)現(xiàn),隨機(jī)算法可以包括數(shù)值邊界變異,數(shù)據(jù)元素刪除變異,數(shù)據(jù)元素重復(fù)變異,有效值變異等。對(duì)于特殊的字符還可以有特殊的變異方式。例如,對(duì)于數(shù)據(jù)幀中含有字符類字段的,除了純粹的數(shù)值變異,還可以構(gòu)造字符類型的變異數(shù)據(jù),也就是說畸形數(shù)據(jù)生成策略具體包括:整數(shù)型字段通過設(shè)置不同的特殊數(shù)值構(gòu)造整數(shù)溢出類型畸形數(shù)據(jù)包;字符型字段通過設(shè)置不同的特殊字符構(gòu)造畸形數(shù)據(jù)包,包括使用超長(zhǎng)字符串用來檢測(cè)字符串溢出、NULL結(jié)束符缺失的非法串、格式化字符串等。當(dāng)然,還可以包括其他變異類型,本發(fā)明對(duì)此不作具體限定。
不難理解的是,上述方法實(shí)施例中的舉例說明只是為了便于更好地理解本發(fā)明實(shí)施例提供的測(cè)試用例的生成方法,并不能構(gòu)成對(duì)本發(fā)明的具體限定。且上述的各個(gè)優(yōu)選實(shí)施方式之間不會(huì)相互影響,各個(gè)優(yōu)選實(shí)施方式之間的任意組合所得到的方案均應(yīng)該落入本發(fā)明的保護(hù)范圍。
此外,在具體實(shí)施時(shí),本實(shí)施例提供的測(cè)試用例的生成方法均可以使用模糊測(cè)試框架生成對(duì)于某一功能的測(cè)試用例數(shù)據(jù)定義的文件。優(yōu)選地,測(cè)試用例是包含以下標(biāo)簽域的xml文件:
其中,
1)第一級(jí)標(biāo)簽<Peach></Peach>包括整個(gè)文件,用于版本介紹等。
2)第二級(jí)標(biāo)簽包括Include,DataModel,StateModel,Agent,Test,Run,其中:
3)Include標(biāo)簽域用于包含外部文件,含有模糊測(cè)試框架的基本方法,類,數(shù)據(jù)類型等。
4)DataModel標(biāo)簽域用于定義數(shù)據(jù)結(jié)構(gòu),此標(biāo)簽下還可以有若干級(jí)、若干種下級(jí)標(biāo)簽。使用這些子標(biāo)簽可以比較容易的定義數(shù)據(jù)的類型,大小,各個(gè)數(shù)據(jù)塊之間的關(guān)系,以及CRC校驗(yàn)和等。此外,可以定義多個(gè)DataModel,多個(gè)DataModel之間可以有關(guān)系也可以沒有關(guān)系。
5)StateModel標(biāo)簽域用于定義測(cè)試的邏輯,實(shí)際上相當(dāng)于一個(gè)狀態(tài)機(jī)。下級(jí)標(biāo)簽包括State用于表示一個(gè)狀態(tài),每個(gè)State中又可以包含若干個(gè)Action標(biāo)簽,用于執(zhí)行發(fā)送數(shù)據(jù)包之類的命令。
6)Agent標(biāo)簽域用于檢測(cè)exception,crash等,即用來監(jiān)測(cè)被測(cè)目標(biāo)的反應(yīng)。
7)Test標(biāo)簽域用于指定將要使用到的state,Agent,publisher等,用什么方法發(fā)數(shù)據(jù),還可指定使用什么方法加工數(shù)據(jù)。
8)Run標(biāo)簽域用于指定模糊測(cè)試執(zhí)行的進(jìn)入點(diǎn),即當(dāng)前這次模糊測(cè)試使用哪個(gè)Test。
當(dāng)然,上述數(shù)據(jù)定義文件的生成方法只是一種可選的實(shí)施例,還可以通過其他方式生成,本發(fā)明對(duì)此不作具體限定。
為證明本發(fā)明的優(yōu)越性,本發(fā)明做了一系列測(cè)試實(shí)驗(yàn)。在這里仍然以讀寫多寄存器的功能碼為例,基于示例一提供的方法,保持功能碼不變,保持讀數(shù)量字段、寫起始地址字段、寫數(shù)量字段、寫字節(jié)數(shù)字段包含的內(nèi)容不變,將讀起始地址字段以及寫入值字段的屬性為變異為真,被測(cè)設(shè)備在接收到測(cè)試用例前和接收到測(cè)試用例后的狀態(tài)可以如圖2-圖4所示。
顯然,如圖2所示,被測(cè)設(shè)備在沒有接受到測(cè)試用例時(shí),能夠正常建立TCP連接,處于正常的抓包狀態(tài)。一旦接受到測(cè)試用例時(shí),就會(huì)如圖3所示出現(xiàn)異常,無法建立TCP連接,且服務(wù)器端也沒有響應(yīng)TCP連接。相應(yīng)的,TCP的通訊連通狀態(tài)也由圖4(a)示出的ON變?yōu)閳D4(b)示出的OFF,從而可以對(duì)這一功能進(jìn)行有效的漏洞測(cè)試。
需要說明的是,為了能生成覆蓋率高的測(cè)試用例,除了上述讀寫多寄存器的功能碼,還可以基于上述方法實(shí)施例提供的方法對(duì)其他功能碼進(jìn)行分析,生成其他功能碼的測(cè)試用例。同時(shí)還可以針對(duì)每種功能碼的不同的感興趣字段進(jìn)行測(cè)試,發(fā)現(xiàn)可能的漏洞,這里不一一列舉,表3為不同功能碼測(cè)試不同字段后會(huì)引起錯(cuò)誤的統(tǒng)計(jì)表。
表3不同功能碼測(cè)試不同字段后引起錯(cuò)誤的統(tǒng)計(jì)表
第二方面,本發(fā)明提供了一種測(cè)試用例生成裝置,與本發(fā)明第一方面提供的方法對(duì)應(yīng),用于生成測(cè)試Modbus協(xié)議規(guī)約的測(cè)試用例,如圖5所示,包括:
功能碼選擇單元501,用于在預(yù)存的若干個(gè)功能碼中選取一個(gè)作為目標(biāo)功能碼;其中,若干個(gè)功能碼,為Modbus協(xié)議規(guī)定的執(zhí)行不同功能操作的數(shù)據(jù)包所對(duì)應(yīng)的若干個(gè)功能碼;
獲取單元502,用于根據(jù)Modbus協(xié)議規(guī)定,獲取與目標(biāo)功能碼對(duì)應(yīng)的數(shù)據(jù)包中各個(gè)字段的定義;
字段選擇變異單元503,用于選取功能碼字段以及各個(gè)字段中用于控制測(cè)試用例通信功能的字段作為不可變字段,將其余字段作為可變字段;將不可變字段設(shè)置為預(yù)設(shè)值,以使測(cè)試用例支持基于Modbus協(xié)議進(jìn)行通信;對(duì)可變字段中的至少一個(gè)字段進(jìn)行隨機(jī)變異,以生成與至少一個(gè)字段的定義不符或數(shù)據(jù)設(shè)置不符的測(cè)試用例。
在具體實(shí)施時(shí),字段選擇變異單元503,還用于:對(duì)所有可變字段的數(shù)據(jù)進(jìn)行隨機(jī)變異,以生成與可變字段數(shù)據(jù)的定義不符的測(cè)試用例。
在具體實(shí)施時(shí),字段選擇變異單元503,還用于:將可變字段中的一部分字段的數(shù)據(jù)逐一地或組合地設(shè)置為預(yù)設(shè)值,預(yù)設(shè)值包括字段定義的取值范圍內(nèi)的最大值、最小值或中間值;對(duì)可變字段中的另一部分字段的數(shù)據(jù)進(jìn)行隨機(jī)取值變異,以生成與另一部分字段數(shù)據(jù)的定義不符的測(cè)試用例。
在具體實(shí)施時(shí),字段選擇變異單元503,還用于:將可變字段中用于表示單元標(biāo)識(shí)符字段、功能碼字段以及數(shù)據(jù)域長(zhǎng)度的長(zhǎng)度字段設(shè)置為預(yù)設(shè)值,對(duì)單元標(biāo)識(shí)符字段、功能碼字段以及數(shù)據(jù)域中的任一項(xiàng)或其組合進(jìn)行變異而加長(zhǎng)或者壓縮實(shí)際長(zhǎng)度,以生成實(shí)際長(zhǎng)度與長(zhǎng)度字段的預(yù)設(shè)值不匹配的測(cè)試用例。
在具體實(shí)施時(shí),這里的隨機(jī)變異包括數(shù)據(jù)元素刪除變異,數(shù)據(jù)元素重復(fù)變異,有效值變異,或在各字段定義的數(shù)值范圍內(nèi)的數(shù)值邊界變異。
由于本實(shí)施例所介紹的測(cè)試用例生成裝置為可以執(zhí)行本發(fā)明實(shí)施例中的測(cè)試用例生成方法的裝置,故而基于本發(fā)明實(shí)施例中所介紹的測(cè)試用例生成的方法,本領(lǐng)域所屬技術(shù)人員能夠了解本實(shí)施例的測(cè)試用例生成裝置的具體實(shí)施方式以及其各種變化形式,所以在此對(duì)于該測(cè)試用例生成裝置如何實(shí)現(xiàn)本發(fā)明實(shí)施例中的測(cè)試用例生成方法不再詳細(xì)介紹。只要本領(lǐng)域所屬技術(shù)人員實(shí)施本發(fā)明實(shí)施例中測(cè)試用例生成方法所采用的裝置,都屬于本申請(qǐng)所欲保護(hù)的范圍。
在此提供的算法和顯示不與任何特定計(jì)算機(jī)、虛擬系統(tǒng)或者其它設(shè)備固有相關(guān)。各種通用系統(tǒng)也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類系統(tǒng)所要求的結(jié)構(gòu)是顯而易見的。此外,本發(fā)明也不針對(duì)任何特定編程語言。應(yīng)當(dāng)明白,可以利用各種編程語言實(shí)現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對(duì)特定語言所做的描述是為了披露本發(fā)明的最佳實(shí)施方式。
在此處所提供的說明書中,說明了大量具體細(xì)節(jié)。然而,能夠理解,本發(fā)明的實(shí)施例可以在沒有這些具體細(xì)節(jié)的情況下實(shí)踐。在一些實(shí)例中,并未詳細(xì)示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對(duì)本說明書的理解。
類似地,應(yīng)當(dāng)理解,為了精簡(jiǎn)本公開并幫助理解各個(gè)發(fā)明方面中的一個(gè)或多個(gè),在上面對(duì)本發(fā)明的示例性實(shí)施例的描述中,本發(fā)明的各個(gè)特征有時(shí)被一起分組到單個(gè)實(shí)施例、圖、或者對(duì)其的描述中。然而,并不應(yīng)將該公開的方法解釋成反映如下意圖:即所要求保護(hù)的本發(fā)明要求比在每個(gè)權(quán)利要求中所明確記載的特征更多的特征。更確切地說,如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個(gè)實(shí)施例的所有特征。因此,遵循具體實(shí)施方式的權(quán)利要求書由此明確地并入該具體實(shí)施方式,其中每個(gè)權(quán)利要求本身都作為本發(fā)明的單獨(dú)實(shí)施例。
本領(lǐng)域那些技術(shù)人員可以理解,可以對(duì)實(shí)施例中的設(shè)備中的模塊進(jìn)行自適應(yīng)性地改變并且把它們?cè)O(shè)置在與該實(shí)施例不同的一個(gè)或多個(gè)設(shè)備中。可以把實(shí)施例中的模塊或單元或組件組合成一個(gè)模塊或單元或組件,以及此外可以把它們分成多個(gè)子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對(duì)本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設(shè)備的所有過程或單元進(jìn)行組合。除非另外明確陳述,本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的每個(gè)特征可以由提供相同、等同或相似目的的替代特征來代替。
此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此的一些實(shí)施例包括其它實(shí)施例中所包括的某些特征而不是其它特征,但是不同實(shí)施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實(shí)施例。例如,在下面的權(quán)利要求書中,所要求保護(hù)的實(shí)施例的任意之一都可以以任意的組合方式來使用。
本發(fā)明的各個(gè)部件實(shí)施例可以以硬件實(shí)現(xiàn),或者以在一個(gè)或者多個(gè)處理器上運(yùn)行的軟件模塊實(shí)現(xiàn),或者以它們的組合實(shí)現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實(shí)踐中使用微處理器或者數(shù)字信號(hào)處理器(DSP)來實(shí)現(xiàn)根據(jù)本發(fā)明實(shí)施例的網(wǎng)關(guān)、代理服務(wù)器、系統(tǒng)中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實(shí)現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計(jì)算機(jī)程序和計(jì)算機(jī)程序產(chǎn)品)。這樣的實(shí)現(xiàn)本發(fā)明的程序可以存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)上,或者可以具有一個(gè)或者多個(gè)信號(hào)的形式。這樣的信號(hào)可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號(hào)上提供,或者以任何其他形式提供。
應(yīng)該注意的是上述實(shí)施例對(duì)本發(fā)明進(jìn)行說明而不是對(duì)本發(fā)明進(jìn)行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計(jì)出替換實(shí)施例。在權(quán)利要求中,不應(yīng)將位于括號(hào)之間的任何參考符號(hào)構(gòu)造成對(duì)權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個(gè)”不排除存在多個(gè)這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計(jì)算機(jī)來實(shí)現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個(gè)可以是通過同一個(gè)硬件項(xiàng)來具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序。可將這些單詞解釋為名稱。