19.IDA-棧指針調節、設置函數特性

棧指針調節

IDA會盡其所能跟蹤函數內每一條指令上的棧指針的變化。IDA跟蹤這種變化的準確程度,在很大程度上影響着函數的棧幀佈局的準確程度。如果IDA無法確定一條指令是否更改了棧指針,你就需要手動調整棧指針 
如果一個函數調用了另一個使用stdcall調用約定的函數,就會出現上述情況,這是最簡單的一種情況。如果被調用的函數位於IDA無法識別的共享庫中(IDA擁有與許多常用庫函數的簽名和調用約定有關的信息),那麼,IDA並不知道該函數使用了stdcall調用約定,也就無法認識到:被調用的函數會將棧指針修改後返回。因此,IDA會爲函數的剩餘部分提供一個錯誤的棧指針值。

要進行棧調整,首先應選中進行調整的地址,並選擇Edit▶Func-tions▶Change Stack Pointer(熱鍵爲ALT+K),然後指定棧指針更改的字節數(或右鍵菜單選中Change Stack Pointer)

è¿éåå¾çæè¿°

注意更改的是選中的指令對棧的更改量,另棧是向低地址增長的,所以看圖中指令,當前地址相對原始 esp小了0x8,指令是call callflow(int),而callflow函數是__stdcall,所以DIFFERENCE 爲4(內部平衡堆棧,向上增長4)

如果IDA不能準確計算出callflow爲__stdcall,那麼就會出錯(如前面提到的callflow爲IDA不能識別的共享庫的導入函數),那麼我們需要在每個callflow的調用處進行棧調整,這很繁瑣,而且容易出錯 
對於任意函數(包括庫函數,導入函數),都可以選中此函數,再使用EDIT▶Functions▶Edit Functions… 
è¿éåå¾çæè¿°

如果是導入函數,雙擊到.rdata目錄,然後再使用EDIT▶Functions▶Edit Functions… 

è¿éåå¾çæè¿°

棧調整對應Purged bytes,即

 函數特性

函數名稱(Name of function): 
- 提供另外一種更改函數名稱的方法 
起始地址(Start address): 
- 函數中第一條指令的地址。通常,IDA會在分析過程中,或根據創建函數時所使用的地址,自動識別這個地址。 
結束地址(End address): 
- 函數中最後一條指令之後的地址。通常,它是函數的返回語句之後的指令的地址。記住,這個地址並不是函數的一部分,而是函數的最後一條指令之後的地址。 
局部變量區(Local variables area): 
- 函數的局部變量專用的棧字節數。多數情況下,IDA會通過分析函數的棧指針的行爲,自動計算出這個值。 
保存的寄存器(Saved registers): 
- 爲調用方保存寄存器(見圖6-4)所使用的字節數。IDA認爲保存的寄存器區域放在保存的返回地址頂部、與函數有關的所有局部變量的下方。一些編譯器選擇將寄存器保存在函數局部變量的頂部。IDA認爲保存這些寄存器所使用的空間屬於局部變量區域,而非保存的寄存器區域。 
已刪除字節(Purged bytes): 
- 已刪除字節表示當函數返回調用方時,IDA從棧中刪除的參數的字節數。對cdecl函數而言,這個值始終爲0。對stdcall函數來說,這個值表示傳遞到棧上的所有參數佔用的空間。在x86程序中,如果IDA觀察到程序使用了返回指令的RET N變體,它將自動確定這個值。 
幀指針增量(Frame pointer delta): 
- 有時候,編譯器可能會對函數的幀指針進行調整,使其指向局部變量區域的中間,而不是指向保存在局部變量區域底部的幀指針。調整後的幀指針到保存的幀指針之間的這段距離叫做幀指針增量。

屬性: 
不返回(Does not return): 
- 函數不返回到它的調用方。如果調用這樣的函數,在相關的調用指令之後,IDA認爲函數不會繼續執行 
庫函數(Library func): 
- 這個屬性將一個函數標記爲庫代碼 
基於BP的幀(BP based frame): 
- 這個特性表示函數利用了一個幀指針。多數情況下,你可以通過分析函數的“序言”來自動確定這一點。但是,如果通過分析無法確定給定的函數是否使用了幀指針,就可以手動選擇這個特性。如果你手動選擇了這個特性,一定要相應地調整保存的寄存器的大小(通常指根據保存的幀指針的大小增大)和局部變量的大小(通常指根據保存的幀指針的大小減少)。對基於幀指針的幀而言,使用幀指針的內存引用被格式化,以利用符號棧變量名稱,而非數字偏移量。如果沒有設置這個特性,則認爲棧幀引用與棧指針寄存器有關。 
BP等於SP(BP equals to SP): 
- 一些函數將幀指針配置爲在進入一個函數時指向棧幀(以及棧指針)的頂端。在這種情況下,就應設置該屬性。基本上,它的作用等同於將幀指針增量的大小設置爲等於局部變量區域

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章