Was passiert mit Strings bei FreeStructure() ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Was passiert mit Strings bei FreeStructure() ?

Beitrag von Bisonte »

Und noch eine Frage.

Code: Alles auswählen

Structure s_mystructure
  id.i
  text.s
  value.i
EndStructure

*Mem.s_mystructure = AllocateStructure(s_mystructure)

*Mem\id = 1
*Mem\value = 2831
*Mem\text = "Hallo"

FreeStructure(*Mem)
Was passiert mit dem String in der Struktur ? Meines Wissens wird ja eigentlich nur ein Zeiger auf diesen String in der "Struktur" abgelegt.
Würde also heissen, er würde noch irgendwo im RAM des Computers herumfliegen. Sehe ich das richtig ?

Und wenn dem so ist, wie kriegt man den dann weg ? Weil ich stell mir das gerade wie eine Sicherheitslücke vor, wenn die Strings noch im
Speicher sind (Monitoring) ....
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Was passiert mit Strings bei FreeStructure() ?

Beitrag von Josh »

Bei FreeStructure() gibt es einen Verweis auf ClearStructure()
Help hat geschrieben:ClearStructure gibt den Speicher eines strukturierten Speicherbereichs frei. Dies ist nützlich, wenn die Struktur Strings, Arrays, Listen oder Maps beinhaltet, welche intern von PureBasic allokiert wurden. 'Struktur' ist der Name der Struktur, welche zum Ausführen des Löschens verwendet werden soll. Alle Felder werden auf Null gesetzt. Es gibt keine interne Überprüfung, um sicherzustellen, dass die Struktur zum Speicherbereich passt. Diese Funktion ist nur für fortgeschrittene Anwender und sollte mit Bedacht verwendet werden.
Wenn du den String wirklich aus dem Speicher haben willst, dann müsstest du den Speicherbereich vorher mit Blanks überschreiben.
Zuletzt geändert von Josh am 10.09.2017 16:36, insgesamt 1-mal geändert.
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Was passiert mit Strings bei FreeStructure() ?

Beitrag von Bisonte »

Das hab ich glatt überlesen. Danke.
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Was passiert mit Strings bei FreeStructure() ?

Beitrag von mk-soft »

Wird nicht überschrieben, aber freigegeben...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Was passiert mit Strings bei FreeStructure() ?

Beitrag von GPI »

Der String wird freigeben. Problem ist allerdings, nicht überschrieben und ein Pointer auf diesen String bleibt gültig. Anfangs erhält man sogar noch den String, bis irgendwann das System den Speicher wieder verwendet und irgendwas drin landet. Und dann wirds kritisch.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Was passiert mit Strings bei FreeStructure() ?

Beitrag von Bisonte »

Das war meine Befürchtung.

Also sollte man vor dem Freigeben den String mit der gleichen Länge mit irgendwas befüllen.
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Was passiert mit Strings bei FreeStructure() ?

Beitrag von Josh »

Das Problem hast doch nicht nur in Strukturen, das hast du bei jedem einzelnen String. Wenn es so wichtige Daten sind, dann halt immer mit Leerzeichen drüber schreiben.
Bisonte hat geschrieben:Also sollte man vor dem Freigeben den String mit der gleichen Länge mit irgendwas befüllen.
Den String mit gleicher Länge zu befüllen ist unsicher, soweit ich weiß, allociert Pb bei jeder Änderung eines Strings einen neuen Speicher. Mit PokeS() ist das auf jeden Fall sicherer.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Was passiert mit Strings bei FreeStructure() ?

Beitrag von mk-soft »

In Deiner Structure ist es doch ein ganz normaler String.
Wenn du die Structure frei gibst, darf du auch nicht mehr darauf zugreifen. Ist doch normal.
Warum solltest du auf den String als Pointer zugreifen?

Mit FreeStructure wird auch der String in der Structure freigeben. Somit kommt es auch nicht zu einen Speicherleck.
Also alles Gut.

Oder hast du Angst das jemand im Arbeitsspeicher Dein Programm hackt :mrgreen:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Was passiert mit Strings bei FreeStructure() ?

Beitrag von Bisonte »

mk-soft hat geschrieben:In Deiner Structure ist es doch ein ganz normaler String.
Wenn du die Structure frei gibst, darf du auch nicht mehr darauf zugreifen. Ist doch normal.
Warum solltest du auf den String als Pointer zugreifen?

Mit FreeStructure wird auch der String in der Structure freigeben. Somit kommt es auch nicht zu einen Speicherleck.
Also alles Gut.

Oder hast du Angst das jemand im Arbeitsspeicher Dein Programm hackt :mrgreen:
Nein, das nicht. Es geht mir eigentlich darum, dass WENN sensible Daten in einem String stecken, das man diese dann auch aus dem Speicher
wirklich entfernt, oder halt unlesbar macht. Das kein Speicherleck entsteht ist mir klar.

Z.b. nimm ein Datenbank Programm. Du hast ein verschlüsseltes Passwort. Dieses musst du entschlüsseln, damit du auf die Datenbank zugreifen kannst. Nach dem "Login" Vorgang würde aber bei einem "nichtfreigeben" das unverschlüsselte Passwort noch im Speicher stehen.

Und daher wollt ich nun wissen, ob bei FreeStructure() oder auch FreeMemory() mit einem String passiert.

Fazit : Der String ist noch unverändert im Speicher. Ergo : Unlesbar machen wenn sensible Daten. (natürlich VOR dem freigeben ;) )

Im Grunde das gleiche Prinzip wie bei Festplatten. Das File ist solange "rettbar", solange es nicht überschrieben wurde.
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Was passiert mit Strings bei FreeStructure() ?

Beitrag von GPI »

Bisonte hat geschrieben:Nein, das nicht. Es geht mir eigentlich darum, dass WENN sensible Daten in einem String stecken, das man diese dann auch aus dem Speicher
wirklich entfernt, oder halt unlesbar macht.
dann liest man es aus, wenn das Programm das noch nutzt...

Ich denke darüber brauchst du nicht so große Gedanken machen. Wenn der Rechner verseucht ist, dann wird eh alles ausgehebelt. Und das entschlüsselte Passwort - es müsste von einen anderen Programm gezielt angefordert werden (was nicht geht) und dann ausgewertet. Es müsste immer wieder Speicher anfordern und zwar eigentlich alles etc. durchsuchen und freigeben und so weiter. Das würde auffallen.

Aber wenn du sicher gehen willst, ruf ein "ClearStructure" vorher auf. Dann ists weg.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Antworten