WriteProcesMemory beschreibt falschen Ort



  • Hallo,
    ich versuche eine Variable von einem Spiel zu überschreiben.
    Base Pointer und Offset habe ich mit CheatEngine herausgefunden. Wenn ich versuche den gewünschten Wert in CE zu verändern, ändert sich dieser auch im Spiel. Versuche ich aber genau den gleichen Wert (BasePointe+Offset) zu verändern, wird zwar der Wert an diese Stelle geschrieben(habe mit ReadProcesMemory nachgeprüft) aber nicht im Game geändert. Könnt ihr mir sagen, was ich falsch mache? Kann es sein, dass ich die Adresse nicht richtig angebe?

    Laut CE ist der BasePointer 00509B74 und das Offset in der MemoryStructure 00F8.
    Ich benutze VS 2010.

    Vielen Dank und viele Grüße
    Max

    Source:

    #include "stdafx.h"
    #include <Windows.h>
    #include <iostream>
    #include <conio.h>
    #include <tlhelp32.h>
    #include <string>
    
    using namespace std;
    
    static int baseAdress = 0x00509B74;
    static int hpOffset = 0xF8;
    
    DWORD hpPoint = baseAdress + hpOffset;
    
    int main()
    {
    	HWND hWnd = FindWindow(0, "AssaultCube");
    
    	if (hWnd == NULL)
    	{
    		MessageBox(0, "Error cannot find window!", "Error!", MB_OK + MB_ICONERROR);
    	}
    
    	else
    	{
    
    		DWORD proc_id;
    
    		GetWindowThreadProcessId(hWnd, &proc_id);
    
    		HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id);
    
    		if (!hProcess)
    		{
    			MessageBox(NULL, "Cannot open process!", "Error!", MB_OK + MB_ICONERROR);
    		}
    
    		else
    		{
    
    			if (ReadProcessMemory(hProcess, LPVOID(0x00509B74+0x00F8), &hpAtm, sizeof(hpAtm), NULL))
    			{
    
    				MessageBox(NULL, "WriteProcessMemory is a success!", "Success!", MB_OK + MB_ICONINFORMATION);
    			}
    
    			else
    			{
    				MessageBox(NULL, "Error cannot WriteProcessMemory!", "Error!", MB_OK + MB_ICONERROR);
    			}
    
    			CloseHandle(hProcess);
    		}
    
    	}
    
    	system("pause");
    
        return 0;
    }
    


  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • In Deinem Code benutzt Du aber nur "ReadProcessMemory()", aber ich denke, das ist Deine "Kontrollversion".
    Vielleicht liegt es daran, daß das Spiel den Wert neu auslesen muß.
    Ich könnte mir denken, daß man vielleicht ein Neuzeichnen des Fensters erzwingen muß.
    UpdateWindow(hWnd)



  • Vorher noch "InvalidateRect()" aufrufen...



  • Hier der komplette neue Source Code.
    Habe versucht das Window zu Updaten, der Wert im Spiel ändert sich aber leider trotzdem nicht.
    Ich glaube, ich schreibe einfach an die falsche Stelle. Die Base+Offset habe ich aber richtig angegeben oder?
    Mfg

    // AC Cheat.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    #include <Windows.h>
    #include <iostream>
    #include <conio.h>
    #include <tlhelp32.h>
    #include <string>
    
    using namespace std;
    
    //global Vars
    
    DWORD baseAdress = 0x00509B74;
    DWORD hpOffset = 0xF8;
    DWORD armorOffset = 0xFC;
    DWORD mgAmmo = 0x150;
    
    DWORD hpAtm;
    
    DWORD hpTarget = 666;
    
    int main()
    {
    	//Create a Handle to the process
    
    	HWND hWnd = FindWindow(0, "AssaultCube");
    
    	if (hWnd == NULL)
    	{
    		MessageBox(0, "Error cannot find window!", "Error!", MB_OK + MB_ICONERROR);
    	}
    
    	else
    	{
    
    		DWORD proc_id;
    
    		GetWindowThreadProcessId(hWnd, &proc_id);
    
    		HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id);
    
    		if (!hProcess)
    		{
    			MessageBox(NULL, "Cannot open process!", "Error!", MB_OK + MB_ICONERROR);
    		}
    
    		else
    		{
    				//Write new Value
    
    			if (WriteProcessMemory(hProcess, LPVOID(0x00509B74+0xF8), &hpTarget, sizeof(hpTarget), NULL))
    			{
    				cout << "WriteProcessMemory was succesfull!\n\n";
    			}
    
    			else
    			{
    				cout << "WriteProcessMemory failed!\n\n";
    			}
    
    			//Check the new Value
    
    			if (ReadProcessMemory(hProcess, LPVOID(0x00509B74 + 0xF8), &hpAtm, sizeof(hpAtm), NULL))
    			{
    				cout << "ReadProcessMemory was succesfull!\n\n";
    			}
    			else
    			{
    				cout << "ReadProcessMemory failed!\n\n";
    			}
    
    			//Update Window
    
    			InvalidateRect(hWnd, 0, FALSE);
    
    			UpdateWindow(hWnd);
    
    			CloseHandle(hProcess);
    		}
    
    		//Display the validated Value
    
    		cout << "###########################################\n";
    		cout << "Hp: " << hpAtm << "\n";
    		cout << "###########################################\n";
    
    	}
    
    	system("pause");
    
        return 0;
    }
    


  • Ja, ich denke schon, wenn die Werte für Base-Address und Offset stimmen.
    Es wäre interessant beim letzten Parameter von "WriteProcessMemory()", einen Zeiger auf einem DWORD-Wert zu übergeben und nicht NULL, um zu überprüfen, ob auch auch wirklich ein DWORD-Wert (Größe) geschrieben wird.
    Eine andere Frage ist es wirklich ein DWORD-Wert, der geschrieben werden soll?


Anmelden zum Antworten