Autor Beitrag
Don Krawallo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45

Windows 10 x64
Delphi 10.4.1
BeitragVerfasst: Fr 14.09.12 20:38 
Einen wunderschönen Guten Abend hier im Forum.

Eins vorweg, die Suchfunktion hab ich bereits benutzt, hilft mir aber in meiner Form der Problemlösung nicht weiter.
Noch etwas zur Erklärung...
Bisher schreibe ich in den Speicher fremder Prozesse, natürlich, mittels WriteProcessMemory. In diesem Sinne handelt sich es quasi um statische Adressen die beschrieben werden.
Mittlerweile hab ich mich mal über die VirtualProtectEx Funktion her gemacht und versuche das Ganze so zu lösen, also das Schreiben in einen Prozess.

Folgendes Problem besteht jetzt meinerseits. Die Funktion liefert mir ja nur den Pointer auf die Anfangsadresse des Speicherbereichs den ich mir mit dieser API zuweise. Im nachfolgenden seht ihr den Codeabschnitt...
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
var
  BaseAdress: PByte;
begin
  BaseAdress:= VirtualAllocEx (hProcess, nil, dwSize, flNewProtect, lpflOldProtect);
  WriteProcessMemory(hProcess, Pointer(BaseAdress), lpBuffer, nSize, lpNumberOfBytesWritten);


Problemlos kann ich so z.B. auch an einer bestimmten Stelle innerhalb des zugewiesenen Speichers schreiben. So wie hier zu sehen...
ausblenden Delphi-Quelltext
1:
WriteProcessMemory(hProcess, Pointer(BaseAdress+$500), lpBuffer, nSize, lpNumberOfBytesWritten);					


Soweit alles kein Problem. Konkret dreht es sich nun um folgendes... Ich möchte z.B. nach den geschriebenen Daten, die als Array deklariert sind, einen Sprungbefehl schreiben. Die Berechnung des Sprunges bzw. der Sprungweite ist soweit kein Problem, aber da mir VirtualProtectEx nur den Pointer liefert kann ich jetzt z.B. nicht einfach rechnen...
ausblenden Quelltext
1:
Sprung ZU Adresse - Sprung VON Adresse - 5 (Opcodes der Sprungweite)					


Ich müsste also erst einmal den Pointer in eine Integer Variable umwandeln. Aber da stoße ich irgendwie auf Granit.
Wäre schön wenn mir jemand in dieser Richtung nen Tipp geben könnte das zu lösen.

Ansonsten wünsche ich noch einen schönen Abend
MFG Don Krawallo
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: So 16.09.12 19:24 
Pointer(Integer(BaseAdress) + 5)

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit

Für diesen Beitrag haben gedankt: Don Krawallo
Don Krawallo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45

Windows 10 x64
Delphi 10.4.1
BeitragVerfasst: So 16.09.12 20:44 
Das Problem hatte ich bereits gelöst.
Eine generelle Suche im Internet (best friend google) brachte mir bereits den Erfolg.
Casten ist hier das Stichwort.

Trotzdem einen herzlichen Dank für Deine Antwort.

Übrigens... Ich habe das folgendermaßen gelöst.
ausblenden Delphi-Quelltext
1:
2:
NewWert:= Integer(BaseAdress);
Merker:= $00400400 - NewWert - 5;

In der Variable "Merker" stehen also die Bytes die nach der JMP Anweisung (0xE9h) geschrieben werden.
Diese könnte man dann, wie üblich, mittels WriteProcessMemory schreiben...