期待的效果就像 PCHuntor 里的那样,如下:

上代码
#include "stdafx.h" #include <Windows.h> #include <vector> #include <iostream> #include <assert.h> #include <psapi.h> #include <tlhelp32.h>
using namespace std;
static bool EnumAllMemoryBlocks(HANDLE hProcess, OUT vector<MEMORY_BASIC_INFORMATION>& memories){ assert(hProcess != nullptr);
memories.clear(); memories.reserve(200);
SYSTEM_INFO sysInfo = { 0 }; GetSystemInfo(&sysInfo);
const char* p = (const char*)sysInfo.lpMinimumApplicationAddress; MEMORY_BASIC_INFORMATION memInfo = { 0 }; while (p < sysInfo.lpMaximumApplicationAddress){ size_t size = VirtualQueryEx( hProcess, p, &memInfo, sizeof(MEMORY_BASIC_INFORMATION32) ); if (size != sizeof(MEMORY_BASIC_INFORMATION32)){break;} 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;
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; } }else{cout << "EnumAllMemoryBlocks failed." << endl;} } } getchar(); return 0; }
|
效果图:
