C++/Win32 - 如何迭代特定进程的线程列表并将起始地址解析为模块?
Posted
技术标签:
【中文标题】C++/Win32 - 如何迭代特定进程的线程列表并将起始地址解析为模块?【英文标题】:C++/Win32 - How to Iterate specific process's thread list and resolve start address to module? 【发布时间】:2019-07-21 13:21:42 【问题描述】:请记住,我是系统编程的新手。
我想做的是获取特定进程的线程列表(包括系统进程,又名 PID 4),并使用模块名称获取每个线程的 PID。
ProcessExplorer 会这样做,但我完全不知道他们是如何做到的 :(
任何帮助,尤其是代码方面的帮助将不胜感激。
我通过使用 EnumProcesses (Name to PID) 获取 PID 但对如何实现另外两个必需的功能一无所知。
【问题讨论】:
@IharobAlAsimi 你能指出在哪里阅读吗? 所有win32函数都有在线文档。 那么,确切地说,我们在谈论什么功能? 您必须通过阅读文档来弄清楚,但我怀疑它与您用于该过程的相同。 您是在暗示,我应该尝试从 MSDN 中与 Thread 相关的整个文档中搜索吗?因为,这很令人困惑,因为我在 MSDN 中搜索了几个小时以使用模块名称解析线程起始地址,就像我发布的屏幕截图一样,没有。 【参考方案1】:我不能代表 ProcessExplorer,但 ProcessHacker 做了类似的事情,我已经看过它的源代码几次。
他们的方法在理论上很简单,但需要一些努力来实现(解析函数名称可能很棘手)。
这里或多或少是一步一步的过程:
使用NtQueryInformationThread
查询线程的起始地址。 (Code here)
查找该地址属于哪个模块并加载其符号文件 (pdb)
现在查询该符号文件以获取该地址处的函数名称(如果存在)。 (Code here) 如果该地址没有函数,它们只是以漂亮的方式返回模块名称和起始地址 (ModuleName.dll+<startAddress - moduleBase>
)
我希望这能解决一些问题。
【讨论】:
UC mod 拥有我和所有 xD / 谢谢! :) 哦,我仍然需要“查找该地址属于哪个模块”的参考,但猜它也存在于 PH 中? @아아니으 这可以通过简单地将地址与每个模块的起始地址进行比较来完成。如果它在 (moduleBase, moduleBase+moduleSize] 范围内,那么你找到了它所在的模块。【参考方案2】:我记得系统进程(PID 为 4)普通用户无法访问(甚至管理员)。 如果你真的想分析系统进程的信息,你需要了解一些关于 Windows Kernel Application 的知识。
分析过程中的方法,别人的答案已经说得很清楚了。
【讨论】:
您不能检查它的堆栈,但您仍然可以获取线程列表并在用户模式下暂停/恢复它们。用无人驾驶 PH 检查。以上是关于C++/Win32 - 如何迭代特定进程的线程列表并将起始地址解析为模块?的主要内容,如果未能解决你的问题,请参考以下文章