Programm ermittelt eigene md5 Summe



  • Hallo,

    Gibt es eine Möglichkeit das ein Programm (C++, C#, ...)
    die MD5 Summe seiner eigenen .exe ermittelt ?

    Ich möchte ein Konzept erarbeiten bei dem zur Erlaubnis das Programm zu benutzen die MD5 Summe der .exe eingegeben wird und entsprechend reagieren.

    z.B. soll ähnlicher Code verwendet werden.

    if (inputMD5 != ownMD5)
    {
    // falsche MD5
    }
    else
    {
    // richtige MD5
    }

    Die Frage ist: wie berechnet sich der MD5-Wert der .exe, so das ich ihn in der Variablen speichern kann und wie kann ich ihn mir zugänglich machen, zum Beispiel in eine Datei schreiben, damit ich ihn dann kenne ?


  • Mod

    Wo soll der Unterschied sein zu irgendeiner anderen Datei? Die md5-Summe einer beliebigen Datei kannst du doch berechnen, oder? Ansonsten liegt hier eine viel wichtigere Baustelle, um die du dich erst einmal kümmern musst.

    Die einzige Kunst an dem Vorhaben ist doch, herauszufinden, wie die Exe überhaupt heißt. Viel Spaß, das ist im allgemeinsten Fall nicht einfach. Wurde aber bestimmt schon 1000 Mal hier gefragt.

    Ich möchte ein Konzept erarbeiten bei dem zur Erlaubnis das Programm zu benutzen die MD5 Summe der .exe eingegeben wird und entsprechend reagieren.

    Ich weiß zwar nicht was das soll, aber es klingt schon jetzt nach unausgereiftem Murks. Magst du erläutern, was das soll?



  • SeppJ schrieb:

    Wo soll der Unterschied sein zu irgendeiner anderen Datei? Die md5-Summe einer beliebigen Datei kannst du doch berechnen, oder? Ansonsten liegt hier eine viel wichtigere Baustelle, um die du dich erst einmal kümmern musst.

    Die einzige Kunst an dem Vorhaben ist doch, herauszufinden, wie die Exe überhaupt heißt. Viel Spaß, das ist im allgemeinsten Fall nicht einfach. Wurde aber bestimmt schon 1000 Mal hier gefragt.

    Ne, die Kunst ist es die MD5 der kompletten exe zu kennen, wenn man diese hart in eine if-Abfrage eincodieren will. Die Checksumme der zu checkenden Daten ist ja leider in diesen enthalten 🕶 .



  • Angenommen, man hat es geschafft. Welchen Unterschied macht es zu einer anderen beliebigen Zahl?


  • Mod

    Walli schrieb:

    Ne, die Kunst ist es die MD5 der kompletten exe zu kennen, wenn man diese hart in eine if-Abfrage eincodieren will. Die Checksumme der zu checkenden Daten ist ja leider in diesen enthalten 🕶 .

    Lol, ja. Ob es da wohl irgendwo einen Fixpunkt gibt? Da könnte man ja einen ganzen wissenschaftlichen Artikel zu schreiben. Ich hatte eigentlich angenommen, die md5-Summe wird von der exe live berechnet, aber so ist das viel interessanter…



  • SeppJ schrieb:

    Lol, ja. Ob es da wohl irgendwo einen Fixpunkt gibt? Da könnte man ja einen ganzen wissenschaftlichen Artikel zu schreiben.

    Papers kenne ich dazu keine, aber eine Implementation:
    http://www.ioccc.org/2004/omoikane.c, .hint, .info



  • SeppJ schrieb:

    Walli schrieb:

    Ne, die Kunst ist es die MD5 der kompletten exe zu kennen, wenn man diese hart in eine if-Abfrage eincodieren will. Die Checksumme der zu checkenden Daten ist ja leider in diesen enthalten 🕶 .

    Lol, ja. Ob es da wohl irgendwo einen Fixpunkt gibt? Da könnte man ja einen ganzen wissenschaftlichen Artikel zu schreiben. Ich hatte eigentlich angenommen, die md5-Summe wird von der exe live berechnet, aber so ist das viel interessanter…

    Richtig interessant wie so security garbage zustande kommt... 😃 😉

    @MiBreuer
    Nein jetzt mal im ernst? Deine Problem liegt eher an fehlendem Verständnis für die Materie.



  • MiBreuer schrieb:

    Die Frage ist: wie berechnet sich der MD5-Wert der .exe

    Die Wertermittlung ist trivial. Ich weiß aber nicht, wie man mit Sicherheit die eigene exe identifiziert.

    MiBreuer schrieb:

    so das ich ihn in der Variablen speichern kann

    Das ist, wie Sepp schon erklärt hat, praktisch unmöglich, wenn die Variable innerhalb des Inputs der md5-Funktion liegt.

    MiBreuer schrieb:

    wie kann ich ihn mir zugänglich machen, zum Beispiel in eine Datei schreiben, damit ich ihn dann kenne ?

    Geht schon eher in die richtige Richtung. Denn statt Hashen musst Du digital signieren. Diese Signatur ist ein asymmetrisch verschlüsselter Hash. Mit dem öffentlichen Schlüssel, der in Deiner exe steht, kannst Du dann die Signatur prüfen. Die Signatur muss natürlich außerhalb des Teils liegen, über den die Signatur gebildet wird. Aber dafür gibt's Möglichkeiten.

    Ciao, Allesquatsch



  • Theoretisch ist es trivial, man nimmt irgendeine Zufallszahl, z.b. 0x12345678. Dann schreibt man in den Code:

    if( hashVonEigenerDatei() == 0x12345678 )
    {
        Blubb();
    }
    

    Nach dem Kompilieren haengt man solange zufaellige Zeichen an die exe, bis sie den Hash 0x12345678 hat. Anstatt nur anzuhaengen kann man auch irgendwelche Stellen in der exe zufaellig modifizieren inkl. der Stelle wo die Konstante 0x12345678 steht.



  • [quote="Allesquatsch"]

    MiBreuer schrieb:

    MiBreuer schrieb:

    so das ich ihn in der Variablen speichern kann

    Das ist, wie Sepp schon erklärt hat, praktisch unmöglich, wenn die Variable innerhalb des Inputs der md5-Funktion liegt.

    Das geht schon, es geht ja um die .exe und nicht um die Kopie die ausgeführt wird.



  • TGGC schrieb:

    Nach dem Kompilieren haengt man solange zufaellige Zeichen an die exe, bis sie den Hash 0x12345678 hat.

    Stimmt, das ist eine wirklich sehr "theoretische" Lösung.

    In der Praxis hat man nach durchschnittlich 18.446.744.073.709.551.616 Versuchen dann eine passende Kombination gefunden 🙂

    Ciao, Allesquatsch



  • ScottZhang schrieb:

    Allesquatsch schrieb:

    MiBreuer schrieb:

    so das ich ihn in der Variablen speichern kann

    Das ist, wie Sepp schon erklärt hat, praktisch unmöglich, wenn die Variable innerhalb des Inputs der md5-Funktion liegt.

    Das geht schon, es geht ja um die .exe und nicht um die Kopie die ausgeführt wird.

    Das mit dem Executable als Input war unstrittig.

    Aber das Problem liegt darin - und so hat es Sepp richtig erkannt - dass ja ein im Executable integrierter Hashwert Bestandteil des Inputs sein müsste. Und zumindest bei kryptographischen Hashes (andere würden auch keine Manipulationssicherheit erzeugen) ist das ein k.o.-Kriterium.

    Nimmt man den Hashwert allerdings aus dem Executable heraus (z.B. indem man ihn in den Dateinamen integriert), dann wäre er nicht abgesichert. Jemand der den Programmcode patcht, kann auch den Hashwert patchen.

    Deshalb meine Empfehlung mit eine einfachen digitalen Signatur. Die kann ohne den privaten Schlüssel geprüft werden, gilt aber nur für den konkreten Hashwert des Executable. Eine Erstellung für ein modifiziertes Executable ist ohne privaten Schlüssel nicht möglich.

    Dann hat man die Sicherheit des asymmetrischen Schlüssels und des Hashverfahrens und muss nur dafür sorgen, dass die Abfrage gut im Programmcode verborgen ist.

    Ciao, Allesquatsch


  • Mod

    Allesquatsch schrieb:

    Dann hat man die Sicherheit des asymmetrischen Schlüssels und des Hashverfahrens und muss nur dafür sorgen, dass die Abfrage gut im Programmcode verborgen ist.

    Dieses "nur" ist aber ganz schön schwierig. Praktisch jeder Kopierschutz wird trotz viel Arbeit beim Verstecken in der Regel in Tagen oder noch schneller geknackt.



  • Allesquatsch schrieb:

    Deshalb meine Empfehlung mit eine einfachen digitalen Signatur. Die kann ohne den privaten Schlüssel geprüft werden, gilt aber nur für den konkreten Hashwert des Executable. Eine Erstellung für ein modifiziertes Executable ist ohne privaten Schlüssel nicht möglich.

    Den öffentlichen Schlüssel, den das Programm zum Prüfen der Signatur verwendet, kann man genauso einfach patchen wie einen hartkodierten Hashwert. Effektiv macht das also keinen nennenswerten Unterschied, würde ich sagen.



  • Christoph schrieb:

    Allesquatsch schrieb:

    Deshalb meine Empfehlung mit eine einfachen digitalen Signatur. Die kann ohne den privaten Schlüssel geprüft werden, gilt aber nur für den konkreten Hashwert des Executable. Eine Erstellung für ein modifiziertes Executable ist ohne privaten Schlüssel nicht möglich.

    Den öffentlichen Schlüssel, den das Programm zum Prüfen der Signatur verwendet, kann man genauso einfach patchen wie einen hartkodierten Hashwert. Effektiv macht das also keinen nennenswerten Unterschied, würde ich sagen.

    Klappt nicht, denn der private öffentliche (korrigiert) Schlüssel ist Bestandteil des Executable und damit der signierten Nachricht.

    Allerdings sind war dann bei dem Hauptangriffspunkt, dass die Prüfroutine gut versteckt sein muss. Wenn ich schon die Stelle mit dem privaten öffentlichen Schlüssel gleich finde, dann kann ich die ganze Prüfroutine substituieren.

    Ciao, Allesquatsch



  • Ok, um das mal zu spezifizieren: wir möchten ein Programm, dass seinen eigenen MD5-Hashwert hardkodiert enthält. Wir können nicht wissen, wie das restliche Programm im Ergebnis aussehen wird, also muss dieser nachträglich eingefügt werden.
    Wir brauchen also einen hypothetischen Algorithmus, in eine Datei an eine bestimmte Stelle den MD5-Hash zu schreiben, den die resultierende Datei haben wird. Nehmen wir an, es gäbe einen solchen Algorithmus (der in absehbarer Zeit fertig ist). Dann wäre dieses Verfahren vollkommen nutzlos, weil dann jeder, der das Programm modifiziert, so auch einfach den Hash aktualisieren kann. Und das Finden des Hashes im Programm ist trivial, denn dieser ist ja bekannt.



  • Allesquatsch schrieb:

    Klappt nicht, denn der private Schlüssel ist Bestandteil des Executable und damit der signierten Nachricht.

    Wenn der private Schlüssel Teil der Executable ist, dann kann man doch selber einfach eine passende Signatur erzeugen? Ich dachte der Witz daran war gerade, dass der private Schlüssel geheim gehalten und nur der öffentliche Schlüssel mitgeliefert wird.



  • Christoph schrieb:

    Allesquatsch schrieb:

    Klappt nicht, denn der private Schlüssel ist Bestandteil des Executable und damit der signierten Nachricht.

    Wenn der private Schlüssel Teil der Executable ist, dann kann man doch selber einfach eine passende Signatur erzeugen? Ich dachte der Witz daran war gerade, dass der private Schlüssel geheim gehalten und nur der öffentliche Schlüssel mitgeliefert wird.

    Danke für den Hinweis. War ein Typo, den ich korrigiert habe. Zum Prüfen braucht man natürlich den öffentlichen Schlüssel, der deshalb auch bevorzugt Teil der signierten Nachricht ist.

    Ciao, Allesquatsch



  • Allesquatsch schrieb:

    Zum Prüfen braucht man natürlich den öffentlichen Schlüssel, der deshalb auch bevorzugt Teil der signierten Nachricht ist.

    OK. Dann patche ich den öffentlichen Schlüssel und die Signatur. Wenn ich meinen eigenen öffentlichen Schlüssel reinpatche, kann ich auch eine passende Signatur anlegen. Das ist nicht wirklich schwieriger als einen einzelnen hartkodierten Hashwert zu patchen, würde ich sagen.



  • Christoph schrieb:

    Dann patche ich den öffentlichen Schlüssel und die Signatur. Wenn ich meinen eigenen öffentlichen Schlüssel reinpatche, kann ich auch eine passende Signatur anlegen. Das ist nicht wirklich schwieriger als einen einzelnen hartkodierten Hashwert zu patchen, würde ich sagen.

    Wie ich schon geschrieben habe, ist die Prüfroutine selbst - völlig unabhängig vom angewandten Verfahren - ein Angriffsvektor. Das Verfahren selbst ist aber deutlich stabiler und robuster, weil beispielsweise der md5-Hash nicht im Code auftauchen muss.

    Ciao, Allesquatsch


Anmelden zum Antworten