ReadProcessMemory - 299

Cromon

Erfahrenes Mitglied
Hallo zusammen!

Es ist nun eine rechte Weile her seit ich mich das letzte Mal mit Windows rumgeschlagen habe, doch ich habe mir als kleines Ziel das Projekt vorgenommen eine Library für Speichermanipulationen und Speicherauslesungen zu schreiben.

Das sieht bisher so aus:
Code:
#ifndef _MEMORY_READER_H
#define _MEMORY_READER_H

class DLL_EXPORT MemoryReader
{
	HANDLE hProcess;
	template<typename T>
	T Read(unsigned dwAdress);
public:
	MemoryReader();
	MemoryReader(__in HANDLE hProcess);
	BOOL LoadFromProcessName(__in LPSTR szProcName);
	BOOL LoadFromClassName(__in LPSTR szClassName);
	BOOL LoadFromWindowName(__in LPSTR szWindowName);
	UINT ReadUInt(DWORD dwAdress);
	ULONGLONG ReadUInt64(DWORD dwAdress);

#pragma region MemoryReaderMembers
	DWORD dwProcId;
#pragma endregion
};

#endif

Und die Implementation davon:
Code:
MemoryReader::MemoryReader()
{
	hProcess = INVALID_HANDLE_VALUE;
}

MemoryReader::MemoryReader(HANDLE hProc)
{
	hProcess = hProc;
	dwProcId = GetProcessId(hProcess);
}

BOOL MemoryReader::LoadFromProcessName(__in LPSTR szProcName)
{
	DWORD dwProcessCount = 0;
	HANDLE* hProcesses = Process::GetProcessesByName(szProcName, &dwProcessCount, false);
	if(hProcesses == 0 || dwProcessCount == 0)
		return FALSE;
	hProcess = hProcesses[0];
	dwProcId = GetProcessId(hProcess);
	return TRUE;
}

BOOL MemoryReader::LoadFromWindowName(__in LPSTR szWindowName)
{
	HANDLE hProcess = Process::GetProcessByWindowTitle(szWindowName);
	if(hProcess == INVALID_HANDLE_VALUE)
		return FALSE;
	this->hProcess = hProcess;
	dwProcId = GetProcessId(hProcess);
	return TRUE;
}

BOOL MemoryReader::LoadFromClassName(__in LPSTR szClassName)
{
	HANDLE hProcess = Process::GetProcessByClassName(szClassName);
	if(hProcess == INVALID_HANDLE_VALUE)
		return FALSE;
	this->hProcess = hProcess;
	dwProcId = GetProcessId(hProcess);
	return TRUE;
}

UINT MemoryReader::ReadUInt(DWORD dwAdress)
{
	return Read<UINT>(dwAdress);
}

ULONGLONG MemoryReader::ReadUInt64(DWORD dwAdress)
{
	return Read<ULONGLONG>(dwAdress);
}

template<typename T>
T MemoryReader::Read(unsigned dwAdress)
{
	Process::AdjustPrivileges();
	T gOut = 0;
	DWORD dwBytesRead = 0;
	if(ReadProcessMemory(hProcess, &dwAdress, &gOut, sizeof(T), &dwBytesRead) == FALSE)
	{
		gOut = ~((T)0);
		char msg[255];
		sprintf(msg, "Error: %u - Bytes Read: %u - Bytes to read: %u - Adress: %X - Process: %p", GetLastError(), dwBytesRead, sizeof(T), dwAdress, hProcess);
		MessageBox(0, msg, "", MB_OK);
	}
	return gOut;
}

In einem ersten Test habe ich nun das folgend ausgeführt:
Code:
	MemoryReader memreader;
	if(memreader.LoadFromWindowName("MineSweeper") == TRUE)
	{
		UINT cbCurTime = memreader.ReadUInt(0x100579C);
	}

Gemäss den Worten einer anderen Person sollte das die aktuelle Zeit in Minesweeper sein. Allerdings möchte die ganze Sache nicht ganz gleich wie ich, denn es kommt eine MessageBox mit folgendem Inhalt:
"Error: 299 - Bytes Read: 0 - Bytes to read: 4 - Adress: 100579C - Process: 00001EE0"

Sieht jemand von euch gerade zufällig was ich selbst übersehen habe?

/EDIT:
Ich habe mal kurz eine andere Exe-Datei mit folgendem Inhalt erstellt:
Code:
static const unsigned int i = 45536;

int main()
{
	printf("%p\n", &i);
	system("Pause");
}

Wenn ich nun den folgenden Code ausführe:
Code:
	MemoryReader memreader;
	if(memreader.LoadFromProcessName("TestProj.exe") == TRUE)
	{
		UINT cbCurTime = memreader.ReadUInt(0x00415800);
		CString str;
		str.Format("%u", cbCurTime);
		AfxMessageBox(str);
	}

So bekomm ich jedoch nicht die 45536 raus sondern eine andere Zahl, jedoch bekomm ich keinen Fehler 299.

Gruss
Cromon
 
Zuletzt bearbeitet:
Hallo,

woher willst du bei deinem Test wissen, das die Zahl genau an Adresse 0x00415800 liegt?
Hast du das mit nem Disassembler kontrolliert?

Und auch MineSweeper kann sich schon mal ändern von Windows zu Windows oder?
Außerdem muss die Quelle nicht recht haben ;)

Gruß
Anfänger
 
Hm, ja, jetzt funktioniert es, finde jedoch die Beschreibung in der MSDN und die "Hilfe" von Itellisense irgendwie irreführend. Unter LPCVOID hab ich irgendwie einen Zeiger auf eine Variable die die Adresse beinhält verstanden, aber dem scheint ja nicht so zu sein :)

Danke dir!
 
Zurück