Strings und hexeditor



  • Hallo,
    Habe ein kleines Problemm. In meinem .exe ist ein string deklarire z.b

    string name = "Mein name ist secret";
    

    Wenn ich dann es mit Hexeditor aufmache dann kann ich es da sehen.
    Meine frage ist: wie mache ich so das die string und char im hexeditor nicht zu sehen sind.
    Danke



  • Verschluesseln oder zur Laufzeit erzeugen



  • knivil schrieb:

    Verschluesseln oder zur Laufzeit erzeugen

    Jop.
    @TE Bedenke aber, dass man das mit einem Debugger immer noch bekommen kann. Man macht es halt nur schwieriger.



  • w81 schrieb:

    Meine frage ist: wie mache ich so das die string und char im hexeditor nicht zu sehen sind.
    Danke

    Gar nicht. Wozu auch?



  • TyRoXx schrieb:

    w81 schrieb:

    Meine frage ist: wie mache ich so das die string und char im hexeditor nicht zu sehen sind.
    Danke

    Gar nicht. Wozu auch?

    Ein nicht zu verachtender Schutz gegen Reverse Engineering.


  • Mod

    Ethon schrieb:

    Ein nicht zu verachtender Schutz gegen Reverse Engineering.

    Ich wusste gar nicht, dass meine Oma ins Reverse Engineering eingestiegen ist.



  • es gibt eine XorStr Klasse die sowas erledigen kann. Im Quellcode steht dann nur noch sowas hier:

    /*hallo*/XorStr<0x38, 6, 0x7E92C958>("\x50\x58\x56\x57\x53" + 0x7E92C958).s
    

    greetz KN4CK3R



  • es geht um eine wette. mein Freund mein er ist der beste Hacker und ich will ihm zeigen das auch von mir geschriebenes programm b.z string in in dem exe er nicht findet. er soll Passwort eingeben und das Programm zeigt dann ob es ok ist oder nicht.



  • SeppJ schrieb:

    Ethon schrieb:

    Ein nicht zu verachtender Schutz gegen Reverse Engineering.

    Ich wusste gar nicht, dass meine Oma ins Reverse Engineering eingestiegen ist.

    Deine Oma vielleicht nicht. 😉



  • w81 schrieb:

    es geht um eine wette. mein Freund mein er ist der beste Hacker und ich will ihm zeigen das auch von mir geschriebenes programm b.z string in in dem exe er nicht findet. er soll Passwort eingeben und das Programm zeigt dann ob es ok ist oder nicht.

    Und wenn du jetzt auch noch die leiseste Ahnung von C++ hättest, wäre das ganz einfach.

    Um einen "Hacker" dieses Kalibers zu überlisten wird wahrscheinlich so etwas genügen (vorausgesetzt der Compiler optimiert die Schleife nicht weg):

    static const char key = 13; //oder eine andere geeignete Zahl
    char[] secret = {'s' ^ key, 'e' ^ key, 'c' ^ key, 'r' ^ key, 'e' ^ key, 't' ^ key, '\0' ^ key};
    for (size_t i = 0; i < sizeof(secret); ++i)
    {
        secret[i] ^= key;
    }
    std::string password = secret;
    

  • Mod

    w81 schrieb:

    es geht um eine wette. mein Freund mein er ist der beste Hacker und ich will ihm zeigen das auch von mir geschriebenes programm b.z string in in dem exe er nicht findet. er soll Passwort eingeben und das Programm zeigt dann ob es ok ist oder nicht.

    Dann mach doch was fieses, wo der String erst berechnet wird. Superfies, wenn es noch von äußeren Umständen, wie dem Systemdatum abhängt. Hier mal etwas Inspiration:

    #include <iostream>
    #include <random>
    #include <string>
    #include <ctime>
    
    using namespace std;
    
    string generate_deterministic_password(unsigned length)
    {
      mt19937 rng;
      rng.seed(1234598765);
      std::uniform_int_distribution<char> alphabet_distribution('A','Z');
      string password;
      for (unsigned i =0; i < length; ++i)
        password.push_back(alphabet_distribution(rng));
      return password;  
    }
    
    string generate_password_depending_on_environment(unsigned length)
    {
      time_t rawtime;
      time(&rawtime);
      tm *ptm = gmtime(&rawtime);
      mt19937 rng;
      rng.seed(1234598765 + ptm->tm_yday);
      std::uniform_int_distribution<char> alphabet_distribution('A','Z');
      string password;
      for (unsigned i =0; i < length; ++i)
        password.push_back(alphabet_distribution(rng));
      return password;    
    }
    
    int main()
    {
      string passwort = generate_deterministic_password(8);
      cout << "Normales Passwort wäre: " << passwort << '\n';
      string fieses_passwort = generate_password_depending_on_environment(8);
      cout << "Heutiges Passwort wäre: " << fieses_passwort << '\n';  
    }
    

    Dieses sollte deterministisch das Passwort "AOTQABKJ" und heute (oder wenn das Systemdatum der 6.3.2012 ist) das fiese Passwort "YURICUQM". Da schreibst du dir nach diesem Muster einen Keygen für dich und ein Abfrageprogramm für deinen Freund.

    Für beide Passwörter muss man sich schon ziemlich anstrengen. Wenn du den Symboltable stripst, dann ist noch nicht einmal mehr verräterische Information über den Zufallsgenerator übrig und es bleibt eigentlich nur Deassemblieren oder im Debugger das Programm nach Zeichenkettenvergleichen suchen. Damit bekommt man das Programm dann aber recht leicht 😞 . Das gilt auch für die meisten anderen Obfuskationstechniken - wenn man sich gegen Debuggereinsatz wehren will, dann ist das eigentlich eher ein Vergleich der Willenskräfte zwischen Hacker und Programmierer, wer zu mehr Gehirnverknotungen bereit/fähig ist.
    Aber ich bezweifle, dass dein Freund dazu in der Lage ist, schon dieses einfache Beispielprogramm zu knacken. Denn die am lautesten tönenden Hacker sind meistens die schlechtesten. Außer du lässt Debuginformationen im Programm, dann schafft das sogar meine Oma. Da musst du aufpassen.

    P.S.: Das Programm braucht die Zufallsgeneratoren aus der C++11-Stanardbibliothek (oder auch schon C++98-TR1(?), dafür müsstest du das Programm leicht anpassen, dann können das dann selbst Compiler mit älteren Standardbibliotheken), da ich mich auf die Implementierung des Zufallsgenerators verlassen können möchte. Man könnte auch einen eigenen Zufallsgenerator nehmen (oder einfach jede andere Funktion, die irgendwie Zahlen zwischen 'A' und 'Z' erzeugt), wenn es streng C++98-konform sein soll.


Anmelden zum Antworten