一種新的使用逆向擴展控制流圖的靜態(tài)函數(shù)識別方法
【專利摘要】一種新的使用逆向擴展控制流圖的靜態(tài)函數(shù)識別方法,屬于軟件逆向工程領(lǐng)域。所述方法包括如下步驟:步驟1:建立區(qū)域逆向擴展控制流圖的集合;步驟2:對逆向擴展控制流圖去噪,刪除構(gòu)建過程中搜索出的非編譯器能生成的節(jié)點;步驟3:刪除和合并逆向擴展控制流圖;步驟4:在逆向擴展控制流圖中識別函數(shù)入口;步驟5:得到指定區(qū)域中多個函數(shù)的識別結(jié)果。與傳統(tǒng)方法不同,本發(fā)明以函數(shù)的返回指令作為識別特征,以函數(shù)返回指令節(jié)點作為逆向搜索起點構(gòu)建逆向擴展控制流圖,能夠在指定二進制代碼區(qū)域中識別多個函數(shù),并且能夠有效識別傳統(tǒng)靜態(tài)識別方法無法識別的無特定頭字節(jié)特征及無交叉引用的函數(shù)。
【專利說明】一種新的使用逆向擴展控制流圖的靜態(tài)函數(shù)識別方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于軟件逆向工程領(lǐng)域,涉及一種使用逆向擴展控制流圖的靜態(tài)函數(shù)識別方法。
【背景技術(shù)】
[0002]二進制代碼審查是針對二進制代碼進行的安全審計過程。一定規(guī)模的軟件難免會使用第三方組件。而第三方組件往往缺乏源代碼。如微軟系統(tǒng)動態(tài)鏈接庫。欲對這樣的軟件進行代碼審查,逆向工程手段幾乎是唯一選擇。另一方面,當前惡意代碼越發(fā)猖獗,嚴重威脅計算機系統(tǒng)安全,惡意代碼的檢測對于提高計算機系統(tǒng)安全尤為重要。但是絕大部分惡意代碼是無法獲取到源代碼的,因此逆向工程幾乎也是唯一的分析手段。
[0003]逆向工程的主要步驟為反匯編,識別函數(shù)及庫函數(shù)、變量、結(jié)構(gòu)體等高級語言元素。最后識別各函數(shù)的操作語義,通過分析函數(shù)間的交叉引用來進一步增強對整個程序語義的理解。由上述步驟可以看出,識別函數(shù)是整個逆向工程里至關(guān)重要的一個環(huán)節(jié)。傳統(tǒng)靜態(tài)識別方法使用函數(shù)開頭字節(jié)特征及函數(shù)間交叉引用信息來識別函數(shù)。在二進制代碼中往往大量存在無顯著特征和交叉引用的函數(shù),因此傳統(tǒng)靜態(tài)識別方法無法有效識別此類函數(shù)。
【發(fā)明內(nèi)容】
[0004]為了解決在指定二進制代碼區(qū)域中識別無顯著特征和交叉引用的多個函數(shù)的問題,本發(fā)明提供了一種新的使用逆向擴展控制流圖的靜態(tài)函數(shù)識別方法。
[0005]本發(fā)明為解決其技術(shù)問題所采用的技術(shù)方案的基本思想是:對于指定的二進制代碼區(qū)域,先假設(shè)所有符合函數(shù)返回指令(一般為RET指令)特征的地址都是函數(shù)返回地址,然后從這些函數(shù)返回地址自底向上構(gòu)造對應(yīng)的逆向擴展控制流圖(Reverse ExtendedControl Flow Graph,RECFG)0所謂逆向擴展控制流圖是指這樣一種控制流圖,節(jié)點代表指令,邊代表指令控制依賴,但不同于傳統(tǒng)的控制流圖的是,它從函數(shù)返回指令節(jié)點逆向構(gòu)建一個擴展的控制流圖,圖中節(jié)點的前驅(qū)為其前面所有可能存在的指令。圖的逆向搜索起點是函數(shù)返回指令,它包含了待識別函數(shù)的控制流圖,因此傳統(tǒng)的控制流圖是RECFG的子圖。對于任意兩個RECFG,它們有且僅有三種關(guān)系:1)相互獨立,即它們是互不連通的圖;2)同為一個圖的子圖,即它們同屬一個函數(shù);3)沖突,即一個圖的搜索起點(函數(shù)返回指令)是另外一個圖的某指令的操作數(shù)的一部分。對于符合關(guān)系2)的兩個圖,可以將它們合并。對于存在沖突關(guān)系的兩個圖,則采用多屬性決策理想點法刪除一個圖,解決沖突。最終所有獨立的RECFG都對應(yīng)于一個函數(shù)。一個函數(shù)的入口點只有一個,它可能是一個RECFG中的任意節(jié)點。從該節(jié)點出發(fā)遍歷RECFG得到的子圖,實際是以此節(jié)點為入口點的函數(shù)控制流圖。函數(shù)識別問題因此而轉(zhuǎn)換為函數(shù)入口點的識別問題。最終根據(jù)每個節(jié)點對應(yīng)的控制流圖的屬性,使用多屬性決策理想點法識別出函數(shù)的入口點。
[0006]本發(fā)明的使用逆向擴展控制流圖的靜態(tài)函數(shù)識別方法,包括如下步驟: 步驟1:建立區(qū)域逆向擴展控制流圖的集合;
步驟2:對逆向擴展控制流圖去噪,刪除構(gòu)建RECFG過程中搜索出的非編譯器能生成的節(jié)點;
步驟3:刪除和合并逆向擴展控制流圖;
步驟4:在逆向擴展控制流圖中識別函數(shù)入口 ;
步驟5:得到指定區(qū)域中多個函數(shù)的識別結(jié)果。
[0007]與傳統(tǒng)方法不同,本發(fā)明以函數(shù)的返回指令作為識別特征,以函數(shù)返回指令節(jié)點作為逆向搜索起點構(gòu)建逆向擴展控制流圖,能夠在指定二進制代碼區(qū)域中識別多個函數(shù),并且能夠有效識別傳統(tǒng)靜態(tài)識別方法無法識別的無特定頭字節(jié)特征及無交叉引用的函數(shù)。
【專利附圖】
【附圖說明】
[0008]圖1是本發(fā)明的流程示意圖;
圖2是逆向擴展控制流圖構(gòu)造算法;
圖3是逆向擴展控制流圖構(gòu)造算法中的逆向搜索算法;
圖4是逆向擴展控制流圖示意圖;
圖5是圖4的識別結(jié)果。
[0009]【具體實施方式】
下面結(jié)合附圖對本發(fā)明的技術(shù)方案作進一步的說明,但并不局限如此,凡是對本發(fā)明技術(shù)方案進行修改或者等同替換,而不脫離本發(fā)明技術(shù)方案的精神和范圍,均應(yīng)涵蓋在本發(fā)明的保護范圍中。
[0010]【具體實施方式】一:本實施方式中的使用逆向擴展控制流圖的靜態(tài)函數(shù)識別方法,首先對于指定的二進制代碼區(qū)域,從所有符合函數(shù)返回指令特征的地址構(gòu)建對應(yīng)的逆向擴展控制流圖;通過計算圖的三個屬性:指令長度總和、圈復(fù)雜度和全位數(shù)指令百分比,并使用多屬性決策理想點法解決圖中可能存在的沖突;最后將函數(shù)識別轉(zhuǎn)換為函數(shù)入口點的識別問題,即對每個圖的每個無前驅(qū)節(jié)點,計算其遍歷得到的子圖的三個屬性,使用理想點法決策出函數(shù)入口點得到最終的函數(shù)識別結(jié)果。具體步驟如下:
步驟1:建立區(qū)域逆向擴展控制流圖的集合:
對指定的代碼區(qū)域,從所有符合函數(shù)返回指令特征的地址自底向上構(gòu)造對應(yīng)的逆向擴展控制流圖(Reverse Extended Control Flow Graph,RECFG),形成區(qū)域逆向擴展控制流圖的集合。
[0011]如圖2所示,RECFG的構(gòu)造過程分為兩大步。第一步,逆向構(gòu)造初始圖:首先將搜索起點加入圖中,反復(fù)對圖中新加入的點搜索其所有可能的前驅(qū)。圖3給出了搜索RECFG中一個點r所有可能前驅(qū)的算法,具體檢測所有可能長度的指令是否為r的前驅(qū):如果一個指令的字節(jié)與點r對應(yīng)指令地址前(低地址)的相同長度的字節(jié)一致,則此指令為點r的一個前驅(qū)。第二步,對于圖中的分支指令的跳轉(zhuǎn)目標,使用現(xiàn)有常見的基于控制流的遞歸遍歷方法,將從這些跳轉(zhuǎn)目標開始的控制流圖加入到當前RECFG中。圖4給出了一個RECFG示意圖。
[0012]逆向擴展控制流圖RECFG是本發(fā)明提出的一種用于函數(shù)識別的中間表示,它是指這樣一種控制流圖,節(jié)點代表指令,邊代表指令控制依賴,但不同于傳統(tǒng)的控制流圖的是,逆向擴展控制流圖中節(jié)點的前驅(qū)為其前面所有可能存在的指令。
[0013]步驟2:對逆向擴展控制流圖去噪,刪除構(gòu)建RECFG過程中搜索出的非編譯器能生成的節(jié)點:
步驟21:刪除非法條件分支指令,包括無前驅(qū)節(jié)點的條件分支指令、跳轉(zhuǎn)目標為非法內(nèi)存地址的條件分支指令、兩條分支中存在字節(jié)重疊指令的條件分支指令;
步驟22:刪除不以函數(shù)返回指令、跳轉(zhuǎn)指令、CALL指令為結(jié)尾的路徑;
步驟23:檢查每條路徑,刪除成對指令不匹配的節(jié)點(如路徑上有pushad無popad)及其所有前驅(qū);
步驟24:刪除高權(quán)限指令及其所有前驅(qū),包括中斷相關(guān)指令、停機指令、CPU特殊寄存器操作指令;
步驟25:刪除無實際意義的指令,包括Ν0Ρ、斷點指令、加O指令、減O指令、與O的邏輯或、移動次數(shù)為O的移位操作指令、源操作數(shù)和目的操作數(shù)相同的傳送指令; 步驟26:將包含逆向搜索起點的子圖作為新的逆向擴展控制流圖;
步驟27:重復(fù)步驟26,直至圖不再變化為止。
[0014]步驟3:刪除和合并逆向擴展控制流圖:
步驟31:枚舉區(qū)域RECFG集合中任意兩個RECFG,若一個圖的逆向搜索起點(函數(shù)返回指令)在另一個圖中,從區(qū)域RECFG集合中刪除節(jié)點數(shù)較少的一個圖;
步驟32:枚舉區(qū)域RECFG集合中任意兩個RECFG,若一個圖的逆向搜索起點(函數(shù)返回指令)為另一圖中某點對應(yīng)指令的一部分,則根據(jù)圖的指令長度總和、圈復(fù)雜度、全位數(shù)指令百分比,使用多屬性決策理想點法刪除相對較差的一個圖。
[0015]步驟4:在逆向擴展控制流圖中識別函數(shù)入口:
步驟41:從圖中每個沒有前驅(qū)的點出發(fā)遍歷得到以此點為入口點的控制流圖;
步驟42:根據(jù)圖的指令長度總和、圈復(fù)雜度、全位數(shù)指令百分比,使用多屬性決策理想點法決策出最優(yōu)的控制流圖作為函數(shù)的識別結(jié)果(如圖5所示)。
[0016]步驟5:得到指定區(qū)域中多個函數(shù)的識別結(jié)果。
[0017]【具體實施方式】二:本實施方式與【具體實施方式】一不同的是,提供一種步驟32和步驟42所使用的多屬性決策理想點法,其包括如下步驟:
(O計算決策矩陣:
取評價指標分別為:圖的指令長度之和、圈復(fù)雜度、全位數(shù)指令百分比。其中,全位數(shù)指令是指CPU—次能處理的最大位數(shù)的指令。這3個評價指標的權(quán)重-(7=1,2,3)分別為
0.5、0.38、0.12。
[0018]假設(shè)有《個可選方案,則取3個評價指標的決策矩陣為:
【權(quán)利要求】
1.一種新的使用逆向擴展控制流圖的靜態(tài)函數(shù)識別方法,其特征在于所述方法包括如下步驟: 步驟1:建立區(qū)域逆向擴展控制流圖的集合; 步驟2:對逆向擴展控制流圖去噪,刪除構(gòu)建逆向擴展控制流圖過程中搜索出的非編譯器能生成的節(jié)點; 步驟3:刪除和合并逆向擴展控制流圖; 步驟4:在逆向擴展控制流圖中識別函數(shù)入口 ; 步驟5:得到指定區(qū)域中多個函數(shù)的識別結(jié)果。
2.根據(jù)權(quán)利要求1所述的一種新的使用逆向擴展控制流圖的靜態(tài)函數(shù)識別方法,其特征在于所述步驟I的具體過程如下: 對指定的代碼區(qū)域,從所有符合函數(shù)返回指令特征的地址自底向上構(gòu)造對應(yīng)的逆向擴展控制流圖,形成區(qū)域逆向擴展控制流圖的集合。
3.根據(jù)權(quán)利要求2所述的一種新的使用逆向擴展控制流圖的靜態(tài)函數(shù)識別方法,其特征在于所述逆向擴展控制流圖的構(gòu)造過程分為兩步: 第一步,逆向構(gòu)造初始圖:首先將搜索起點加入圖中,反復(fù)對圖中新加入的點搜索其所有可能的前驅(qū); 第二步,對于圖中的分支指令的跳轉(zhuǎn)目標,使用現(xiàn)有常見的基于控制流的遞歸遍歷方法,將從這些跳轉(zhuǎn)目標開始的控制流圖加入到當前逆向擴展控制流圖中。
4.根據(jù)權(quán)利要求1所 述的一種新的使用逆向擴展控制流圖的靜態(tài)函數(shù)識別方法,其特征在于所述步驟2用于逆向擴展控制流圖去噪的步驟包括如下步驟: 步驟21:刪除非法條件分支指令,包括無前驅(qū)節(jié)點的條件分支指令、跳轉(zhuǎn)目標為非法內(nèi)存地址的條件分支指令、兩條分支中存在字節(jié)重疊指令的條件分支指令; 步驟22:刪除不以函數(shù)返回指令、跳轉(zhuǎn)指令、CALL指令為結(jié)尾的路徑; 步驟23:檢查每條路徑,刪除成對指令不匹配的節(jié)點及其所有前驅(qū); 步驟24:刪除高權(quán)限指令及其所有前驅(qū),包括中斷相關(guān)指令、停機指令、CPU特殊寄存器操作指令; 步驟25:刪除無實際意義的指令,包括NOP、斷點指令、加O指令、減O指令、與O的邏輯或、移動次數(shù)為O的移位操作指令、源操作數(shù)和目的操作數(shù)相同的傳送指令; 步驟26:將包含逆向搜索起點的子圖作為新的逆向擴展控制流圖; 步驟27:重復(fù)步驟26,直至圖不再變化為止。
5.根據(jù)權(quán)利要求1所述的一種新的使用逆向擴展控制流圖的靜態(tài)函數(shù)識別方法,其特征在于所述步驟3用于刪除和合并逆向擴展控制流圖的步驟包括如下步驟:步驟31:枚舉區(qū)域逆向擴展控制流圖集合中任意兩個逆向擴展控制流圖,若一個圖的逆向搜索起點在另一個圖中,從區(qū)域逆向擴展控制流圖集合中刪除節(jié)點數(shù)較少的一個圖;步驟32:枚舉區(qū)域逆向擴展控制流圖集合中任意兩個逆向擴展控制流圖,若一個圖的逆向搜索起點為另一圖中某點對應(yīng)指令的一部分,則根據(jù)圖的指令長度總和、圈復(fù)雜度、全位數(shù)指令百分比,使用多屬性決策理想點法刪除相對較差的一個圖。
6.根據(jù)權(quán)利要求1所述的一種新的使用逆向擴展控制流圖的靜態(tài)函數(shù)識別方法,其特征在于所述步驟4用于在一個逆向擴展控制流圖中識別函數(shù)入口的步驟包括如下步驟:步驟41:從圖中每個沒有前驅(qū)的點出發(fā)遍歷得到以此點為入口點的控制流圖; 步驟42:根據(jù)圖的指令長度總和、圈復(fù)雜度、全位數(shù)指令百分比,使用多屬性決策理想點法決策出最優(yōu)的控制流圖作.為函數(shù)的識別結(jié)果。
【文檔編號】G06F9/44GK103440122SQ201310291941
【公開日】2013年12月11日 申請日期:2013年7月12日 優(yōu)先權(quán)日:2013年7月12日
【發(fā)明者】邱景, 蘇小紅, 馬培軍, 趙玲玲, 王甜甜 申請人:哈爾濱工業(yè)大學(xué)