windows堆棧研究以及線程安全

因爲hook時要線程安全,考慮每條線程的堆棧放對應的數據,因而找了一下網上的說法是默認2M,實際狀況卻不是這樣的。在win10下,使用gcc,vc++,delphi,3種編譯器默認編譯進行了測試。c++

真實大小是1A0000-A3000=FD000(1,036,288) 大約1M,這是堆棧滿了從新分配後的大小,必須跨越棧底堆棧纔會從新分配,我想這部分應該在內核,暫時還沒研究。而默認大小實際是5000(20480)也就是20K,想要增長到1M,必須屢次跨越棧底,每次增長1000(4096),也就是4K,一直到A3000(注意這裏是例子中的偏移,實際狀況可能不同,好比另外一個表現爲500000-403000=FD000)就能夠中止了,以後你就可使用1M的堆棧了。須要注意的是,直接把esp改過去是行不通的,會形成程序崩潰,必需要屢次跨越棧底。安全

程序裏應該這麼作:測試

FD-5=F8操作系統

也就是說要作下面這個循環F8次。線程

mov esp,[dword fs:0x8]指針

push eax對象

jmp XMalExe.009176D6編譯器

說一下棧頂,跨越棧頂沒有問題,可是操做系統並不會更改TEB中的數據,因此這種作法沒法增長堆棧大小。編譯

 

再說一下線程安全,直接在堆棧中分配的局部變量固然是安全的,可是指針不安全,若是每條線程分配一個對象,這種面向對象也是安全的,全局變量是不安全的,而不一樣線程使用同一個對象也是不安全的。變量

相關文章
相關標籤/搜索