任意のプロセスのメモリー内容を全て取得したいと思っています。
下記コードをVS2008(WindowsXP),VS2010(Vista)にて実行してメモ帳のメモリーを取得しようとしましたが、
ReadProcessMemory()が失敗します。
読み込むサイズを1024などに変更しても同様でした。
どのようにすれば実現できますでしょうか?
よろしくお願いいたします。
////////////////////////////////////////////////////////////////////////////
// ReadProcessMemoryTest.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <windows.h>
#include "Psapi.h"
#pragma comment(lib,"psapi.lib")
int _tmain(int argc, _TCHAR* argv[])
{
HWND hWnd;
DWORD dwID;
HANDLE hProcess;
hWnd = FindWindow(TEXT("Notepad"),NULL);
GetWindowThreadProcessId(hWnd, &dwID);
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, dwID);
if (!hProcess)
{
printf("Couldn't open process.\n");
system("PAUSE");
return 0;
}
PROCESS_MEMORY_COUNTERS memInfo;
memInfo.WorkingSetSize=0;
memInfo.PagefileUsage=0;
if(!GetProcessMemoryInfo(hProcess, &memInfo, sizeof(memInfo)))
{
printf("Couldn't get memory info.\n");
CloseHandle(hProcess);
return 0;
}
printf("memory size is %d\n",memInfo.WorkingSetSize);
int value = 9999999, newvalue = -1;
DWORD address = (0x0000000); //pointer address
// DWORD newpvalue = NULL;
printf("Pointer address is intially %x\n", address);
char *buf = new char[memInfo.WorkingSetSize];
memset(buf, 0, memInfo.WorkingSetSize);
if(!ReadProcessMemory(hProcess,(LPCVOID) address, &buf, memInfo.WorkingSetSize ,NULL))
{
DWORD errorCode = GetLastError();
printf("Couldn't get memory. Erro code is %d\n",errorCode);
delete buf;
system("PAUSE");
return 0;
}
printf("Pointer value is\n");
for (int i=0 ;i<memInfo.WorkingSetSize;++i)
{
printf( " %02X", buf[i] );
}
printf( "\n" );
delete buf;
system("PAUSE");
return 0;
}
GetLastError を調べなきゃ。
プロセスに対する PROCESS_VM_READ アクセス権が無いのが原因かも・・・
と思いましたが、以下の情報が検索でヒットしましたので、そちらを
どうぞ!
http://social.msdn.microsoft.com/Forums/ja/vcgeneralja/thread/caa5b07e-52b8-43fd-99af-7bcef325d6f3
以上。
(1) 0x0--0xffffは読めません
(2) ReadProcessMemoryの引数 &buf --> buf
(3) delete buf ---> delete[] buf
ツイート | ![]() |