Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Byte in Speicher schreiben (https://www.delphipraxis.net/68225-byte-speicher-schreiben.html)

bundy 26. Apr 2006 15:54


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:

const
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;
Bis daher funktioniert das wunderbar

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

jim_raynor 26. Apr 2006 16:05

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);

ichbins 26. Apr 2006 16:09

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:
00000000 00000000 00000000 00001000
heisst also z.B. 8.

Du schreibst allerdings deine 200 (Binär: 01100100) einfach ins erste Byte, so dass es dann so aussieht:
Code:
 * NEU * * ALT *   * ALT *  * ALT *
01100100 00000000 00000000 00001000
und das ergibt jetzt eine unvorstellbar grosse Zahl, nämlich:
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.

Frickeldrecktuxer_TM 26. Apr 2006 16:24

Re: Byte in Speicher schreiben
 
Zitat:

Zitat von ichbins
Dabei enthält das letzte Byte den niedrigsten Zweierpotenwert,

Nicht auf PCs.
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.

bundy 26. Apr 2006 16:29

Re: Byte in Speicher schreiben
 
Hi danke für eure schnelle antwort


Zitat:

Zitat von jim_raynor
Warum so kompliziert:

sollte wunderbar klappen.
Delphi-Quellcode:
var
  x:integer;
begin
  x:=cxSpinEdit1.Value;
  WriteProcessMemory(HandleWindow, ptr(Address1), x, sizeof(x), write);

so gehts nicht


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

Frickeldrecktuxer_TM 26. Apr 2006 16:39

Re: Byte in Speicher schreiben
 
Zitat:

Zitat von bundy
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 FF 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00


oh mann , das check ich jetzt irgendwie net.

Wieso? Passt doch alles. Das Problem ist nur, daß dein buf nur 1 Byte groß ist, und Zahlen größer als 255 kriegst du da auch mit Mühe nicht rein ;-)
jim_raynors Idee ist richtig, bis auf ein kleines Detail funktioniert sie auch:
Delphi-Quellcode:
WriteProcessMemory(HandleWindow, ptr(Address1), @x, sizeof(x), write);
WPM will einen Zeiger auf die Daten haben, nicht die Daten selbst.

bundy 26. Apr 2006 16:46

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

jim_raynor 26. Apr 2006 16:47

Re: Byte in Speicher schreiben
 
Zitat:

Zitat von Frickeldrecktuxer_TM
jim_raynors Idee ist richtig, bis auf ein kleines Detail funktioniert sie auch:
Delphi-Quellcode:
WriteProcessMemory(HandleWindow, ptr(Address1), @x, sizeof(x), write);
WPM will einen Zeiger auf die Daten haben, nicht die Daten selbst.

harhar. Wusste doch, irgendwas hab ich vergessen :zwinker:.

Für den, den @ nicht gefällt kann auch Addr(x) verwenden ;)

bundy 26. Apr 2006 16:53

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);

Dax 26. Apr 2006 17:02

Re: Byte in Speicher schreiben
 
Nö.
Delphi-Quellcode:
var x: Integer;
begin
  x := csSpinEdit2.Value;
  WriteProcessMemory(HandleWindow, ptr(Address4), @x, sizeof(x), write);
end;
So wärs richtig ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:41 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz