C++ C++/Win32-如何迭代特定流程';s线程列表并将起始地址解析为模块?
请记住,我是系统编程的新手 我试图做的是获取特定进程的线程列表(包括系统进程,又名PID 4),并使用模块名获取每个线程的PID ProcessExplorer可以做到这一点,但我完全不知道他们是如何做到这一点的:( 任何帮助,尤其是代码方面的帮助,都将不胜感激 我使用枚举进程(名称到PID)获取PIDC++ C++/Win32-如何迭代特定流程';s线程列表并将起始地址解析为模块?,c++,c,windows,winapi,C++,C,Windows,Winapi,请记住,我是系统编程的新手 我试图做的是获取特定进程的线程列表(包括系统进程,又名PID 4),并使用模块名获取每个线程的PID ProcessExplorer可以做到这一点,但我完全不知道他们是如何做到这一点的:( 任何帮助,尤其是代码方面的帮助,都将不胜感激 我使用枚举进程(名称到PID)获取PID 但是对于如何实现另外两个必需的函数一无所知。我不能代表ProcessExplorer说话,但是ProcessHacker做了类似的事情,我已经查看了它的源代码好几次了 他们的方法在理论上很简单
但是对于如何实现另外两个必需的函数一无所知。我不能代表ProcessExplorer说话,但是ProcessHacker做了类似的事情,我已经查看了它的源代码好几次了 他们的方法在理论上很简单,但需要一些努力来实现(解析函数名可能很棘手) 这里大致是一步一步的过程:
- 使用
查询线程的起始地址。()NtQueryInformationThread
- 查找该地址所属的模块并加载其符号文件(pdb)
- 现在,如果存在函数名,则在该符号文件中查询该地址处的函数名。()如果该地址处没有函数,则它们将以一种非常简单的方式返回模块名和起始地址(
)ModuleName.dll+
分析过程中的ADS的方法,其他人的答案已经说得非常清楚。@IharobAlAsimi你能指出在哪里阅读吗?所有win32函数都有在线文档。确切地说,我们谈论的是什么函数?你必须通过阅读文档来弄清楚,但我怀疑它与你使用的是同一个对于这个过程。你是在暗示,我应该尝试从MSDN中与线程相关的整个文档中搜索吗?因为,这让人困惑,因为我在MSDN中搜索了几个小时,用模块名解析线程开始地址,就像我发布的屏幕截图一样,没有。UC mod拥有我和所有xD/谢谢!:)哦,我仍然需要参考“找到该地址属于哪个模块”tho,但猜测它也存在于PH中@아아니으 这可以通过简单地将地址与每个模块的起始地址进行比较来实现。如果它在(moduleBase,moduleBase+moduleSize)范围内,则您可以找到它所在的模块。您无法检查它的堆栈,但仍然可以获取线程列表,并在用户模式下挂起/恢复它们。请使用driverless PH进行检查。