Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi In den Speicher schreiben (https://www.delphipraxis.net/31147-den-speicher-schreiben.html)

Reddog 5. Okt 2004 00:49


In den Speicher schreiben
 
Hallo,

kann mir jemand sagen, mit welcher Methode man am besten in den Speicher des eigenen Programms schreibt?
Also bei fremden habe ich immer WriteProcessMemory verwendet. Kann man das auch in dem eigentlichen Programm verwenden? Und was gibt man dann als Process-Handle an (vielleicht HInstance?)?

Also Danke für jegliche Hilfe,
Reddog.

dizzy 5. Okt 2004 01:52

Re: In den Speicher schreiben
 
Was willst du denn wohin schreiben, und um was zu bewirken?

Reddog 5. Okt 2004 02:47

Re: In den Speicher schreiben
 
War eher so generell gefragt.

Zum Beispiel, will ich mein Programm im Speicher verändern (was man natürlich normal nicht sollte :) ). Oder einfach den Wert bei einer bestimmten Addresse ändern. Man könnte ja zum Beispiel Move() benutzen, oder? Ich wollte nur mal fragen, welche Methoden gut und sicher sind.

Aber eigentlich war das eine ziemlich dumme Frage, gebe ich zu.

Reddog.

MartinA 6. Okt 2004 11:27

Re: In den Speicher schreiben
 
Zitat:

Zitat von Reddog
War eher so generell gefragt.

Zum Beispiel, will ich mein Programm im Speicher verändern (was man natürlich normal nicht sollte :) ). Oder einfach den Wert bei einer bestimmten Addresse ändern. Man könnte ja zum Beispiel Move() benutzen, oder? Ich wollte nur mal fragen, welche Methoden gut und sicher sind.

Aber eigentlich war das eine ziemlich dumme Frage, gebe ich zu.

Reddog.

So dumm find ich die Frage garnicht. :)
In einigen meiner Programme benötige ich diese Funktionalität auch und arbeite dann meist mit folgenden Procdeduren:

Code:
procedure WriteByte(Addr: DWord; Data: Byte); assembler
asm
  pushad
  mov bl,Data
  mov eax,Addr
  mov [eax],bl
  popad
end;

procedure WriteWord(Addr: DWord; Data: Word); assembler
asm
  pushad
  mov bx,Data
  mov eax,Addr
  mov [eax],bx
  popad
end;

procedure WriteDWord(Addr: DWord; Data: DWord); assembler
asm
  pushad
  mov ebx,Data
  mov eax,Addr
  mov [eax],ebx
  popad
end;
Gruß
Martin

Luckie 6. Okt 2004 11:35

Re: In den Speicher schreiben
 
Kapier ich nicht. Sinnvoll ändern kan nman doch sowie so nur Bytes von Daten und über die habe ich doch sowieso in meinem Programm die volle Kontrolle. :gruebel:

MartinA 6. Okt 2004 12:50

Re: In den Speicher schreiben
 
Zitat:

Zitat von Luckie
Kapier ich nicht. Sinnvoll ändern kan nman doch sowie so nur Bytes von Daten und über die habe ich doch sowieso in meinem Programm die volle Kontrolle. :gruebel:

Ich gebe Dir vollkommen recht, wenn man von dem Standpunkt ausgeht, das es sich um Variablen handelt die man Programatisch verändern kann.

z.B
Code:
 A := 10;
A soll nun 11 werden.
 A := 11;
Ist allemal sinnvoller als
 WriteByte($woauchimmer,$B);
Wenn ich jedoch dynamisch den Code erweitern ohne jeweils alles neu zu Compilieren bzw. neu Auszuliefern hat man kaum eine andere Möglichkeit.

Pseudocode:
Code:
 dbgMakeJump(hxInMSGProcBase, DWord(@InMsgProc) + 2, 0);
 dbgMakeJump(DWord(@InMsgProc), hxInMSGProcBase-5, 0);
   :
   :
procedure dbgMakeJump(hxZielAddr, hxJumpAddr, NOPS: DWord);
Var
 Buffer : Array[1..5] of Byte;
 Data   : DWord;
 X      : Byte;
begin
  Data:= hxZielAddr - (hxJumpAddr + 5);
  Move(Data, Buffer[2], 4);
  Buffer[1]:= $E9;
  WriteSecureBuffer(hxJumpAddr, @Buffer, 5);
  For X:= 1 to NOPS do WriteSecureByte(hxJumpAddr + 4 + X, $90);
end;
Vorstehendender Code befindet sich in einer Debug-DLL die nur geladen wird wenn Sie da ist. Ist dem So wird eine bestimmte Routine der Exe auf eine Funktion der DLL umgebogen. Im Prinzip kommt das einen "Funktionshook" recht nahe.
Eine andere Einsatzmöglichkeit währe es auch z.B. einen Durchlaufszähler auf ähnliche Weise zu verändern. Nochmal deutlich hervorheben, will ich, daß die Änderungen aus der DLL kommen und im Hauptprogramm vorgenommen werden. Die Änderung im Hauptprogramm selbst auf diese weise ist, wie bereits richtig festgestellt wurde, relativ sinnlos.

Gruß
Martin

Reddog 7. Okt 2004 14:59

Re: In den Speicher schreiben
 
@MartinA: Danke für die Antwort und die Funktionen. Ich probier's mal aus. Ich wollte ja ursprünglich auch einen Funktionshook machen(zu keinm höheren Zweck, nur aus Neugier). Dazu fand ich auch Beispiele. Aber die bezogen sich auf function-hooks für andere Anwendungen, und haben mit WriteProcessMemory gearbeitet. Da ich aber einen für mein eigenes Programm machen wollte, habe ich mir eben die Frage gestellt, mit was schreib ich in den Speicher.

Reddog.

shmia 7. Okt 2004 15:03

Re: In den Speicher schreiben
 
Umleiten von Funktionsaufrufen
PS: jetzt passt der Link

toms 7. Okt 2004 15:04

Re: In den Speicher schreiben
 
Zitat:

Umleiten von Funktionsaufrufen

Zitat:

Fehler: 404 - Datei nicht gefunden

Die Seite, die Du aufrufen wolltest, ist auf diesem Server nicht vorhanden.
Du kannst das Forum über einen der Links im Seitenkopf ansteuern.

Reddog 9. Okt 2004 01:10

Re: In den Speicher schreiben
 
Danke für das Beispiel.

Eigentlich wollte ich Nichts bestimmtes durch's Umleiten der Fuktionen erreichen. Ich wollte nur mein Verständnis für solche Sachen etwas erweitern. :oops:

Reddog.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:59 Uhr.
Seite 1 von 2  1 2      

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