Hallo zusammen, hab da mal eine technische Frage:
Variablen die in einer proc lokal declariert & gefüllt werden, sind ja dem Hauptprogramm nach verlassen der proc nicht mehr bekannt. Wie sieht es denn mit dem Speicher aus? Werden beim verlassen der proc nur die Zeiger auf diese Variablen entfernt oder wird auch der aktuelle Inhalt dieser Variablen im Speicher gelöscht?
Wenn nicht, dann müßte ich ja diese Inhalte vor dem verlassen der procs immer mit 'clear' bereinigen, oder?
Lokale Variablen im Speicher
-
-
-
Hallo,
keine Bange, die Variablen belegen nach dem Verlassen der PROC keinen Speicherplatz mehr. Eine Ausnahme sind die Bereichsvariablen, die vor dem Verlassen der Prozedur DISPOSEd werden müssen.Gruß
Roland -
Zitat
die Variablen belegen nach dem Verlassen der PROC keinen Speicherplatz mehr.
Ok - der Speicherplatz wird nicht mehr belegt (im Sinne von: er könnte vom System/Programmen anderseitig wieder benutzt weren)
Was für mich in diesem speziellen Fall interessant ist, ob der ehemalige Inhalt dieser Variable noch als "Datenmüll" im Speicher rumdümpelt, bis er vllt. irgendwann mit anderen Daten überschrieben wird. Z.B. hatte die Variable den Wert "Gänseblümchen", nach verlassen der Proc ist der Bereich wieder freigegeben - alles klar - aber das Wort "Gänseblümchen" steht erstmal weiterhin (als ascii-Code) in diesem freigegebenen Speicherbereich, richtig? Er wird also nicht vor dem Freigeben mit Nullbytes o.ä. gefüllt? -
Der dümpelt dort evtl. weiter rum, bloß zuzuordnen ist der der Variable nicht mehr.
EVTL. heißt, insofern der Bereich weiter zugewiesen ist und nicht überschrieben wurde. -
Kann man problemlos nachweisen.
Bei deiner Frage bekomme ich etwas Bauchschmerzen - was hast du genau vor und warum fragst du das?
Eventuell bist du komplett auf dem falschen Dampfer... -
Geht sicher darum, sensible (geheime) Daten nach deren Gebrauch sofort zu löschen, oder?
-
Zitat
Geht sicher darum, sensible (geheime) Daten nach deren Gebrauch sofort zu löschen, oder?
genau! ich bastel grade an einem Programm, das meine Passwörter verwalten soll.
-
- Mittels Debugger lässt sich so was problemlos mit dem richtigen Haltepunkt unverschlüsselt aus dem Speicher lesen - egal wie du das löscht.
- Auch das hier bringt dir nichts:
Passwort$ = "". Bleibt weiterhin im Speicher, denn der Variablen wird einfach nur eine neue Adresse zugewiesen, der Wert bleibt weiterhin im Speicher. Überschreiben mit WriteProcessMemory wäre da etwas sicherer, dann bleibt aber immer noch Punkt 1.
-
Was nun technisch genau geschieht, hängt von der XProfan-Version und damit auch vom jeweils verwandten Delphi-Compiler ab.
In der aktuellen XProfan-Version werden einfache Stringvariablen verschlüsselt gespeichert. Außerdem wird beim Verlassen der Prozedur der Speicher der Variablen per API freigeben. Dabei werden allerdings nicht zwingend die einzelnen Bytes überschrieben.
Bei älteren XProfan-Versionen, die die Strings nicht verschlüsseln, hilft es, den String durch einfache Zuweisung mit einem String gleicher Länge aber mit anderem Inhalt, etwa Leerzeichen oder Null-Bytes, zu überschreiben. In dem Fall ändert sich die Adresse des Strings nicht.Gruß
Roland -
-
Zitat
Mittels Debugger lässt sich so was problemlos mit dem richtigen Haltepunkt unverschlüsselt aus dem Speicher lesen
das mit dem Debugger erledigt sich doch, wenn das Prog als .exe arbeitet, oder? Oder gibt es Debugger, mit dem man beliebige .exe-Progs debuggen kann? Und wenn ja, dann würde ich das sicherlich auf meinem Rechner merken oder löppelt so etwas auch im Hintergrund wie ein Trojaner etc.?
was macht den WriteProcessMemory genau? Könnte ich evtl. genausoviel leerzeichen oder Nullbytes in die Variable schreiben, wie die ürsprüngliche Länge des Wertes war? also:
oder
die zweite zeile hab ich mir gerade ausgedacht (noch nicht probiert)
Aber irgendwas in der Art....ZitatAuch das hier bringt dir nichts:
Passwort$ = "". Bleibt weiterhin im Speicher, denn der Variablen wird einfach nur eine neue Adresse zugewiesen,
und was genau macht:Oder ich arbeite von vornherein mit Bereichsvariablen - die könnte ich ja dann gezielt nach gebrauch mit nullbytes überschreiben & disposen...:idea::kratz:
oh, während ich schrieb haben sich einige Beiträge hinzugesellt, also ich arbeiet mit XProfan 11
-
Zitat
Oder gibt es Debugger, mit dem man beliebige .exe-Progs debuggen kann?
Ja, gibt es.
Zitat
und was genau macht:
Code:
clear pw$
Jetzt die Adresse der Variablen auf 0.
Und: Ja man kann den Wert mit genausovielen Zeichen überschreiben - genau das mach man mit WriteProcessMemory auch.
Am besten compilierst du mir mit deiner Profanversion mal meinen Code oben. Ich sage und zeige dir dann, wie sicher das ist. -
Zitat
Da müsste man mir folgenden Code mal compilieren:
nur kompilieren oder eine komplette .exe?
...und wie krieg ich das zu dir? -
Komplette EXE, hier hochladen (ist kostenlos), Downloadlink posten.
-
Das ist ja cool:D
Hier der Download:
File-Upload.net - speichertest.zipund zum entfernen (nach dem Download):
File-Upload.net - Delete -
Hier ein Bild vom Prozessspeicher der EXE:
[Blockierte Grafik: http://s4.postimage.org/1cqtsz144/speicher.jpg]
Ich hoffe, das reicht. -
Das Gänseblümchen blüht aber nicht nur da, sondern noch an drei weiteren Adressen im Speicher:
[Blockierte Grafik: http://s4.postimage.org/1csizuvdw/speicher.jpg]
Die markierte dürfte die interessanteste sein.
Um an deine Passwörter zu kommen, reicht also unter Umständen ein einfaches Suchen nach Strings im Speicher aus. Auch wenn du die eine Adresse überschreibst, heißt das nicht, dass das Passwort nicht noch woanders steht. -
Ähem .... :
Clear pw$ setzt natürlich NICHT die Adresse der Variablen auf 0, sondern ist identisch mit pw$ = ""!Gruß
Roland -
Code
Alles anzeigenPROC Test Declare Adresse$ Adresse$ = "Gänseblümchen" Print addr(Adresse$) Clear Adresse$ Print addr(Adresse$) endproc Test While 1 Waitkey wend
[Blockierte Grafik: http://s2.postimage.org/1lke852hw/speicher.jpg]
Kommt glaube ich drauf an, wie man das sieht. -
alles Klar - Danke,
ZitatAuch wenn du die eine Adresse überschreibst, heißt das nicht, dass das Passwort nicht noch woanders steht.
die Adresse ändert sich auch, wenn ich die Variable mit exakt der gleichen Anzahl Leerzeichen fülle
Ich habe den Code wie folgt geändert:Code
Alles anzeigenPROC Test Declare Adresse$, ad& Adresse$ = "Gänseblümchen" Print addr(adresse$) ' Adresse$ = " " ' Adresse$ = Space$(Len(Adresse$)) ad& = Addr(Adresse$) String ad&, 0 , Space$(Len(Adresse$)) Print addr(adresse$) endproc Test WaitKey
Ich lad das mal hoch, könntest du das dann nochmal testen?
-
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!