Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Speicher eines strings freigeben (https://www.delphipraxis.net/125874-speicher-eines-strings-freigeben.html)

WorstNightmare 13. Dez 2008 22:49


Speicher eines strings freigeben
 
Hallo,

ich speichere sensible Informationen in einem string, welche dann verschlüsselt werden. Den Ursprungs-string möchte ich gerne aus dem Speicher entfernen, ihn einfach '' zu setzen funktioniert leider nicht.
Wenn ich z.B. eine globale Variable s: string habe und das mache:
Delphi-Quellcode:
  s := DateToStr(Now);
Dann sehe ich das Datum in einem Memory Browser natürlich im Speicher. Wie erreiche ich, dass der Inhalt aus dem Speicher verschwindet? Geht das überhaupt, oder muss ich den Speicher dann vorher auch mit einer speziellen Methode anfordern?

Apollonius 13. Dez 2008 22:55

Re: Speicher eines strings freigeben
 
Du kannst zum Beispiel Folgendes tun:
Delphi-Quellcode:
for i:=1 to Length(Str) do
  Str[i] := 'x';
Durch die For-Schleife wird jedes einzelne Zeichen im Speicher überschrieben, sodass es nicht mehr rekonstruiert werden kann.

WorstNightmare 13. Dez 2008 23:05

Re: Speicher eines strings freigeben
 
Stimmt, so ist es weg.
Gibt es noch einen "ordentlicheren" Weg, wo der Speicher auch komplett freigegeben wird, sodass er wieder anders genutzt werden kann?

SirThornberry 13. Dez 2008 23:09

Re: Speicher eines strings freigeben
 
nein nicht bei Strings da deren Speicher den Speichermanger verwendet und dieser sich um die Freigabe kümmert. Und selbst wenn der Speicher frei gegeben wurde kann dieser noch im Ram stehen oder im swap file.
Im übrigen ist sowas verschwendete Zeit. Wer die Daten will liest sie aus dem Binary aus bzw. geht im Debugger alles Schritt für Schritt durch.

Apollonius 13. Dez 2008 23:11

Re: Speicher eines strings freigeben
 
Der Speicher wird freigegeben, wenn dem String ein neuer Wert zugewiesen wird oder er aus dem Scope läuft (die enthaltende Klasse freigegeben wird, die Prozedur beendet wird, in der der String als lokale Variable deklariert wurde, oder selbiges mit dem enthaltenden Record passiert). Wenn du explizit den Speicher freigeben willst, genügt es, einen Leerstring zuzuweisen.

SirThornberry 13. Dez 2008 23:25

Re: Speicher eines strings freigeben
 
Ob der Speicher wirklich freigegeben wird bestimmt der Speichermanager. Wenn man einen Leerstring zuweist heißt das noch lange nicht das der Speichermanager auch den Speicher frei gibt.

Namenloser 13. Dez 2008 23:30

Re: Speicher eines strings freigeben
 
Zitat:

Zitat von Apollonius
Du kannst zum Beispiel Folgendes tun:
Delphi-Quellcode:
for i:=1 to Length(Str) do
  Str[i] := 'x';
Durch die For-Schleife wird jedes einzelne Zeichen im Speicher überschrieben, sodass es nicht mehr rekonstruiert werden kann.

Wenn schon, dann bitte mit Delphi-Referenz durchsuchenFillChar :wink:

himitsu 13. Dez 2008 23:45

Re: Speicher eines strings freigeben
 
Aber wie schon erwähnt wurde ... aus dem virtuellen Speicher der Anwendung bekommt man es leicht raus (infach überschreiben),
aber was den physischen Speicher, die Auslagerungs und Co. angeht, da gibt es keine zuverlässige Möglichkeit, da man selber nicht wirklich Einfluß drauf hat, wo etwas gespeichert wird.
Windows verschiebt den Speicher ja wie es will hin und her und ob dann noch irgendwo 'ne alte Kopie existiert ...

PS:
wie befüllst du den den String?
womöglich ibt es ja auch innerhalb deiner Anwendug schon Kopieen (z.B. bei längenänderung und beim zusammenführen mehrerer Strings, wird da einiges an speicher umkopiert)

Ja und dann hat SirThornberry Recht ... wenn jemand da ran will, dann ließt er sich die Daten einfach aus, bevor sie von deinem Programm gelöscht werden.

jbg 14. Dez 2008 09:46

Re: Speicher eines strings freigeben
 
Zitat:

Zitat von NamenLozer
Wenn schon, dann bitte mit Delphi-Referenz durchsuchenFillChar :wink:

Aber bitte nicht unter Delphi 2009 verwenden, außer du passt den "Size" Parameter an Unicode an.

Apollonius 14. Dez 2008 13:27

Re: Speicher eines strings freigeben
 
Zitat:

Zitat von NamenLozer
Wenn schon, dann bitte mit Delphi-Referenz durchsuchenFillChar :wink:

Ihr ewigen Nörgler. :angel: Du hast natürlich recht.

Bezüglich Sinn/Unsinn: Man sollte durchaus Passwörter o.Ä. überschreiben, die der Nutzer eingegeben hat. Windows bietet sogar extra die Funktion MSDN-Library durchsuchenSecureZeroMemory für solche Zwecke. Als Erklärung wird Folgendes genannt:
Zitat:

The password would remain on the application stack where it could be captured in a crash dump or probed by a malicious application.
Auch wenn es hier um den Heap und nicht um den Stack geht, ist die Überlegung übertragbar. Es geht ja explizit nicht darum, Daten vor dem Anwender zu schützen, der einen Debugger verwenden kann, sondern vor anderen Anwendungen.

himitsu 14. Dez 2008 13:33

Re: Speicher eines strings freigeben
 
Delphi-Quellcode:
ZeroMemory(PChar(Str), Length(Str) * SizeOf(Char));
SecureZeroMemory hat unter Delphi keine Auswirkung. (dort hat es genau die selbe Funktion wie ZeroMemory)

In C ist es so, daß z.B. ZeroMemory weggelassen wird, wenn der zu überschriebende Speicherbereich (also die Variable) danach nicht mehr verwendet wird.
Delphi hat eine derartige Anpassung nicht.
(ZeroMemory ist in C eine Inline-Funktion, oder genauer gesagt ein Makro, weswegen der Compiler derartige Optimierungen vornehmen kann)

Apollonius 14. Dez 2008 13:41

Re: Speicher eines strings freigeben
 
Mir ist bekannt, dass SecureZeroMemory nur existiert, weil ZeroMemory in C wegoptimiert werden kann. Mir ging es nur darum, zu zeigen, dass auch Microsoft es als sinnvoll erachtet, sensible Daten im Speicher zu überschreiben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 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 by Thomas Breitkreuz