我做了這個簡單的類從它打開的過程和閱讀記憶: 問題是,當我打電話ReadDWORD
任何內存地址ReadProcessMemory
失敗,錯誤代碼6:ERROR_INVALID_HANDLE, The handle is invalid
。而我無法弄清楚我做錯了什麼。OpenProcess處理無效的ReadProcessMemory
如果我把OpenProcess
部分放在ReadDWORD
函數中就可以正常工作。我如何儲存手柄有什麼問題嗎?爲什麼在我使用它之前它變得無效?
Memory.h
#ifndef MEMORY_H
#define MEMORY_H
#include <windows.h>
#include <psapi.h>
#pragma comment(lib, "psapi.lib")
#include <iostream>
class Memory
{
public:
Memory();
Memory(DWORD offset);
~Memory();
DWORD ReadDWORD(DWORD addr);
private:
HANDLE m_hProc;
DWORD m_Offset;
};
#endif
Memory.cpp
#include "Memory.h"
Memory::Memory()
{
Memory(0);
}
Memory::Memory(DWORD offset)
{
m_hProc = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, false, 5444); // 5444 is the PID of a process I'm testing this with
m_Offset = offset;
}
Memory::~Memory()
{
CloseHandle(m_hProc);
}
DWORD Memory::ReadDWORD(DWORD addr)
{
// Optional memory offset
addr += m_Offset;
DWORD value = -1;
int result = ReadProcessMemory(m_hProc, (LPVOID)addr, &value, sizeof(DWORD), NULL);
if (result == 0)
std::cout << "ReadProcessMemory error: " << GetLastError() << std::endl;
return value;
}
什麼是m_hProc值? 'Memory :: Memory'中存在OpenProcess失敗的機會。另外請注意,您不能只讀取遠程進程的隨機地址,通常正確的虛擬地址會以某種方式傳遞。例如通過IPC。最後,硬編碼PID不是一個好主意,每當你重新測試應用程序時,你都必須改變它。 – Andrey 2011-03-30 23:08:19
我檢查了Memory :: Memory中的m_hProc,它並沒有失敗。在ReadDWORD中m_hProc與Memory :: Memory中的不同。 – sippeangelo 2011-03-30 23:16:40