C++/Win32 - 如何迭代特定进程的线程列表并将起始地址解析为模块?

标签 c++ c windows winapi

请记住,我是系统编程的新手。

我试图做的是获取特定进程的线程列表(包括系统进程,又名 PID 4),并获取每个线程的 PID 和模块名称。

ProcessExplorer 会这样做,但我完全不知道他们是怎么做到的:(

example

任何帮助,尤其是代码方面的帮助,我们将不胜感激。

我通过使用 EnumProcesses (Name to PID) 获取 PID 但是对于如何实现另外两个必需的功能一无所知。

最佳答案

我不能代表 ProcessExplorer,但 ProcessHacker 做了类似的事情,我已经查看了它的源代码几次。

它们的方法在理论上很简单,但需要付出一些努力才能实现(解析函数名称可能很棘手)。

这里或多或少是一步一步的过程:

  • 使用NtQueryInformationThread查询线程的起始地址。 ( Code here )
  • 找到该地址属于哪个模块并加载它的符号文件(pdb)
  • 现在查询该符号文件以获取该地址处的函数名称(如果存在)。 ( Code here ) 如果该地址没有函数,他们只是以一种漂亮的方式返回模块名称和起始地址 ( ModuleName.dll+<startAddress - moduleBase> )

我希望这能澄清一些事情。

关于C++/Win32 - 如何迭代特定进程的线程列表并将起始地址解析为模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57133611/

相关文章:

c++ - 如何将绑定(bind)的模板友元函数特化到模板类?

c++ - 调用 std::adjacent_difference() 时的隐式转换

c - 我是否需要在 make 文件的依赖项列表中包含其他头文件中包含的头文件?

无法将PCM数据写入wav文件

c++ - 在 if 语句中将两个数字相除会给出错误的输出

c++ - 函数参数中的 A 和 A[] 有什么区别?

c - 在 C 中从标准输入逐个字符地读取直到 EOF

c++ - 每 xx 小时执行一次命令的 Windows C++ 代码(类似于 CRON)

windows - 批处理脚本在带括号的文件名上失败

php - PHP unlink() 调用的 Windows 文件权限问题