獲取或修改指定進程ID的內存數據

文章原地址:http://www.bytekits.com/explorer/

 

在進程ID已知的前提下,如何獲取該進程在內存中的數據,下面提供一種方法。


 
  1. void GetProcessMemory(ULONG PID,,PVOID PVOID pRaddAddr)
  2. {
  3.  
  4. PROCESS_INFORMATION pi;
  5. ZeroMemory(&pi, sizeof(pi));
  6. pi.dwProcessId = PID;
  7.  
  8. HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_CREATE_THREAD | PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION, FALSE, pi.dwProcessId);
  9. if (hProcess == NULL)
  10. {
  11. ::MessageBoxA(NULL,"openprocess error",  NULL, MB_OK);
  12. return;
  13. }
  14.  
  15. SIZE_T nRead;
  16. BOOL ISOK = ::ReadProcessMemory(hProcess, pRaddAddr, buff, sizeof(buff), &nRead);
  17. if (!ISOK)
  18. {
  19. ::MessageBoxA(NULL, "ReadProcessMemory error", NULL, MB_OK);
  20. CloseHandle(hProcess);
  21. return;
  22. }
  23.  
  24. //這裏的數組緩衝區需要足夠大,否則會產生緩衝區溢出
  25. char tmp[4096] = { 0 };
  26. int index = 0;
  27. if (nRead > 0)
  28. {
  29. for (SIZE_T i = 0; i < nRead; i++)
  30. {
  31. index += sprintf_s(tmp + index,128, "%02X ", buff[i]);
  32. }
  33. }
  34. else
  35. {
  36. ::MessageBoxA(NULL, "no date to read error", NULL, MB_OK);
  37. }
  38.  
  39. CloseHandle(hProcess);
  40. }

當然也可以使用WriteProcessMemory來重入進程內存。

注意:打開進程需要足夠的權限,否則OpenProcess會失敗,可提高本進程的權限或本進程以高權限運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章