亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

一種智能電表的軟件一致性檢測(cè)方法

文檔序號(hào):9325767閱讀:1009來源:國(guó)知局
一種智能電表的軟件一致性檢測(cè)方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明主要涉及計(jì)算機(jī)學(xué)科中的固件逆向工程技術(shù)、反匯編和反編譯技術(shù)、嵌入 式系統(tǒng)設(shè)計(jì)技術(shù),特別是其中的反匯編和反編譯技術(shù),具體涉及一種智能電表的軟件一致 性檢測(cè)方法。本發(fā)明是對(duì)逆向工程技術(shù)中軟件可靠性問題的合理剖析,可以有效解決智能 電表在生產(chǎn)過程中出現(xiàn)的樣品表與批量表的運(yùn)行差異問題。
【背景技術(shù)】
[0002] 在智能電表的生產(chǎn)過程中,往往采用公開招標(biāo)的方式選擇生產(chǎn)商為其制造預(yù)定規(guī) 格的電表。一旦競(jìng)標(biāo)成功,生產(chǎn)商便生產(chǎn)大批量電表用于投入使用。由于各種因素導(dǎo)致很 難保證大批量電表與樣品表的規(guī)格完全一致,因而在智能電表投入使用時(shí)經(jīng)常出現(xiàn)工作狀 態(tài)異常、質(zhì)量不合格的情況。因此對(duì)智能電能表進(jìn)行軟件功能檢測(cè)工作迫在眉睫。由于在 智能電表測(cè)試中發(fā)現(xiàn)樣品表的質(zhì)量和功能遠(yuǎn)遠(yuǎn)優(yōu)于批量生產(chǎn)的電表。因此,需要提出一種 智能電表的軟件一致性檢測(cè)方法,并設(shè)計(jì)出一種智能電能表反匯編儀對(duì)兩種表型進(jìn)行比較 鑒別,控制批量生產(chǎn)的智能電能表與樣品表的功能和質(zhì)量誤差在一定范圍內(nèi)。

【發(fā)明內(nèi)容】

[0003] 本發(fā)明主要是解決現(xiàn)有技術(shù)所存在的技術(shù)問題;提供了一種用以實(shí)現(xiàn)兩個(gè)智能電 表之間的代碼功能比對(duì)情況。對(duì)比目前市場(chǎng)上出現(xiàn)的比較單一依靠反匯編或者反編譯的技 術(shù)實(shí)例,本發(fā)明提出的方法將反匯編與反編譯結(jié)合,系統(tǒng)地實(shí)現(xiàn)了智能電表從機(jī)器碼到高 級(jí)語(yǔ)言的處理,在語(yǔ)法和語(yǔ)義層次上均達(dá)到了最完整的蘊(yùn)涵程度的一種智能電表的軟件一 致性檢測(cè)方法。
[0004] 本發(fā)明的上述技術(shù)問題主要是通過下述技術(shù)方案得以解決的:
[0005] -種智能電表的軟件一致性檢測(cè)方法,其特征在于,包括:
[0006] -個(gè)對(duì)智能電能表內(nèi)部機(jī)器碼提取的步驟:提取智能電能表嵌入式主板的 EEPROM和MCU內(nèi)部基于二進(jìn)制表示的機(jī)器碼;
[0007] -個(gè)反匯編的步驟:將二進(jìn)制表示的機(jī)器碼轉(zhuǎn)換為基于指定處理器的匯編指令; 依據(jù)處理器指令集的類型進(jìn)行選擇靜態(tài)反匯編算法,具體是:
[0008] 選擇一:對(duì)于定長(zhǎng)指令集,根據(jù)每條指令的長(zhǎng)度將機(jī)器碼進(jìn)行劃分,進(jìn)而判斷指令 類型并進(jìn)行處理;
[0009] 選擇二:對(duì)于變長(zhǎng)指令集,從機(jī)器碼起始地址開始采取操作碼遍歷的方式獲取第 一個(gè)有效操作碼,根據(jù)該操作碼確定當(dāng)前指令的長(zhǎng)度,進(jìn)而得到下一條指令的起始地址;然 后,使用遞歸的方法根據(jù)下一條指令的起始地址確定下下一條指令的長(zhǎng)度……如此循環(huán) 下去,最終得到所有指令的操作碼長(zhǎng)度和指令長(zhǎng)度,根據(jù)這些信息判斷指令類型并進(jìn)行處 理;
[0010] -個(gè)中間語(yǔ)言優(yōu)化的步驟:將指定處理器的不同格式的匯編指令統(tǒng)一為一種中間 指令表示,以便于接下來反編譯流程的運(yùn)作;將反匯編得到的匯編指令按照類別進(jìn)行處理: 對(duì)于賦值類指令(如加、減、乘、除運(yùn)算等),將其直接轉(zhuǎn)換為相應(yīng)的運(yùn)算表達(dá)式;對(duì)于無條 件轉(zhuǎn)移指令JMP,直接使用C語(yǔ)言中的GOTO語(yǔ)句替代;對(duì)于有條件轉(zhuǎn)移指令,保留其語(yǔ)句不 變,直接由程序流分析模塊進(jìn)行處理;對(duì)于CALL過程調(diào)用,直接構(gòu)造子函數(shù)進(jìn)行抽象;對(duì)于 返回指令RET和堆棧指令PUSH和POP,保留其語(yǔ)句不變,直接由控制流分析模塊進(jìn)行處理; 對(duì)于其它指令,由于沒有顯式的高級(jí)語(yǔ)言對(duì)應(yīng)語(yǔ)句,故直接略去;
[0011] 一個(gè)反編譯的步驟:反編譯的目的是進(jìn)行中間語(yǔ)言到C語(yǔ)言的轉(zhuǎn)換,分為前端, 數(shù)據(jù)流分析和后端;
[0012] -個(gè)代碼結(jié)構(gòu)分析的步驟:完成對(duì)反編譯產(chǎn)生的高級(jí)語(yǔ)言(即由反編譯步驟7得 到的C語(yǔ)言)中的代碼結(jié)構(gòu)的抽象化,即所謂的控制流分析;其實(shí)現(xiàn)過程包括:產(chǎn)生一組包 含各類信息的節(jié)點(diǎn)結(jié)構(gòu)的中間文件解析模塊、在畫布特定位置繪制相應(yīng)的圖形,矩形或者 菱形的函數(shù)繪制模塊、將函數(shù)繪制模塊繪制出來的圖形,按照特定的規(guī)則連接起來,從而形 成控制流圖函數(shù)連線模塊;具體方法是:
[0013] 步驟1 :由中間文件解析模塊產(chǎn)生一組包含各類信息的節(jié)點(diǎn)結(jié)構(gòu),詳細(xì)步驟如下:
[0014] 步驟I. 1 :打開輸入文件,獲取輸入文件流;通過調(diào)用C++中庫(kù)函數(shù)fopenO,并選 擇rt模式,即打開文本文件,允許讀與寫;
[0015] 步驟1. 2 :初始化節(jié)點(diǎn)信息;
[0016] 步驟1. 3 :解析文件的輸入流,以while語(yǔ)句進(jìn)行遍歷,直至遍歷至文件結(jié)束標(biāo)記 符;
[0017] 步驟1. 4 :在遍歷時(shí),碰到換行符時(shí)將節(jié)點(diǎn)中funid屬性加一,并且記錄每一行的 起始的空格數(shù)目,并將結(jié)果作為節(jié)點(diǎn)的deep屬性;
[0018] 步驟1. 5 :調(diào)用私有函數(shù)GetName獲取每個(gè)節(jié)點(diǎn)的名字;在GetName函數(shù)中我們需 要特殊處理含有if, switch, while, else關(guān)鍵字的節(jié)點(diǎn);在遍歷到此類節(jié)點(diǎn)的時(shí)候,我們?nèi)?除這些關(guān)鍵字,而只留下剩余的信息,即判斷條件;與此同時(shí),修改節(jié)點(diǎn)中的type信息,根 據(jù)關(guān)鍵字的不同,修改為 IFTYPE, WHILETYPE, SWITCHTYPE, ELSETYPE ;
[0019] 步驟1. 6 :為ELSETYPE類型的節(jié)點(diǎn)找到與其配對(duì)的IFTYPE類型的節(jié)點(diǎn);
[0020] 步驟1. 7 :為節(jié)點(diǎn)添加父節(jié)點(diǎn)和孩子節(jié)點(diǎn)信息;其中獲取孩子節(jié)點(diǎn)信息的方法為, 向下遍歷,直到碰到深度比本節(jié)點(diǎn)小于等于的節(jié)點(diǎn)則停止遍歷,否則將深度比自己大一的 節(jié)點(diǎn)加入孩子節(jié)點(diǎn)數(shù)組;獲取其父節(jié)點(diǎn)信息的方法為,向上遍歷,直到找到第一個(gè)深度小于 本節(jié)點(diǎn)的函數(shù)節(jié)點(diǎn),則為雙親節(jié)點(diǎn);
[0021] 步驟I. 8 :IF、WHILE、SWITCH模塊結(jié)束位置確定;中間文件解析后,產(chǎn)生的結(jié)果為 一組包含各類信息的節(jié)點(diǎn)結(jié)構(gòu);
[0022] 步驟2 :函數(shù)繪制模塊在畫布特定位置繪制相應(yīng)的圖形,矩形或者菱形,詳細(xì)步驟 如下:
[0023] 步驟:2. 1 :遍歷經(jīng)過中間文件解析模塊后的節(jié)點(diǎn)信息,當(dāng)此節(jié)點(diǎn)擁有孩子節(jié)點(diǎn)并 且此節(jié)點(diǎn)的類型為FUNTYPE時(shí),將此節(jié)點(diǎn)作為新的一行的起始節(jié)點(diǎn);
[0024] 步驟2. 2 :計(jì)算每一行起始節(jié)點(diǎn)的Y軸方向的偏移量;這個(gè)偏移量由兩個(gè)方面的 因素所主導(dǎo);其一,起始行節(jié)點(diǎn)的序列;其二,在此節(jié)點(diǎn)之前,若其他行中含有IFTYPE節(jié)點(diǎn), ELSETYPE節(jié)點(diǎn),WHILETYPE節(jié)點(diǎn),SWITCHTYPE節(jié)點(diǎn),那么需特別計(jì)算偏移量,因?yàn)橐陨线@些 節(jié)點(diǎn)都會(huì)在Y軸方向存在增量;
[0025] 步驟2. 3 :計(jì)算新行首節(jié)點(diǎn)之后,繪制首節(jié)點(diǎn)圖像,即矩形;
[0026] 步驟2. 4 :將首節(jié)點(diǎn)位置信息,填入狀態(tài)信息結(jié)構(gòu)體中;
[0027] 步驟2. 5 :在步驟三繪制的矩形框中間添加函數(shù)名稱信息;
[0028] 步驟2. 6 :遍歷新行的首節(jié)點(diǎn)的子孩子節(jié)點(diǎn),繪制子孩子節(jié)點(diǎn)形狀;
[0029] 步驟2. 7 :繪制子孩子節(jié)點(diǎn)時(shí),首先確定子孩子節(jié)點(diǎn)的位置信息,其次判斷子孩子 節(jié)點(diǎn)的類型信息;子孩子節(jié)點(diǎn)的位置信息也會(huì)由其之前的IFTYPE節(jié)點(diǎn),ELSETYPE節(jié)點(diǎn), WHILETYPE節(jié)點(diǎn),SWITCHTYPE節(jié)點(diǎn)所影響,例如ELSETYPE類型的節(jié)點(diǎn)會(huì)出現(xiàn)在下面的一行 中,因此ELSETYPE類型節(jié)點(diǎn)的子孩子,不應(yīng)該算在偏移量中;確定位置信息之后,為孩子節(jié) 點(diǎn)添加名稱;
[0030] 步驟3 :函數(shù)連線模塊將函數(shù)繪制模塊繪制出來的圖形,按照特定的規(guī)則連接起 來,從而形成控制流圖,詳細(xì)步驟如下:
[0031 ] 步驟:3. 1 :尋找每一行的起始節(jié)點(diǎn),并將起始節(jié)點(diǎn)的出口坐標(biāo)傳遞;
[0032] 步驟3. 2 :遍歷起始節(jié)點(diǎn)的孩子節(jié)點(diǎn);子孩子節(jié)點(diǎn)可能有五種情況,分別是: IFTYPE,WHILETYPE,ELSETYPE,SWITCHTYPE,F(xiàn)UNCTYPE,具體是:
[0033] 條件情況一 =IFTYPE情況下分為兩部分,原因是IFTYPE和ELSETYPE不一定成對(duì) 出現(xiàn);在IFTYPE情況下,首先將IFTYPE節(jié)點(diǎn)與傳遞進(jìn)來的出口坐標(biāo)相連,接下來對(duì)IFTYPE 節(jié)點(diǎn)的子孩子進(jìn)行遍歷,遍歷之后獲取最后一個(gè)節(jié)點(diǎn)的橫坐標(biāo),并將該橫坐標(biāo)值與IFTYPE 節(jié)點(diǎn)中標(biāo)記的終止節(jié)點(diǎn)相連接;其次處理不含有ELSETYPE節(jié)點(diǎn)的IFTYPE節(jié)點(diǎn);先計(jì)算此 IF塊中含有多少個(gè)IFTYPE,多少個(gè)WHILETYPE,以及多少個(gè)SWITCHTYPE ;將這作為轉(zhuǎn)折點(diǎn)的 縱坐標(biāo)偏移量;并將此轉(zhuǎn)折點(diǎn)與IFTYPE節(jié)點(diǎn)菱形的下部節(jié)點(diǎn)相連,代表著不滿足IFTYPE節(jié) 點(diǎn)的路徑;
[0034] 條件情況二:WHILETYPE情況下,首先將WHILETYPE節(jié)點(diǎn)與傳遞進(jìn)來的出口坐標(biāo)相 連,接下來對(duì)WHILETYPE節(jié)點(diǎn)的子孩子進(jìn)行遍歷,遍歷之后獲取最后一個(gè)節(jié)點(diǎn)的橫坐標(biāo),并 將該橫坐標(biāo)值與WHILETYPE節(jié)點(diǎn)中標(biāo)記的終止節(jié)點(diǎn)相連接;其次在WHILETYPE類型的菱形 節(jié)點(diǎn)的上部作為一個(gè)出口節(jié)點(diǎn),接下來計(jì)算WHILETYPE類型節(jié)點(diǎn)函數(shù)域內(nèi)是否包含有其他 WHILETYPE類型節(jié)點(diǎn),以及這些節(jié)點(diǎn)的數(shù)目;將WHILETYPE節(jié)點(diǎn)的數(shù)目作為偏移量,從而在 菱形上部確定轉(zhuǎn)折點(diǎn)縱坐標(biāo)位置,此條連線代表不滿足判斷條件所走路徑;在菱形下部的 頂點(diǎn)引出一條折線,代表在滿足條件之后返回WHILETYPE節(jié)點(diǎn),再次進(jìn)行判斷條件;
[0035] 條件情況三:ELSETYPE情況下,首先找到與其配對(duì)的IFTYPE節(jié)點(diǎn),在找到與其配 對(duì)的IFTYPE節(jié)點(diǎn)之后,再次計(jì)算IFTYPE節(jié)點(diǎn)塊中含有多少個(gè)IFTYPE,多少個(gè)WHILETYPE, 以及多少個(gè)SWITCHTYPE,以這些作為偏移量在IFTYPE節(jié)點(diǎn)的下方確定ELSETYPE節(jié)點(diǎn)的坐 標(biāo);接下來將ELSETYPE節(jié)點(diǎn)與IFTYPE菱形節(jié)點(diǎn)的下部相連接;隨后遍歷ELSETYPE節(jié)點(diǎn)的 子孩子節(jié)點(diǎn);
[0036] 條件情況四:SWITCHTYPE情況下,首先將SWITCHTYPE節(jié)點(diǎn)與傳遞進(jìn)來的出口坐標(biāo) 相連接,接下來對(duì)SWITCHTYPE節(jié)點(diǎn)的子孩子進(jìn)行遍歷,遍歷之后,獲取最后一個(gè)節(jié)點(diǎn)的橫 坐標(biāo)值,并將橫坐標(biāo)值與S
當(dāng)前第1頁(yè)1 2 3 4 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1