国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

重水堆控制計算機二進制程序反匯編研究

2022-06-06 08:11:50陸乾杰吳海燕
儀器儀表用戶 2022年6期
關鍵詞:指令集二進制靜態(tài)

陸乾杰,趙 心,錢 銳,吳海燕

(中核核電運行管理有限公司 維修五處,浙江 海鹽 314300)

0 引言

重水堆核電站采用電站控制計算機(Digital Control Computer,以下簡稱DCC)進行全廠集中控制,負責反應堆反應性控制、主回路壓力和裝量控制、蒸發(fā)器壓力和液位控制等,是整個核電站的控制中樞。國內唯一的秦山三期重水堆電站控制系統(tǒng)由加拿大原子能公司設計,硬件采用SSCI 890(S)系列計算機[1]。該系列計算機為16 位8MHz 集成電路數(shù)字機,操作系統(tǒng)(V70 Omnitask Real-time Executive,VORTEX)和核心控制程序均采用SSCI V70 指令集,系統(tǒng)中所有程序均以二進制代碼形式運行。雖然大部分程序均有其對應的未編譯源碼,但是系統(tǒng)中仍然存在大量沒有源碼的二進制程序,例如系統(tǒng)引導程序、系統(tǒng)測試程序等。對于這些二進制程序進行邏輯功能分析是非常困難和復雜的,因此本文將通過反匯編的方法對二進制程序進行反編譯研究,將二進制代碼轉化成便于理解和閱讀的匯編代碼。

圖1 反編譯的解決思路Fig.1 Disassembly pipeline diagram

1 問題的提出和解決思路

1.1 問題提出

在DCC 系統(tǒng)備份和恢復過程中,DCC 程序均以COR 文件類型進行存儲。COR 文件是二進制代碼,無法直接打開和閱讀。而在DCC 的缺陷分析和國產化研究中,出現(xiàn)了對于DCC 二進制程序反匯編的需求,主要來源于以下幾個方面:

1)當系統(tǒng)出現(xiàn)異常時,需要對備份出來的數(shù)據(jù)進行檢查和代碼分析,通過回溯其代碼執(zhí)行的過程來定位缺陷的位置。

2)在變更或者參數(shù)修改時,可能需要查看歷史備份數(shù)據(jù)COR 文件中對應的數(shù)值。

3)在執(zhí)行系統(tǒng)測試時,可能會出現(xiàn)一些無法意料的報錯,就需要對測試程序的邏輯進行分析,而現(xiàn)存所有的測試程序均以二進制碼的形式存儲,無法直接進行分析。

4)在Processor 處理器板卡國產化時,需要對其引導程序進行分析,而引導程序只有二進制碼,無法進行分析。

基于以上需求,本文需要對DCC 系統(tǒng)的二進制碼進行反匯編研究,只要能將二進制碼COR 文件轉變成具有可閱讀性的文本,以上問題就能迎刃而解。

1.2 解決思路

完成對于二進制程序COR 文件的反匯編工作,首先要對SSCI V70 指令集數(shù)據(jù)格式進行分析,根據(jù)其格式標準對COR 文件格式的分析,將COR 文件中二進制數(shù)據(jù)從文件中取出來,并且以八進制的形式進行展現(xiàn)。

其次要對SSCI V70 指令集和尋址方式進行分析,對各類指令進行分類,提取特征,根據(jù)總結出來的特征完成對于單條指令的反匯編。

最后在完成單條指令反匯編的基礎上,對整個程序進行整體反匯編,主要解決整體反匯編中出現(xiàn)的數(shù)據(jù)區(qū)和指令區(qū)無法識別的問題,最終形成具有可閱讀性的文本。

2 COR數(shù)據(jù)可視化

2.1 指令數(shù)據(jù)格式分析

SSCI V70 指令集是16 位指令集,所有的數(shù)據(jù)和命令僅包含16 位。數(shù)據(jù)的BIT0-14 表示數(shù)值,BIT15 為符號位S,符號位S 為0 表示正數(shù),符號位S 為1 表示負數(shù)。在DCC 中負數(shù)的數(shù)值使用補碼表示。地址的BIT15 為指針位I,若指針位I 為1 表示這個地址為指針,實際地址為BIT0-14 地址所指向空間的數(shù)值。

2.2 COR文件轉化

當程序直接讀取COR 文件只能得到字節(jié)流數(shù)據(jù),如圖2。

圖2 COR文件字格式圖Fig.2 COR Type file in origin format

根據(jù)對SSCI V70 指令集數(shù)據(jù)格式的分析,所有數(shù)據(jù)均是16 位數(shù)據(jù),因此可以將COR 文件轉化為16 位數(shù)據(jù)為單元的數(shù)據(jù)列表。由于讀取的值為8 位/字節(jié),因此可以做如下轉換:

bytes 為讀入字節(jié)流,idata 為轉化后16 位數(shù)據(jù)。

在對COR 文件進行轉化后發(fā)現(xiàn)COR 的前128 字節(jié)為描述信息,其中包括了COR 的程序名、程序位置、程序長度等信息。因此實際代碼數(shù)據(jù)從128 字節(jié)開始進行轉化,INIT 程序轉化后用八進制顯示如圖3。

圖3 COR文件八進制格式圖Fig.3 COR Type file recording in octal

將COR 文件轉化為16 位數(shù)據(jù)為單元的數(shù)據(jù)列表后可以對程序內容進行反匯編。

3 單條指令反編譯

3.1 指令類型和尋址方式分析

所有的指令可分為單字指令和雙字指令,單字指令指的是有16 位二進制數(shù)據(jù)組成的指令,雙字指令是有兩個16 位二進制數(shù)據(jù)組合而成的指令。

對于DCC 指令集共有10 類指令[2],分別為,存取指令(Load/store)、算術指令(Arithmetic)、邏輯指令(Logic)、位移指令(Shift/Rotation)、寄存器指令(Register Transfort / Modification)、跳轉指令(Jump)、調用指令(Jump-and-mark)、執(zhí)行指令(Execution)、控制指令(Control)、IO 指令(Input/Output)。

一般一條單字指令都由操作碼(OP CODE)、尋址方式(M)和操作數(shù)(A)構成。操作碼指示這條指令的作用和功能,尋址方式表示指令要操作的數(shù)據(jù)存放形式,與操作數(shù)配合可以在內存空間或者寄存器中找到需要操作的數(shù)據(jù)。

3.2 指令統(tǒng)計分類

對于編譯器而言,明確了操作碼、操作數(shù)和尋址方式后就可以根據(jù)以上規(guī)則轉化為二進制碼。但是據(jù)上文所述對于不同指令而言其操作數(shù)、操縱碼、尋址方式在16 位或者32 位指令空間中的位置不同,反編譯器無法根據(jù)二進制碼直接應用規(guī)則來將二進制碼反編譯。

便于反編譯器的執(zhí)行,通過對Varian-70 所有指令共176 種進行統(tǒng)計后,根據(jù)指令BIT12-15、BIT9-11和BIT6-8 的值將指令分為38 小類:

表1 指令集分類表Table 1 Instruction types summary

3.3 具體實現(xiàn)

根據(jù)以上分類,可以通過指令前7 位的數(shù)值定位到指令類型和指令功能,然后根據(jù)后9 位(單字)或者后9+16 位(雙字)提供的信息完成具體操作,舉例如下:

不帶數(shù)據(jù)單字舉例:005002,其前四位為0,中三位為5,根據(jù)分類屬于單字寄存器指令,進一步得知后9 位中前3 位為0 表示寄存器間數(shù)據(jù)轉換,中3 位為0 表示數(shù)據(jù)清零,后3 位為2 表示B 寄存器,因此005002 反匯編為“TZB”。

帶數(shù)據(jù)單字舉例:020612,其前四位為2,中三位為0,根據(jù)分類屬于直接單字取指令(B 寄存器),進一步得知后9 位表示直接尋址的地址,因此020612 反匯編為“LDB 612”。

雙字舉例:006010,030300,第一個字中前四位為0,中三位為6,根據(jù)分類屬于雙字存取指令,進一步得知后9 位表示數(shù)據(jù)取到A 寄存器,第二個字為取值地址,因此006010,030300 反匯編為“LDA 030300”。

通過以上方法可以完成單條指令的反匯編,并且根據(jù)類型分類可以獲知下個字的類型。

4 整體反匯編

反匯編算法可以分為靜態(tài)掃描算法和動態(tài)掃描算法。靜態(tài)掃描算法是對目標程序從頭到尾進行掃描,直接將所遇到的二進制碼全部翻譯為對應的匯編指令,缺點在于無法區(qū)分程序段中的數(shù)據(jù)區(qū)。動態(tài)掃描算法是模擬程序運行來區(qū)分指令和數(shù)據(jù),但是缺點在于動態(tài)掃描時需要處理間接調用和多層調用問題,且編譯的覆蓋面低于靜態(tài)掃描算法[3]。

對于靜態(tài)掃描算法,最大的問題在于解決指令和數(shù)據(jù)的區(qū)分。對DCC 源碼分析發(fā)現(xiàn),DCC 的數(shù)據(jù)區(qū)一般處于程序開頭或者結尾,且大規(guī)模出現(xiàn),很少出現(xiàn)少量數(shù)據(jù)與指令混雜在一起的情況。因此采用靜態(tài)掃描的反編譯算法較為合適,同時本文根據(jù)DCC 源碼特征采用動態(tài)標記和卷積標記兩種策略來解決數(shù)據(jù)與指令無法區(qū)分的問題。

4.1 動態(tài)標記

小規(guī)模出現(xiàn)的數(shù)據(jù)區(qū)往往會被上下文通過單指令直接索引的方式調用,因此在第一次靜態(tài)掃描時,當掃描到單指令直接索引的指令時將索引的地址進行標注為數(shù)據(jù)區(qū),進行動態(tài)標記。當?shù)诙螔呙钑r不進行反編譯,僅僅對標記為數(shù)據(jù)區(qū)的數(shù)據(jù)轉為數(shù)據(jù)顯示。例如:

當?shù)谝淮螔呙钑r,會將數(shù)據(jù)反編譯為:

由于第一次掃描時會將023411 地址標記為數(shù)據(jù),因此第二次掃描后為:

第一次靜態(tài)掃描時對于無法反編譯的數(shù)據(jù)(未在指令集)標記為數(shù)據(jù),同時針對字符串編譯一般經(jīng)過反編譯后會出現(xiàn)大量單字節(jié)操作指令,例如下文所示(取自AACKN程序示例):

通過對大量連續(xù)出現(xiàn)如上指令的片段數(shù)據(jù)標記為數(shù)據(jù)區(qū)。

4.2 卷積過濾

由于大塊數(shù)據(jù)區(qū)的數(shù)據(jù)可能正好可以被反匯編,因此當?shù)谝淮戊o態(tài)掃描后會出現(xiàn)零零散散的指令分布在數(shù)據(jù)區(qū)內。卷積在離散數(shù)學中的意義是對當前數(shù)據(jù)和卷積核進行加權求和,這樣可以將當前數(shù)據(jù)與周圍數(shù)據(jù)信息融合,再經(jīng)過一層濾波就可以將零散分布在大塊數(shù)據(jù)區(qū)的指令去除,實現(xiàn)大塊數(shù)據(jù)區(qū)的識別。

卷積公式如下:x 表示輸入序列,h 表示卷積核,y 表示輸出結果,N 為數(shù)據(jù)長度(f 長度+h 長度-1)。

經(jīng)過第一次靜態(tài)反編譯標記和動態(tài)標記后代碼標記區(qū)可以用一個一維矩陣矩陣形式表示x[n],其中n 表示數(shù)據(jù)數(shù)量,若為數(shù)據(jù)類型則為1,若為指令則為0。

以SGL 程序的30077-30125 的數(shù)據(jù)段為例,數(shù)組x表示標記區(qū)數(shù)據(jù),1 表示為數(shù)據(jù),0 表示為指令:

以python 語言為例使用一個[1,1,1,1,1]的卷積核h 與x 做卷積運算:

得到結果y 如下:

再經(jīng)過>1 的濾波器后得到數(shù)組z:

由此可以看到通過卷積濾波之后夾雜在數(shù)據(jù)區(qū)的指令均被過濾,這是由于卷積時卷積核會將當前數(shù)據(jù)周圍信息也包含進來,通過濾波后指令類型就消失了,就能能到完整的數(shù)據(jù)區(qū)。

圖4 反編譯器程序邏輯圖Fig.4 Disassembly compiler logic diagram

4.3 具體實現(xiàn)

反匯編器整體實現(xiàn)的流程如下:

1)從COR 文件中讀取二進制數(shù)據(jù),并且將二進制數(shù)據(jù)轉化成八進制數(shù)據(jù),放入數(shù)據(jù)數(shù)組中。

2)第一遍靜態(tài)反編譯,對單個數(shù)據(jù)依次進行反編譯,同時對于單指令直接索引和無法反編譯的數(shù)據(jù)進行動態(tài)標記,標記于對應的標記數(shù)組中。

3)第二遍循環(huán),使用卷積核對標記數(shù)組進行卷積運算,得到新的標記數(shù)組。

4)第三遍循環(huán),對于標記數(shù)組中大于某值的數(shù)據(jù)均轉為數(shù)據(jù)類型顯示。

5)最后,將所有顯示數(shù)據(jù)輸出到文本中,完成反編譯過程。

5 問題的解決

通過以上的研究,完成了對于反編譯器的代碼編寫,實際以DCC 備份SGL.COR 運行結果如下,左側為原編譯過程中產生的標記文件,右側為COR 文件反編譯的結果片段:

由于反編譯后數(shù)據(jù)缺少交叉編譯時的符號,因此指令后面仍保持數(shù)據(jù)顯示。

圖5 反編譯對比Fig.5 Disassembly result comparing with source code

對于以上結果,當系統(tǒng)出現(xiàn)異常時,就可以通過反編譯后文本回溯執(zhí)行過程來定位缺陷的位置,同時對歷史備份數(shù)據(jù)COR 文件進行反匯編后可以快捷地查看相應的參數(shù)數(shù)值。

對于測試程序和引導程序,可以直接在Virtual Console 機上加載程序完畢后,通過“C”命令對其內存數(shù)據(jù)進行顯示和保存。通過這種方法可以直接得到八進制碼,無需進行COR 數(shù)據(jù)的轉化。最后通過反編譯,可以得到可閱讀的文本進行邏輯分析,為國產化研究和測試程序執(zhí)行流程的研究解決了數(shù)據(jù)無法直接閱讀的難題。

6 結束語

本文通過對DCC 指令集的數(shù)據(jù)格式的分析,根據(jù)16位數(shù)據(jù)中關鍵位信息將指令分為了39 小類。根據(jù)分類,可以通過指令前7 位的數(shù)值定位到指令類型和指令功能,然后根據(jù)后9 位(單字)或者后9+16 位(雙字)提供的信息完成單條指令的反匯編操作。結合DCC 代碼特點,采用靜態(tài)編譯的方式進行反編譯,使用動態(tài)標記和卷積過濾的方法區(qū)分了數(shù)據(jù)區(qū)和指令,解決了靜態(tài)編譯中數(shù)據(jù)指令無法區(qū)分的缺點,完成了整體二進制數(shù)據(jù)的反編譯工作。反編譯后數(shù)據(jù)雖然缺少交叉編譯時的符號,但是已經(jīng)具備了可讀性。通過本文的方法可以將未知的二進制碼反匯編為具有可讀性的匯編代碼,有利于重水堆控制計算機的缺陷查找和系統(tǒng)學習。

猜你喜歡
指令集二進制靜態(tài)
用二進制解一道高中數(shù)學聯(lián)賽數(shù)論題
靜態(tài)隨機存儲器在軌自檢算法
3DNow指令集被Linux淘汰
電腦報(2021年49期)2021-01-06 18:36:55
有趣的進度
二進制在競賽題中的應用
實時微測量系統(tǒng)指令集及解析算法
機床靜態(tài)及動態(tài)分析
機電信息(2015年9期)2015-02-27 15:55:56
具7μA靜態(tài)電流的2A、70V SEPIC/升壓型DC/DC轉換器
什么是AMD64
基于覆蓋率驅動的高性能DSP指令集驗證方法
計算機工程(2014年6期)2014-02-28 01:28:03
达州市| 白银市| 社旗县| 榆中县| 天柱县| 辉县市| 五原县| 甘德县| 渑池县| 定州市| 韶关市| 栾城县| 宝应县| 洪江市| 马公市| 望都县| 财经| 上蔡县| 兴义市| 大足县| 宜君县| 女性| 景宁| 香港 | 高唐县| 湛江市| 醴陵市| 朝阳县| 嘉峪关市| 泰和县| 夹江县| 黑山县| 新津县| 肃北| 辽中县| 新民市| 慈利县| 什邡市| 隆回县| 衡阳县| 金寨县|