陳炎明,李旺林,陳 希,3,關靜雅,3
(1湖北省計量測試技術研究院,湖北 武漢430223;2湖北省產品質量監督檢驗研究院,湖北 武漢430061;3武漢大學計算機學院,湖北 武漢430072)
現代計量器具仍存在計量作弊現象,并且不僅有一般的硬件設備改裝、加裝多余脈沖發生設備等作弊手段,有些不法商家更改計量軟件的程序代碼[1],利用嵌入式計量軟件本身存在的設計漏洞修改計量程序,甚至直接更換計量主板以達到作弊的目的。在嵌入式計量軟件中,后門程序是指生產廠家預留或者經營者刻意設計的作弊方式,通過遙控器或者設置鍵盤組合鍵等方式觸發作弊后門來篡改計量程序中的計量參數或其他計量數據[2]。趨于高科技化的作弊方式為人工檢測計量軟件后門帶來了困難,因此急需一種自動檢測方法來方便高效地檢測嵌入式計量軟件中的作弊后門。
本文在研究分析了一般軟件的后門檢測方法和二進制可執行程序檢測方法的基礎上,針對其不足,提出了基于執行路徑分析的嵌入式計量軟件的后門檢測方法。該檢測方法以二進制可執行程序為檢測對象,跟蹤和分析二進制程序的執行路徑,判斷是否存在作弊后門,為嵌入式軟件后門的自動化檢測提供了新的借鑒。
靜態分析法是在不實際執行程序的條件下,利用分析工具對程序代碼進行分析,對可執行程序進行反匯編,在此基礎上找出惡意代碼的特征值或可疑語義特征[3]。靜態分析的優點是可以避免執行惡意代碼對被分析系統的破壞;但同時因為不執行代碼,所分析的代碼不全是最終執行的代碼,在無用代碼上浪費了分析時間,且對反匯編技術的依賴也使靜態分析存在局限性。靜態分析方法包括基于代碼語義的方法,通過分析惡意代碼的行為和代碼意義來識別和判定惡意代碼[4],和不分析語義而是通過提取惡意行為和代碼的特征來標識惡意代碼的基于代碼特征的分析方法[5]。
動態檢測方法[6]是通過動態跟蹤并觀察惡意代碼的執行情況來理解惡意代碼的行為,所研究的代碼部分即實際執行到的代碼。該方法獲得運行時信息,分析過程簡單且結果清晰。動態檢測方法包括外部觀察法,即通過觀察惡意代碼執行時系統發生的調用函數行為來研究惡意代碼的功能,這種方法不對惡意代碼本身的語義特性作分析。另一種方法是跟蹤調試法,通過跟蹤目標程序執行情況,對惡意代碼的語義進行分析,進而判別惡意代碼的惡意行為。
程序執行路徑(execution path)是程序在一次運行中所執行的有序語句序列。跟蹤程序執行路徑是程序在測試、糾錯、排查和理解等方面重要的輔助手段。
對嵌入式計量軟件的二進制可執行程序進行分析時,執行路徑是程序執行一次命令的指令序列,記錄所執行過的指令流。跟蹤程序的執行路徑,需要監視相關寄存器內容、堆棧信息、狀態轉移規律及整個地址空間的動態運行狀態,通過獲取當前二進制可執行程序所執行的指令地址,取出指令并譯碼后計算下一指令的地址。
關于程序執行路徑,有如下幾個定義。
1)路徑P = {I1,I2,I3,…,Ij…,|j≤N},其中語句I可以是細粒度的指令,或者基本塊、函數等。執行語句按照執行順序組成的語句序列稱為路徑。在本文的檢測方法中,記錄執行路徑以條件轉移指令劃分的基本塊為記錄單位,基本塊內為順序執行的不可分割的指令序列。
2)起始路徑。起始于語句I1的執行路徑為起始路徑。本文檢測方法中的起始路徑為二進制可執行程序加載執行后的初始化執行過程,每一條執行路徑都以程序初始化為起點,由于初始化過程相同,本文從初始化完成后的執行路徑開始記錄。
3)原子路徑。如果執行路徑P由連續執行不可分的語句序列P0組成,那么P0為路徑P的原子路徑。本文檢測方法以基本塊為路徑節點,基本塊內的指令流為連續執行不可分割的指令流組成,每一個基本塊即原子路徑。通過記錄基本塊的地址可以降低記錄的路徑節點數量,提高處理速度。
4)路徑執行條件。對于執行路徑P={Ij|j≤N},其中有k條判斷語句(0<k≤N),JD為判斷語句的集合,JD = {Ij|Ij為判斷語句}。P,Ij,JD對應于一個判斷條件Cj,Cj是一個布爾表達式,由若干原子謂詞和and,or,not等邏輯連接詞組成。集合Var由所有與Cj有關的變量的組成。當且僅當C1,C2,…,Ck為真時,路徑P 執行。因此記 <C1,C2,…,Ck,Var> 為真時路徑P的執行條件。
本文對執行路徑的路徑節點定義為條件轉移分支點,即以轉移語句作為路徑節點來組成執行路徑。輸入一條命令的過程中,每輸入一個命令字,在二進制程序中都將對應一個條件分支,即一條控制轉移指令,形成一個路徑節點。根據不同命令值與命令樹中命令值的匹配,跳轉到不同的執行指令或入口函數。每一命令字對應的路徑節點之間,對應的二進制執行程序中也可能存在其他控制轉移指令,不作為路徑節點來跟蹤和處理。
執行路徑跟蹤算法記錄每一個路徑節點的首地址和末地址,記錄一條執行路徑所執行過的代碼的地址。條件轉移指令由JZ,JNZ,JB,JC等幾種指令組成。執行路徑跟蹤算法記錄以條件轉移指令開始的路徑節點,首地址即當前跳轉指令的跳轉目的地址,即跳轉指令地址與偏移量的和,末地址為下一跳轉指令所在的地址。路徑節點用該節點執行代碼的首末指令地址來標識,記為 Ni(begini,endi)。執行路徑存儲為 path{N0(begin0,end0),N1(begin1,end1),…,Ni(begini,endi),…,Nn-1(beginn-1,endn-1)}(i≥0,n≥1)。單片機程序從0000 H 地址開始自動執行,這部分代碼對于每次執行都相同,因此執行路徑從接收第一個命令字輸入后產生的路徑節點開始計算,到輸入最后一個命令字程序執行相關操作后執行路徑截止。
執行路徑跟蹤分為兩個步驟:1)對有關計量參數(如計量系數、計量單價、計量密度等)正常的系統命令做預處理路徑跟蹤,計量程序逐條執行這些系統命令,路徑跟蹤模塊保存執行路徑的節點,得到計量程序執行正常操作指令所執行到的代碼地址,此部分地址的代碼的功能為計量系數操作,為敏感區域代碼,存儲為path{N0(begin0,end0),N1(begin1,end1),…,Ni(begini,endi),…,Nn-1(beginn-1,endn-1)}(i≥0,n≥1);2)對計量程序執行測試命令所得的執行路徑進行路徑跟蹤處理,得到計量程序執行測試命令所執行到的代碼地址,即該條測試命令所運行的代碼部分,存儲為pat hk{N0(begin0,end0),N1(begin1,end1),…,Nj(beginj,endj),…,Nm-1(beginm-1,endm-1)}(k,j≥0,m ≥1)。
執行路徑跟蹤是系統檢測后門的關鍵部分,通過執行自動生成的測試命令,逐條跟蹤并記錄執行被測命令時的執行路徑。執行路徑由執行結點組成,記錄執行路徑首先要對執行結點進行處理。
嵌入式計量器具通過外部連接設備(如鍵盤等)輸入功能指令、計量命令等,計量軟件接受這些指令并且匹配、解析指令并執行相應功能操作。通常在嵌入式軟件的指令系統中,對于指令的存儲和匹配采用簡單的狀態轉移和命令樹法。狀態轉移適用于簡單且指令數量少的嵌入式指令系統,復雜的指令系統采用命令樹來存儲指令,指令的查找和匹配操作通過遍歷命令樹來實現。
3.1.1 簡單的狀態轉移 對于指令數少、功能簡單的指令系統,采用簡單的狀態轉移來對輸入的操作指令進行匹配和執行。其過程可視為有限狀態機(FSM)。每輸入一個命令字,程序相應地做出反應,跳轉到不同的執行指令處。每一個轉移的狀態都在程序中對應一條控制轉移指令。
3.1.2 命令樹 計量器具中復雜的指令系統按命令樹對命令進行存儲。命令格式為樹狀層次結構,具有多個命令子系統,每個命令子系統又具有多個子命令。
1)命令樹存儲 命令樹結構為多棵二叉樹的形式,常見的方法為將命令樹存儲為多叉樹結構,并將多叉樹轉化為鏈式二叉樹形式,簡化了命令樹的存儲和遍歷操作。采用孩子兄弟法用來存儲命令樹,將每一個命令子系統存儲為一棵二叉樹,公用命令則是一棵只有根結點的二叉樹。一棵完整的命令樹由每一個子系統根結點和公用命令結點組成命令樹的右鏈,各個子系統下的孩子結點組成左鏈。
2)命令樹查找 命令查找過程是程序根據用戶輸入的指令,遍歷命令樹,跳轉到相應的處理指令。具體過程如下:根據用戶輸入的命令字符串,分離命令字和參數,并將參數保存至參數表。取第一個命令字,從命令樹的右分支開始查找,若匹配則在此結點的左分支進行下一等級結點的匹配和查找;若不匹配則在此結點同一等級的右分支查找。對于不匹配的命令,報告輸入錯誤信息,對于匹配的命令,則執行相應地址處的控制轉移指令。
在計量程序中,對輸入的命令進行查找、匹配、執行的過程都伴隨著程序指令的轉移和執行,通過記錄計量程序執行指令流可以得到計量程序的執行軌跡。
執行路徑跟蹤算法要對程序執行系統級測試命令的匹配和執行過程中的狀態轉移路徑進行跟蹤,并記錄為執行路徑。具體動態跟蹤方法為:以8052系列單片機仿真平臺執行目標二進制可執行程序為基礎,通過在路徑跟蹤過程中對代碼指令進行解碼,以基本塊為處理單位,判斷指令的類型,若指令為條件轉移指令,則作為路徑節點進行處理。基本塊劃分示意圖如圖1所示。

圖1 基本塊劃分示意圖
具體實現如下:執行路徑跟蹤采用記錄以條件轉移指令為界劃分的基本塊的首末指令地址。基本塊內為順序執行的指令流,除末尾一條指令為條件轉移指令外,塊內無多余的條件轉移指令。條件轉移指令和無條件轉移指令共同構成二進制程序中的控制轉移指令,其中程序執行無條件轉移指令后將自動跳轉并執行下一條指令,不會改變基本塊內指令流執行順序;只有執行條件轉移指令時,程序根據判定條件會出現不同轉移分支,此時基本塊發生分割。條件轉移指令位于基本塊的末尾,將當前條件轉移指令歸為上一基本塊,指令地址為上一基本塊的末地址;通過計算條件轉移指令的地址可得到將要執行的基本塊的首指令地址,按照取得末指令地址的方法,在下一個條件轉移指令處可得到該基本塊的最后一條指令地址。其中轉移地址為入口函數地址的條件轉移指令的首指令地址處理同上。執行路徑跟蹤算法流程如圖2所示。

圖2 執行路徑跟蹤算法
在8052系列單片機指令集中,控制轉移指令包括條件轉移指令JZ,JNZ,JC,JB,JNE,以及無條件轉移指令JMP,CALL。單片機仿真平臺執行指令時定義一個變量保存當前執行指令的地址,根據地址取出第一個指令字解碼判斷指令功能,并計算要取的操作數字長。若當前指令判斷為控制轉移指令,根據取出的操作數可算出跳轉指令地址。每執行一條指令都判斷是否為控制轉移指令,若是條件轉移指令,則后門跟蹤模塊對其做存儲基本塊首尾指令地址的處理。下面的代碼片段以JNZ指令處理為例,說明路徑跟蹤的方法:
vector<unsigned>copy_PC0;//定義vector變量copy_PC0,記錄基本塊的首地址
vector<unsigned>copy_PC1;//定義vector變量copy_PC1,記錄基本塊的首地址
unsigned i8052_PC;//i8052_PC保存仿真平臺當前執行的指令地址
……

以上基本塊首末指令地址的處理方法以條件跳轉指令JNZ指令的處理為例,記錄執行路徑經過的基本塊。本模塊采用跟蹤條件轉移指令為執行路徑,不同于全路徑跟蹤。所跟蹤到的路徑指令為非連續地址的指令流,將跟蹤到的條件轉移指令串聯起來就是一次執行的一條完整路徑。
[1]王林波,沈春磊,趙書展,等.如何治理加油機高科技計量作弊[J].上海計量測試,2007,34(03):47-49.
[2]王鳳翔.淺析燃油加油機的防作弊措施[J].科技信息,2012(23):103-103.
[3]Rieck K,Holz T,Willems C,etal.Lear ning and classification of mal ware behavior[M].Detection of Intr usions and Mal ware,and Vulnerability Assessment.Springer Berlin Heidelber g,2008:108-125.
[4]Rieck K,Trinius P,Willems C,etal.Automatic analysis of mal ware behavior using machine lear ning[J].Journal of Computer Security,2011,19(04):639-668.
[5]Roberto B,Matthien C,Roberta G,etal.Sy mbolic Path-Oriented Test Data Generation for Floating-Point Programs[C].Proc of the 6th IEEE Int.Conf.on Soft ware Testing, Verification and Validation(ICST13),2013.
[6]Panchapakesan A,Abiel mona R,Petriu E,etal.Dynamic white-box soft ware testing using a recursive hybrid evolutionary strategy/genetic algorithm[C].Evolutionary Computation (CEC),2013 IEEE Congress on.IEEE,2013:2 525-2 532.