Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 19:45

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[Help]Basepointer+Offset addieren

Discussion on [Help]Basepointer+Offset addieren within the C/C++ forum part of the Coders Den category.

Closed Thread
 
Old   #1
 
Preakz's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 84
Received Thanks: 22
Question [Help]Basepointer+Offset addieren

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
Preakz is offline  
Old 04/19/2013, 02:13   #2
 
elite*gold: 1000
Join Date: Apr 2012
Posts: 1,003
Received Thanks: 208
Wieso sizeof(long)? Müsste doch eig sizeof(DWORD) sein, wenn ich mich recht entsinne.
qkuh is offline  
Old 04/19/2013, 03:14   #3
 
elite*gold: 100
Join Date: Aug 2005
Posts: 595
Received Thanks: 208
Windef.h:151 - typedef unsigned long DWORD;

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 ?
dready is offline  
Old 04/19/2013, 17:54   #4
 
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
Vielleicht hilft dir das hier. Hatte ich mal so für Torchlight gescrieben glaube ich...

.Infinite is offline  
Old 04/19/2013, 20:01   #5
 
Preakz's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 84
Received Thanks: 22
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;

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.
Preakz is offline  
Old 04/20/2013, 00:32   #6
 
.NoThx's Avatar
 
elite*gold: 0
Join Date: Jun 2010
Posts: 3,146
Received Thanks: 583
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 ?

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

und warum is des ein String ?
.NoThx is offline  
Old 04/20/2013, 01:19   #7
 
Preakz's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 84
Received Thanks: 22
Quote:
Originally Posted by .NoThx View Post
Muss man nicht erst lesen mit ReadProcess memory ?

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)
Preakz is offline  
Old 04/20/2013, 10:49   #8
 
.NoThx's Avatar
 
elite*gold: 0
Join Date: Jun 2010
Posts: 3,146
Received Thanks: 583
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 ?
.NoThx is offline  
Old 04/20/2013, 12:24   #9
 
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
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.
Nightblizard is offline  
Old 04/20/2013, 18:26   #10
 
marykillsjane's Avatar
 
elite*gold: 0
Join Date: Sep 2010
Posts: 1,909
Received Thanks: 522
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 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 ^^.
marykillsjane is offline  
Old 04/20/2013, 19:45   #11
 
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
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...



.Infinite is offline  
Old 04/20/2013, 20:54   #12
 
Master674b's Avatar
 
elite*gold: 0
Join Date: Dec 2012
Posts: 255
Received Thanks: 110
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.
Master674b is offline  
Old 04/20/2013, 21:00   #13
 
.NoThx's Avatar
 
elite*gold: 0
Join Date: Jun 2010
Posts: 3,146
Received Thanks: 583
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!
.NoThx is offline  
Thanks
1 User
Old 04/21/2013, 00:29   #14
 
Preakz's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 84
Received Thanks: 22
Habs (: !
Hab einfach die Komplette Funktion neu geschrieben...
Danke nochmal an alle die mir geholfen haben.

MfG
Preakz

/CLOSE
Preakz is offline  
Old 04/21/2013, 21:42   #15
 
marykillsjane's Avatar
 
elite*gold: 0
Join Date: Sep 2010
Posts: 1,909
Received Thanks: 522
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 .....
marykillsjane is offline  
Closed Thread


Similar Threads Similar Threads
Spalten addieren
02/12/2013 - .NET Languages - 8 Replies
hi! Ich habe folgendes Problem in Visual Basics http://i.epvpimg.com/vVwCe.jpg wie kann ich das umsetzen? Teamspeak + Teamviewer wär das beste, wäre schön wenn sich wer findet :)
can anyone give me the quest windows offset and move offset value and base
07/30/2012 - Cabal Online - 2 Replies
i am experimenting on this again its the unli entry procedure i know its patched already but i want to try something
Pointer und offset addieren
02/26/2012 - .NET Languages - 5 Replies
HI! Kann mir bitt jemand diesen Pointer: &H290330 mit dieser Offset addieren: &H6F8 (Ich brauche das für VB08) Danke!
++ Addieren
10/30/2010 - General Coding - 13 Replies
Hallo wie kann ich in einer while mehr als 1 addieren ? Also wenn z.B.: int a ; in der while dann while(bla) a++
Variabeln addieren
08/08/2009 - AutoIt - 13 Replies
hai leuts hab hier ein kleines prog in arbeit. ist zwar kein bot aber es soll eine überraschung für mein grossvater werden. er liebt es ein schweizer kartenspiel names "jasse" zu spielen und dieses programm soll für ihn rechnen und schreiben. nun zu meinem problem: ich mächte auf der linken seite bei punkte eine zahl ein geben können welche es danach zur gesammtpunktzahl addiert, komishcer weise stimmen die zahlen jedoch nicht wenn ich 10 eingebe und auf den button schreiben drücke...



All times are GMT +1. The time now is 19:45.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.