|
You last visited: Today at 02:44
Advertisement
MemoryHacking Funktionsfrage(n)
Discussion on MemoryHacking Funktionsfrage(n) within the General Coding forum part of the Coders Den category.
03/27/2012, 22:28
|
#1
|
elite*gold: 0
Join Date: Nov 2008
Posts: 8
Received Thanks: 0
|
MemoryHacking Funktionsfrage(n)
Hallo Liebe Community,
Zuallererst... Ja ich weiß es gibt viele Tutorials zu diesem Thema, ja ich habe Google benutzt. ;-)
Ich habe einfach an einige Verständnisprobleme, die viele Tutorials, da sie hauptsächlich auf Copy & Paste ausgelegt sind, keineswegs aus der Welt schaffen.
Kurz gesagt sind habe ich Probleme das zusammenwirken von Pointern und Offsets zu verstehen. Klar ich addiere mein Offset zum Pointer und das Ergebnis ist meine dynamische Adresse. Aber was addiere ich wozu? Ein Pointer zeigt auf eine bestimmten Speicherbereich oder enthält, kurz gesagt, meine Adresse.
Wie genau... wirkt das Offset? Ich habe mir die Implementierung für Multilevelpointer in c++ angesehen. Dabei wird, soweit ich das beurteilen kann das Offset Dynamisch daraufgerechnet. D.h. soweit ich das verstehe doch: Der Pointer enthält eine beliebige dynamische Adresse, diese Adresse enthält einen Wert. Da sie dynamisch ist kann sie in unterschiedlichen Speicherbereichen liegen. Der Wert den sie enthält kann nicht der gewünschte sein, da ich auf eben diese Adresse ja das Offset noch addiere.
Zusammenfassung also: Das Offset definiert einen festen "Abstand" zwischen einer dynamischen Adresse, die eben immer wieder Anderswertig im bekannten Pointer vorliegt und meiner gesuchten Zieladresse?
Wie darf ich das verstehen?
Entschuldigt bitte wenn es irgendwo ein Tutorial dafür gibt, dass ich übersehen habe. Nur bisher habe ich eben nichts gefunden.
Gruß Masterfire
|
|
|
03/27/2012, 22:56
|
#2
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,909
Received Thanks: 25,409
|
Natürlich kann der Inhalt eines Pointers die gewünschte Adresse sein, und zwar wenn das Offset 0 ist.
Offsets entstehen normalerweise durch Arrays oder Zeiger auf Objekte.
Du hast also einen Pointer, der auf ein Objekt zeigt, meinetwegen einen globalen. D.h. seine Adresse ist statisch und er befindet sich immer an der gleichen Stelle. An dieser Stelle steht ein Wert, das ist die Adresse des Objekts, die ihm zur Laufzeit (zb. durch new) zugewiesen wird.
Möchte man auf die Variablen innerhalb eines Objekts zugreifen, addiert man das Offset, dass sie relativ zum Anfang des Objekts haben, zu dieser Adresse hinzu (es sei denn, es ist polymorph und hat eine VTable, dann läuft das etwas anders, da diese normalerweise am Anfang des Objekts steht bzw. ein Pointer zu dieser, was die relative Position der Offsets verschiebt).
Bsp.
Code:
class X
{
int Offset0;
int Offset4;
int Offset8;
};
byte *ptr = (byte*) new X();
*(int*)(ptr+4) = 1; //ptr->Offset4 erhält den wert 1
Multi-Level-Pointer entstehen durch Zeiger auf Objekte in Objekten, auf die ein Zeiger in einem Objekt zeigt, ...
Bei Arrays ist es im Grunde das gleiche, nur dass man diese normalerweise daran erkennt, dass die Größe eines Elements mit dem Index multipliziert wird, also etwas wie
Code:
mov eax, 2 //index
mov ebx, 0x1337
mov eax, [ebx+eax*4] //größe 4: wahrscheinlich int/long/float
D.h. in C++ könnte man so drauf zugreifen, obwohl man den Pointer auch einfach direkt mit dem [] Indexoperator als Array nutzen kann und sich die Multiplikation spart:
Code:
byte *ptr = (byte*)new int[10];
*(int*)(ptr+2*4) = 1; //setzt das 3. element auf 1
|
|
|
03/27/2012, 23:11
|
#3
|
elite*gold: 1
Join Date: Jul 2005
Posts: 553
Received Thanks: 454
|
Ein Offset wird eigentlich immer benutzt, wenn es sich um eine Datenstruktur handelt, sprich eine Struktur, Klasse, o.Ä., also eine zusammengehörige Menge an Bytes, die als Gesamtes adressiert wird.
Ein Pointer auf eine solche Datenstruktur zeigt also auf den Anfang (Offset 0) und durch die verschiedenen Offsets gelangt man dann logischerweise an die einzelnen Members der Datenstruktur.
Zur Pointerarithmetik in C/C++ ist anzumerken, dass ptr im letzten Beispiel von MrSmith ein Byte-Pointer ist und um 8 Bytes verschoben.
Wäre er als int-Pointer deklariert und man addiert 2*4, würde man nicht 8 Bytes weitergehen, sondern 8 ints, also 8*4 Bytes.
|
|
|
03/28/2012, 16:40
|
#4
|
elite*gold: 0
Join Date: Nov 2008
Posts: 8
Received Thanks: 0
|
Vielen Dank, das leuchtet ein. ^^ Eine tolle Community
Ich hätte nur noch eine Frage. Es muss doch zu diesen Themen(Speicherverwaltung, Pointer etc.) auch brauchbare Literatur bzw. Tutorials geben. Wie gesagt habe ich da bisher aber nichts gefunden. Könnte mir da jemand etwas nennen? Meine Frage ist zwar beantwortet, aber ich würde mich doch gerne eingehender mit dem Thema beschäftigen. Leider wird es eben in vielen Fachbüchern zur Programmierung, wie bereits erwähnt, nur angeschnitten bzw. wird erklärt wie gewisse Dinge in der entsprechenden Sprache umzusetzen sind. Allerdings wird nicht darauf eingegangen wie es grundsätzlich funktioniert.
Für Hilfe in dieser Hinsicht wäre ich auch sehr dankbar. Es ist auch kein Problem wenn es mit Hilfe von C++ erklärt wird oder der Text in Englisch verfügbar wäre. ;-)
|
|
|
03/28/2012, 18:53
|
#5
|
elite*gold: 0
Join Date: Jul 2010
Posts: 388
Received Thanks: 196
|
Quote:
Originally Posted by Masterfire
Vielen Dank, das leuchtet ein. ^^ Eine tolle Community
Ich hätte nur noch eine Frage. Es muss doch zu diesen Themen(Speicherverwaltung, Pointer etc.) auch brauchbare Literatur bzw. Tutorials geben. Wie gesagt habe ich da bisher aber nichts gefunden. Könnte mir da jemand etwas nennen? Meine Frage ist zwar beantwortet, aber ich würde mich doch gerne eingehender mit dem Thema beschäftigen. Leider wird es eben in vielen Fachbüchern zur Programmierung, wie bereits erwähnt, nur angeschnitten bzw. wird erklärt wie gewisse Dinge in der entsprechenden Sprache umzusetzen sind. Allerdings wird nicht darauf eingegangen wie es grundsätzlich funktioniert.
Für Hilfe in dieser Hinsicht wäre ich auch sehr dankbar. Es ist auch kein Problem wenn es mit Hilfe von C++ erklärt wird oder der Text in Englisch verfügbar wäre. ;-)
|
Viele Informationen darüber wie Datenstrukturen, Funktionen usw. im Low Level Bereich funktionieren. Falls viele Konzepte der High Level Sprachen dich verwirren schau dir an wie sie unter der Haube übersetzt sind und funktionieren und das ganze wird relativ trivial sein.
|
|
|
03/28/2012, 20:43
|
#6
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,909
Received Thanks: 25,409
|
Quote:
Originally Posted by link
Zur Pointerarithmetik in C/C++ ist anzumerken, dass ptr im letzten Beispiel von MrSmith ein Byte-Pointer ist und um 8 Bytes verschoben.
Wäre er als int-Pointer deklariert und man addiert 2*4, würde man nicht 8 Bytes weitergehen, sondern 8 ints, also 8*4 Bytes.
|
Genau das war doch auch gemeint, so passiert es ja im ASM Code oO
Die Adressierung weiß nix von Datentyp-Größen, die kennt nur Bytes. Dementsprechend muss man für die Indizierung ausgehend von einem Byte-Ptr den Index mit der Größe in Bytes eines Elements multiplizieren. Wenn man den Pointer als int* deklariert, erkennt der Compiler wiederum die Größe und baut diese Multiplikation automatisch ein, sodass du dich nicht mehr darum kümmern musst, aber im Falle meines Beispiels, wie du schon richtig gesagt hast, zu viel addiert.
Aber ich wollte ja die Arbeitsweise in ASM darstellen, deshalb auch der Byte Ptr, mit dem man für gewöhnlich auch arbeitet, wenn man interne Strukturen bearbeitet, da man damit jedes einzelne Byte bearbeiten kann.
Will ich eine ganze Variable (zb. vom Typ int) ansprechen, deklariere ich es als int*, ja, aber dann nehme ich eh den Indexzugriff [2] und addiere da keine Offsets.
Was du mit 8 Bytes verschoben meinst, ist mir nicht ganz klar.
Quote:
Vielen Dank, das leuchtet ein. ^^ Eine tolle Community
Ich hätte nur noch eine Frage. Es muss doch zu diesen Themen(Speicherverwaltung, Pointer etc.) auch brauchbare Literatur bzw. Tutorials geben. Wie gesagt habe ich da bisher aber nichts gefunden. Könnte mir da jemand etwas nennen? Meine Frage ist zwar beantwortet, aber ich würde mich doch gerne eingehender mit dem Thema beschäftigen. Leider wird es eben in vielen Fachbüchern zur Programmierung, wie bereits erwähnt, nur angeschnitten bzw. wird erklärt wie gewisse Dinge in der entsprechenden Sprache umzusetzen sind. Allerdings wird nicht darauf eingegangen wie es grundsätzlich funktioniert.
Für Hilfe in dieser Hinsicht wäre ich auch sehr dankbar. Es ist auch kein Problem wenn es mit Hilfe von C++ erklärt wird oder der Text in Englisch verfügbar wäre. ;-)
|
Wenn es nicht ganz so theoretisch wie in SmackJews Vorschlag sein soll: learning by doing.
Durch die Reversing Tutorials von lena151 erfährt man einiges über die Grundlagen vom Reverse Engineering. Wenn man sich dann nen Debugger schnappt und einfach mal ein bisschen experimentiert und kleinere Ergebnisse erziehlt, lernt man auch sehr schnell, besonders, wenn man die Programme, die man analysiert, selbst entwickelt, denn dann hat man nochmal die Übersetzung Highlevel - Lowlevel nach der Optimierung eines Compilers vor sich.
|
|
|
Similar Threads
|
MemoryHacking mit OFFSETS ?!
05/10/2011 - General Coding - 5 Replies
hey hab mir das tut http://www.elitepvpers.com/forum/epvp-coders-tutori als/200357-gamehacking-gamehacking-mit-c-f-r-anf-n ger.html
angesehen und es klappt auch das problem ist nur das ich eine festen pointer benutzen will dafür hab ich 2 offsets nur wie benutze ich die offsets in dem script es funktioniert irg nichts .. in autoit is das kein problem geht auch alles nur ich weis nicht was ich dann an den script aus dem tut ändern muss
bin c++ anfänger :P :D
basepointer = 00F32848...
|
All times are GMT +1. The time now is 02:45.
|
|