首页
社区
课程
招聘
[求助]如何获取已知ID的进程的主线程ID?(谁来编译一下8楼,谢谢啊)
发表于: 2009-1-16 01:19 17579

[求助]如何获取已知ID的进程的主线程ID?(谁来编译一下8楼,谢谢啊)

2009-1-16 01:19
17579
收藏
免费 0
支持
分享
最新回复 (26)
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
26
通过线程执行时间不一定可靠,要是在最开始就CreateThread了,线程的执行时间会相同。

可以通过回溯栈上的值来判断哪个线程是主线程,主线程的栈多少有些不同。例如:
程序载入时主线程的堆栈情况:
0012FFC4 7C817027 返回到 kernel32.7C817027
0012FFC8 7C930228 ntdll.7C930228
0012FFCC FFFFFFFF
...
0012FFF8 0040B158 OFFSET CreateTh.<模块入口点>
0012FFFC 00000000


CreateThread并弹出提示后的主线程栈情况:
0012FF8C 0012FFB4 指向下一个 SEH 记录的指针
0012FF90 0040A0CD SE处理程序
0012FF94 0012FFA8
0012FF98 7FFD6000
0012FF9C 00000001
0012FFA0 0040A000 CreateTh.0040A000
0012FFA4 00E0DAA4 UNICODE "MsgBoxThread(1) Running..."
0012FFA8 /0012FFC0
0012FFAC |0040B189 返回到 CreateTh.0040B189 来自 CreateTh.0040A068
0012FFB0 |7C92DCBA 返回到 ntdll.7C92DCBA
0012FFB4 |0012FFE0 指向下一个 SEH 记录的指针
0012FFB8 |00403E18 SE处理程序
0012FFBC |0012FFC0
0012FFC0 \0012FFF0
0012FFC4 7C817027 返回到 kernel32.7C817027
0012FFC8 7C930228 ntdll.7C930228
0012FFCC FFFFFFFF
...
0012FFF8 0040B158 OFFSET CreateTh.<模块入口点>
0012FFFC 00000000


而子线程的栈是这样的:
00F3FF98 00F3FFDC 指向下一个 SEH 记录的指针
00F3FF9C 0040A0CD SE处理程序
00F3FFA0 00F3FFB4
00F3FFA4 00000000
00F3FFA8 00000000
00F3FFAC 806E5E00
00F3FFB0 00E0DAEC UNICODE "MsgBoxThread(0) Running..."
00F3FFB4 00F3FFEC
00F3FFB8 7C80B6D9 返回到 kernel32.7C80B6D9
00F3FFBC 00000000
00F3FFC0 00000027
00F3FFC4 003F003F
00F3FFC8 00000000
00F3FFCC 7FFDE000
00F3FFD0 89DA4600
00F3FFD4 00F3FFC0
00F3FFD8 88462F90
00F3FFDC FFFFFFFF SEH 链尾部
00F3FFE0 7C839A88 SE处理程序
00F3FFE4 7C80B6E0 kernel32.7C80B6E0
00F3FFE8 00000000
00F3FFEC 00000000
00F3FFF0 00000000
00F3FFF4 0040A068 CreateTh.0040A068
00F3FFF8 00000000
00F3FFFC 00000000


最明显就是主线程栈上的PE入口点信息,没有这个的就是子线程。
另外图简便可以通过ESP的大致位置判断,一般主线程从0012FFC4这里开始(也有特殊情况),而子线程偏差很大。

附带个最简单的测试程序。两个线程,主线程里显示“MsgBoxThread(1)”,像上面的堆栈情况自己用OD看吧。
上传的附件:
2009-5-12 22:17
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
27
CsrProcessLink中取CsrProcessInfo->ClientId.UniqueThread即可,绝对可靠~
2009-5-12 22:27
0
游客
登录 | 注册 方可回帖
返回
//