• 沒有找到結果。

局部變數與函數傳入值

在文檔中 軟體保護之研究 (頁 11-14)

第二章 軟體破解相關背景

2.2 局部變數與函數傳入值

局部變數主要是為了定義一些僅在單個函數裡有用的變數而提出,使用局部 變數能帶來一些額外的好處,它使程式的模組化封裝變得可能,試想一下,如果 要用到的變數必須定義在程式的資料段裡面,假設在一個子程式中要用到一些變 數,當把這個子程式移植到別的程式時,除了把程式碼移過去以外,還必須把變 數定義移過去。而即使把變數定義移過去了,由於這些變數定義在大家都可以用 的資料段中,就無法對別的程式碼保持透明,別的程式碼有可能有意無意地修改 它們。局部變數這個概念出現以後,兩個以上的函式都要用到的資料才被定義為 總體變數統一放在資料段中,僅在單一函式內部使用的變數則放在堆疊中,這樣 函式可以編成黑盒子的模樣,使程式的模組結構更加分明。

局部變數的作用範圍是單一函式,在進入函式的時後,透過修改堆疊指標 SP 來預留出需要的空間,在用 ret 指令返回主程式之前,同樣透過恢復 SP 來丟 棄這些空間,這些變數就隨之無效了。它的缺點就是因為空間是臨時分配的,所 以無法定義含有初始化值的變數,因此對局部變數的初始化一般在函式中以指令 完成。

函式傳入值與局部變數的共通點在於皆為某一函式需要,因此兩者皆以系統 堆疊實作之。不同點在於函式傳入值在被呼叫函式執行前由呼叫函式預留空間與 設定其值接著才執行被呼叫函式,而局部變數則在被呼叫函式開頭預留空間執行 過程中設定其值。函式呼叫的詳細作法本文略過不提只介紹函式呼叫時局部變數 與傳入值的堆疊中的變化如圖 3 所示。

圖 3 函式呼叫與堆疊變化示意圖

BP 與間接定址法

由記憶位址存取資料的方法,叫做記憶位址定址法(Memory Addressing mode),記憶位址定址法又分成 1.直接定址法 2.間接定址法兩大類。

間接定址法就是不直接指明資料的位置,而把資料的位址存於暫存器,然後 指示 CPU 往暫存器上取得資料所在位址以存取資料的方法。間接定址法又細分為 數種,其中一種叫做基底定址法即為利用 BP 定址的方法。

相對於 SP 永遠指向堆疊頂端 BP 則隨需要而變化,在某個函式執行的過程中 BP 會保持不變(呼叫子函式不算)指向某個位置當做基底定址法的基底,此方法 也是系統存取局部變數與傳入值的方法細節如圖 4 所示。

圖 4 基底定址法示意圖

上面介紹是用來存取局部變數與傳入值的間接定址法,實際上我們可以任意 一個暫存器為基底來存取記憶體。本節資料參考[2]。

2.3 80x86 處理器的工作模式

8088/8086 的 CPU 暫存器如 AX,BX,CX,DX,SI,DI,SP 和 BP 為 16 位元暫存器,

在 80386 中,這些暫存器被擴展到 32 位元,即 EAX,EBX,ECX,EDX,ESI,EDI,ESP 和 EBP。

80386 處理器有三種工作模式:真實模式,保護模式和虛擬 86 模式。

真實模式和虛擬 86 模式是為了和 8086 處理器相容而設置的。在真實模式 下,80386 處理器只能使用 32 位元暫存器的前 16 位元,後面的 16 位元都浪費了,

因此相當於一個快速的 8086 處理器。

保護模式是 80386 處理器的主要工作模式。在此模式下,80386 可以定址 2^32=4GB 的位置空間,同時,保護模式提供了 80386 先進的多工,記憶體分頁 管理和優先順序保護等機制。

為了在保護模式下繼續提供和 8086 處理器的相容,80386 又設計了一種虛 擬 86 模式,以便可以在保護模式的多工條件下,有的任務運行 32 位元程式,有 的任務運行 MS-DOS 程式。在虛擬 86 模式下,同樣支援多工,記憶體分頁管理和 優先順序保護等機制,但記憶體的定址方式和 8086 相同,只可以定址 1MB 的空

間。

當 80386 在保護模式下運作時,定址空間高達 2^32=4GB。雖然與 8086 可定 址的 1MB 位置的差距可謂很大,但實際的微處理系統很難能安裝如此大的實體 記憶體。所以,虛擬記憶體(Virtual Memory)是一種必需的技術。

虛擬記憶體(Virtual Memory)不是真正的記憶體,它通過映射(Map)的方 法,使可用的虛擬位置答到 4GB,每一個應用程式可以被分配 2GB 的虛擬位置,

剩下的 2GB 留給作業系統自己使用。簡單地說,虛擬記憶體的實現方法和過程是:

1. 當一個應用程式被啟動時,作業系統就創建一個新行程,並給每一個行程分 配 2GB 的虛擬位置(不是記憶體,只是位置)

2. 虛擬記憶體管理器(Virtual Memory Manager)經應用程式的程式碼映射到那 個應用程式的虛擬位置中的某個位置,並把當前所需要的程式碼讀取到物理 位置中(注意 :虛擬位置和應用程式碼在實體記憶體中的位置沒有關連) 3. 如果使用動態連結程式庫(Dynamic-Link Library,即 DLL) ,也被映射到該

行程的虛擬位置空間,在需要的時後才被讀入實體記憶體

在 Win32 平臺上(包括 Windows 95/98/ME/NT/2000/XP/CE) ,可執行檔是 PE(Portable Executable)格式。本節介紹 PE 檔的基本知識與作業系統如何載入 並執行軟體。

PE 檔使用一個線性的位置空間,所有程式碼和資料都被合併在一起,組成 一個很大的結構。檔案的內容被分割為不同的區塊(Section),塊中包含程式碼

在文檔中 軟體保護之研究 (頁 11-14)

相關文件