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):?
- 一些函數將幀指針配置為在進入一個函數時指向棧幀(以及棧指針)的頂端。在這種情況下,就應設置該屬性。基本上,它的作用等同于將幀指針增量的大小設置為等于局部變量區域
總結
以上是生活随笔為你收集整理的19.IDA-栈指针调节、设置函数特性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 18.IDA-创建自己的sig
- 下一篇: 20.IDA-修改二进制文件、显示修改点