Breaking Information Hiding: otze hat mich herausgefordert...



  • Zweig von
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-251787-and-start-is-24.html

    class base{ 
        virtual void foo(){} 
        virtual void bar(){} 
    }; 
    
    class test1:public base 
    { 
        int a; 
    };
    

    Das ist einfach:

    class test1_breaker : public base
    {
     public:
       int a;  
    };
    ...
    ((test1_breaker*)&test1_instance)->a = 23
    
    class test2 
    { 
        static int a; 
    }
    

    keine Ahnung

    class test3 
    { 
        class Private; 
        Private* a; 
    };
    

    Müsste wie 1. gehen:

    class test3_breaker
    {
    public:
     class Private
     {
       public:
         /* hier dummy-implementierung von Private, so dass die Adressen passen */
     }
     Private * a;
    }
    

    so, könnt ihr mir weiterhelfen? Kann man irgendwie die adresse der statischen variablen raten? Weiter komme ich nicht. (ja otze, du darfst auch 😉 )

    Dass das ganze undefined behaviour ist, ist klar.



  • 3. bräuchte nicht mal so kompliziert zu sein - die Private Klassendeklaration ist egal, du brauchst lediglich eine im Layout identische Klasse zu haben:

    class test3
    {
        class Private;
        Private* a;
    }; 
    
    struct smells_like_test3_private;
    
    struct test3_breaker
    {
      smells_like_test3_private* a;
    };
    

    an den static member kommst du aber beim besten Willen nicht ran, wenn du nicht gerade das Glück hast, dass irgendjemand mit Berechtigung einen pointer auf test2::a hält - in dem Fall kannst du mit den gleichen Trickdieb-Methoden auch dort die Informationen rausklauen.


Anmelden zum Antworten