![]() |
Byte in Speicher schreiben
Hi Leute
Ich bin gerade dabei einen Trainer für das Spiel Harry Potter und der Feuerkelch zu schreiben. Das funktioniert soweit auch wunderbar. Ich suche via TSearch die Speicheradressen und schreibe dann die Werte. Ich setzte den Wert der Leben auf 200 Adresse | Value $241BC08 | 200 das mach ich so
Delphi-Quellcode:
Bis daher funktioniert das wunderbarconst Address1='$241BC08'; procedure TForm1.setLives; var x:integer; begin x:=cxSpinEdit1.Value; GetMem(buf, 1); buf^ := chr(x); WriteProcessMemory(HandleWindow, ptr(Address1), buf, NumberOfBytes, write); end; Doch jetzt will ich die "Zauberbohnen" editieren. Adresse: $24194F0 Ich will über einen SpinEdit den Wert ändern z.B 99999999 Bohnen. Jetzt die Frage : Wie rechne ich das den um, weil die Ganze Zahl bekomme ich ja nicht in die Adresse. Er müsste den Rest in die nächste Adresse schreiben. Hat jemand ne ahnung wie ich das uf die Reihe bekomme, das wenn die Zahl für das einen Byte zu gross ist er ins nächste schreibt ? lg Bundy Jetzt zu meinem Problem |
Re: Byte in Speicher schreiben
Warum so kompliziert:
sollte wunderbar klappen.
Delphi-Quellcode:
var
x:integer; begin x:=cxSpinEdit1.Value; WriteProcessMemory(HandleWindow, ptr(Address1), x, sizeof(x), write); |
Re: Byte in Speicher schreiben
Ich glaube du machst einen grundlegenden Fehler.
Mit welchem Programm hast du denn die Adressen gesucht? Bei TSearch musst du ja auswählen welcher Datentyp vorliegt. Ein Integer bei Delphi belegt z.B. immer 4 Bytes (zumindest bei 32-Bit-EXEn). Dabei enthält das letzte Byte den niedrigsten Zweierpotenwert,
Code:
heisst also z.B. 8.
00000000 00000000 00000000 00001000
Du schreibst allerdings deine 200 (Binär: 01100100) einfach ins erste Byte, so dass es dann so aussieht:
Code:
und das ergibt jetzt eine unvorstellbar grosse Zahl, nämlich:
* NEU * * ALT * * ALT * * ALT *
01100100 00000000 00000000 00001000
Delphi-Quellcode:
0*2^0 ALTER WERT
0*2^1 ALTER WERT 0*2^2 ALTER WERT 1*2^3 = 8 ALTER WERT 0*2^4 ALTER WERT ... 0*2^24 //das Element dass im linken Byte als erstes kommt, also am rechtesten (*g*) steht 0*2^25 1*2^26 = 67108864 (:shock:) 0*2^27 0*2^28 1*2^29 = 536870912 1*2^30 = 1073741824 0*2^31 //das linkseste also letzte Byte somit hat der neue Leben-Integer den Wert 1677721600 (der neue, hinzugefügte) + 8 (die Ursprüngliche Anzahl, welche nicht überschrieben wurde), also insgesammt 1677721608 und nicht 200, wie du es beabsichtigt hast. Du musst den kompletten Inhalt deiner Integer-Variable auf die nächsten 4 Bytes kopieren. Du musst aber darauf achten, dass das Leben auch evtl. ein Real-Wert sein könnte, dann musst du eben den kompletten Inhalt einer Real-Variable über die nächsten Bytes kopieren. |
Re: Byte in Speicher schreiben
Zitat:
Die Byte-Order bei LE ist das least significant Byte links nicht rechts. Die Zahl 0x12345678 wird also zur Byte-Folge 0x78 0x56 0x34 0x12. Entsprechend sind die Bytes auch left-aligned, ein 0x1234 wird nicht zu 0x00 0x00 0x34 0x 12, sondern zu 0x34 0x12 0x00 0x00. |
Re: Byte in Speicher schreiben
Hi danke für eure schnelle antwort
Zitat:
[Pascal Fehler] Unit1.pas(153): E2010 Inkompatible Typen: 'Pointer' und 'Integer' auch nicht wenn ich statt x wieder buf einsetzte jetzt steht Leben = 1 $588BEC 01 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 jetzt leben = 200 $588BEC C8 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 jetzt leben = 999999 $588BEC 3F 42 0F 00 02 00 00 00 00 00 00 00 00 00 00 00 oh mann , das check ich jetzt irgendwie net. |
Re: Byte in Speicher schreiben
Zitat:
jim_raynors Idee ist richtig, bis auf ein kleines Detail funktioniert sie auch:
Delphi-Quellcode:
WPM will einen Zeiger auf die Daten haben, nicht die Daten selbst.
WriteProcessMemory(HandleWindow, ptr(Address1), @x, sizeof(x), write);
|
Re: Byte in Speicher schreiben
:thumb: :thumb: :thumb: :thumb: :thumb: :thumb:
Leute Ihr seit einfach GENIAL !!!!!! :thumb: :thumb: :thumb: :thumb: :thumb: :thumb: funktioniert :) lg Bundy |
Re: Byte in Speicher schreiben
Zitat:
Für den, den @ nicht gefällt kann auch Addr(x) verwenden ;) |
Re: Byte in Speicher schreiben
Ist das auch richtig ?
Delphi-Quellcode:
x:=cxSpinEdit2.Value;
GetMem(buf, sizeof(x)); buf^ := chr(x); WriteProcessMemory(HandleWindow, ptr(Address4), buf, sizeof(x), write); |
Re: Byte in Speicher schreiben
Nö.
Delphi-Quellcode:
So wärs richtig ;)
var x: Integer;
begin x := csSpinEdit2.Value; WriteProcessMemory(HandleWindow, ptr(Address4), @x, sizeof(x), write); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz