当前位置: 首页 > news >正文

C++实现支持32位和64位进程的模块枚举

使用 Visual Studio 2022 (VC++ 2022) 创建 MFC 对话框应用程序

支持查找32位和64位进程(使用TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32同时枚举两种模块)

输入进程名称(例如notepad.exe),点击“查找进程”按钮

在列表控件(ListCtrl)中显示该进程的所有模块名称、基址、大小、路径

1. 资源部分(在资源编辑器中添加控件)

在对话框资源(ID 为IDD_GETMODULEBASE_DIALOG)中添加以下控件:

类型IDCaption其他属性
Edit ControlIDC_EDIT_PROCESS(空)
ButtonIDC_BTN_SEARCH查找进程
List ControlIDC_LIST_MODULES(空)View: Report, 加四列(见代码)
StaticIDC_STATIC_TIP输入进程名(如 notepad.exe)

2. GetModuleBaseDlg.h

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

#pragma once

#include <tlhelp32.h>

#include <afxwin.h>

#include <afxcmn.h>

classCGetModuleBaseDlg :publicCDialogEx

{

public:

CGetModuleBaseDlg(CWnd* pParent = nullptr);

enum{ IDD = IDD_GETMODULEBASE_DIALOG };

protected:

virtualvoidDoDataExchange(CDataExchange* pDX);

virtualBOOLOnInitDialog();

DECLARE_MESSAGE_MAP()

public:

afx_msgvoidOnBnClickedBtnSearch();

private:

DWORDGetProcessIDByName(LPCTSTRlpProcessName);

BOOLGetAllModules(DWORDdwPID, CListCtrl& listCtrl);

CEdit m_editProcess;

CButton m_btnSearch;

CListCtrl m_listModules;

};

3. GetModuleBaseDlg.cpp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

#include "pch.h"

#include "GetModuleBase.h"

#include "GetModuleBaseDlg.h"

#include "afxdialogex.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

CGetModuleBaseDlg::CGetModuleBaseDlg(CWnd* pParent/*=nullptr*/)

: CDialogEx(IDD_GETMODULEBASE_DIALOG, pParent)

{

}

voidCGetModuleBaseDlg::DoDataExchange(CDataExchange* pDX)

{

CDialogEx::DoDataExchange(pDX);

DDX_Control(pDX, IDC_EDIT_PROCESS, m_editProcess);

DDX_Control(pDX, IDC_BTN_SEARCH, m_btnSearch);

DDX_Control(pDX, IDC_LIST_MODULES, m_listModules);

}

BEGIN_MESSAGE_MAP(CGetModuleBaseDlg, CDialogEx)

ON_BN_CLICKED(IDC_BTN_SEARCH, &CGetModuleBaseDlg::OnBnClickedBtnSearch)

END_MESSAGE_MAP()

BOOLCGetModuleBaseDlg::OnInitDialog()

{

CDialogEx::OnInitDialog();

// 设置列表控件为报告视图并添加列

m_listModules.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

m_listModules.InsertColumn(0, _T("模块名称"), LVCFMT_LEFT, 150);

m_listModules.InsertColumn(1, _T("基址"), LVCFMT_LEFT, 120);

m_listModules.InsertColumn(2, _T("大小"), LVCFMT_LEFT, 100);

m_listModules.InsertColumn(3, _T("路径"), LVCFMT_LEFT, 400);

returnTRUE;

}

// 根据进程名获取 PID(支持大小写不敏感)

DWORDCGetModuleBaseDlg::GetProcessIDByName(LPCTSTRlpProcessName)

{

DWORDdwPID = 0;

HANDLEhSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if(hSnapshot == INVALID_HANDLE_VALUE)

return0;

PROCESSENTRY32 pe32 = {sizeof(pe32) };

if(Process32First(hSnapshot, &pe32))

{

do

{

if(_tcsicmp(pe32.szExeFile, lpProcessName) == 0)// 不区分大小写

{

dwPID = pe32.th32ProcessID;

break;

}

}while(Process32Next(hSnapshot, &pe32));

}

CloseHandle(hSnapshot);

returndwPID;

}

// 枚举指定进程的所有模块(同时支持 32/64 位模块)

BOOLCGetModuleBaseDlg::GetAllModules(DWORDdwPID, CListCtrl& listCtrl)

{

listCtrl.DeleteAllItems();

// 同时使用 TH32CS_SNAPMODULE 和 TH32CS_SNAPMODULE32 可兼容 WOW64 进程的 32 位模块

HANDLEhSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, dwPID);

if(hSnapshot == INVALID_HANDLE_VALUE)

returnFALSE;

MODULEENTRY32 me32 = {sizeof(me32) };

if(Module32First(hSnapshot, &me32))

{

intnItem = 0;

do

{

CString strBase, strSize;

strBase.Format(_T("0x%016I64X"), (ULONGLONG)me32.modBaseAddr);

strSize.Format(_T("0x%08X"), me32.modBaseSize);

listCtrl.InsertItem(nItem, me32.szModule);

listCtrl.SetItemText(nItem, 1, strBase);

listCtrl.SetItemText(nItem, 2, strSize);

listCtrl.SetItemText(nItem, 3, me32.szExePath);

nItem++;

}while(Module32Next(hSnapshot, &me32));

}

CloseHandle(hSnapshot);

returnTRUE;

}

voidCGetModuleBaseDlg::OnBnClickedBtnSearch()

{

CString strProcessName;

m_editProcess.GetWindowText(strProcessName);

strProcessName.Trim();

if(strProcessName.IsEmpty())

{

AfxMessageBox(_T("请输入进程名称!"));

return;

}

DWORDdwPID = GetProcessIDByName(strProcessName);

if(dwPID == 0)

{

AfxMessageBox(_T("未找到指定进程!请确认进程名称正确(包含.exe),且进程正在运行。"));

m_listModules.DeleteAllItems();

return;

}

CString strTitle;

strTitle.Format(_T("进程 %s (PID: %u) 的模块列表"), strProcessName, dwPID);

SetWindowText(strTitle);

if(!GetAllModules(dwPID, m_listModules))

{

AfxMessageBox(_T("枚举模块失败,可能没有足够权限。"));

m_listModules.DeleteAllItems();

}

}

4. 项目配置(VS2022)

项目使用Unicode字符集。

使用 MFC:项目属性 → 常规 → 使用 MFC → “在共享 DLL 中使用 MFC” 或 “在静态库中使用 MFC”。

5.使用方法

  • 运行程序
  • 在编辑框输入进程可执行文件名,例如:notepad.exechrome.exe
  • 点击“查找进程”
  • 列表中会显示该进程加载的所有模块(包括主模块和 DLL)

这样就完整实现了你要求的功能,支持 32 位和 64 位进程的模块枚举。

http://www.jsqmd.com/news/1111961/

相关文章:

  • Frida Native函数Hook实战:精准获取堆栈、参数与返回值
  • JMeter性能测试入门实战:从环境搭建到结果分析全流程指南
  • JMeter CSV参数化实战:数据驱动性能测试配置与并发控制详解
  • AI安全测试与红队评估:从原理到企业落地
  • 告别手动转存:夸克网盘自动化管理终极指南
  • CVE-2023-38646漏洞应急响应:Metabase企业版RCE漏洞检测、修复与验证实战
  • 使用wrk对vLLM OpenAI API进行压力测试与性能调优实战
  • OpenClaw实战:从AI工具到生产力伙伴的转型指南
  • 日志系统——系统的“黑匣子“
  • ChatGPT聊天机器人实战部署:从API密钥配置到对话状态管理,7大核心模块一次性打通
  • Web安全加固:X-Frame-Options与HSTS响应头配置实战指南
  • JMeter恒定吞吐量定时器:精准控制TPS的性能测试实战指南
  • Hashcat密码恢复实战:从原理到防御的完整指南
  • MATLAB免改代码的HHT时频分析工具包:一键生成希尔伯特谱、边际谱、包络谱与瞬时参数
  • CLONEit 评测以及如何使用CLONEit 轻松传输数据
  • 深入浅出:手机安全屋TEE架构与CA/TA交互实战指南
  • TPAFE0808与TM4C129EKCPDT的多通道信号采集系统设计
  • JMeter性能测试实战:从脚本优化到瓶颈定位的完整指南
  • FDE前沿部署工程师全解:实战训练营如何搭建完整上岗能力体系
  • Q-learning在迷宫求解中的实践与优化
  • 英雄联盟终极工具箱:5个核心功能让你从青铜到王者的快速进阶指南
  • Burp Suite v1.6.27 实战指南:从零配置到现代Web安全测试进阶
  • 实战通用漏洞报告模板:提升安全测试与开发协作效率的标准化指南
  • 【计算机Java毕业设计案例】基于 SpringBoot 的在线教育资源检索与学习系统的设计与实现 面向自学用户的免费课程资源教育平台(程序+文档+讲解+定制)
  • ncmdump:5分钟解锁网易云NCM加密音乐,实现跨平台自由播放
  • Android支付安全升级:KeyStore2与AES-GCM认证加密实战指南
  • 前端工程效率:开发者体验不是矫情,是交付速度
  • 国密SM2双证书与数据信封技术:加密私钥安全存储实战指南
  • 嵌入式系统精确计时:硬件定时器与CS2200-CP实战
  • 使用acme.sh为Nginx部署Let‘s Encrypt泛域名SSL证书实战指南