Autor Beitrag
SchwiegerSohn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Fr 24.06.05 16:36 
Hi,
Ich habe Folgendes Problem.
Ich Möchte in ein Fremden Programm genauer Gesagt in einem Spiel den Speicher ändern.
Die Werte Stammen von einem Zufallsgenerator.. Und werden noch Mathematisch Bearbeitet.. Deren Ergebnisse sind mein Ziel!
Ich möchte auch, das dieser Zufallsgenerator erhalten bleibt!
Das Problem ist : Die werte Landen auf dem stack. Die Werte könnte ich über Read bzw WriteProcessMemory lesen und ändern.. nur müssen diese Werte vorher noch geprüft werden, Dabei wird dann entschieden ob sie geändert werden , oder gleich bleiben! Die Werte werden auch Sehr schnell weiter Verabeitet.. so das ich das Programm nach dem Zufallsgenerator unterbrechen müsste, die werte auslesen , prüfen... und dann eventuell neuschreiben muss.. Und dann das Programm ganz normal weiter laufen lassen!

Hat jemand ne idee wie man sowas Realiesieren kann ?
PS: Das ganze läuft auf einem Win98 System.

_________________
Wer rechtschreibfehler findet darf sie behalten!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 24.06.05 16:44 
PID auf den fremden Prozess holen
ProzessPrio auf Lowest setzen (oder mit Suspend vollständig anhalten)
Änderung mit OpenProcess\WriteProcessMemory\CloseHandle ausführen
Prozess wieder auf Normal-Prio setzen und Resume ausführen..

Elegantere Möglichkeit:
Schreib in deinem Programm ein mini-Debugger-Interface und setz nen HW-Breakpoint auf den Return-Befehl des Zufallsgenerators. Danach kannst Du im Kontext des Spiels ohne Probleme arbeiten. Nach Abschluss der Arbeiten einfach weiterarbeiten (und Debuggen fortsetzen) ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
SchwiegerSohn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Fr 24.06.05 16:55 
Erstmal vielen dank :)
Das hilft mir schonmal sehr weiter..
Das Problem dabei ist nur.. wie finde ich herraus wann das programm an der richtigen stelle ist um es Anzuhalten?
Ständig den EIP zu überwachen ist glaub ich nicht der richtige weg.. wenn es überhaupt geht ?

An die 2te Elegantere möglichkeit hab ich auch schon gedacht... nur hab ich überhaupt keine ahnung wie ich einen Hardware BreakPoint setze.. im MSDN hab ich dazu nix gefunden..

_________________
Wer rechtschreibfehler findet darf sie behalten!
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 24.06.05 18:54 
Titel: Re: Fremdes Programm Einfrieren Speicher ändern und weiterla
user profile iconSchwiegerSohn hat folgendes geschrieben:
Die Werte könnte ich über Read bzw WriteProcessMemory lesen und ändern.

Unter 32-Bit Windows? Ob das so einfach geht wage ich zu bezweifeln. Mit Read- und WriteProcessmemory kannst du nur Speicher lesen und schreiben, den du dir selber mit VirtuallAllocEx im fremden Prozess reserviert hast.

Desweiteren gibt es hier im Forum schon genug Threads zu Spiele Trainern.
Arnulf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Fr 24.06.05 20:25 
Hi
Zitat:
Desweiteren gibt es hier im Forum schon genug Threads zu Spiele Trainern.

Das ist soweit richtig.
Aber genau an dem problem Arbeite ich auch nebenbei - neben vielen anderen dingen :).

Spieletrainer machen es sich relativ einfach - die Arbeiten nicht mit den werten sonder setzen nur funktionen ausser kraft.
Code Caves oder ähnliches überspringen ( nopen) ja nur funktionen oder zeilen einer Funktion.
Das heißt ich bin hier immer noch in der code section - und kann mehr oder weniger machen was ich will.

Das auslesen oder bearbeiten des dynamisch erstellten Speichers ist da was ganz anderes.
Hier muß ich irgendwie and die basepointer des dynamischen speichers ran und das ist nicht so einfach.
Einzige möglichkeit mit der ich momentan herumexperementiere ist, wie ein cheat ein codecave zu machen.
Also einen jump auf meinen code, wenn ich momentan weiß, daß der gewünschte basepointer grad im register steht.
Und dann hald den pointer zu speichern - damit könnte ich vielleicht an die richtige stelle kommen.

Sicher kennen leute die sich mehr auskennen bessere methoden, aber mit meiner geringen Erfahrung ist mir nichts anderes eingefallen.

Hoffe es kommen noch mehr Ideen oder Antworten vor allem für delphi - wenn man sowas machen will findet man ja code genug für c++ - aber für delphi gibts hald wenig.

Arnulf
SchwiegerSohn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Fr 24.06.05 20:28 
@Lucky : Ich kenn die Ganzen Trainer Topic's..
Aber diese Trainer Patchen ja einfach nur die Entscheidenen Calls ins NOP's.. so das nix abgezogen wird.
Mein Spiel ist auch kein Ego Shooter.. Sondern Ein Karten Spiel..
Die Karten werden via zufalls generator gebildet.. Ich möchte die Karten Direkt nachdem sie gezogen wurden überprüfen und ggf neu schreiben.

Ich übe(versuche) mich grade an der "DEBUGACTIVEPROCESS" Das klappt soweit auch schon..
Nur müsste ich jetzt noch wissen, wie ich einen BreakPoint Setze? wenn das überhaupt geht.
Ich weiss nicht wie die debugger das machen.. und im MSDN ist dazu leider nix zu finden..

_________________
Wer rechtschreibfehler findet darf sie behalten!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 24.06.05 21:16 
Nur kurz nebenbei: Den eigenen Prozess kann man nicht debuggen ;-)

Zum Thema:

Wenn Du weißt, wo der Prozess die Routine für den Zufallsgenerator im Speicher hat, dann Patchst Du von dieser den RET-Befehl durch ein $CC (INT 3). Bei jeder Ausführung des Zufallsgenerators hält der Debugger an genau dieser Stelle an und übergibt deinem Prozess die Steuerung. Nun fragst Du mit dem Debugger den aktuellen Thread-Context ab. Das Ergebnis des Zufallsgenerators steht zu diesem Zeitpunkt im Register EAX. Da Du den Source verändert hat, musst Du dich durch Manipulation des Threadkontext selber um den Rücksprung kümmern, d.h.

DWORD PTR [ESP] auslesen
Wert an EIP zuweisen
ESP um 4 inkrementieren
Neuen Threadkontext an debuggtes Spiel weiterreichen.

BTW: user profile iconuall@ogc sollte Dir zu diesem Thema weiterführende Hinweise geben können.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
SchwiegerSohn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Fr 24.06.05 21:39 
@BenBE :) *thx* diese möglichkeit bin ich schon am testen.. bzw ich werd es so hinbiegen das es funktioniert :)

_________________
Wer rechtschreibfehler findet darf sie behalten!


Zuletzt bearbeitet von SchwiegerSohn am Mo 27.06.05 15:45, insgesamt 1-mal bearbeitet
SchwiegerSohn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Mo 27.06.05 14:24 
Das mit dem INT03 geht super..
Nochmal THX @ all :)

_________________
Wer rechtschreibfehler findet darf sie behalten!