c++ - C++/Win32 - 如何迭代特定进程的线程列表并将起始地址解析为模块?
问题描述
请记住,我是系统编程的新手。
我想做的是获取特定进程的线程列表(包括系统进程,又名 PID 4),并使用模块名称获取每个线程的 PID。
ProcessExplorer 做到了这一点,但我完全不知道他们是如何做到这一点的:(
任何帮助,尤其是代码,将不胜感激。
我通过使用 EnumProcesses (Name to PID) 获取 PID,但对如何实现其他两个必需的功能一无所知。
解决方案
我不能代表 ProcessExplorer,但 ProcessHacker 做了类似的事情,我已经看过它的源代码几次。
他们的方法在理论上很简单,但需要一些努力来实现(解析函数名可能很棘手)。
这里或多或少是一步一步的过程:
- 用于
NtQueryInformationThread
查询线程的起始地址。(代码在这里) - 查找该地址属于哪个模块并加载其符号文件(pdb)
- 现在查询该符号文件以获取该地址处的函数名称(如果存在)。(这里的代码)如果该地址没有函数,它们只是以漂亮的方式返回模块名称和起始地址(
ModuleName.dll+<startAddress - moduleBase>
)
我希望这可以解决一些问题。
推荐阅读
- flutter - Flutter 将图像从屏幕保存到设备
- r - 仅对特定的 rhandsontable 列更改做出反应
- terraform - 运行 SQL 脚本发布 SQL Server 和数据库创建
- python - Numpy Array:第一次出现小于阈值的 N 个连续值
- java - 增加 LDAP 查询超时值
- ruby-on-rails - 在 debian-10 上使用 nginx 设置乘客
- python - Tensorflow 导入错误:libcudnn.so.5 No such file or directory
- aws-codepipeline - 如何让 CodePipeline 监视 CodeCommit 的特定文件夹?
- casting - 如何将 GoogleBigQuery 中的列类型从字符串更改为记录
- android-studio - 完全隐藏导航栏(Android Studio)