[Help]Basepointer+Offset addieren

04/19/2013 00:51 Preakz#1
Hallo alle zusammen.
Ich schreibe mir grade aktuell eine Klasse womit ich meinen Speicher auslesen und beschreiben kann.

Mein Problem:
Wenn ich versuche basepointer+offset zu addieren läuft i.w. falsch.
wenn ich nur eine Normale Adresse ohne offset habe funkt alles.

Hier mal ein Beispiel wie ich es mache:

Code:
unsigned long adresse = Baseadresse
unsigned long dummyadresse;
DWORD numBytesRead;

für jedes offset
{
   unsigned long offset_adr = hole offset
ReadProcessMemory(h, (LPCVOID)adresse, &dummyadresse, sizeof(long), &numBytesRead);
		adresse = dummyadresse+offset_adr;
}

return adresse   //Returned unsigned long
Mach ich i.w. falsch ?

MfG
Preakz
04/19/2013 02:13 qkuh#2
Wieso sizeof(long)? Müsste doch eig sizeof(DWORD) sein, wenn ich mich recht entsinne.
04/19/2013 03:14 dready#3
Windef.h:151 - typedef unsigned long DWORD;
:D
Denk aber auch das Dword "richtiger" wäre Oo

Aber warum das ganze nicht klappt ist ne gute Frage, errechnest du die Base selbst ?
Was hast du in offset adress wenns läuft ?
04/19/2013 17:54 .Infinite#4
Vielleicht hilft dir das hier. Hatte ich mal so für Torchlight gescrieben glaube ich...

04/19/2013 20:01 Preakz#5
Das mit dem long habe ich in DWORD geändert.

@.Infinity
Danke ich werds mal versuchen (:

EDIT:
MH ka wie ichs lösen soll es funkt i.w. net :S

Hier der Functions-Aufruf:
Code:
#include "Header.h"

void main()
{
	TMemory a;
	a.Init( "0x0052600C+0x20", "Blabla"); //Fenstertitel ausgedacht.. adresse + offset nicht , das sind die daten womit ich die neue adr suche...
	a.GetValue();
}
Header.h
Code:
#ifndef HEADER_H
#define HEADER_H


#include <iostream>
#include <Windows.h>
#include <string>
#include "TMemory.h"

using namespace std;



#endif
TMemory.h
Code:
#ifndef TMEMORY_H
#define TMEMORY_H
class TMemory
{
public:
	//Normal Konstructor
	TMemory(void);
	//Destructor
	virtual ~TMemory(void);

	unsigned long MakeAdress(char *, HANDLE *);
	void Init( char *, std::string );
	void GetValue();
	void WriteValue(int);

private:
	HWND window;
	HANDLE handle;
	DWORD prozess;
	DWORD puffer;
	unsigned long adress;
	std::string title;

	int value;
};
#endif
TMemory.cpp
(MakeAdress ist hierbei das mit den offsets addieren etc.pp)
Code:
#include "Header.h"




TMemory::TMemory(void)
{
	cout << "New TMemory Instance started!" << endl;
	//Init
	window = NULL;
	handle = NULL;
	prozess = NULL;
	puffer = NULL;
	adress = NULL;
	title = "";
	value = NULL;
}
TMemory::~TMemory(void)
{
	window = NULL;
	handle = NULL;
	prozess = NULL;
	puffer = NULL;
	adress = NULL;
	title = "";
	value = NULL;	
	if(handle != NULL)
	{
		CloseHandle(handle);
		cout << "TMemory Handle geschlossen!" << endl;
	}
	cout << "TMemory Instance deleted!" << endl;
}

unsigned long TMemory::MakeAdress(char * source, HANDLE *h)
{
	int main_addr_lengh = 0;
	int source_lengh = 0;
	int offsets = 0;

	unsigned long adresse;
	unsigned long dummyadresse;

	DWORD numBytesRead;

	for( int i=0; source[i] != '\0'; i++)
	{
		source_lengh++;
		if(source[i] == '+')
			offsets++;
	}

	for( int i=0; source[i] != '+'; i++)
		main_addr_lengh++;


	cout << "Source_lengh = "<<source_lengh << endl;
	cout << "Main-Addr_Lengh = "<< main_addr_lengh << endl;
	cout << "Offsets = " << offsets << endl<<endl<<endl;


	// START HAUPTADRESSE //
	char * mainadr = NULL;
	mainadr = new char[main_addr_lengh+1];

	for(int i=0; i<main_addr_lengh; i++)
		mainadr[i] = source[i];

	mainadr[main_addr_lengh] = '\0';

	cout << "Main-Adresse lautet: "<< mainadr << endl;
	adresse = strtoul(mainadr, NULL, 0);
	cout << "Main-Adresse umgewandelt: "<< adresse << endl << endl;

	if(mainadr != NULL)
		delete []mainadr;

	if( offsets == 0)
		return adresse;

	
	// START OFFSETS //
	int offset_lengh = 0;	
	int akt_pos = main_addr_lengh+1;
	for(int offnr=0; offnr < offsets; offnr++)
	{
		for(int a=akt_pos;source[a] != '+' && source[a] != '\0'; a++)
		{
			offset_lengh++;
			//cout << source[a];
		}
		
		//cout << "offset"<<offnr<<"_länge ="<<offset_lengh <<endl;

		
		char * offset = NULL; 
		offset = new char[offset_lengh+1];

		for(int i=0; i<offset_lengh; i++)
			offset[i] = source[akt_pos+i];

		offset[offset_lengh] = '\0';

		unsigned long offset_adr = strtoul(offset, NULL, 0);

		cout << "Offset"<<offnr<<" lautet: "<<offset<<endl;
		cout << "Offset-Umgewandelt lautet: "<<offset_adr<<endl<<endl;

		
		ReadProcessMemory(h, (LPCVOID)adresse, &adresse, sizeof(DWORD), &numBytesRead);
		adresse += offset_adr;
		

		if(offset != NULL)
			delete []offset;

		akt_pos += offset_lengh+1;
		offset_lengh = 0;
		
		
	}
	cout << "NEUE ADR: " << adresse;
	return adresse;
	
}
void TMemory::Init(char * SEARCH_ADRESS, string WINDOW_TITLE)
{
		//GET PARAMS

	//Search Window
	while(window == NULL)
    {
		cout << "Suche nach Fenster: "<<WINDOW_TITLE<<" ..."<<endl;
		Sleep(100);
		window = FindWindow(NULL, WINDOW_TITLE.c_str());
    }
	cout << "Fenster gefunden!"<<endl;
	//Prozess holen
	GetWindowThreadProcessId(window, &prozess);
	//Handle holen
	handle = OpenProcess(PROCESS_ALL_ACCESS | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, prozess);
	adress = MakeAdress(SEARCH_ADRESS, &handle);
	cout << endl << "******************* - "<<adress<<" - **************"<<endl;
}

void TMemory::GetValue()
{
	int tempval = 0;
	  int errRe = ReadProcessMemory(handle, (LPCVOID)adress, &tempval, sizeof(puffer),NULL);
		
        if(errRe == 0) {
            cout << "Error Reading Memory: " << GetLastError() << endl;
        } else { 
			value = tempval;
			cout << "Wert ist: "<< value << endl;
        }
}
void TMemory::WriteValue(int param)
{
	int errWr = WriteProcessMemory(handle, (LPVOID)adress, &param,sizeof(param),&puffer);
 
        if(errWr == 0) {
            cout << "Error Writing Memory: " << GetLastError() << endl;
        }
		else
		{
			cout << "Wert "<<param<<" erfolgreich geschrieben!"<<endl;
		}
}
Quote:
Originally Posted by dready View Post
Windef.h:151 - typedef unsigned long DWORD;
:D
Denk aber auch das Dword "richtiger" wäre Oo

Aber warum das ganze nicht klappt ist ne gute Frage, errechnest du die Base selbst ?
Was hast du in offset adress wenns läuft ?
Wenns läuft hab ich einfach nur die aktuelle Adresse (nicht die Basepoint adresse!) von z.B. X-Pos eines Charackters vom Programm was ich geöffnet habe.
04/20/2013 00:32 .NoThx#6
Quote:
#include "Header.h"

void main()
{
TMemory a;
a.Init( "0x0052600C+0x20", "Blabla"); //Fenstertitel ausgedacht.. adresse + offset nicht , das sind die daten womit ich die neue adr suche...
a.GetValue();
}
Muss man nicht erst lesen mit ReadProcess memory ? :D

also die Adresse die hinter 0x0052600C+0x20 ist mit ReadProcessMemory auslesen?

und warum is des ein String ?
04/20/2013 01:19 Preakz#7
Quote:
Originally Posted by .NoThx View Post
Muss man nicht erst lesen mit ReadProcess memory ? :D

also die Adresse die hinter 0x0052600C+0x20 ist mit ReadProcessMemory auslesen?

und warum is des ein String ?
Wegen den 2 Funktionen: (String alles bis zum ersten + ergibt die hauptadresse wenns kein plus gibt dann ist es die einzigste, ansonsten wird jedes plus als initialisierung für ein neues offset angesehen welches den wert entweder bis zum nächsten + oder zur Nullterminierung annimmt... (strtoul() <- String to Unsigned Long)
04/20/2013 10:49 .NoThx#8
Quote:
Originally Posted by Preakz View Post
Wegen den 2 Funktionen: (String alles bis zum ersten + ergibt die hauptadresse wenns kein plus gibt dann ist es die einzigste, ansonsten wird jedes plus als initialisierung für ein neues offset angesehen welches den wert entweder bis zum nächsten + oder zur Nullterminierung annimmt... (strtoul() <- String to Unsigned Long)
Also vorweg: Ich lerne garde selbst nur C++ und bin kein 1337 h4xxor.

Daher hab ich mal ein paar fragen:
Warum hast du bei OpenProcess die Flags "PROCESS_ALL_ACCESS | PROCESS_VM_READ | PROCESS_VM_WRITE" obwohl dir "PROCESS_ALL_ACCESS" eh schon alles erlaubt ?
04/20/2013 12:24 Nightblizard#9
Quote:
Originally Posted by .NoThx View Post
Also vorweg: Ich lerne garde selbst nur C++ und bin kein 1337 h4xxor.

Daher hab ich mal ein paar fragen:
Warum hast du bei OpenProcess die Flags "PROCESS_ALL_ACCESS | PROCESS_VM_READ | PROCESS_VM_WRITE" obwohl dir "PROCESS_ALL_ACCESS" eh schon alles erlaubt ?
Vielleicht deswegen:

Quote:
Originally Posted by msdn
Windows Server 2003 and Windows XP: The size of the PROCESS_ALL_ACCESS flag increased on Windows Server 2008 and Windows Vista. If an application compiled for Windows Server 2008 and Windows Vista is run on Windows Server 2003 or Windows XP, the PROCESS_ALL_ACCESS flag is too large and the function specifying this flag fails with ERROR_ACCESS_DENIED. To avoid this problem, specify the minimum set of access rights required for the operation. If PROCESS_ALL_ACCESS must be used, set _WIN32_WINNT to the minimum operating system targeted by your application (for example,
#define _WIN32_WINNT _WIN32_WINNT_WINXP
). For more information, see Using the Windows Headers.
[Only registered and activated users can see links. Click Here To Register...]
04/20/2013 18:26 marykillsjane#10
Quote:
Originally Posted by Preakz View Post
Wegen den 2 Funktionen: (String alles bis zum ersten + ergibt die hauptadresse wenns kein plus gibt dann ist es die einzigste, ansonsten wird jedes plus als initialisierung für ein neues offset angesehen welches den wert entweder bis zum nächsten + oder zur Nullterminierung annimmt... (strtoul() <- String to Unsigned Long)
Du musst erst eine Variable definieren z.B. vom Typ DWORD welche die Adresse in Hex Form beinhaltet z.N. DWORD addr = 0xFFA1;
Dann musst du mir der ReadProcessmemory Funktion die Adresse auslesen , das Offset hinzuaddieren , und am Ende wenn du die "Endadresse" errechnet hat liest du den Wert(die Adresse) nochmal mit Readprocessmemory aus.
Ich habe aus nem Tutorial [Only registered and activated users can see links. Click Here To Register...] mir auch ne selbstgeschriebene Funktion abgeschaut , um das mit dem ausrechnen der Endadresse sehr einfach zu handhaben wie ich finde. Vieleicht hilft sie dir ja auch.
Code:
DWORD FindDmaAddy(int PointerLevel, HANDLE hProcHandle, DWORD Offsets[], DWORD BaseAddress)
{


	DWORD pointer = BaseAddress;            
	DWORD pTemp;
	
	DWORD pointerAddr;
	for(int i = 0; i < PointerLevel; i ++)
	{
			if(i == 0)
			{
				ReadProcessMemory(hProcHandle, (LPCVOID)pointer, &pTemp, 4, NULL);
			}
			
			pointerAddr = pTemp + Offsets[i];   // Set p1 to content of p + offset

			
			ReadProcessMemory(hProcHandle, (LPCVOID)pointerAddr, &pTemp, 4, NULL);
			
	}
	return pointerAddr;
}
Ich denke du verstehst wofür diese Funktion gedacht ist /wie man sie Anwendet. Wenn nicht frag einfach nochmal nach dann erklär ichs dir ^^.
04/20/2013 19:45 .Infinite#11
Quote:
Originally Posted by marykillsjane
Du musst erst eine Variable definieren z.B. vom Typ DWORD welche die Adresse in Hex Form beinhaltet z.N. DWORD addr = 0xFFA1;
Dann musst du mir der ReadProcessmemory Funktion die Adresse auslesen , das Offset hinzuaddieren , und am Ende wenn du die "Endadresse" errechnet hat liest du den Wert(die Adresse) nochmal mit Readprocessmemory aus.
Ich habe aus nem Tutorial How To hack any Game with C++ on German mir auch ne selbstgeschriebene Funktion abgeschaut , um das mit dem ausrechnen der Endadresse sehr einfach zu handhaben wie ich finde. Vieleicht hilft sie dir ja auch.
Ich glaube das ist ihm schon klar...



04/20/2013 20:54 Master674b#12
Bitte lösche dein Projekt und diesen Thread, kauf dir ein Buch und melde dich erst in mindestens 3 Monaten wieder wenn doch irgendwas unklar sein sollte und du es immer noch nicht über eigenes Suchen gefunden haben solltest.
04/20/2013 21:00 .NoThx#13
Quote:
Originally Posted by Master674b View Post
Bitte lösche dein Projekt und diesen Thread, kauf dir ein Buch und melde dich erst in mindestens 3 Monaten wieder wenn doch irgendwas unklar sein sollte und du es immer noch nicht über eigenes Suchen gefunden haben solltest.
Bitte Unterlass den Spam, jeder hat mal angefangen, und der Bereich ist dazu da um Leuten zu helfen.

Als ich angefangen habe zu programmieren, habe ich die selben Fehler gemacht, jeder hat mal dumme Fehler gemacht wo er sich dumm und dämlich gesucht hat!
04/21/2013 00:29 Preakz#14
Habs (: !
Hab einfach die Komplette Funktion neu geschrieben...
Danke nochmal an alle die mir geholfen haben.

MfG
Preakz

/CLOSE
04/21/2013 21:42 marykillsjane#15
Quote:
Originally Posted by .Infinite View Post
Ich glaube das ist ihm schon klar...



Ja , nömlich das er die Adresse definiert ,und dann nicht beim allerersten mal ausliest ,sondern direkt damit rechnet und sie erst danach mit Readprocmemory ausliest.
Die Funktion die ich gepostet habe liest die definierte Adresse beim ersten durchlauf aus rechn et dann damit ,und liest sie am Ende wieder aus.So habe ich es auch aus den Tutorials gelernt (Ich weiß ,dass die oft schlecht geschrieben sind ja) , Er kann es ja mal ausprobieren ob es daran liegt ( oder mit der Funktion aufeinmal geht) kostet ihn doch nichts .....