專利名稱:嵌入式軟件反編譯中的靜態(tài)庫函數(shù)識別實(shí)現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及嵌入式軟件反編譯技術(shù)領(lǐng)域,特別是涉及一種嵌入式軟件反編譯中的靜態(tài)庫函數(shù)識別實(shí)現(xiàn)方法。
背景技術(shù):
逆向工程是剖析一個物體看它如何工作,目的是為了復(fù)制或增強(qiáng)這個物體。它是一個從較舊工業(yè)拿來的實(shí)踐,現(xiàn)在時常在計算機(jī)硬件和軟件上使用。舉例來說,在汽車業(yè)中,一個廠商可能購買競爭者的車輛,分解它,而且檢查車輛焊接處,封鉛和車輛的其他成份,以達(dá)到使用類似的部件增強(qiáng)他們的汽車的目的。
軟件逆向工程包括使程序的機(jī)器代碼(被送到邏輯處理器的一串0和1的字符串)反向回到被寫入的源代碼,使用程序設(shè)計語言聲明。軟件逆向工程可能想要達(dá)到如下目的因為原代碼遺失,所以想要重新得到程序的原代碼;研究程序如何運(yùn)行特定的操作;改善程序的性能;修復(fù)一個程序錯誤(當(dāng)原始碼不可得的時候,改正程序的一個錯誤);識別在一個程序內(nèi)的惡意的內(nèi)容,像是病毒;或改編為一個微處理器寫的程序以適應(yīng)一個設(shè)計不同的微處理器。為復(fù)制程序這唯一的目的的逆向工程構(gòu)成違反版權(quán)并且是違法的。
在一些情形中,軟件的得到許可的使用明確地禁止逆向工程。做軟件逆向工程的人可能使用一些工具分解一個程序。一個工具是十六進(jìn)位傾卸裝置,它以十六進(jìn)位的格式(這比二進(jìn)位的格式容易讀)印刷或顯示程序的二進(jìn)位數(shù)字。藉由知道代表處理器指令的位的形式和指令長度,逆向工程師能識別一個程序的特定部分看到他們?nèi)绾喂ぷ鳌?br>
另外的通常工具是分解器。分解器讀二進(jìn)位的代碼然后以文本形式顯示每個可執(zhí)行的指令。一個分解器不能夠分辨在可執(zhí)行的指令和被程序使用的數(shù)據(jù)之間的不同,所以調(diào)試器被用,它允許分解器避免分解程序的數(shù)據(jù)部分。這些工具可能被一個解密高手用來修改代碼并且得到對一個計算機(jī)系統(tǒng)的進(jìn)入權(quán)或引起其他的傷害。
硬件逆向工程包括拆開一個裝置看它如何工作。舉例來說,如果一個處理器廠商想要見到競爭者的處理器如何工作,他們能購買競爭者的處理器,分解它,然后制造一個相似的處理器。然而,這一個過程在許多國家中是違法的。大體上,硬件逆向工程需要很多的專業(yè)技術(shù)并且相當(dāng)昂貴。另一種逆向工程涉及產(chǎn)生已制造的零件的3-D圖形(當(dāng)它的藍(lán)圖不可得的時候)以便再制造這個零件。為了對一個零件進(jìn)行逆向工程,這個零件用坐標(biāo)測量器(CMM)測量。當(dāng)它被測量時,一個3-D線框架圖像被產(chǎn)生并在一個監(jiān)視器上顯示。在測定完成后,線框架圖像被度量。使用這些方法任何的零件能夠進(jìn)行逆向工程。
而動態(tài)跟蹤調(diào)試能夠?qū)崿F(xiàn)對程序的跟蹤和逐條運(yùn)行,其實(shí)這是利用了單步中斷和斷點(diǎn)中斷的原因,而且目前的大多數(shù)跟蹤調(diào)試軟件都是利用了這兩個中斷。
單步中斷(INT1)是由機(jī)器內(nèi)部狀態(tài)引起的一種中斷,當(dāng)系統(tǒng)標(biāo)志寄存器的TF標(biāo)志(單步跟蹤標(biāo)志)被置位時,就會自動產(chǎn)生一次單步中斷,使得CPU能在執(zhí)行一條指令后停下來,并顯示各寄存器的內(nèi)容。
斷點(diǎn)中斷(INT3)是一種軟中斷,軟中斷又稱為自陷指令,當(dāng)CPU執(zhí)行到自陷指令時,就進(jìn)入斷點(diǎn)中斷服務(wù)程序,由斷點(diǎn)中斷服務(wù)程序完成對斷點(diǎn)處各寄存器內(nèi)容的顯示。
反編譯是一種將目標(biāo)代碼轉(zhuǎn)換成為等價的高級語言形式代碼的技術(shù),它是軟件逆向工程中的一個重要組成部分。反編譯分為基于可執(zhí)行程序的反編譯和基于虛擬機(jī)指令的反編譯。庫函數(shù)的識別是整個反編譯過程的一個重要組成部分。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種嵌入式軟件反編譯中的靜態(tài)庫函數(shù)識別實(shí)現(xiàn)方法。
本發(fā)明解決其技術(shù)問題采用的技術(shù)方案如下1)中間代碼識別利用匯編指令與機(jī)器指令的對應(yīng)關(guān)系生成可執(zhí)行程序的匯編代碼;2)提取函數(shù)模塊函數(shù)模塊最終都是以“CALL地址A”的形式出現(xiàn)在地址A開始地址處,所以識別函數(shù)模塊也就是把“CALL地址A”中地址A開始的模塊識別出來,通過尋找函數(shù)模塊的起始地址和終止地址,確定函數(shù)模塊;3)識別所用編譯器不同編譯器自帶的動態(tài)庫名字是不同的,借助編譯器編譯所產(chǎn)生的其他特殊信息,可以很好地達(dá)到識別執(zhí)行程序所用編譯器的目的;4)提取相應(yīng)的靜態(tài)庫每個編譯器的靜態(tài)庫可以通過查看其用戶手冊得到,可以通過分析文件格式得到庫文件中的所有函數(shù)的函數(shù)名、函數(shù)代碼等信息,建立其靜態(tài)庫函數(shù)的一個靜態(tài)數(shù)據(jù)庫;
5)識別庫函數(shù)對于給定的一段函數(shù)模塊代碼,從靜態(tài)庫建立起來的數(shù)據(jù)庫中找出一個函數(shù)與該段函數(shù)模塊代碼的指令長度和操作碼序列相等。
本發(fā)明與背景技術(shù)相比,具有的有益的效果是本發(fā)明是一種嵌入式軟件反編譯中的靜態(tài)庫函數(shù)識別實(shí)現(xiàn)方法,其主要功能是結(jié)合反編譯的整個過程特點(diǎn),對靜態(tài)庫將用戶的函數(shù)模塊與編譯器的庫函數(shù)之間進(jìn)行匹配,中間代碼中的調(diào)用函數(shù)過程代碼形式中的函數(shù)入口地址換成相應(yīng)的庫函數(shù)名,以實(shí)現(xiàn)對靜態(tài)庫函數(shù)的識別。
(1)高效性。本方法實(shí)現(xiàn)了在嵌入式軟件反編譯中的靜態(tài)庫函數(shù)識別,有利于加快反編譯工作的速度,提高反編譯的效率。
(2)實(shí)用性。對靜態(tài)庫將用戶的函數(shù)模塊與編譯器的庫函數(shù)之間進(jìn)行匹配,有利于目標(biāo)代碼轉(zhuǎn)換成為等價的高級語言形式的反編譯工作。
附圖是本發(fā)明的實(shí)施過程示意圖;具體實(shí)施方式
本發(fā)明是一種嵌入式軟件反編譯中的靜態(tài)庫函數(shù)識別實(shí)現(xiàn)方法,下面結(jié)合
其具體實(shí)施過程。
1)中間代碼識別把執(zhí)行程序轉(zhuǎn)換為相應(yīng)的中間代碼是進(jìn)行庫函數(shù)識別的一個關(guān)鍵所在,這個步驟也是反編譯中的反匯編過程。本發(fā)明利用匯編指令與機(jī)器指令的對應(yīng)關(guān)系生成可執(zhí)行程序的匯編代碼,生成的反匯編后的代碼如下表所示
上述的第一列形如“01006CBC”的是代碼裝載地址,第二列形如“FF 75 08”的是指令的二進(jìn)制編碼,緊接著后面的“push”是相應(yīng)的匯編指令的操作碼,最后就是該指令的操作數(shù)。
2)提取函數(shù)模塊提取函數(shù)模塊就是把中間代碼中出現(xiàn)的函數(shù)模塊識別出來,對于中間代碼而言,由于函數(shù)模塊最終都是以“CALL地址A”的形式出現(xiàn)在地址A開始地址處,所以識別函數(shù)模塊也就是把“CALL地址A”中地址A開始的模塊識別出來。根據(jù)函數(shù)的定義和編譯的特點(diǎn),中間代碼形式的函數(shù)最后都是以“retn”的形式返回的,所以根據(jù)程序本身的流程,以“retn”返回形式為依據(jù),可以把中間代碼中的所有CALL指令中出現(xiàn)的函數(shù)模塊識別出來。
3)識別所用編譯器不同編譯器自帶的動態(tài)庫名字是不同的,借助編譯器編譯所產(chǎn)生的其他特殊信息,可以很好地達(dá)到識別執(zhí)行程序所用編譯器的目的;根據(jù)實(shí)際執(zhí)行程序的特點(diǎn),如果執(zhí)行程序引用了動態(tài)庫,通過其動態(tài)庫就可以識別出相應(yīng)的編譯器。
4)提取相應(yīng)的靜態(tài)庫每個編譯器的靜態(tài)庫可以通過查看其用戶手冊得到,可以通過分析文件格式得到庫文件中的所有函數(shù)的函數(shù)名、函數(shù)代碼等信息,如對于一個函數(shù)“fopen”,通過這種方法可以得到如下表所示
通過獲取的所有庫函數(shù)的函數(shù)名、函數(shù)代碼,就可以建立其靜態(tài)庫函數(shù)的一個靜態(tài)數(shù)據(jù)庫,建立的數(shù)據(jù)庫地格式如下表所示
由于編譯器在聯(lián)編的時候會采取重定位操作,上述類似的“call 0000000F”指令最后操作數(shù)會改變,所以上述建庫的過程就沒有錄入操作數(shù)。
5)識別庫函數(shù)對于給定的一段函數(shù)模塊代碼,從靜態(tài)庫建立起來的數(shù)據(jù)庫中找出一個函數(shù)與該段函數(shù)模塊代碼的指令長度和操作碼序列相等。
權(quán)利要求
1.嵌入式軟件反編譯中的靜態(tài)庫函數(shù)識別實(shí)現(xiàn)方法,其特征在于1)中間代碼識別利用匯編指令與機(jī)器指令的對應(yīng)關(guān)系生成可執(zhí)行程序的匯編代碼;2)提取函數(shù)模塊函數(shù)模塊最終都是以“CALL地址A”的形式出現(xiàn)在地址A開始地址處,所以識別函數(shù)模塊也就是把“CALL地址A”中地址A開始的模塊識別出來,通過尋找函數(shù)模塊的起始地址和終止地址,確定函數(shù)模塊;3)識別所用編譯器不同編譯器自帶的動態(tài)庫名字是不同的,借助編譯器編譯所產(chǎn)生的其他特殊信息,可以很好地達(dá)到識別執(zhí)行程序所用編譯器的目的;4)提取相應(yīng)的靜態(tài)庫每個編譯器的靜態(tài)庫可以通過查看其用戶手冊得到,可以通過分析文件格式得到庫文件中的所有函數(shù)的函數(shù)名、函數(shù)代碼等信息,建立其靜態(tài)庫函數(shù)的一個靜態(tài)數(shù)據(jù)庫;5)識別庫函數(shù)對于給定的一段函數(shù)模塊代碼,從靜態(tài)庫建立起來的數(shù)據(jù)庫中找出一個函數(shù)與該段函數(shù)模塊代碼的指令長度和操作碼序列相等。
全文摘要
本發(fā)明公開了一種嵌入式軟件反編譯中的靜態(tài)庫函數(shù)識別實(shí)現(xiàn)方法。本發(fā)明的方法結(jié)合反編譯的整個過程特點(diǎn),對靜態(tài)庫將用戶的函數(shù)模塊與編譯器的庫函數(shù)之間進(jìn)行匹配,中間代碼中的調(diào)用函數(shù)過程代碼形式中的函數(shù)入口地址換成相應(yīng)的庫函數(shù)名,以實(shí)現(xiàn)對靜態(tài)庫函數(shù)的識別。本方法實(shí)現(xiàn)了在嵌入式軟件反編譯中的靜態(tài)庫函數(shù)識別,有利于將目標(biāo)代碼轉(zhuǎn)換成為等價的高級語言形式的反編譯工作。
文檔編號G06F9/44GK1818863SQ20061004980
公開日2006年8月16日 申請日期2006年3月13日 優(yōu)先權(quán)日2006年3月13日
發(fā)明者陳天洲, 胡威, 謝斌, 趙懿 申請人:浙江大學(xué)