![]() |
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. |
Re: In den Speicher schreiben
Was willst du denn wohin schreiben, und um was zu bewirken?
|
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. |
Re: In den Speicher schreiben
Zitat:
In einigen meiner Programme benötige ich diese Funktionalität auch und arbeite dann meist mit folgenden Procdeduren:
Code:
Gruß
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; Martin |
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:
|
Re: In den Speicher schreiben
Zitat:
z.B
Code:
Wenn ich jedoch dynamisch den Code erweitern ohne jeweils alles neu zu Compilieren bzw. neu Auszuliefern hat man kaum eine andere Möglichkeit.
A := 10;
A soll nun 11 werden. A := 11; Ist allemal sinnvoller als WriteByte($woauchimmer,$B); Pseudocode:
Code:
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.
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; 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 |
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. |
Re: In den Speicher schreiben
|
Re: In den Speicher schreiben
Zitat:
Zitat:
|
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. |
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