文章原地址:http://www.bytekits.com/explorer/
在進程ID已知的前提下,如何獲取該進程在內存中的數據,下面提供一種方法。
- void GetProcessMemory(ULONG PID,,PVOID PVOID pRaddAddr)
- {
- PROCESS_INFORMATION pi;
- ZeroMemory(&pi, sizeof(pi));
- pi.dwProcessId = PID;
- HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_CREATE_THREAD | PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION, FALSE, pi.dwProcessId);
- if (hProcess == NULL)
- {
- ::MessageBoxA(NULL,"openprocess error", NULL, MB_OK);
- return;
- }
- SIZE_T nRead;
- BOOL ISOK = ::ReadProcessMemory(hProcess, pRaddAddr, buff, sizeof(buff), &nRead);
- if (!ISOK)
- {
- ::MessageBoxA(NULL, "ReadProcessMemory error", NULL, MB_OK);
- CloseHandle(hProcess);
- return;
- }
- //這裏的數組緩衝區需要足夠大,否則會產生緩衝區溢出
- char tmp[4096] = { 0 };
- int index = 0;
- if (nRead > 0)
- {
- for (SIZE_T i = 0; i < nRead; i++)
- {
- index += sprintf_s(tmp + index,128, "%02X ", buff[i]);
- }
- }
- else
- {
- ::MessageBoxA(NULL, "no date to read error", NULL, MB_OK);
- }
- CloseHandle(hProcess);
- }
當然也可以使用WriteProcessMemory來重入進程內存。
注意:打開進程需要足夠的權限,否則OpenProcess會失敗,可提高本進程的權限或本進程以高權限運行。