Not a member yet? Register for your free account!

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 13:41

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

 

Inline Asm -> Wert aus Register in anderes Register schreiben

Reply
 
Old   #1
 
elite*gold: 0
The Black Market: 4/0/0
Join Date: Jul 2010
Posts: 422
Received Thanks: 163
Question Inline Asm -> Wert aus Register in anderes Register schreiben

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




Last edited by MaxMilimeter; 03/15/2012 at 21:35.
MaxMilimeter is offline  
Old   #2
 
elite*gold: 5
The Black Market: 0/0/0
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
"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?
Nightblizard is offline  
Old   #3
 
elite*gold: 0
The Black Market: 0/0/0
Join Date: Nov 2009
Posts: 343
Received Thanks: 45
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 ];


Last edited by yihaaa; 03/15/2012 at 20:55.
yihaaa is offline  
Old   #4
 
elite*gold: 0
The Black Market: 4/0/0
Join Date: Jul 2010
Posts: 422
Received Thanks: 163
@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.




Last edited by MaxMilimeter; 03/15/2012 at 21:37.
MaxMilimeter is offline  
Old   #5
 
elite*gold: 0
The Black Market: 0/0/0
Join Date: Jul 2010
Posts: 388
Received Thanks: 195
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
SmackJew is offline  
Old   #6
 
elite*gold: 0
The Black Market: 4/0/0
Join Date: Jul 2010
Posts: 422
Received Thanks: 163
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?


Last edited by MaxMilimeter; 03/15/2012 at 21:53.
MaxMilimeter is offline  
Old   #7
 
elite*gold: 0
The Black Market: 0/0/0
Join Date: Jul 2010
Posts: 388
Received Thanks: 195
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
SmackJew is offline  
Thanks
1 User
Old   #8
 
elite*gold: 0
The Black Market: 4/0/0
Join Date: Jul 2010
Posts: 422
Received Thanks: 163
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
MaxMilimeter is offline  
Old   #9
 
elite*gold: 0
The Black Market: 0/0/0
Join Date: Jul 2010
Posts: 388
Received Thanks: 195
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.
SmackJew is offline  
Old   #10
 
elite*gold: 0
The Black Market: 4/0/0
Join Date: Jul 2010
Posts: 422
Received Thanks: 163
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.
MaxMilimeter is offline  
Old   #11
 
elite*gold: 0
The Black Market: 0/0/0
Join Date: Jul 2010
Posts: 388
Received Thanks: 195
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.


Last edited by SmackJew; 03/15/2012 at 23:48.
SmackJew is offline  
Thanks
1 User
Old   #12
 
elite*gold: 0
The Black Market: 4/0/0
Join Date: Jul 2010
Posts: 422
Received Thanks: 163
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?
MaxMilimeter is offline  
Old   #13
 
elite*gold: 0
The Black Market: 0/0/0
Join Date: Jul 2010
Posts: 388
Received Thanks: 195
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
}
SmackJew is offline  
Thanks
1 User
Old   #14
 
elite*gold: 0
The Black Market: 4/0/0
Join Date: Jul 2010
Posts: 422
Received Thanks: 163
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...

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 ...


Last edited by MaxMilimeter; 03/16/2012 at 00:23.
MaxMilimeter is offline  
Old   #15
 
elite*gold: 0
The Black Market: 0/0/0
Join Date: Jul 2010
Posts: 388
Received Thanks: 195
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...
Der String geht wahrscheinlich durch mehrere Funktionen. Eine Verschlüsselungsfunktion, eine Sendfunktion usw..
SmackJew is offline  
Thanks
1 User
Reply



« Previous Thread | Next Thread »

Similar Threads
Register -.-
Hallo! Ich habe mein register script zum laufen bekommen und auch den Text in der Datenbank aufegführt (als master) und mssql ist bei xampp auch...
3 Replies - Flyff PServer - Discussions / Questions
Wtf? Register?
Hello, I have a problem, I want to make a privateserver, but my problem is... If I put my registerpage in my wamp, I dont see the page... ...
11 Replies - Flyff PServer - Discussions / Questions
Float Wert Schreiben
und zwar sonst schreib ich immer mein Wert so in VB2008 Memory.Writememory(p(0), &H6473850, "300", "4") aber da ich jetzt eine Float Typ...
7 Replies - General Coding
register
is this right, if I want to enter register page on the vps? because when I do it, it can't get it. http://195.46.39.44/register.php
2 Replies - CO2 PServer - Discussions / Questions
I cant register
I cant register on the new cabal8 site (world of cabal) and there is some new thing called super password what's that!? Also when i click regiter a...
3 Replies - Cabal Main - Discussions / Questions



All times are GMT +1. The time now is 13:41.


Powered by vBulletin®
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.

Support | Contact Us | FAQ | Advertising | Privacy Policy
Copyright ©2016 elitepvpers All Rights Reserved.