[ASM] Eine Frage bezüglich Konstanten?

12/21/2011 06:02 Atzenkeeper#1
Also ich hätte da mal eine grundsätzliche Frage dazu wassich allein mit Olly noch machen könnte.

Quote:
Ist es Möglich einen Variierenden String in ein Programm zu schläusen und eine Funktion dann immer diesen String beziehen zu lassen.

Als kleines Beispiel stellt euch eine Chat-Funktion vor.
Diese holt sich denn immer die Nachricht aus einem Bestimmten Register.
Nehmen wir mal an EDX verweißt auf die String Variable.

Ist es nun möglich eine String Variable im Clienten zu hinterlegen so das ich diese dann statt der anderen Variable in EDX Moven kann ??

Das alles ohne Externes Modul sprich eine DLL weil damit ist mir klar dasses möglich ist aber mein C++ mag mich nochnicht soganz weshalb ich mich noch auf das Patchen mit Olly begrenze.
Edit:

Quote:
Oder mussich dazu wirklich in C++ ne DLL schreiben die dann eine Detourfunction setzt und mir dort eine Variable anlegen die ich ausgeben kann und das Register dann in die Lokale Variable Moven ??

P.S:
Quote:
Ne Frage am Rande könnt ihr mir eine gute Umgebung empfehlen um eine GUI für ein C++ Tool zu Basteln denn das bereitet mir in C++ momentan am meisten Kopfzerbrechen. Mit Visg geht es zwar ganz gut aber wenn ich etwas umfangreichere GUIs erstellen will spackt es rum.

Und wennich die GUI direkt in VC++ erstelle dann tauchen ohne ende Definitions Fehler auf.

Und ich weiß nichtmal wonach ich da genau Googlen soll deswegen schmeiß ich diese Frage nochmal mit in den Raum :P

Bin im moment noch so sehr an das einfache VB.Net gewöhnt :D
Die Zitat-Tags sollen es nur übersichtlicher machen :P
12/21/2011 13:37 MrSm!th#2
Du kannst auch mit olly detouren, das ganze nennt sich dann codecave.

schrei da halt nen jump zu einer codecave hin, da führst du die überschriebenen instructions aus, movst den gewünscht wert in EDX und jumpst zurück
12/21/2011 16:17 Atzenkeeper#3
Ja das das geht weiß ich schon das habe ich auch schon öfters gebraucht.
Nur ich hab immer das Problem wenn mein Gewünschter Wert nicht zu finden ist ihn selbst zu Deklahieren.

Aber da gibt es sicher auch irgend eine Möglichkeit.
Bei der Methode die du beschrieben hast muss ich meist aber auch den Code den ich mit dem Jump überschreibe an der neuen Stelle mit eintragen und dann meinen Code dazu und dann halt am ende wieder ein Jump zu dem was als nächstes käme.

Hat bis jetzt immer ganz gut geklappt.
Aber mein problem ist es ja ich will einen bestimmten String z.b. in einem Register hinterlegen den ich aber so im Clienten noch nicht beziehen kann.

Also dassich selber einen Konstanten String im Clienten hinterlegen kann ô.o#

Mein Zweites Problem war halt eine Zahl die an bestimmten Punkten in den Registern steht die leider so nicht über Memorys auszulesen ist. Auslesbar zu machen.
12/21/2011 16:50 MrSm!th#4
hab ich doch gesagt o.ô

ja, dann packst du den string halt da rein. gibt ja tools, die können einem codecaves einfügen, da gibts auch sicher tools, die fügen einem neue daten in die data section.

ansonsten müsstest du dich selbst ein bisschen mit dem PE format und sections auseinandersetzen und einen string hinzufügen.

ich hab es bisher immer so gemacht, dass ich den string selbst irgendwo per olly eingefügt habe. du kannst ja code patches vornehmen und gleichzeitig auch binary.

ich hab mir also eine codecave gesucht, die groß genug war und erst den string / die daten dort eingefügt (einfach die stelle nicht im asm fenster, sondern im dump fenster editiert) und danach den code und da dann auf den string verwiesen.

würde ich aber von abraten, denn normalerweise ist die protection der code section nur auf execute gesetzt, es könnte also eine access violation auslösen, wenn die zielfunktion dann versucht, die daten an der stelle einzulesen.
12/21/2011 17:40 yihaaa#5
Natürlich ist das möglich. Wie MrSm!th schon gesagt hat, brauchst du dazu eine CodeCave oder wenns past, kann du ja direkt den Befehl verändern.

MfG
12/21/2011 18:08 lolkop#6
der weg den mrsmith beschrieben hat würde immer erfordern, das du einen freien bereich im speicher findest, auf welchen auchnoch die benötigten rechte vergeben sind. gerade bei programmen welche mit code droppern oder pe-optimizern bearbeitet wurden, wirst du solche bereiche aber wohl selten vorfinden.

solange du dich auf windows beschränkst, kannst du doch auch auf die winapis zugreifen, und per VirtualAllocEx function einfach einen breich für deinen string und für deine codecave einrichten.

ich denke es gibt kaum sprachen, welche nicht auf die winapis zugreifen können =P

wenn du lieber mit asm als mit c++ arbeitest, kannst du das ganze zur not auch in asm selbst schreiben. hierfür gibts ja auch genügend open-source compiler. eine in asm generierte dll sollte keinerlei nachteile (abgesehen von der fehlenden hochsprache) gegenüber einer in c++ generierten haben.
12/21/2011 18:47 MrSm!th#7
Quote:
der weg den mrsmith beschrieben hat würde immer erfordern, das du einen freien bereich im speicher findest, auf welchen auchnoch die benötigten rechte vergeben sind. gerade bei programmen welche mit code droppern oder pe-optimizern bearbeitet wurden, wirst du solche bereiche aber wohl selten vorfinden.
man kann ccs auch selbst erstellen...
12/21/2011 20:16 Atzenkeeper#8
Ja das mit den Code Caves war schon vorher verstanden hab mir auch schon ein Tut angeguckt wo ich gesehen hab das man die mit CE suchen kann. Hab früher bei dem Game bei dem ich paar Patches geschrieben hatte einfach immer meinen Code am Ende angehängt weil da einfach alles Frei war aber das lies sich nicht in die Exe übertragen musste ich also Runtime immer wieder wiederholen.

Ich finde so Code Injections eigendlich nicht schwer mir macht das sogar spaß in ASM da was rum zu schrauben und immer mehr dazu zu lernen aber mein eigendliches Problem war ja das ich einen String in meinem Programm hinterlegen will den ich dann via MOV EDX,Adresse in das EDX Register z.b. laden könnte ich hab mir die im Clienten bereits hinterlegten Strings mal angeguckt und versucht das in an eine Leere stelle zu übertragen aber statt das der selbe String raus kam kam einfach irgend ein Unnötiger Befehl raus.

Also mussich ja irgendwas übersehen haben was dem Programm sagt jetzt kommt ein String. Worauf mussich da achten ô.o
12/21/2011 21:28 lolkop#9
olly wird dir im cpu fenster immer versuchen sämtliche bytes in asm befehle zu übersetzen.
das ist aber auch nicht weiter schlimm, zumindest solange der code nicht irgendwann in deinen string reinrennt :P. willst du nach strings suchen, so musst du ins dump fenster schauen.

schreibst du zb "hallo" in adresse 0x12345678, so zeigt olly dir im cpu fenster das an:
Code:
12345678   48               DEC EAX
12345679   61               POPAD
1234567A   6C               INS BYTE PTR ES:[EDI],DX
1234567B   6C               INS BYTE PTR ES:[EDI],DX
1234567C   6F               OUTS DX,DWORD PTR ES:[EDI]
im dump fenster hingegen siehst du dann deinen string:
Code:
12345678  48 61 6C 6C 6F 00 00 00  Hallo...
12/21/2011 23:21 Atzenkeeper#10
achso das ist gut zu wissen das hatte mich nämlich leicht verwirrt weil er alle strings immer in komische befehle umgeschrieben hatte hab aber auch schon in grau strings im cpu fenster gesehen ô.o
12/21/2011 23:32 MrSm!th#11
Nur darfst du den Teil halt nicht ausführen, sondern nur die Adresse in EDX moven (willst es ja als String interpretieren und die Referenz übergeben) und du bisst sichergehen, dass an die Stelle vom Programm nichts anderes bzw. gar Code geladen wird!