Unmögliche Aufgabe?

Für allgemeine Fragen zur Programmierung mit PureBasic.
¯\_(ツ)_/¯
Beiträge: 141
Registriert: 18.08.2017 09:35

Unmögliche Aufgabe?

Beitrag von ¯\_(ツ)_/¯ »

Man kann MD5 Prüfsumme einer Exe erstellen. Das ist kein Problem. Und man kann die Prüfsumme in die Exe packen.
Auch kein Problem. Aber ist es möglich die selbe Prüfsumme in die Exe einzubunden die mit der neuen Prüfsumme
nach dem einbinden übereinstimmt? Problem ist sobald man die Exe verändert indem man die Prüfsumme einbindet
dann ändert sich die Prüfsumme der neuen Exe. Kann man MD5 Prüfsumme vorhersagen? Ich möchte in der Exe die
eigene MD5 Prüfsumme der selben Exe haben damit die Exe die Prüfsummme aus der eigenen Exe liest und mit
FileFingerprint(ProgramFilename(),#PB_Cipher_MD5) vergleicht ob die Exe von einem anderen Programm modifiziert
wurde. Das klingt unlösbar oder :?:
Bild
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Re: Unmögliche Aufgabe?

Beitrag von Fluid Byte »

Du führst den Sinn einer MD5-Prüfsumme ad absurdum.
Windows 10 Pro, 64-Bit / Outtakes | Derek
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Unmögliche Aufgabe?

Beitrag von ccode_new »

@¯\_(ツ)_/¯

Dein Text liest sich verwirrend.

Hierbei stimme ich dem fließenden Byte zu.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Dadido3
Beiträge: 103
Registriert: 24.02.2007 22:15
Kontaktdaten:

Re: Unmögliche Aufgabe?

Beitrag von Dadido3 »

Es ist nicht unmöglich, nur schwierig.

Das prinzip bei Bitcoin ist ziemlich ähnlich, nur dass die Prüfsumme dabei nicht im Block, welcher gehasht wird, vorhanden ist. Außerdem wird bei bitcoin nach einem Hash gesucht, welcher mit einer bestimmten Anzahl von 0 Bits beginnt. Es macht aber keinen Unterschied, ob man nach einer Kette von 0 Bits, oder einer Kette von bestimmten Bits sucht.

Auf das Problem hier bezogen, auch wenn der Hash-Algorithmus nicht MD5, sondern SHA256 ist, könnte man es folgendermaßen vergleichen:
  • Anzahl von zu suchenden Bits des MD5-Hashes: 128 (Es muss ja der komplette Hash gefunden werden, welcher vorher festgelegt und in die exe-Datei geschrieben wurde)
  • Aktuelle Hashrate von Bitcoin: 25.295.477.650 GH/s
  • Aktuelle Difficulty von Bitcoin: 3290605988754 (Umgerechnet muss also der Hash des Blockes mit ca. 73 Null-Bits beginnen)
  • Durchschnittszeit zwischen gefundenen Bitcoin-Blöcken: 10 Minuten
Jetzt die Annahme man habe ein Gerät, welches mit gleicher Geschwindigkeit alle Möglichkeiten durchsucht:

Die Zeit wird proportional mit dem Suchraum größer, und da sich dieser mit jedem weiteren Bit verdoppelt wird die benötigte Zeit um den Faktor 2^(128-73) größer. Also 3,6*10^17 Minuten. (685 milliarden Jahre)
Also selbst mit der gigantischen Rechenleistung von Bitcoin ist das recht aussichtslos. Auch wenn man noch berücksichtigt, dass bei Bitcoin zwei mal mit SHA256 gehasht wird, und dass MD5 viel schneller zu Hashen wäre, wird man nicht wahrscheinlich nicht zu einer nutzbaren Rechendauer kommen.

Eine Sache wäre da aber noch: MD5 gilt nicht mehr als sicher, eventuell kann man gezielt Kollisionen oder andere Lücken ausnutzen, um schneller zu einem Ergebnis zu kommen.

Ich hoffe ich habe mich nirgends vertan.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Unmögliche Aufgabe?

Beitrag von NicTheQuick »

Einfach die MD5-Summe an das Ende der Datei packen und beim Berechnen nicht miteinbeziehen. Anders geht es nicht. Im Übrigen nutzt man hier eher SHA256 und nicht das veraltete MD5.
Bild
¯\_(ツ)_/¯
Beiträge: 141
Registriert: 18.08.2017 09:35

Re: Unmögliche Aufgabe?

Beitrag von ¯\_(ツ)_/¯ »

Tut mir wirklich sehr leid, dass ich mich ungenau ausgedrückt habe. Sorry :( Ich versuche es so zu erklären...
NicTheQuick hat geschrieben:Einfach die MD5-Summe an das Ende der Datei packen
Wenn ich das mache, dann ist die MD5-Summe veraltet bzw. stimmt nicht mit der MD5-Summe überein wenn ich die
geänderte Exe erneut auf MD5 prüfe. Ich meine so:
MD5.s = FileFingerprint("meineExe.exe",#PB_Cipher_MD5)
MD5.s -> Exe einbinden
MD5_2.s = FileFingerprint("meineExe.exe",#PB_Cipher_MD5)
Ergo: MD5_2.s ist anders als MD5.s. Ich will aber dass MD5 Summe gleichbleibt damit meine Exe feststellen kann ob
meine Exe geändert wurde.
Bild
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: Unmögliche Aufgabe?

Beitrag von Lord »

Beherzige doch einfach mal den Ratschlag, welcher Dir hier gegeben wurde:
http://www.purebasic.fr/german/viewtopi ... 16&t=30681
Bild
Derren
Beiträge: 557
Registriert: 23.07.2011 02:08

Re: Unmögliche Aufgabe?

Beitrag von Derren »

¯\_(ツ)_/¯ hat geschrieben:
NicTheQuick hat geschrieben:Einfach die MD5-Summe an das Ende der Datei packen
Wenn ich das mache, dann ist die MD5-Summe veraltet
Nein.

Du hast ne Exe mit einer Funktion, die sich selber liest, dabei aber die letzten x Byte ignoriert (x = Länge der Prüfsumme), aus den gelesenen Daten die Prüfsumme generiert und mit den letzten x Byte der Datei vergleicht.
Zum Verteilen der Exe brauchst du ein zweites Programm, welches die komplette Exe einliest, die Prüfsumme bildet und dann die Prüfsumme an's Ende schreibt.
Signatur und so
¯\_(ツ)_/¯
Beiträge: 141
Registriert: 18.08.2017 09:35

Re: Unmögliche Aufgabe?

Beitrag von ¯\_(ツ)_/¯ »

Danke Derren, dann darf ich nicht FileFingerprint benutzen sondern StringFingerprint oder so so das nicht die
komplette Datei gechecktsummt wird sondern bis zum Ende wo der Platzhalter der Checksumme ist. Okay dann gings
damit. Aber mit FileFingerprint scheint also unmöglich zu sein. Ich werde es so machen wie du es gesagt hast
Danke! Nur der einzige Nachteil ist dass es trotzdem unsicher ist weil der Cracker könnte den Inhalt meiner Exe
verändern und die CHecksumme am Ende nur anpassen und so glaubt mein Programm es sei nichts verändert worden.
Deshalb hätte ich gerne FileFingerprint nur kann ich keine CHecksumme vorhersagen damit es auch nach der Exe-
Änderung stimmt.
Bild
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: Unmögliche Aufgabe?

Beitrag von Lord »

Wenn's denn unbedingt so sein soll:

Code: Alles auswählen

Ergebnis$ = FileFingerprint(Dateiname$, Plugin [, Bits [, Offset [, Länge]]])
Länge ist hier Dein Freund.
Bild
Antworten