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:
Und die Implementation davon:
In einem ersten Test habe ich nun das folgend ausgeführt:
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:
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:
Wenn ich nun den folgenden Code ausführe:
So bekomm ich jedoch nicht die 45536 raus sondern eine andere Zahl, jedoch bekomm ich keinen Fehler 299.
Gruss
Cromon
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: