大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述C++ 遍历进程内存块相关的知识,希望能为你提供帮助。
期待的效果就像 PCHuntor 里的那样,如下:
那就开始咯 —— ?
// Test_Console.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <
Windows.h>
#include <
vector>
#include <
iostream>
#include <
assert.h>
#include <
psapi.h>
#include <
tlhelp32.h>
using namespace std;
/*枚举指定进程所有内存块
assert(hProcess != nullptr);
参数:
hProcess:要枚举的进程,需拥有PROCESS_QUERY_INFORMATION权限
memories:返回枚举到的内存块数组
返回:
成功返回true,失败返回false.
*/
static bool EnumAllMemoryBlocks(HANDLE hProcess, OUT vector<
MEMORY_BASIC_INFORMATION>
&
memories)
// 如果 hProcess 为空则结束运行
assert(hProcess != nullptr);
// 初始化 vector 容量
memories.clear();
memories.reserve(200);
// 获取 PageSize 和地址粒度
SYSTEM_INFO sysInfo =0 ;
GetSystemInfo(&
sysInfo);
/*
typedef struct _SYSTEM_INFO
union
DWORD dwOemId;
// 兼容性保留
struct
WORD wProcessorArchitecture;
// 操作系统处理器体系结构
WORD wReserved;
// 保留
DUMMYSTRUCTNAME;
DUMMYUNIONNAME;
DWORDdwPageSize;
// 页面大小和页面保护和承诺的粒度
LPVOIDlpMinimumApplicationAddress;
// 指向应用程序和dll可访问的最低内存地址的指针
LPVOIDlpMaximumApplicationAddress;
// 指向应用程序和dll可访问的最高内存地址的指针
DWORD_PTR dwActiveProcessorMask;
// 处理器掩码
DWORDdwNumberOfProcessors;
// 当前组中逻辑处理器的数量
DWORDdwProcessorType;
// 处理器类型,兼容性保留
DWORDdwAllocationGranularity;
// 虚拟内存的起始地址的粒度
WORDwProcessorLevel;
// 处理器级别
WORDwProcessorRevision;
// 处理器修订
SYSTEM_INFO, *LPSYSTEM_INFO;
*/
//遍历内存
const char* p = (const char*)sysInfo.lpMinimumApplicationAddress;
MEMORY_BASIC_INFORMATIONmemInfo =0 ;
while (p <
sysInfo.lpMaximumApplicationAddress)
// 获取进程虚拟内存块缓冲区字节数
size_t size = VirtualQueryEx(
hProcess,// 进程句柄
p,// 要查询内存块的基地址指针
&
memInfo,// 接收内存块信息的 MEMORY_BASIC_INFORMATION 对象
sizeof(MEMORY_BASIC_INFORMATION32)// 缓冲区大小
);
if (size != sizeof(MEMORY_BASIC_INFORMATION32))break;
// 将内存块信息追加到 vector 数组尾部
memories.push_back(memInfo);
// 移动指针
p += memInfo.RegionSize;
return memories.size() >
0;
int _tmain(int argc, _TCHAR* argv[])
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
// 进程快照句柄
PROCESSENTRY32 process = sizeof(PROCESSENTRY32);
// 接收进程信息的对象
vector<
MEMORY_BASIC_INFORMATION>
vec;
// 存放进程内存块的数组
/*
typedef struct _MEMORY_BASIC_INFORMATION
PVOIDBaseAddress;
// 内存块基地址指针
PVOIDAllocationBase;
// VirtualAlloc 函数分配的基地址指针
DWORDAllocationProtect;
// 内存块初始内存保护属性
SIZE_T RegionSize;
// 内存块大小
DWORDState;
// 内存块状态(COMMIT、FREE、RESERVE)
DWORDProtect;
// 内存块当前内存保护属性
DWORDType;
// 内存块类型(IMAGE、MAPPED、PRIVATE)
MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
*/
// 遍历进程
while (Process32Next(hProcessSnap,&
process))
// 找到想要的进程
if(strcmp(process.szExeFile,"rundll32.exe") == 0)
// 获取进程句柄
HANDLE h_rundll32 = OpenProcess(PROCESS_ALL_ACCESS, FALSE, process.th32ProcessID);
if(!h_rundll32)cout <
<
"OpenProcess failed." <
<
endl;
// 遍历该进程的内存块
if(EnumAllMemoryBlocks(h_rundll32,vec))
for(int i=0;
i<
vec.size();
i++)
// 输出
cout <
<
"BaseAddress:" <
<
vec[i].BaseAddress <
<
endl;
cout <
<
"AllocationBase:" <
<
vec[i].AllocationBase <
<
endl;
cout <
<
"AllocationProtect:" <
<
vec[i].AllocationProtect <
<
endl;
cout <
<
"RegionSize:" <
<
vec[i].RegionSize <
<
endl;
cout <
<
"State:" <
<
vec[i].State <
<
endl;
cout <
<
"Protect:" <
<
vec[i].Protect <
<
endl;
cout <
<
"Type:" <
<
hex <
<
vec[i].Type <
<
endl;
cout <
<
"----------------------------------" <
<
endl;
elsecout <
<
"EnumAllMemoryBlocks failed." <
<
endl;
getchar();
return 0;
效果图:
【C++ 遍历进程内存块】
推荐阅读
- Java中的类和对象
- 通过注册表强制解锁文件占用
- C++ 反调试(基于 SEH 的 SetUnhandledExceptionFilter)
- 源文件与模块生成时的文件不同。是否希望调试器使用它()
- C++ HOOK 指定进程的指定 API(MessageBoxA 为例)(最简单)
- Windows 10 系统进入测试模式命令
- markdown 实现代码折叠效果
- Python中hashlib模块的使用
- Android系统自带的android.util.Base64的实现源码