如何通过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);

如何继续?替代方案?

如何通过PID和线程ID查找Windows服务

我查看了Process Hacker的源代码。没有哈里·约翰斯顿提出的启发式方法。取而代之的是什么:

1) 使用NtQueryInformationThread查找线程的基地址。检查来自另一个进程的win32线程的Get-StartAddress以了解如何从C#调用。

2) 进程句柄是通过NtQueryInformationThreadNtOpenProcess获得的。

3) NtReadVirtualMemory用于从打开进程中FIELD_OFFSET(TEB, SubProcessTag)位置的线程内存中读取(不确定如何转换为C#)。这就是所谓的ServiceTag

4) 使用advapi32.dll中的I_QueryTagInformationServiceTag中获取服务名称。

因此,没有欺骗,也没有魔术,但让它在C#中工作似乎有点困难。

通常情况下,您不能。线程和服务之间没有1:1的关系。一个线程可以运行多个服务,而一个服务可以(通常也有)具有多个线程。

Process Hacker可能使用某种启发式方法,例如,跟踪线程的调用堆栈并识别svchost.exe正在运行的DLL。或者它假设线程与调用ServiceMain()的线程相同;可能有一种未记录的方法来识别这一点。