可以肯定地說(shuō),任何設(shè)計(jì)合理的程序都是圍繞著數(shù)據(jù)進(jìn)行設(shè)計(jì)的。哪些數(shù)據(jù)必須由程序來(lái)管理呢?在程序中這些數(shù)據(jù)最準(zhǔn)確、高效的表示方法是什么?這些都是有經(jīng)驗(yàn)的軟件設(shè)計(jì)人員和軟件開發(fā)人員必須知道的最基本的問(wèn)題。
對(duì)逆向工程而言,數(shù)據(jù)也是同樣重要的。要真正理解一個(gè)程序,逆向者必須理解這個(gè)程序的數(shù)據(jù)。只要理解了程序中關(guān)鍵數(shù)據(jù)結(jié)構(gòu)的總體規(guī)劃和設(shè)計(jì)目的,我們就可以相對(duì)比較輕松地破譯我們感興趣的特定的代碼區(qū)域。
本附錄講解了各種各樣與程序中底層數(shù)據(jù)管理相關(guān)的主題。我們將從堆棧開始,討論在程序中是如何使用堆棧的,然后接著討論程序中使用的幾種最基本的數(shù)據(jù)構(gòu)造(data constructs。譯注:數(shù)據(jù)構(gòu)造要比數(shù)據(jù)結(jié)構(gòu)的含義更廣泛。),比如說(shuō)變量,等等。接下來(lái)一節(jié)我們討論數(shù)據(jù)在內(nèi)存中的布置,并且描述了(從底層代碼的視角來(lái)看)數(shù)組、鏈表等常用的數(shù)據(jù)構(gòu)造。最后,我將演示類在底層是怎樣實(shí)現(xiàn)的以及怎樣在逆向工程中識(shí)別類。
C.1 堆棧
可以說(shuō)堆棧是一塊連續(xù)的內(nèi)存,在系統(tǒng)中運(yùn)行的例程將它組織成“層狀”結(jié)構(gòu)。堆棧中的內(nèi)存單元在函數(shù)的生命周期內(nèi)可以使用,而當(dāng)函數(shù)返回時(shí),這些內(nèi)存單元就會(huì)被釋放(釋放后其他函數(shù)就可以用了)。
接下來(lái)的幾小節(jié)將展示堆棧是怎樣組織的,并講述各種決定堆棧的基本布局的調(diào)用約定。
C.1.1 堆棧幀
堆棧幀指的是在堆棧中為當(dāng)前正在運(yùn)行的函數(shù)分配的區(qū)域(或空間)。傳入的參數(shù)、返回地址(當(dāng)這個(gè)函數(shù)結(jié)束后必須跳轉(zhuǎn)到該返回地址。譯注:即主調(diào)函數(shù)的斷點(diǎn)處)以及函數(shù)所用的內(nèi)部存儲(chǔ)單元(即函數(shù)存儲(chǔ)在堆棧上的局部變量)都在堆棧幀中。
對(duì)函數(shù)來(lái)說(shuō),堆棧幀內(nèi)部具體的布局是一個(gè)非常關(guān)鍵的問(wèn)題,因?yàn)椴季謺?huì)影響到函數(shù)訪問(wèn)堆棧中存放的傳入?yún)?shù)以及存放其內(nèi)部數(shù)據(jù)(例如局部變量)的方式。大多數(shù)函數(shù)調(diào)用代碼都是以一段為函數(shù)設(shè)置堆棧幀的序言(prologue)開始的。設(shè)置堆棧幀的目的是:通過(guò)將一個(gè)指針存放在堆棧中參數(shù)區(qū)域和局部變量區(qū)域之間的那個(gè)單元,使得函數(shù)可以簡(jiǎn)便而快捷地訪問(wèn)這些參數(shù)和局部變量。這個(gè)指針通常存放在一個(gè)輔助寄存器中(通常是EBP),而騰出來(lái)ESP(ESP是主堆棧指針)來(lái)記錄當(dāng)前堆棧位置(即堆棧頂)。當(dāng)前堆棧位置非常重要,因?yàn)檫@個(gè)函數(shù)可能還需要調(diào)用另外一個(gè)函數(shù)——這種情況下在ESP指向的當(dāng)前位置下面(譯注:“下面”指的是更低內(nèi)存地址,而不是圖C.1中所示的那種“上下”關(guān)系)的區(qū)域就要被用來(lái)給被調(diào)函數(shù)創(chuàng)建一個(gè)新的堆棧幀了。
圖C.1展示了堆棧的總體布局以及堆棧幀是怎樣布置的。

總結(jié):
堆棧幀是一個(gè)為函數(shù)保留的區(qū)域,用來(lái)存儲(chǔ)關(guān)于參數(shù)、局部變量和返回地址的信息。
堆棧幀通常是在新的函數(shù)調(diào)用的時(shí)候創(chuàng)建,并在函數(shù)返回的時(shí)候銷毀。
說(shuō)白了,堆棧由堆棧幀組成. 當(dāng)調(diào)用函數(shù)時(shí)堆棧幀被壓入棧中, 當(dāng)函數(shù)返回時(shí)堆棧幀被從棧中彈出. 堆棧幀包括函數(shù)的參數(shù), 函數(shù)地局部變量, 以及恢復(fù)前一個(gè)堆棧幀所需要的數(shù)據(jù)。