[C#] Freeze Value (Memory Editing)

03/25/2013 20:46 Explo!t#1
Hey Community :)
ich komme da mit einer Frage auf die ich leider keine Antwort finde. Ich weiß das es möglich ist durch eine Schleife die Adresse ständig neuzubeschreiben mit dem gewünschten wert. Jedoch ergibt das ein Problem. Beispiel: Ich fülle den Wert meines Lebens ständig mit 100 (full), ich werde im Spiel angeschossen und der Prozess versucht auf die Adresse zuzugreifen und zu beschreiben, wenn mein Programm und das Spiel versuchen gleichzeitig auf die Adresse zu schreiben verursacht das Bugs, beispielweise kann ich mich in diesem Fall Ingame nicht mehr bewegen und hänge an der Stelle fest.

Ich weiß das es per CheatEngine möglich ist die Adresse zu finden die auf die Lebensadresse zugreift und sie zu verändern und diese dann mit NOP zu füllen, auch genannt "replace with code that does nothing (NOP)". Meine Frage wäre. Ist es möglich dies in C# zu realisieren ? Oder gibt es eine andere Möglichkeit einen Wert in einer Adresse zu "freezen" damit ich immer volles Leben habe ?

Mit freundlichen Grüßen
Explo!t
03/25/2013 21:10 dready#2
Sicher, die vorgehensweise ist im Endeffekt die selbe wie wenn du den Wert schreibst

Finde die Funktion die dafür zuständig ist, schreib dir die Speicherstelle auf
Benutz deine Writememory Funktion um sie mit nops zu überschreiben :)
03/25/2013 21:16 Explo!t#3
wie schreib ich die NOP auf ?
03/25/2013 21:23 dready#4
Das was du in den Debuggern wie dem kleinen in Cheatengine siehst sind Mnemonics
Das bedeutet es ist ein kleines Buchstabenkürzel das für einen Opcode steht
Das sollte ausreichen damit du mal nach googlen kannst :)

Der Opcode für ein Nop ist 0x90
03/25/2013 22:01 Explo!t#5
das heißt ich trage als Wert für die Adresse einfach 0x90 ein ?!
03/25/2013 22:09 dready#6
Du schaust in einem Debugger deiner Wahl was für ein Code den auf deine Adresse schreibt, glaub Cheatengine kann das auch

Danach suchst do wo im Speicher den diese Stelle ist und überschreibst sie mit nops
03/25/2013 22:15 Explo!t#7
das habe ich verstanden. Die Adresse habe ich sogar gefunden. Ich werds gleich mal
probieren und per EDIT gleich in diesem Post berichten ob ich es hingekriegt habe.

OT: Erstmal kurz was essen :P

EDIT: Ich kriegs irgendwie nicht gebacken. Könnten wir vielleicht mal in Skype schreiben ?!
EDIT²: Also die Adresse die die Lebens Adresse beschreibt ist "name.exe+B331F". Das heißt diese Adresse muss ich mit 0x90 füllen ? Wenn ja wie schreibe ich sie als adresse auf ?
03/26/2013 00:54 Kilinat#8
Quote:
Originally Posted by Explo!t View Post
das habe ich verstanden. Die Adresse habe ich sogar gefunden. Ich werds gleich mal
probieren und per EDIT gleich in diesem Post berichten ob ich es hingekriegt habe.

OT: Erstmal kurz was essen :P

EDIT: Ich kriegs irgendwie nicht gebacken. Könnten wir vielleicht mal in Skype schreiben ?!
EDIT²: Also die Adresse die die Lebens Adresse beschreibt ist "name.exe+B331F". Das heißt diese Adresse muss ich mit 0x90 füllen ? Wenn ja wie schreibe ich sie als adresse auf ?
Ich glaub 0x90 war ein Beispiel wie sowas aussieht. Ich weiß nicht genau ob das stimmt, aber denke dass es dann 0xB331F sein müsste.
03/26/2013 01:02 Explo!t#9
Das habe ich probiert. Das Problem ist wenn ich ingame gehe und ich lasse mich anschießen, gibts nen mega error und das spiel stürzt ab.

Und 0x90 bedeutet in diesem Falle wirklich NOP
03/26/2013 01:04 dready#10
0x90 ist der opcode für ein nop

die adresse ist name.exe baseadresse + b331f
in .net kannst du das sehr einfach mit der Process Class rausbekommen
entweder als Baseadress oder als Moduleadress von name.exe im process, beide wege sollte hinhauen

Einfach 0x90 irgendwo hinschreiben wird dir kaum weiterhelfen, du musst versuchen den code soweit zu verstehen um zu erkennen was genau nun die anweisung ist die den Wert verringert

Danach siehst du dir an Wieviel bytes diese anweisung den hat
Danach überschreibst du diese Bytes mit einer entsprechenden Menge an Nop anweisungen

So wie sich das anhört überschreibst du nur einen Teil der Function ;) es scheint ja die Richtige zu sein da dein Spiel crashed

Bsp um zu verdeutlichen was ich mein

Du hattest dort stehen
JE 0x12345678
du überschreibst es mit 0x90
nun steht da
NOP 0x12345678

kann nicht klappen, musst alles ersetzen ;)
03/26/2013 01:18 Explo!t#11
Das heißt ich muss mehr adressen finden die diese adresse beschreiben ?!
03/26/2013 01:36 dready#12
Nein, es heißt du musst dir ansehen was genau den da geschrieben wird

Deine Adresse hast du, sieh dir mal an was da im moment so steht
Danach ersetzt du alle bytes die zu dieser anweisung gehören
03/26/2013 01:40 Explo!t#13
das heißt die byte länge könnte größer sein ?
03/26/2013 01:42 dready#14
mit ziemlicher sicherheit sogar ;)
Überflieg am besten mal die Grundlagen der Assembler Sprache, dann ergibt das ganze etwas mehr Sinn für dich
03/26/2013 01:46 Explo!t#15
wie gesagt, ist alles sehr neu für mich und ich sitz ja auch nicht 24h an sowas. Jedoch ist es ein sehr interessantes thema und du hilfst mir sehr dabei das ganze zu verstehen. Ich lerne ziemlich gut wenn mir jemand dabei hilft. Deswegen frage ich auch sehr oft.

Werde das ganze morgen mal probieren und dann berichte ich wieder

EDIT: Wie kann ich 6 bytes lang mit NOP füllen ?! ich hab ja nur 1 adresse und 1 value

EDIT²: Schreibe ich dann einfach 0x900x90x090, etc. ? oder wie mach ich das