可執行代碼

可執行代碼

目標代碼(object code)指計算機科學中編譯器或彙編器處理原始碼後所生成的代碼,它一般由機器代碼或接近於機器語言的代碼組成。在計算機科學中,可執行代碼(Executable Code)是指將目標代碼連線後形成的代碼,簡單來說是機器能夠直接執行的代碼。可執行代碼一般是執行檔的一部分。

基本介紹

  • 中文名:可執行代碼
  • 外文名:Executable Code
  • 學科:計算機科學
  • 定義:目標代碼連線後形成的代碼
  • 有關術語:執行檔
  • 套用:軟體程式、記憶體泄露檢查
簡介,執行檔與可執行程式,ECMA的可執行代碼類型,基於可執行代碼的緩衝區溢出檢測模型,

簡介

可執行代碼(Executable Code)是指將目標代碼連線後形成的代碼,簡單來說是機器能夠直接執行的代碼,可執行代碼當然也是二進制的。原始碼(也稱源程式)是指未編譯的按照一定的程式設計語言規範書寫的文本檔案,是一系列人類可讀的計算機語言指令。 在電腦程式設計中,一般建議將原始碼與可執行代碼分離存儲。問題在於不同平台下編譯出來的可執行代碼是不同的,例如一個程式複製到不同的電腦上,即便代碼不做任何修改,VI也會被修改,因為VI中包含的可執行代碼變了。理論上,可執行代碼與原始碼分離開來,可以提高程式的載入速度:程式可以各取所需,只載入原始碼或只載入可執行代碼。

執行檔與可執行程式

執行檔 (executable file) 指的是可以由作業系統進行載入執行的檔案。在不同的作業系統環境下,可執行程式的呈現方式不一樣。通常執行檔內,含有以二進制編碼的微處理器指令,也因此執行檔有時稱為二進制檔。這些二進制微處理器指令的編碼,於各種微處理器有所不同,故此執行檔多數要分開不同的微處理版本。一個電腦檔案是否為執行檔,主要由作業系統的傳統決定。例如根據特定的命名方法(如擴展名為exe)或檔案的元數據信息(例如UNIX系統設定“可運行”許可權)。在現代的各種電腦架構,執行檔除了有程式的信息之外,還有其他信息,例如讓程式運行的作業系統設定值數據、調試數據等等。
可執行程式(executable program,EXE File)是指一種可在作業系統存儲空間中浮動定位的可執行程式。在MS-DOS和MS-WINDOWS下,此類檔案擴展名為·exe。
WINDOWS作業系統中的二進制執行檔,分兩種:
一種後輟名為·com,另一種是·exe 。
DOS規定,有重名的exe和com,運行時優先執行com檔案。如果只有A.exe,就可以直接輸入A,而不用輸入全名。但如果有A.com和A.exe,輸入A則優先執行A.com,要運行A.exe只能輸入A.exe而不能輸入A。一般用於DOS,在WINDOWS系統中的執行檔案一般都是.exe檔案。在 MS-DOS 中,用以標識執行檔的檔案擴展名。用戶在提示行輸入不帶 .exe 擴展名的檔案名稱後按 Enter 鍵或者點雙擊就能運行可執行程式。

ECMA的可執行代碼類型

一共有三種 ECMA 腳本可執行代碼:
全局代碼是指被作為 ECMAScript Program 處理的原始碼文本。一個特定 Program 的全局代碼不包括作為 FunctionBody 被解析的原始碼文本。
Eval 代碼是指提供給 eval 內置函式的原始碼文本。更精確地說,如果傳遞給 eval 內置函式的參數為一個字元串,該字元串將被作為 ECMA 腳本 Program 進行處理。在特定的一次對 eval 的調用過程中,eval 代碼作為該 Program 的全局代碼部分。
函式代碼是指作為 FunctionBody 被解析的原始碼文本。一個 FunctionBody 的函式代碼不包括作為其嵌套函式的 FunctionBody 被解析的原始碼文本。函式代碼同時還特指以構造器方式調用 Function 內置對象時所提供的原始碼文本。更精確地說,調用 Function 構造器時傳遞的最後一個參數將被轉換為字元串並作為 FunctionBody 使用。如果調用 Function 構造器時,傳遞了一個以上的參數,除最後一個參數以外的其他參數都將轉換為字元串,並以逗號作為分隔設定連線在一起成為一個字元串,該字元串被解析為 FormalParameterList 供由最後一個參數定義的 FunctionBody 使用。初始化 Function 對象時所提供的函式代碼,並不包括作為其嵌套函式的 FunctionBody 被解析的原始碼文本。
嚴格模式下的代碼
一個 ECMA 腳本程式的語法單元可以使用非嚴格或嚴格模式下的語法及語義進行處理。當使用嚴格模式進行處理時,以上三種代碼將被稱為嚴格全局代碼、嚴格 eval 代碼和嚴格函式代碼。當符合以下條件時,代碼將被解析為嚴格模式下的代碼:
當全局代碼以指令序言開始,且該指令序言包含一個使用嚴格模式指令時,即為嚴格全局代碼。
當 Eval 代碼以指令序言開始,且該指令序言包含一個使用嚴格模式指令時;或者在嚴格模式下的代碼中通過直接調用 eval 函式時,即為嚴格 eval 代碼。
當一個 FunctionDeclaration、FunctionExpression 或 PropertyAssignment 訪問器處在一段嚴格模式下的代碼中,或其函式代碼以指令序言開始,且該指令序言包含一個使用嚴格模式的指令序言時,該函式代碼即為嚴格函式代碼。
當調用內置的 Function 構造器時,如果最後一個參數所表達的字元串在作為 FunctionBody 處理時以指令序言開始,且該指令序言包含一個使用嚴格模式的指令,則該函式代碼即為嚴格函式代碼。

基於可執行代碼的緩衝區溢出檢測模型

緩衝區是程式為存儲數據而分配的連續的具有一定長度的記憶體空間。而緩衝區溢出是指,寫入緩衝區的數據長度大於緩衝區分配的長度,使得數據寫到相鄰的記憶體中而覆蓋掉其中已有的數據。若覆蓋掉的數據恰好是程式的入口,那么程式將會跳轉到寫入的數據指定的地址去執行。攻擊者通過精心構造填充數據,可以使程式跳轉到指定的代碼處執行,從而進行非法操作。
當前緩衝區溢出檢測技術主要分為 2 類:靜態檢測和動態檢測。
靜態檢測主要是通過對原始碼的審查和分析來發現緩衝區溢出漏洞。由於不需要運行程式,因此,檢測效率較高,代價較小;缺點是大都依賴於原始碼且有較高的誤報率和漏報率。
動態檢測技術是在程式的運行過程中,通過監測程式的運行狀態來檢測是否發生了緩衝區溢出。該類技術可以通過模糊測試 (fuzz testing) 主動誘發, 也可以通過修改軟硬體平台被動監測 ,以發現漏洞。前者的優點是誤報率低;缺點是測試充分性無法保證,可能有較高的漏報率。後者的優點是漏報率低;缺點是代價大,且大都無法防禦拒絕服務攻擊。
根據緩衝區溢出原理,提出一種基於可執行代碼的緩衝區溢出檢測模型,給出該模型的理論基礎,描述模型構建的過程,提出新的緩衝區引用實例的識別方法。 該模型將可執行代碼反彙編為彙編代碼, 建立函式調用關係圖和控制流圖, 分析緩衝區變數及其引用實例,從緩衝區引用實例逆程式流方向歸結路徑約束,通過約束求解判斷緩衝區溢出可能與否。

相關詞條

熱門詞條

聯絡我們