|
You last visited: Today at 19:45
Advertisement
[Help]Basepointer+Offset addieren
Discussion on [Help]Basepointer+Offset addieren within the C/C++ forum part of the Coders Den category.
04/19/2013, 00:51
|
#1
|
elite*gold: 0
Join Date: Feb 2012
Posts: 84
Received Thanks: 22
|
[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
|
|
|
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.
|
|
|
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 ?
|
|
|
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...
Code:
#include <iostream>
#include <Windows.h>
using namespace std;
class hack
{
private:
HANDLE processHandle;
int* varPointer;
public:
hack(char* pwindowName, int pbasePointer, int poffsets[], int poffsetCount);
void set(int pValue);
int get();
};
hack::hack(char* pwindowName, int pbasePointer, int poffsets[], int poffsetCount)
{
HWND window = FindWindow(0, pwindowName);
if(!window)
{
cerr << "ERROR: Fenster nicht gefunden" << endl;
}
DWORD processId;
GetWindowThreadProcessId(window, &processId);
processHandle = OpenProcess(PROCESS_ALL_ACCESS, false, processId);
int varAddress;
if(!ReadProcessMemory(processHandle, (int*)pbasePointer, &varAddress, sizeof(int), NULL))
{
cerr << "ERROR: Base Address konnte nicht gelesen werden" << endl;
}
if (poffsetCount > 1)
{
for (int i=0; i<poffsetCount-1; i++)
{
varAddress += poffsets[i];
ReadProcessMemory(processHandle, (int*)varAddress, &varAddress, sizeof(int), NULL);
}
}
varAddress += poffsets[poffsetCount-1];
varPointer = reinterpret_cast<int*>(varAddress);
}
void hack::set(int pValue)
{
WriteProcessMemory(processHandle, varPointer, &pValue, sizeof(int), NULL);
}
int hack::get()
{
int value;
ReadProcessMemory(processHandle, varPointer, &value, sizeof(int), NULL);
return value;
}
int main()
{
int gold_offsets[2] = {0x1C, 0x3C4};
hack gold("Torchlight", 0x00E555FC, gold_offsets, 2);
int exp_offsets[2] = {0x1C, 0x3C8};
hack exp("Torchlight", 0x00E555FC, exp_offsets, 2);
int fame_offsets[2] = {0x1C, 0x3CC};
hack fame("Torchlight", 0x00E555FC, fame_offsets, 2);
int fame_tier_offsets[2] = {0x1C, 0x3D0};
hack fame_tier("Torchlight", 0x00E555FC, fame_tier_offsets, 2);
int skillpoints_offsets[2] = {0x1C, 0x3DC};
hack skillpoints("Torchlight", 0x00E555FC, skillpoints_offsets, 2);
int spellpoints_offsets[2] = {0x1C, 0x3E0};
hack spellpoints("Torchlight", 0x00E555FC, spellpoints_offsets, 2);
cin.get();
return 0;
}
|
|
|
04/19/2013, 20:01
|
#5
|
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, ¶m,sizeof(param),&puffer);
if(errWr == 0) {
cout << "Error Writing Memory: " << GetLastError() << endl;
}
else
{
cout << "Wert "<<param<<" erfolgreich geschrieben!"<<endl;
}
}
Quote:
Originally Posted by dready
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.
|
|
|
04/20/2013, 00:32
|
#6
|
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 ?
|
|
|
04/20/2013, 01:19
|
#7
|
elite*gold: 0
Join Date: Feb 2012
Posts: 84
Received Thanks: 22
|
Quote:
Originally Posted by .NoThx
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)
Code:
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;
}
|
|
|
04/20/2013, 10:49
|
#8
|
elite*gold: 0
Join Date: Jun 2010
Posts: 3,146
Received Thanks: 583
|
Quote:
Originally Posted by Preakz
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)
Code:
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;
}
|
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
|
#9
|
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
|
Quote:
Originally Posted by .NoThx
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.
|
|
|
|
04/20/2013, 18:26
|
#10
|
elite*gold: 0
Join Date: Sep 2010
Posts: 1,909
Received Thanks: 522
|
Quote:
Originally Posted by Preakz
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)
Code:
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;
}
|
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 ^^.
|
|
|
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...
Quote:
|
Originally Posted by .Infinite
Code:
if (poffsetCount > 1)
{
for (int i=0; i<poffsetCount-1; i++)
{
varAddress += poffsets[i];
ReadProcessMemory(processHandle, (int*)varAddress, &varAddress, sizeof(int), NULL);
}
}
varAddress += poffsets[poffsetCount-1];
varPointer = reinterpret_cast<int*>(varAddress);
|
Quote:
|
Originally Posted by marykillsjane
Code:
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;
|
merkste was?
|
|
|
04/20/2013, 20:54
|
#12
|
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.
|
|
|
04/20/2013, 21:00
|
#13
|
elite*gold: 0
Join Date: Jun 2010
Posts: 3,146
Received Thanks: 583
|
Quote:
Originally Posted by Master674b
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
|
#14
|
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
|
|
|
04/21/2013, 21:42
|
#15
|
elite*gold: 0
Join Date: Sep 2010
Posts: 1,909
Received Thanks: 522
|
Quote:
Originally Posted by .Infinite
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 .....
|
|
|
 |
|
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.
|
|