Programm ermittelt eigene md5 Summe



  • 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



  • Christoph schrieb:

    Das ist nicht wirklich schwieriger als einen einzelnen hartkodierten Hashwert zu patchen, würde ich sagen.

    Wobei hier das Kernproblem ist, dass Du die Stelle mit dem Hashwert nicht in den Teil legen kannst, über den der Hashwert generiert wird.

    Ciao, Allesquatsch



  • Allesquatsch schrieb:

    Das Verfahren selbst ist aber deutlich stabiler und robuster, weil beispielsweise der md5-Hash nicht im Code auftauchen muss.

    Dafür muss aber der öffentliche Schlüssel und die Signatur im Code auftauchen, was effektiv wenig ändert.



  • Christoph schrieb:

    Allesquatsch schrieb:

    Das Verfahren selbst ist aber deutlich stabiler und robuster, weil beispielsweise der md5-Hash nicht im Code auftauchen muss.

    Dafür muss aber der öffentliche Schlüssel und die Signatur im Code auftauchen, was effektiv wenig ändert.

    Doch, denn im Gegensatz zur Ursprungsidee ist das Ganze praktisch realisierbar.

    Die Signatur steht übrigens außerhalb des Codes, sonst hättest Du das gleiche Problem wie beim md5-Hash. Natürlich lässt sich auch beim reinen Hashen der Hashwert irgendwo außerhalb anhängen. Aber im Gegensatz zum md5-Hash kann niemand eine korrekte Signatur erzeugen.

    Das Wichtigste bleibt das geeignete Verstecken der Prüfroutine. Das Verfahren an sich ist aber - im Gegensatz zur reinen md5-Idee - praktikabel und bewährt.

    100% sicher geht nie. Wenn man den kompletten Code reenginiert, kann man auch die Prüfroutine(n) finden und überbrücken. Es ist aber immer ein Abwägen zwischen dem eigenen Aufwand und dem zum Cracken notwendigen.

    Ciao, Allesquatsch



  • Allesquatsch schrieb:

    100% sicher geht nie. Wenn man den kompletten Code reenginiert, kann man auch die Prüfroutine(n) finden und überbrücken. Es ist aber immer ein Abwägen zwischen dem eigenen Aufwand und dem zum Cracken notwendigen.

    Denn Satz habe ich vermisst. 👍

    Mann könnte das ganze aber mit Anti-debugging Routinen spicken... was dann noch schwieriger ist. Aber der Feind ist nur die Zeit! Machbar ist da leider alles!



  • Allesquatsch schrieb:

    Die Signatur steht übrigens außerhalb des Codes, sonst hättest Du das gleiche Problem wie beim md5-Hash. Natürlich lässt sich auch beim reinen Hashen der Hashwert irgendwo außerhalb anhängen. Aber im Gegensatz zum md5-Hash kann niemand eine korrekte Signatur erzeugen.

    Aber natürlich kann jeder eine korrekte Signatur erzeugen: Ich ersetze einfach den Public Key durch meinen eigenen und erzeuge dann mit meinem private key eine passende Signatur.

    Bei der md5-Methode kann ich in der Executable

    1. den hartkodierten Hash patchen.

    Bei der Public-Key-Signatur-Methode kann ich in der Executable

    1. den public key und
    2. die Signatur patchen.

    Man muss also bei beiden Methoden nur ein paar hartkodierte Bytes ändern, das ist alles. Ob man diese konstanten Bytes nun "Hash" nennt oder "public key + Signatur" sind nur Worte.


Anmelden zum Antworten