如何通过PID和线程ID查找Windows服务
本文关键字:查找 Windows 服务 ID 线程 何通过 PID | 更新日期: 2023-09-27 18:23:55
在我的C#应用程序中,我有一个Windows服务的PID和线程ID。如何找到它是哪个服务(注意:例如,svchost.exe的单个实例可以承载多个服务)?无论是直接在C#中,还是调用其他实用程序,我都可以。
进程黑客可以显示服务名称(进程属性->标签线程->列服务)。
到目前为止,我已经找到了进程和线程:
var p = Process.GetProcessById(pid);
var t = p.Threads.Cast<ProcessThread>().SingleOrDefault(t => t.Id == threadId);
如何继续?替代方案?
我查看了Process Hacker的源代码。没有哈里·约翰斯顿提出的启发式方法。取而代之的是什么:
1) 使用NtQueryInformationThread
查找线程的基地址。检查来自另一个进程的win32线程的Get-StartAddress以了解如何从C#调用。
2) 进程句柄是通过NtQueryInformationThread
和NtOpenProcess
获得的。
3) NtReadVirtualMemory
用于从打开进程中FIELD_OFFSET(TEB, SubProcessTag)
位置的线程内存中读取(不确定如何转换为C#)。这就是所谓的ServiceTag
。
4) 使用advapi32.dll
中的I_QueryTagInformation
从ServiceTag
中获取服务名称。
因此,没有欺骗,也没有魔术,但让它在C#中工作似乎有点困难。
通常情况下,您不能。线程和服务之间没有1:1的关系。一个线程可以运行多个服务,而一个服务可以(通常也有)具有多个线程。
Process Hacker可能使用某种启发式方法,例如,跟踪线程的调用堆栈并识别svchost.exe
正在运行的DLL。或者它假设线程与调用ServiceMain()的线程相同;可能有一种未记录的方法来识别这一点。