首页
社区
课程
招聘
如何确定线程栈的基址?
发表于: 2023-10-29 09:35 11626

如何确定线程栈的基址?

2023-10-29 09:35
11626

很早之前,我遇到过几个与栈相关的问题,当时总结过几篇关于线程栈的文章,分别是 《栈大小可以怎么改?》《栈局部变量优化探究,意外发现了 vs 的一个 bug ?》《栈又溢出了》《有趣的异常》。在这几篇总结中,简单的总结了栈溢出的原因,设置线程栈大小的方法。但是还有一点没弄清楚:操作系统是怎么知道一个线程的栈大小的?一定记录在某个位置了,否则就不能正确的在栈溢出的时候抛出异常了。不能根据 PE 头中的字段判断,因为在创建线程的时候可以指定线程栈大小。TEB 中的 StackLimit 是真正的栈底吗?带着这些疑问一起来刨根问底吧~

友情提示:结论在文章末尾。

相信,很多小伙伴儿都知道,可以使用 !teb 查看线程相关的信息。

view-thread-using-teb-command
其中的 StackBaseStackLimit 分别指示了栈顶和当前栈使用情况。因为栈是从上向下增长的,所以 StackBase 的值比较大。

我之前一直认为这两个字段分别指向了栈顶和栈底(线程栈可以到达的最低位置),可以通过这两个字段计算出线程栈大小。后来才发现 StackLimit 并没有指向栈底,而是指向了线程栈当前所到达的最低位置。

线程栈默认的大小是 1MB。如果计算一下 StackBase - StackLimit 的值即可知道,它们的差值是 256KB,而不是 1MB

calculate-current-thread-stack-size
那么当前线程栈的大小是不是 1MB 呢?该如何确认呢?可以通过 vmmap 确定。

打开 vmmap.exe,并选择想要查看的进程,即可进行查看。

注意: 当选择的进程已经中断到调试器时,vmmap.exe 会一直等待,需要让目标进程运行起来。

view-stack-size-in-vmmap
可以看到,线程 9804 的线程栈大小确实是 1MB

根据以上信息,可以确定 StackLimit 并不是真正的线程栈栈底。那么,栈底位置到底记录在哪里了呢?

最近在重翻《软件调试》的时候,发现了一个关键函数。

在第 2222.8.1 节 栈空间的自动增长(P617)中提到了一个关键函数 MiCheckForUserStackOverflow。该函数是判断栈空间能否增长的关键函数。如果知道该函数是如何实现的,就能找到栈底了。

脑子里很快有了三个选项:google 搜索,ReactOSserver03 源码。正好电脑上有源码,不用考虑其它两个选项了。

知道了函数名,但是还不知道这个函数在哪个文件中实现的。这个简单,在 File Locator 中输入 MiCheckForUserStackOverflow,很快就找到了关键的文件。

search-MiCheckForUserStackOverflow
双击打开 accesschk.c,找到 MiCheckForUserStackOverflow。注释很清晰的解释了这个函数的作用。

MiCheckForUserStackOverflow-description

说明: 该函数的实现在 wrk 中也可以找到,地址是 https://github.com/mic101/windows/blob/master/WRK-v1.2/base/ntos/mm/acceschk.c。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 3
支持
分享
最新回复 (6)
雪    币: 3
活跃值: (466)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢楼主 学废了
2023-10-30 17:10
0
雪    币: 3535
活跃值: (31016)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢分享
2023-10-31 17:39
1
雪    币: 6501
活跃值: (4912)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
4
只记得老师曾经说过栈的大小是1024
2023-10-31 18:39
0
雪    币: 8519
活跃值: (9122)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
5
拉闸太子 感谢楼主 学废了
我也废了
2023-11-15 13:12
0
雪    币: 8519
活跃值: (9122)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
6
简单的简单 只记得老师曾经说过栈的大小是1024[em_78]
可以改 默认保留大小是 1MB
2023-11-15 13:12
0
雪    币: 8519
活跃值: (9122)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
7
秋狝 感谢分享
感谢阅读
2023-11-15 13:12
0
游客
登录 | 注册 方可回帖
返回
//