Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   (C++) Zeiger ein Sicherheitsrisiko? (https://www.delphipraxis.net/29516-c-zeiger-ein-sicherheitsrisiko.html)

Dannyboy 10. Sep 2004 09:21


(C++) Zeiger ein Sicherheitsrisiko?
 
Hallo Freunde der sicheren Speicherverwaltung,
einer meiner überheblichen Tutoren war doch tatsächlich der Ansicht, dass es KEINE Möglichkeit gibt, von außerhalb einer Klasse (C++) auf deren private Attribute zuzugreifen. Da musste ich natürlich dagegen wetten um ihn eines besseren zu belehren. Der Mann ist ohnehin einer der arroganteren Sorte (kurz: Klugscheißer), meine Lektion war einfach nötig, um ihn am Boden der Tatsachen zu halten. Ging um nix Großes, nur um eine Pizza, die ich gleich in vollen Zügen genießen werde, da er wohl oder übel einsehen musste, dass ich diese Wette gewonnen habe. Ich werd’ jetzt meine Pizza genießen gehen und wünsche Euch viel Spass mit meinem erdrückenden Argument, das mich diese Wette gewinnen lies. Also, hier mein Quelltext, der einen externen Zugriff auf ein privates Attribut ermöglicht:
Check this out.
DANYBOY
Code:
#include <iostream.h>
#include <string.h>
/* Hinweis: Folgende Klasse enthält KEINE publike (explizite)
            Möglichkeit um das Passwort lesen zu können! Es
            kann lediglich geschrieben werden!
*/
  class AnyClass {
  private:
// privates Passwort
    char password[50];
  public:
// öffentliche Methode, um privates Passwort zu setzen
    void setPassword(char*);
  };

  void AnyClass::setPassword(char *p) {
    strcpy(password, p);
  };

  int main(void) {
// Objekt instanziieren
    AnyClass secret;
// Passwort setzen
    secret.setPassword("If you're seeing this text, YOU'VE ALREADY LOST OUR BET!");
// Char-Zeiger auf Anfang von Objekt im Speicher (explizieter Typecast).
    char *PChar = (char*)&secret;
// Char-Zeiger ausgeben
    cout<<"Cracked Password --> "<<PChar;
// Warten auf Keypress
    cin.get(); cin.get();
// result auf Null setzen
    return 0;
  };
 (C) Dannyboy 2004
PS: Seit lieb zu Euren Tutoren. :mrgreen:

Tubos 10. Sep 2004 09:24

Re: (C++) Zeiger ein Sicherheitsrisiko?
 
Na und?
Nur weil die Variable privat ist heißt das nicht dass sie völlig geschützt ist :zwinker:

Aber danke für den Code!

Chewie 10. Sep 2004 09:46

Re: (C++) Zeiger ein Sicherheitsrisiko?
 
Gleiches geht natürlich auch mit Delphi-Klassen ;)

Habs grad eben mal ausprobiert:

Delphi-Quellcode:
  TMyString = String[50];

  TMyClass = class(TObject)
  private
    MyText: TMyString;
  public
    procedure SetText(s: TMyString);
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  o: TMyClass;
  s: PChar;
begin
  o := TMyClass.Create;
  o.SetText('Wer das sieht, weiß alles' + #0);
  s := Pointer(Integer(o) + 4 + 1); //VMT-Zeiger + Längenbyte
  ShowMessage(s);
  o.Free;
end;

{ TMyClass }

procedure TMyClass.SetText(s: TMyString);
begin
  MyText := s;
end;

Wathlon 10. Sep 2004 10:00

Re: (C++) Zeiger ein Sicherheitsrisiko?
 
Ich weiß nicht ob das grundsätzlich so ist, aber bei Delphi 5 und 7 kann ich immer auf alle privaten Variablen innerhalb einer Unit von allen Klassen dieser Unit aus zugreifen.

Weiß nicht, ob das gewollt oder ein Bug ist.

Gruß Walter

Dannyboy 10. Sep 2004 10:00

Re: (C++) Zeiger ein Sicherheitsrisiko?
 
Geht wohl in fast allen OOP-Sprachen außer in Java. Und selbst dort müssten sich die geschützten Elemente aus dem RAM auslesen lassen. Das zeigt uns, dass wir private Elemente vielleicht verschlüsseln sollten, je nach dem, wie entscheident Performance ist.

Chewie 10. Sep 2004 10:02

Re: (C++) Zeiger ein Sicherheitsrisiko?
 
Zitat:

Zitat von Wathlon
Ich weiß nicht ob das grundsätzlich so ist, aber bei Delphi 5 und 7 kann ich immer auf alle privaten Variablen innerhalb einer Unit von allen Klassen dieser Unit aus zugreifen.

Weiß nicht, ob das gewollt oder ein Bug ist.

Gruß Walter

Das ist gewollt. Bei C++ gibts dafür das "Friends"-Konzept, bei ObjectPascal sind alle Klassen eines Moduls, sprich Unit, "Freunde".

Wathlon 10. Sep 2004 10:03

Re: (C++) Zeiger ein Sicherheitsrisiko?
 
Das Friends-Konzept von C++ kenne ich, stimmt.

Gruß Walter

Dannyboy 10. Sep 2004 10:08

Re: (C++) Zeiger ein Sicherheitsrisiko?
 
Zitat:

Zitat von Wathlon
Ich weiß nicht ob das grundsätzlich so ist, aber bei Delphi 5 und 7 kann ich immer auf alle privaten Variablen innerhalb einer Unit von allen Klassen dieser Unit aus zugreifen.

Weiß nicht, ob das gewollt oder ein Bug ist.

Gruß Walter

Ja, das ist mir gerade vor einer Woche erschreckenderweise aufgefallen, ist aber laut Delphi-Hilfe
gewollt. Deshalb packe ich immer nur eine Klasse in eine Unit und muss dann die Elemente, die ich vererben möchte, tatsächlilch als <protected> deklarieren.

Dannyboy 10. Sep 2004 10:12

Re: (C++) Zeiger ein Sicherheitsrisiko?
 
Zitat:

Zitat von Chewie
Zitat:

Zitat von Wathlon
Ich weiß nicht ob das grundsätzlich so ist, aber bei Delphi 5 und 7 kann ich immer auf alle privaten Variablen innerhalb einer Unit von allen Klassen dieser Unit aus zugreifen.

Weiß nicht, ob das gewollt oder ein Bug ist.

Gruß Walter

Das ist gewollt. Bei C++ gibts dafür das "Friends"-Konzept, bei ObjectPascal sind alle Klassen eines Moduls, sprich Unit, "Freunde".

Ich habe in meinem Beispiel keine Friends verwendet. Übrigens funktioniert mein Quelltext auch
in unterschiedlichen Units. Es dürfte also in beiden Fällen ungewollt sein. Macht aber nix, denn wer kommt schon auf eine so kranke Idee und setzt einen Zeiger auf das Offset eines Objektes und liest von dort an den Speicher aus? :mrgreen:

Dannyboy 10. Sep 2004 10:15

Re: (C++) Zeiger ein Sicherheitsrisiko?
 
Ciao, ich geh' jetzt meine gesponsorte Pizza essen. :mrgreen: :mrgreen: :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz