利用反彙編手段解析C語言函式

2021-10-24 01:55:27 字數 1109 閱讀 6193

利用反彙編手段解析c語言函式

通過在 visual c++6.0 下反彙編乙個 32 位 c語言程式的部分**來解析解釋函式呼叫的具體過程。

函式呼叫過程

函式呼叫過程主要由引數傳遞、位址跳轉、區域性變數分配和賦初值、執行函式體,結果返回等幾個步驟組成。

引數傳遞及函式跳轉

引數由實參傳遞給形參。在底層實現上,即是實參按照函式呼叫規定壓入堆疊。引數傳遞完成後就通過call指令由當前程式跳轉到子程式處。

區域性變數分配並賦值

函 數的「」被解釋為函式體已經執行完。遇到「}」時,會將堆疊中的區域性變數、程式中壓入堆疊的暫存器的值全部彈出,將之前 call指令執行時壓入堆疊的函式返回位址彈到指令指標暫存器 eip,從而返回到主調函式。

堆疊平衡

堆疊平衡指的是將函式呼叫前壓入堆疊的引數彈出堆疊,使堆疊恢復到其呼叫前的狀態。由於函式呼叫完成後,引數就是無用的資料了,因此需要將其移出堆疊。

在 c語言中不需要進行堆疊平衡。而在彙編層面上卻根據呼叫約定來確定由主調函式或是被調函式完成堆疊平衡。

棧幀

引數由主調函式壓入堆疊,call 指令將函式返回位址入棧。進入子函式後,需要儲存 ebp 原值、分配區域性變數空間、儲存暫存器初始值。函式內通過「ebp-位移量」方式訪問區域性變數,通過「ebp+位移量」方式訪問引數。

每發生一次函式呼叫,就會在堆疊中建立乙個棧幀,棧幀在函式呼叫後釋放。但是系統的堆疊資源有限,因此如果函式呼叫(如遞迴呼叫)層數過多,則可能發生堆疊溢位錯誤。

反彙編從 call 指令可見 fuction函式編譯後加了「_」修飾符。

在函式內,遇到「{」時分配區域性空間,並用值「0xcch」進行初始化。未在定義時初始化的區域性變數其初值就與「0xcch」相關。因此 int 型別變數由於佔四個位元組,其初值為 - 858993460(0xccccc-ccch);兩個連續的 0xcch 對應漢字「燙」字,因此當

以字元形式顯示函式內未初始化的變數時會顯示為「燙燙…」;指標型別變數就指向了位址為 0xcccc-cch 的記憶體。由此在除錯模式下能很容易發現未初始化的變數。

利用反彙編手段解析C語言函式

1 問題的提出 函式是 c語言中的重要概念。利用好函式能夠充分利用系統庫的功能寫出模組獨立 易於維護和修改的程式。函式並不是 c 語言獨有的概念,其他語言中的方法 過程等本質上都是函式。可見函式在教學中的重要意義。在教學中一般採用畫簡單的堆疊圖的方式描述函式呼叫,但由於學生對堆疊沒有直觀認識,難以深...

C語言反彙編

這裡使用的是keil4軟體,將編寫的c語言程式彙編成組合語言。這裡只用最簡單的c語言做了一下參考,所舉的例子是最簡單的,只能用於了解一下彙編的表達方式。如圖所示,條件判斷語句的彙編語句表達是賦值後與進行異或比較,再判斷是否進行跳轉。將立即數03賦值給累加器a,然後將累加器a的值與立即數05進行異或 ...

C 虛函式呼叫的反彙編解析

虛函式的呼叫如何能實現其 虛 作為c 多型的表現手段,估計很多人對其實現機制感興趣。大約一般的教科書就說到這個c 強大機制的時候,就是教大家怎麼用,何時用,而不會去 一下這個虛函式的真正實現細節。當然,因為不同的編譯器廠家,可能對虛函式有自己的實現,呵呵,這就算是虛函式對於編譯器的 多型 了 作為編...