Problem mit Pointer auslesen (falscher Wert)

12/12/2015 00:15 Triky313#1
Hi Leute,
habe mir hier mal ein kleines Test-Script zusammengebaut und versuche seit einiger Zeit Werte aus einem Spiel auszulesen. Leider bekomme ich nie den Wert heraus, den die Adresse eigentlich hat.

Kann mir wer sagen ob ich etwas übersehen habe!?

PHP Code:
#include <iostream>
#include <windows.h>

#include <stdio.h> 
#include <stdlib.h>
#include <TlHelp32.h>
#include <tchar.h>
#include <atlconv.h>
using namespace std;


DWORD dwGetModuleBaseAddress(DWORD dwProcessIdentifier, TCHAR *lpszModuleName)
{
    
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessIdentifier);
    
DWORD dwModuleBaseAddress = 0;
    if(
hSnapshot != INVALID_HANDLE_VALUE)
    {
        
MODULEENTRY32 ModuleEntry32 = {0};
        
ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
        if(
Module32First(hSnapshot, &ModuleEntry32))
        {
            do
            {
                if(
_tcscmp(ModuleEntry32.szModule, lpszModuleName) == 0)
                {
                    
dwModuleBaseAddress = (DWORD)ModuleEntry32.modBaseAddr;
                    break;
                }
            } while(
Module32Next(hSnapshot, &ModuleEntry32));
        }
        
CloseHandle(hSnapshot);
    }
    return 
dwModuleBaseAddress;
}

int main()
{


    
// Fenstername einlesen
    
char windowName[100] = "Game";
    
HWND window = FindWindow(0, _T(windowName));
    if(
window == 0)
    {
        while(
true)
        {
            
cout << "Fenster \"" << windowName << "\" nicht gefunden!\n";
            
cout << "Gib einen neuen Fenster-Namen ein!\n";
            
cin.getline(windowName, sizeof(windowName));
            
LPCWSTR lpcwstr_string = A2BSTR(windowName);
            if(
HWND window = FindWindow(0, _T(windowName)))
            {
                
cout << "Fenstername: " << windowName << "\n";
                break;
            }
        }
    }
    else
    {
        
cout << "Fenstername:\t" << windowName << "\n";
    }


    
DWORD pID = 0;
    
GetWindowThreadProcessId(window, &pID);

    
DWORD baseAddr = dwGetModuleBaseAddress(pID, _T("Albion-Online.exe"));
    
cout << "pID:\t\t" << pID << " - " << &pID << "\n";
    
cout << "baseAddr:\t" << baseAddr << " - " << &baseAddr << "\n";
    
DWORD staticOffset = 0x14fe8ca8;

    
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
    
cout << "handle:\t\t" << handle << " - " << &handle << "\n";
    while(
true)
    {
        
DWORD value = baseAddr + staticOffset;
        
DWORD numBytesRead;
        
ReadProcessMemory(handle, (LPCVOID)value, &value, sizeof(DWORD), &numBytesRead);
        
value += 0x28;
        
ReadProcessMemory(handle, (LPCVOID)value, &value, sizeof(DWORD), &numBytesRead);
        
value += 0x1c;
        
ReadProcessMemory(handle, (LPCVOID)value, &value, sizeof(DWORD), &numBytesRead);
        
value += 0x38;
        
//ReadProcessMemory(handle, (LPCVOID)value, &value, sizeof(DWORD), &numBytesRead);
        //value += 0x710;
        //ReadProcessMemory(handle, (LPCVOID)value, &value, sizeof(DWORD), &numBytesRead);
        //value += 0x38c;
        
float result;
        
ReadProcessMemory(handle, (LPCVOID)value, &result, sizeof(float), &numBytesRead);
        
cout << result << endl;
        
Sleep(5000);
    }
    
CloseHandle(handle);
} 
12/19/2015 16:15 hazejp#2
Ich würde sagen, PROCESS_VM_READ reicht für diesen Zweck aus; sollte jedoch nebensächlich sein.
Du solltest evtl. auch die Rückgabewerte von ReadProcessMemory() auf fehlerhafte Adressen überprüfen, da der Wert in lpBuffer im Fall eines solchen Fehlers wahrscheinlich undefiniert ist.