日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

19.IDA-栈指针调节、设置函数特性

發布時間:2024/4/11 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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-栈指针调节、设置函数特性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。