Inline Asm -> Wert aus Register in anderes Register schreiben

03/15/2012 19:21 MaxMilimeter#1
Huhu,
die Frage klingt vielleicht etwas Blöd, aber ich würde gerne wissen, wie ich den Wert eines Registers in ein anderes schreiben kann.

Wenn ich mov verwende wird lediglich die Speicheradresse auf das andere Register geschrieben und ich brauche den Wert in die Speicheradresse die mein Register hält.

Mein Inline Asm Code sieht folgendermaßen aus:
char *command;
[...]
code = "insert 1";
_asm {
mov edx, command;
};

Ist bestimmt einfach, wenn man weiß wie, aber bei Google findet man sogut wie garnichts nützliches über dieser "kleinen Fragen".

Danke im Voraus,
Max
03/15/2012 20:22 Nightblizard#2
"Fehler: 'command' nichtdeklarierter Bezeichner" sollte dir der Compiler um die Ohren hauen.

Was willst du denn überhaupt machen? Das gesamte code Array in das Register schreiben? Das ist nicht machbar. Was ist command?
03/15/2012 20:46 yihaaa#3
Du musst auch das Semikolon hinter dem Befehl wegmachen.
Code:
__asm mov eax, edx;
oder so was?

Code:
char* c = "test";
__asm mov eax, dword ptr ds:[ c ];
03/15/2012 21:35 MaxMilimeter#4
@Nightblizard: char *command; sollte es heißen, das ist nicht das Problem.
Also die Register halten ja Speicheradressen. Was wiederum in diesen Speicheradressen enthalten ist, sieht man in Ollydbg im 'Dump-Fenster' und im Stack. Und genau diesen Inhalt möchte ich durch meinen eigenen ersetzen.

@yihaaa: soweit bin ich ja schon, das ändert lediglich die Adresse die in meinem Register gespeichert ist.
Es geht auch mit Semikolons, aber wenn es so üblich ist, kann ich die bei mehreren Anweisungen später auch weglassen, danke für den Tipp.
03/15/2012 21:38 SmackJew#5
Quote:
Originally Posted by MaxMilimeter View Post
Huhu,
die Frage klingt vielleicht etwas Blöd, aber ich würde gerne wissen, wie ich den Wert eines Registers in ein anderes schreiben kann.

Wenn ich mov verwende wird lediglich die Speicheradresse auf das andere Register geschrieben und ich brauche den Wert in die Speicheradresse die mein Register hält.

Mein Inline Asm Code sieht folgendermaßen aus:
char *code;
[...]
code = "insert 1";
_asm {
mov edx, command;
};

Ist bestimmt einfach, wenn man weiß wie, aber bei Google findet man sogut wie garnichts nützliches über dieser "kleinen Fragen".

Danke im Voraus,
Max
Ein Register hat nur einen Wert. Nichts anderes. Wenn das Register eine Adresse enthält kannst du über ptr auf den Wert an der Adresse zugreifen.

Code:
mov eax, dword ptr [ebx]
oder
mov eax, byte ptr [ebx]
usw
03/15/2012 21:49 MaxMilimeter#6
Okay verstehe, aber wie kann ich dann den Wert einer Adresse durch den Wert einer anderen Adresse ersetzen?

Edit:
Um es nochmal zu veranschaulichen:
In Ollydbg lässt sich der Inhalt von Adressen im Dump-Fenster sehen. Dieser lässt sich über Rechtsklick->Binary->Edit bearbeiten. Wie bekomme ich das mit ASM zustande?
03/15/2012 22:02 SmackJew#7
Quote:
Originally Posted by MaxMilimeter View Post
Okay verstehe, aber wie kann ich dann den Wert einer Adresse durch den Wert einer anderen Adresse ersetzen?
Code:
mov eax, adresse 1
mov ebx, adresse 2

mov eax, dword ptr [eax]
mov dword ptr [ebx], eax
03/15/2012 22:32 MaxMilimeter#8
Danke, das scheint schonmal ein Ansatz zu sein, allerdings werden irgendwie nur die ersten 4 Zeichen meines Strings kopiert und ein Teil des alten bleibt erhalten, wie bekomme ich den Rest rüber? :P
03/15/2012 23:12 SmackJew#9
Quote:
Originally Posted by MaxMilimeter View Post
Danke, das scheint schonmal ein Ansatz zu sein, allerdings werden irgendwie nur die ersten 4 Zeichen meines Strings kopiert und ein Teil des alten bleibt erhalten, wie bekomme ich den Rest rüber? :P
Ein String ist nichts anderes als eine Reihenfolge von Bytes (ein ASCII char ist 1 Byte groß) im Speicher die mit einem Nullbyte abgeschlossen wird. Ein 32bit Register hat eben nur 32 Bit = 4 Byte = dword. Wenn du den String in deinem Programm speichern möchtest weise die Adresse des ersten Bytes einem Zeiger zu. Für genauere Infos musst du schon damit rausrücken was du machen möchtest, aus deinem OP geht jedenfalls nicht viel hervor.
03/15/2012 23:20 MaxMilimeter#10
Könntest du mir da vielleicht einpaar Befehle und wenn möglich ein kurzes Beispiel geben?
In Google findet man zu wenig über ASM.

Also mein Spiel sendet Pakete. Nun soll ein bestimmtes Paket durch mein eigenes ersetzt werden.

Die Pakete sehen in der Regel so aus:
say text
walk 94 23 24 23

Ein say hallo soll dann zum Beispiel in say bye geändert werden (müsste ja mit einer einfachen If Abfrage klappen oder?) und ich bin jetzt dabei erstmal das Paket zu ersetzen.
03/15/2012 23:38 SmackJew#11
Quote:
Originally Posted by MaxMilimeter View Post
Könntest du mir da vielleicht einpaar Befehle und wenn möglich ein kurzes Beispiel geben?
In Google findet man zu wenig über ASM.

Also mein Spiel sendet Pakete. Nun soll ein bestimmtes Paket durch mein eigenes ersetzt werden.

Die Pakete sehen in der Regel so aus:
say text
walk 94 23 24 23

Ein say hallo soll dann zum Beispiel in say bye geändert werden (müsste ja mit einer einfachen If Abfrage klappen oder?) und ich bin jetzt dabei erstmal das Paket zu ersetzen.
Und wozu brauchst du da ASM? Ich würde vorschlagen du hookst die send Funktion und veränderst dort das Paket über den Parameter.

Ansonsten kannst du dem String auch einfach über C die Adresse eines anderen Strings zuweisen:

Code:
char* text = "blablub";
char* eText = "blableb";

text = eText; //text zeigt jetzt auf das erste Byte von eText und ist nun "blableb"
Über ASM sieht das auch nicht viel anders aus:

Code:
char* text = "blablub";
char* eText = "blableb";

__asm {
	lea eax, dword ptr [text] //EAX = Adresse des [B]Zeigers[/B]
	mov ebx, eText //EBX = Adresse auf die eText zeigt
	mov dword ptr [eax], ebx //text zeigt nun auf Adresse auf die eText zeigt
}
Edit:

Hast du die Adresse des Packetstrings kannst du natürlich auch einfach über C den Wert ändern, dazu mal die memset Funktion anschauen bzw. einfach über 'ne Schleife die Bytes und am Ende ein Nullbyte setzen.
03/15/2012 23:55 MaxMilimeter#12
Das Problem ist, dass ich in Sachen ASM nicht genügend Erfahrung habe, um die Send Funktion an sich zu finden. Dort findet irgendeine Art von Verschlüsselung statt, die ich einfach nicht durchblicke, so wird zwischen den verschiedenen Paketen unterschieden vor dem Senden (say, walk etc.) also irgendwie total undurchsichtig für mich als Anfänger und sowieso viel zu Zeitaufwändig.

Habe vor einiger Zeit eh nen Detour dafür geschrieben und bin halt jetzt auf 'ne Idee gekommen wie ich den sinnvoll nutzen könnte. Dafür muss ich halt das Paket durch mein eigenes ersetzen.

Auf das Ausgangspaket kann ich nur über ASM zugreifen, da ein Register darauf zeigt während des Detours. Über C geht das doch garnicht ohne inline ASM, wie schreibe ich es am Ende wieder in den Dump?
03/16/2012 00:09 SmackJew#13
Quote:
Originally Posted by MaxMilimeter View Post
Das Problem ist, dass ich in Sachen ASM nicht genügend Erfahrung habe, um die Send Funktion an sich zu finden. Dort findet irgendeine Art von Verschlüsselung statt, die ich einfach nicht durchblicke, so wird zwischen den verschiedenen Paketen unterschieden vor dem Senden (say, walk etc.) also irgendwie total undurchsichtig für mich als Anfänger und sowieso viel zu Zeitaufwändig.
Die Verschlüsselung musst du ja nicht verstehen. Wenn du die Verschlüsselungsfunktion hast, die ein Klartext Paket übergeben bekommt reicht das vollkommen um selbst Pakete zu verschicken bzw. vom Spiel gesendete zu verändern.

Quote:
Originally Posted by MaxMilimeter View Post
Habe vor einiger Zeit eh nen Detour dafür geschrieben und bin halt jetzt auf 'ne Idee gekommen wie ich den sinnvoll nutzen könnte. Dafür muss ich halt das Paket durch mein eigenes ersetzen.

Auf das Ausgangspaket kann ich nur über ASM zugreifen, da ein Register darauf zeigt während des Detours. Über C geht das doch garnicht ohne inline ASM, wie schreibe ich es am Ende wieder in den Dump?
Wenn du ein Register hast, das die Adresse des Klartext Pakets enthält, reicht es vollkommen dem Register die Adresse eines deiner Strings zuzuweisen.

In deinem Detour, nehmen wir an EAX enthält die Adresse des Klatext Pakets:

Code:
char* meinPaket = "say bye\n xyz etc";

__asm {
    mov eax, meinPaket
}
03/16/2012 00:18 MaxMilimeter#14
Habe ich ja ganz am Anfang versucht, klappt aber nicht, da dann die Adresse die der Register hält in die von meiner Variable geändert wird und das führt zu einer Fehlermelung im Spiel. Es muss also der Wert der Adresse geändert werden und ich habe keine Ahung wie das funktionieren soll mit C. Auch weiß ich nicht wie ich an die Adresse des Registers über C komme falls es denn möglich ist den Wert dann direkt über C zu ändern:
Code:
char *code;
[...]
code = "insert 1";
_asm {
mov edx, command;
};
Zum Thema mit dem Hooken:
Ich habe mehrere Funktionen, die irgendwas mit dem Klartext Paket anstellen. Wenn ich die Steppe verschwindet das Paket auch aus dem Stack und erscheint nicht mehr. Allerdings sehen andere meine Nachricht erst, nachdem ich die Anwendung wieder fortsetze. Das verwirrt mich, denn nachdem ichs gesteppt habe müsste das Paket doch abgeschickt sein.
Kann ich diese Funktion nutzen um zu senden? Und wenn ja, wie krieg ich raus welche Parameter ich dieser Funktion übergeben muss? Bis auf das Klartextpaket werden noch irgendwelche Adressen ohne lesbaren Inhalt gepusht bevor die Funktion gecalled wird. Daraus werd ich auch nicht schlau... :confused:

Mit
Code:
mov eax, adresse 1
mov ebx, adresse 2

mov eax, dword ptr [eax]
mov dword ptr [ebx], eax
funktioniert es, allerdings ist da wieder das Problem, dass nur 4 Zeichen ans Ziel kommen ...
03/16/2012 00:55 SmackJew#15
Quote:
Originally Posted by MaxMilimeter View Post
Habe ich ja ganz am Anfang versucht, klappt aber nicht, da dann die Adresse die der Register hält in die von meiner Variable geändert wird und das führt zu einer Fehlermelung im Spiel. Es muss also der Wert der Adresse geändert werden und ich habe keine Ahung wie das funktionieren soll mit C. Auch weiß ich nicht wie ich an die Adresse des Registers über C komme falls es denn möglich ist den Wert dann direkt über C zu ändern
Der Crash hat dann aber entweder etwas damit zu tun, dass das Register nicht die Adresse enthält sondern etwas anderes, zum Beispiel die Adresse eines Zeigers, oder dass etwas anderes nicht stimmt. Poste den ASM Code der Funktion und den ASM Code mit deinem Detour installiert.

Quote:
Originally Posted by MaxMilimeter View Post
Zum Thema mit dem Hooken:
Ich habe mehrere Funktionen, die irgendwas mit dem Klartext Paket anstellen. Wenn ich die Steppe verschwindet das Paket auch aus dem Stack und erscheint nicht mehr. Allerdings sehen andere meine Nachricht erst, nachdem ich die Anwendung wieder fortsetze. Das verwirrt mich, denn nachdem ichs gesteppt habe müsste das Paket doch abgeschickt sein.
Kann ich diese Funktion nutzen um zu senden? Und wenn ja, wie krieg ich raus welche Parameter ich dieser Funktion übergeben muss? Bis auf das Klartextpaket werden noch irgendwelche Adressen ohne lesbaren Inhalt gepusht bevor die Funktion gecalled wird. Daraus werd ich auch nicht schlau... :confused:
Der String geht wahrscheinlich durch mehrere Funktionen. Eine Verschlüsselungsfunktion, eine Sendfunktion usw..