繼電保護裝置嵌入式軟件的反匯編方法和系統的制作方法
【專利摘要】本發明涉及一種繼電保護裝置嵌入式軟件的反匯編方法和系統。上述繼電保護裝置嵌入式軟件的反匯編方法,包括如下步驟:獲取繼電保護裝置嵌入式軟件的反匯編代碼中的各個指令,分別識別各個指令的指令類型和指令地址;根據所述指令的指令類型建立用于保存指令地址的二叉樹;在對嵌入式軟件進行反匯編時,遍歷所述二叉樹的結點,查找所述二叉樹的左子樹,將所述左子樹的后繼結點所對應的指令地址設置為目標地址;獲取所述目標地址對應的指令內容,對所述指令內容進行反編譯。上述繼電保護裝置嵌入式軟件的反匯編方法和系統,可以覆蓋到相應代碼中的各個指令,具有較高的反編譯效果。
【專利說明】
繼電保護裝置嵌入式軟件的反匯編方法和系統
技術領域
[0001]本發明涉及電力技術領域,特別是涉及一種繼電保護裝置嵌入式軟件的反匯編方法和系統。
【背景技術】
[0002]繼電保護設備是整個電力系統中重要的組成部分,在智能電網中起到了關鍵核心作用,當電力系統元件發生故障時,繼電保護設備會對發生故障元件相鄰的元件斷路器,發出跳閘的指令,及時把故障元件和系統隔開,這樣既能在最大程度上保障故障元件免受再次損害,更能減少對電力系統產生的危害,降低因故障產生事故的損失。當電網運行異常時,繼電保護設備會及時發出警報,并且能夠根據不同異常情況發出不同的信號,以便值班人員進行處理,繼電保護設備對于有些異常情況還能自行的調整。在發生故障時,繼電保護設備能及時把發生故障的部分與系統隔離,保證沒有發生故障部分正常運行,這樣能縮小事故的范圍,降低給電力系統帶來的危害。繼電保護設備還可以在電網運行中起到監控作用,它能及時反映系統各個設備的電流電壓情況,以此可清晰地判斷出設備的運行狀態。
[0003]嵌入式軟件是繼電保護設備的核心部分,如果其出現問題,將會引起嚴重的后果,因此,為了提高繼電保護設備的安全可靠運行,需對嵌入式軟件進行安全性檢測。嵌入式軟件反匯編技術是檢測和分析軟件安全性是一種有效方法,常用于軟件破解(例如找到它是如何注冊的,從而解出它的注冊碼或者編寫注冊機)、外掛技術、病毒分析、逆向工程、軟件漢化等領域。現階段,針對源代碼的分析工具很多,包括CodeStr iker、RhodeCode、CodeTEST、VcTester、VectorCast等,但是病毒、木馬等惡意代碼通常是以二進制文件的形式出現,且嵌入到被攻擊的設備中,一旦代碼運行,這些惡意軟件也就會運行,從而獲得系統的控制權,造成重大經濟損失。針對二進制文件的分析工具并不多,最主要集中在靜態分析上,包括反匯編工具IDA Pro、Windbg等。IDA Pro工具利用的是遞歸遍歷算法原理進行代碼反匯編,是如今的主流分析工具,Windbg是利用線性遍歷算法原理進行代碼反匯編。
[0004]上述反匯編方案應用至繼電保護設備的嵌入式軟件中時,難以獲取相應繼電保護設備運行的動態信息,導致反匯編方案的覆蓋率低,從而影響反匯編效果。
【發明內容】
[0005]基于此,有必要針對傳統方案影響反匯編效果的技術問題,提供一種繼電保護裝置嵌入式軟件的反匯編方法和系統。
[0006]—種繼電保護裝置嵌入式軟件的反匯編方法,包括如下步驟:
[0007]獲取繼電保護裝置嵌入式軟件的反匯編代碼中的各個指令,分別識別間接轉移類型的指令及其指令地址;
[0008]根據所述指令的指令類型建立用于保存指令地址的二叉樹;其中所述二叉樹中,一個結點保存一個指令地址,所述二叉樹左子樹的結點用于保存所述間接轉移類型的指令的指令地址;
[0009]在對嵌入式軟件進行反匯編時,遍歷所述二叉樹的結點,查找所述二叉樹的左子樹,將所述左子樹的后繼結點所對應的指令地址設置為目標地址;
[0010]獲取所述目標地址對應的指令內容,對所述指令內容進行反編譯。
[0011]—種繼電保護裝置嵌入式軟件的反匯編系統,包括:
[0012]識別模塊,用于獲取繼電保護裝置嵌入式軟件的反匯編代碼中的各個指令,分別識別間接轉移類型的指令及其指令地址;
[0013]建立模塊,用于根據所述指令的指令類型建立用于保存指令地址的二叉樹;其中所述二叉樹中,一個結點保存一個指令地址,所述二叉樹左子樹的結點用于保存所述間接轉移類型的指令的指令地址;
[0014]設置模塊,用于在對嵌入式軟件進行反匯編時,遍歷所述二叉樹的結點,查找所述二叉樹的左子樹,將所述左子樹的后繼結點所對應的指令地址設置為目標地址;
[0015]反編譯模塊,用于獲取所述目標地址對應的指令內容,對所述指令內容進行反編譯。
[0016]上述繼電保護裝置嵌入式軟件的反匯編方法和系統,可以識別繼電保護裝置嵌入式軟件的反匯編代碼中各個指令的指令類型和指令地址,根據所述指令類型依次建立用于保存指令地址的二叉樹,將間接轉移類型的指令所對應的指令地址分別保存至上述二叉樹左子樹的結點,再通過遍歷上述二叉樹,獲取相應的目標地址,對上述目標地址對應的指令進行反編譯,其反編譯過程可以覆蓋到相應代碼中的各個指令,具有較高的反編譯效果。
【附圖說明】
[0017]圖1為一個實施例的繼電保護裝置嵌入式軟件的反匯編方法流程圖;
[0018]圖2為一個實施例的繼電保護裝置嵌入式軟件的反匯編方法流程圖;
[0019]圖3為一個實施例的繼電保護裝置嵌入式軟件的反匯編系統結構示意圖。
【具體實施方式】
[0020]下面結合附圖對本發明的繼電保護裝置嵌入式軟件的反匯編方法和系統的【具體實施方式】作詳細描述。
[0021 ]參考圖1,圖1所示表示一個實施例的繼電保護裝置嵌入式軟件的反匯編方法流程圖,包括如下步驟:
[0022]S10,獲取繼電保護裝置嵌入式軟件的反匯編代碼中的各個指令,分別識別間接轉移類型的指令及其指令地址;
[0023]上述步驟可以通過相關查找算法從繼電保護裝置嵌入式軟件所對應的系統內部信息中查找反匯編代碼所在的存儲地址,確定上述反匯編代碼的入口點(首地址)。上述反匯編代碼可以包括間接轉移指令以及數據處理類指令等非間接轉移指令,反匯編過程通常難以覆蓋到上述間接轉移指令。上述間接轉移指令為間接轉移類型的指令,非間接轉移指令為非間接轉移類型的指令。
[0024]S20,根據所述指令的指令類型建立用于保存指令地址的二叉樹;其中所述二叉樹中,一個結點保存一個指令地址,所述二叉樹左子樹的結點用于保存所述間接轉移類型的指令的指令地址;
[0025]上述步驟S20中,可以先建立二叉樹,再根據指令類型,將各個指令地址保存至二叉樹的各個結點,具體可以將間接轉移指令的指令地址保存至二叉樹左子樹的各個結點,將非間接轉移指令的指令地址保存至二叉樹右子樹的各個結點。這樣通過對二叉樹的遍歷,便可以查找到反匯編程序中各個指令的指令地址,根據上述指令地址對相應的指令內容進行反編譯,可以保證反編譯的全面性。
[0026]S30,在對嵌入式軟件進行反匯編時,遍歷所述二叉樹的結點,查找所述二叉樹的左子樹,將所述左子樹的后繼結點所對應的指令地址設置為目標地址;
[0027]上述步驟可以使用寄存器間接尋址或者存儲器間接尋址等尋址方式對相應的二叉樹進行遍歷尋址。
[0028]S40,獲取所述目標地址對應的指令內容,對所述指令內容進行反編譯。
[0029]本實施例提供的繼電保護裝置嵌入式軟件的反匯編方法,可以識別繼電保護裝置嵌入式軟件的反匯編代碼中各個指令的指令類型和指令地址,根據所述指令類型依次建立用于保存指令地址的二叉樹,將間接轉移指令的指令地址分別保存至上述二叉樹左子樹的結點,再通過遍歷上述二叉樹,獲取相應的目標地址,對上述目標地址對應的指令進行反編譯,其反編譯過程可以覆蓋到相應代碼中的各個指令,具有較高的反編譯效果。
[0030]在一個實施例中,上述根據所述指令的指令類型建立用于保存指令地址的二叉樹的步驟后還可以包括:
[0031 ]獲取反匯編代碼中第一個指令的指令地址;
[0032]將所述第一個指令的指令地址保存至二叉樹的根節點。
[0033]本實施例將反匯編代碼中指令首地址保存至二叉樹的根節點,可以保證指令地址與二叉樹各結點對應關系的有序性。
[0034]在一個實施例中,上述根據所述指令的指令類型建立用于保存指令地址的二叉樹的步驟可以包括:
[0035]根據所述反匯編代碼中間接轉移類型的指令個數建立二叉樹,所述二叉樹中左子樹的結點個數等于指令個數;
[0036]判斷反匯編代碼中的指令是否為間接轉移指令;
[0037]若是,則將所述指令的地址保存至二叉樹的左子樹,若反匯編代碼中的指令為非間接轉移指令,則將所述指令的地址保存至二叉樹的右子樹;
[0038]將所述指令的指令地址進行標記,并獲取下一個指令,返回執行判斷反匯編代碼中的指令是否為間接轉移指令的步驟。
[0039]本實施例可以根據指令地址的先后順序依次獲取各個指令地址,再根據指令地址讀取對應的指令(包括指令內容),以根據具體的指令類容進行指令類型的判斷。上述指令地址可以通過尋址公式Addr = Addr+length( Instruct 1n)進行獲取,上述Instruct 1n表示指令,length (Instruct 1n)表示指令長度,Addr表示指令地址。將指令地址已保存的指令的指令地址進行標記,表明上述指令地址已被訪問,在下一次獲取到該指令地址時,可以將其挑個,直接獲取下一個指令地址。
[0040]作為一個實施例,上述判斷反匯編代碼中的指令是否為間接轉移指令的步驟前還可以包括:
[0041 ]獲取反匯編代碼中指令的指令地址;
[0042]判斷所述指令地址是否已標記;
[0043]若是,則獲取下一個指令。
[0044]本實施例在反匯編代碼中指令的指令地址已標記(該指令地址已被訪問過)時,直接獲取下一個指令以及相應的指令地址,可以提高獲取指令以及相應指令地址的效率。
[0045]在一個實施例中,上述判斷反匯編代碼中的指令是否為間接轉移指令的步驟前還可以包括:
[0046]獲取反匯編代碼中指令的指令地址;
[0047]判斷所述指令地址是否在設定的地址范圍外;
[0048]若是,則對所述二叉樹的結點進行遍歷。
[0049]本實施例中,在設定的地址范圍外的指令地址對應的指令不是反匯編代碼中的指令,若指令地址為從首地址開始依次獲取,指令地址是否在設定的地址范圍外表明,反匯編代碼中的指令已獲取完畢,相應的指令地址保存完畢,可以對二叉樹的結點進行遍歷。上述地址范圍可以根據反匯編代碼的長度以及其在繼電保護裝置嵌入式軟件中的存儲位置進行設置。
[0050]在一個實施例中,上述在對嵌入式軟件進行反匯編時,遍歷所述二叉樹的結點,查找所述二叉樹的左子樹,將所述左子樹的后繼結點所對應的指令地址設置為目標地址的步驟可以包括:
[0051]對二叉樹進行寄存器間接尋址,回溯掃描各指令地址,尋找各指令地址對應的寄存器號,并根據所述寄存器號計算目標地址。
[0052]在一個實施例中,上述在對嵌入式軟件進行反匯編時,遍歷所述二叉樹的結點,查找所述二叉樹的左子樹,將所述左子樹的后繼結點所對應的指令地址設置為目標地址的步驟可以包括:
[0053]對二叉樹進行存儲器間接尋址,回溯掃描各指令地址,尋找各指令地址對應的存儲器變量,并根據所述存儲器變量計算目標地址。
[0054]在一個實施例中,上述在對嵌入式軟件進行反匯編時,遍歷所述二叉樹的結點,查找所述二叉樹的左子樹,將所述左子樹的后繼結點所對應的指令地址設置為目標地址的步驟后還可以包括:
[0055]檢測當前遍歷的二叉樹結點的后繼是否為空;
[0056]若是,則判斷所述二叉樹遍歷完畢。
[0057]本實施例,在對二叉樹遍歷完畢,獲取其中所有結點以及各結點所保存的指令地址后,可以對上述各個指令地址對應的指令內容進行反編譯。
[0058]在一個實施例中,所述指令類型包括非間接轉移指令類型;所述獲取所述目標地址對應的指令內容,對所述指令內容進行反編譯的步驟后還包括:
[0059]將非間接轉移類型的指令所對應的指令地址分別保存至二叉樹中右子樹的各個結點;
[0060]在對嵌入式軟件進行反匯編時,查找所述二叉樹的右子樹,獲取所述右子樹中各個結點保存的指令地址;
[0061 ]對右子樹中各個結點保存的指令地址所對應的指令內容進行反編譯。
[0062]作為一個實施例,上述繼電保護裝置嵌入式軟件的反匯編方法的流程圖還可以如圖2所示,可以通過查看繼電保護裝置嵌入式軟件系統的內部信息,獲取反匯編代碼所在存儲區地址,確定反匯編代碼的程序入口點(首地址),根據上述首地址建立二叉樹的根節點,從而創建二叉樹,當指令的首地址超出程序代碼的地址范圍或者地址在反匯編過程中被訪問過,可以退出反匯編進入間接轉移指令定位階段,否則反匯編該指令并對指令的類型進行判定,若指令為間接轉移指令,無法獲得指令所指向代碼塊的目標地址,則生成左子樹,上述左子樹的前驅為指令的地址,左子樹的后繼可以設為NULL,然后進入下一條指令,下一條指令的指令地址可以為Addr = Addr+length(Instruct1n),重新對新的地址進行判別。若指令為非間接跳轉指令,則可以生成右子樹,并判斷指令類型是否為數據處理類指令。若是數據處理類指令,則可以將右子樹的前驅設為指令的地址,右子樹的后繼設為轉移地址,并按確定的轉移地址Addr轉移。若為非順序指令即為條件轉移指令,則反匯編該指令并將樹前驅設為指令的地址,樹的后繼設為條件指令的兩個后繼地址,結束該方向掃描進入下一條指令,下一條指令地址為Addr = Addr+length( Instruct 1n)。下面針對指令的后繼為NULL的間接轉移指令,對它的轉移地址進行定位。若指令的后繼為NULL,則根據指令的內容對尋址方式進行判別。若使用存儲器間接尋址,可以回溯掃描各程序指令尋找存儲器變量,并通過計算得出指令的轉移地址,然后將該間接指令的后繼設為指令目標地址。若使用寄存器間接尋址,則可以回溯掃描各程序指令尋找寄存器號,并通過計算得出指令的轉移地址,然后將該間接指令的后繼設為指令目標地址。重復間接轉移地址的定位過程,直至沒有新的間接轉移指令出現。
[0063]參考圖3,圖3所示為一個實施例的繼電保護裝置嵌入式軟件的反匯編系統結構示意圖,包括:
[0064]識別模塊10,用于獲取繼電保護裝置嵌入式軟件的反匯編代碼中的各個指令,分別識別間接轉移類型的指令及其指令地址;
[0065]建立模塊20,用于根據所述指令的指令類型建立用于保存指令地址的二叉樹;其中所述二叉樹中,一個結點保存一個指令地址,所述二叉樹左子樹的結點用于保存所述間接轉移類型的指令的指令地址;
[0066]設置模塊30,用于在對嵌入式軟件進行反匯編時,遍歷所述二叉樹的結點,查找所述二叉樹的左子樹,將所述左子樹的后繼結點所對應的指令地址設置為目標地址;
[0067]反編譯模塊40,用于獲取所述目標地址對應的指令內容,對所述指令內容進行反編譯。
[0068]本發明提供的繼電保護裝置嵌入式軟件的反匯編系統與本發明提供的繼電保護裝置嵌入式軟件的反匯編方法一一對應,在所述繼電保護裝置嵌入式軟件的反匯編方法的實施例闡述的技術特征及其有益效果均適用于繼電保護裝置嵌入式軟件的反匯編系統的實施例中,特此聲明。
[0069]以上所述實施例的各技術特征可以進行任意的組合,為使描述簡潔,未對上述實施例中的各個技術特征所有可能的組合都進行描述,然而,只要這些技術特征的組合不存在矛盾,都應當認為是本說明書記載的范圍。
[0070]以上所述實施例僅表達了本發明的幾種實施方式,其描述較為具體和詳細,但并不能因此而理解為對發明專利范圍的限制。應當指出的是,對于本領域的普通技術人員來說,在不脫離本發明構思的前提下,還可以做出若干變形和改進,這些都屬于本發明的保護范圍。因此,本發明專利的保護范圍應以所附權利要求為準。
【主權項】
1.一種繼電保護裝置嵌入式軟件的反匯編方法,其特征在于,包括如下步驟: 獲取繼電保護裝置嵌入式軟件的反匯編代碼中的各個指令,分別識別間接轉移類型的指令及其指令地址; 根據所述指令的指令類型建立用于保存指令地址的二叉樹;其中所述二叉樹中,一個結點保存一個指令地址,所述二叉樹左子樹的結點用于保存所述間接轉移類型的指令的指令地址; 在對嵌入式軟件進行反匯編時,遍歷所述二叉樹的結點,查找所述二叉樹的左子樹,將所述左子樹的后繼結點所對應的指令地址設置為目標地址; 獲取所述目標地址對應的指令內容,對所述指令內容進行反編譯。2.根據權利要求1所述的繼電保護裝置嵌入式軟件的反匯編方法,其特征在于,所述根據所述指令的指令類型建立用于保存指令地址的二叉樹的步驟后還包括: 獲取反匯編代碼中第一個指令的指令地址; 將所述第一個指令的指令地址保存至二叉樹的根節點。3.根據權利要求1所述的繼電保護裝置嵌入式軟件的反匯編方法,其特征在于,所述根據所述指令的指令類型建立用于保存指令地址的二叉樹的步驟包括: 根據所述反匯編代碼中間接轉移類型的指令個數建立二叉樹,所述二叉樹中左子樹的結點個數等于指令個數; 判斷反匯編代碼中的指令是否為間接轉移指令; 若是,則將所述指令的地址保存至二叉樹的左子樹,若反匯編代碼中的指令為非間接轉移指令,則將所述指令的地址保存至二叉樹的右子樹; 將所述指令的指令地址進行標記,并獲取下一個指令,返回執行判斷反匯編代碼中的指令是否為間接轉移指令的步驟。4.根據權利要求3所述的繼電保護裝置嵌入式軟件的反匯編方法,其特征在于,所述判斷反匯編代碼中的指令是否為間接轉移指令的步驟前還包括: 獲取反匯編代碼中指令的指令地址; 判斷所述指令地址是否已標記; 若是,則獲取下一個指令。5.根據權利要求3所述的繼電保護裝置嵌入式軟件的反匯編方法,其特征在于,所述判斷反匯編代碼中的指令是否為間接轉移指令的步驟前還包括: 獲取反匯編代碼中指令的指令地址; 判斷所述指令地址是否在設定的地址范圍外; 若是,則對所述二叉樹的結點進行遍歷。6.根據權利要求1所述的繼電保護裝置嵌入式軟件的反匯編方法,其特征在于,所述在對嵌入式軟件進行反匯編時,遍歷所述二叉樹的結點,查找所述二叉樹的左子樹,將所述左子樹的后繼結點所對應的指令地址設置為目標地址的步驟包括: 對二叉樹進行寄存器間接尋址,回溯掃描各指令地址,尋找各指令地址對應的寄存器號,并根據所述寄存器號計算目標地址。7.根據權利要求1所述的繼電保護裝置嵌入式軟件的反匯編方法,其特征在于,所述在對嵌入式軟件進行反匯編時,遍歷所述二叉樹的結點,查找所述二叉樹的左子樹,將所述左子樹的后繼結點所對應的指令地址設置為目標地址的步驟包括: 對二叉樹進行存儲器間接尋址,回溯掃描各指令地址,尋找各指令地址對應的存儲器變量,并根據所述存儲器變量計算目標地址。8.根據權利要求1所述的繼電保護裝置嵌入式軟件的反匯編方法,其特征在于,所述在對嵌入式軟件進行反匯編時,遍歷所述二叉樹的結點,查找所述二叉樹的左子樹,將所述左子樹的后繼結點所對應的指令地址設置為目標地址的步驟后還包括: 檢測當前遍歷的二叉樹結點的后繼是否為空; 若是,則判斷所述二叉樹遍歷完畢。9.根據權利要求1至8任一項所述的繼電保護裝置嵌入式軟件的反匯編方法,其特征在于,所述指令類型包括非間接轉移指令類型;所述獲取所述目標地址對應的指令內容,對所述指令內容進行反編譯的步驟后還包括: 將非間接轉移類型的指令所對應的指令地址分別保存至二叉樹中右子樹的各個結點;在對嵌入式軟件進行反匯編時,查找所述二叉樹的右子樹,獲取所述右子樹中各個結點保存的指令地址; 對右子樹中各個結點保存的指令地址所對應的指令內容進行反編譯。10.—種繼電保護裝置嵌入式軟件的反匯編系統,其特征在于,包括: 識別模塊,用于獲取繼電保護裝置嵌入式軟件的反匯編代碼中的各個指令,分別識別間接轉移類型的指令及其指令地址; 建立模塊,用于根據所述指令的指令類型建立用于保存指令地址的二叉樹;其中所述二叉樹中,一個結點保存一個指令地址,所述二叉樹左子樹的結點用于保存所述間接轉移類型的指令的指令地址; 設置模塊,用于在對嵌入式軟件進行反匯編時,遍歷所述二叉樹的結點,查找所述二叉樹的左子樹,將所述左子樹的后繼結點所對應的指令地址設置為目標地址; 反編譯模塊,用于獲取所述目標地址對應的指令內容,對所述指令內容進行反編譯。
【文檔編號】G06F9/45GK106055378SQ201610396955
【公開日】2016年10月26日
【申請日】2016年6月6日
【發明人】陳華軍, 王劍亮, 賓建偉, 張寶林, 劉奕宏, 蒙家曉, 黃建理, 杜金燃
【申請人】中國南方電網有限責任公司電網技術研究中心, 南方電網科學研究院有限責任公司, 工業和信息化部電子第五研究所