Lokale Variablen im Speicher

  • 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?

    Gruß Jörg


    Ideen gibt es viele - man muß sie nur haben...
    Win7-Pro / Linux Mint

  • 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

    (Intel Duo E8400 3,0 GHz / 4 GB RAM / 250 GB HDD / ATI Radeon HD4770 512 MB / Windows Vista - ausgemustert zum Verkauf)
    AMD Athlon II X2 2,9 GHz / 8 GB RAM / 500 + 1000 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X4


    http://www.xprofan.de

  • 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?

    Gruß Jörg


    Ideen gibt es viele - man muß sie nur haben...
    Win7-Pro / Linux Mint

  • 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...

  • 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.

    Gruß Jörg


    Ideen gibt es viele - man muß sie nur haben...
    Win7-Pro / Linux Mint

    • 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

    (Intel Duo E8400 3,0 GHz / 4 GB RAM / 250 GB HDD / ATI Radeon HD4770 512 MB / Windows Vista - ausgemustert zum Verkauf)
    AMD Athlon II X2 2,9 GHz / 8 GB RAM / 500 + 1000 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X4


    http://www.xprofan.de

  • Mit neuen Versione kann ich leider nicht testen.
    Da müsste man mir folgenden Code mal compilieren:

    Code
    PROC Test
     Declare Adresse$
     Adresse$ = "Gänseblümchen"
     Print addr(adresse$)
     Adresse$ = " "
     Print addr(adresse$)
    endproc
    Test
    WaitKey
  • 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:


    Code
    pw$ = "                  "


    oder

    Code
    String addr(pw$), 0, "0000000000000"


    die zweite zeile hab ich mir gerade ausgedacht (noch nicht probiert)
    Aber irgendwas in der Art....


    Zitat

    Auch das hier bringt dir nichts:
    Passwort$ = "". Bleibt weiterhin im Speicher, denn der Variablen wird einfach nur eine neue Adresse zugewiesen,


    und was genau macht:

    Code
    clear pw$


    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

    Gruß Jörg


    Ideen gibt es viele - man muß sie nur haben...
    Win7-Pro / Linux Mint

  • 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?

    Gruß Jörg


    Ideen gibt es viele - man muß sie nur haben...
    Win7-Pro / Linux Mint

  • 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

    (Intel Duo E8400 3,0 GHz / 4 GB RAM / 250 GB HDD / ATI Radeon HD4770 512 MB / Windows Vista - ausgemustert zum Verkauf)
    AMD Athlon II X2 2,9 GHz / 8 GB RAM / 500 + 1000 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X4


    http://www.xprofan.de

  • alles Klar - Danke,

    Zitat

    Auch 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:


    Ich lad das mal hoch, könntest du das dann nochmal testen?

    Gruß Jörg


    Ideen gibt es viele - man muß sie nur haben...
    Win7-Pro / Linux Mint

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!