windows堆栈研究以及线程安全

由于hook时要线程安全,考虑每条线程的堆栈放对应的数据,于是找了一下网上的说法是默认2M,实际情况却不是这样的。在win10下,使用gcc,vc++,delphi,3种编译器默认编译进行了测试。

真实大小是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

110113_UuO2_1777508.png

说一下栈顶,跨越栈顶没有问题,但是操作系统并不会更改TEB中的数据,所以这种做法无法增加堆栈大小。

 

再说一下线程安全,直接在堆栈中分配的局部变量当然是安全的,但是指针不安全,如果每条线程分配一个对象,这种面向对象也是安全的,全局变量是不安全的,而不同线程使用同一个对象也是不安全的。

 

转载于:https://my.oschina.net/u/1777508/blog/1814685

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值