Seite 1 von 1

MD5Fingerprint ergibt auf unterschiedlichen Systemen falsche

Verfasst: 10.10.2009 19:57
von sharkpeter
Hallo zusammen,

das ist das passendste Topic was ich hierzu gefunden habe, darum der Post hier an dieser Stelle.

Ich erstelle aus einem String einen MD5 Fingerprint, zum Beispiel aus "warum_nicht". Ich würde
jetzt erwarten, das unabhängig vom Betriebssystem die gleiche Rückgabe erfolgt. Bei XP und
Vista ist es auch so, zu Windows7 habe ich gerade noch eine Anfrage laufen die aber noch nicht
bestätigt ist.

Was aber sicher ist, unter z.B. WinME kommt ein anderer Code zurück. (Bitte, nicht gleich gähnen,
ja das OS ist alt, es haben aber doch noch einige ...)

Was auch sicher ist, es ist Wurst ob es sich dabei um eine virtuelle oder reale Maschine handelt.

Mich würde interessieren:

- was unter Win98 oder und 98SE herauskommt.
- ob das überhaupt sein darf, ich meine nämlich nicht, es sollte überall gleich sein.

Hier ein lauffähiges Testprogramm, zur "Sicherheit" noch einmal mit einem
älteren PB getestet, darum auch CreateGadgetList(wid), das einfach auskommentieren

Habe eben einmal in den "Analen" von PB gekramt und das Ganze mit 3.94
kompilieren lassen, siehe da: "Ei der Daus, da kommt das Rechte raus ..."

Das sollte vielleicht ins Bug-Forum, da ist was seit mindestens 4.00 verschleppt worden.

Gruß Jens

Code: Alles auswählen

If OpenWindow(  0,  0,  0,280,120,"Passwort - Fingerprint",#PB_Window_ScreenCentered|#PB_Window_SystemMenu) And CreateGadgetList(WindowID(0))
          TextGadget  (#PB_Any, 10, 10,130, 14,"Geben Sie ein Passwort ein:")
  strg0.l=StringGadget(#PB_Any,150,  8,120, 20,"")
          TextGadget  (#PB_Any, 10, 40,100, 14,"Rückgabestring MD5")
  strg1.l=StringGadget(#PB_Any, 10, 60,260, 20,"",#PB_String_ReadOnly)
  bt0.l  =ButtonGadget(#PB_Any, 10, 90,260, 24,"Ausführen")
  Quit.l=#False
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Quit=#True
      Case #PB_Event_Gadget
        Select EventGadget()
          Case bt0
            size.l=Len(GetGadgetText(strg0))
            If size
              *MemoryID = AllocateMemory(size); Länge des Strings
              If *MemoryID
                PokeS(*MemoryID, GetGadgetText(strg0))
                MD5$ = MD5Fingerprint(*MemoryID, MemorySize(*MemoryID))
                SetGadgetText(strg1,MD5$)
                FreeMemory(*MemoryID)
              EndIf
            EndIf
        EndSelect
    EndSelect
  Until Quit
EndIf
End

;<warum_nicht> ergibt bei WinME       : 45e928e853b3fa819ef7e72bd8260928

;<warum_nicht> ergibt bei XP und Vista: 953119d7f44682afb9a153db93ddbb4b

Re: MD5Fingerprint ergibt auf unterschiedlichen Systemen falsche

Verfasst: 10.10.2009 20:28
von STARGÅTE
unabhängig vom Thema, erzeugt du uner umständen ein IMA weil du nur ein Speicher erzeugst der die Länge vom String entspricht, unter UNICODE hätte der String dann aber doppelt so viele Bytes...
außerdem schreibt PokeS() noch eine NULL mit in den Speicher, die bei dir dann außerhalb des reservierten Speichers landet!

nimm also einerseits StringByteLength() statt Len() und mach den Speicher um SizeOf(Character) größer...
oder nehm gleich eine Variable und dann:

Code: Alles auswählen

String$ = GetGadgetText(strg0)
MD5$ = MD5Fingerprint(@String$, StringByteLength(String$))
Vllt löst das ja auch schon das Problem

Re: MD5Fingerprint ergibt auf unterschiedlichen Systemen falsche

Verfasst: 10.10.2009 21:46
von sharkpeter
@stargate,

danke, das hilft.

Aber richtig ist es trotzdem nicht.

Gruß Jens

Re: MD5Fingerprint ergibt auf unterschiedlichen Systemen falsche

Verfasst: 10.10.2009 23:03
von freak
AllocateMemory() rundet auf älteren Windows Versionen gerne mal etwas auf und gibt mehr Speicher zurück als man wollte. Wenn du dann MemorySize() verwendest dann berechnest du den MD5 Fingerprint von einem größeren Buffer als sonst. Nimm einfach die Länge des Strings und nicht MemorySize() dann klappt das auch.

Übrigens forderst du immernoch 1 byte zu wenig an für den String, weil PokeS() auch noch das abschließende Null-Byte schreibt.

Re: MD5Fingerprint ergibt auf unterschiedlichen Systemen falsche

Verfasst: 11.10.2009 07:37
von sharkpeter
@freak,

vielen Dank für die ausführliche Begründung :) Das erklärt den Fehler.

@André sollte das entsprechend in der Hilfe vermerken, denn der obige
Code basiert auf dem Beispiel aus der Hilfe.

Wie von @stargate erwartet, funktioniert es auf den besagten Systemen so richtig:

Code: Alles auswählen

If OpenWindow(  0,  0,  0,280,120,"Passwort - Fingerprint",#PB_Window_ScreenCentered|#PB_Window_SystemMenu))
          TextGadget  (#PB_Any, 10, 10,130, 14,"Geben Sie ein Passwort ein:")
  strg0.l=StringGadget(#PB_Any,150,  8,120, 20,"")
          TextGadget  (#PB_Any, 10, 40,100, 14,"Rückgabestring MD5")
  strg1.l=StringGadget(#PB_Any, 10, 60,260, 20,"",#PB_String_ReadOnly)
  bt0.l  =ButtonGadget(#PB_Any, 10, 90,260, 24,"Ausführen")
  Quit.l=#False
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Quit=#True
      Case #PB_Event_Gadget
        Select EventGadget()
          Case bt0
            size.l=Len(GetGadgetText(strg0))
            If size
              *MemoryID = AllocateMemory(size); Länge des Strings
              If *MemoryID
                String$ = GetGadgetText(strg0)
                MD5$ = MD5Fingerprint(@String$, StringByteLength(String$))
                SetGadgetText(strg1,MD5$)
                FreeMemory(*MemoryID)
              EndIf
            EndIf
        EndSelect
    EndSelect
  Until Quit
EndIf
End

Re: MD5Fingerprint ergibt auf unterschiedlichen Systemen falsche

Verfasst: 11.10.2009 12:13
von Falko
Das mit dem PokeS hätte ich in den Zusammenhang auch nicht gedacht, das man dadurch Probleme mit Len in Memory
erhält. Vor allem das es bei den NT's korrekt läuft und unter Win9x anders ist. Wenn man es aber sagt, das ist so, dann soll es wohl so sein. Man lernt nie aus 8)

Ich hatte zuvor auch für Jens das ausprobiert und nachdem hier eine Lösung gepostet wurde, das so angepasst.

Code: Alles auswählen

;Test this on Win9x and another OS Win2k and greather  
;
Code.s="MyCodeWord"
;size.l=Len(Code)
;*MemoryID = AllocateMemory(size)
;PokeS(*MemoryID,Code,33,-1)
;Debug MD5Fingerprint(*MemoryID, MemorySize(*MemoryID))
Debug MD5Fingerprint(@Code, StringByteLength(Code))

;Vorher mit auskommentierten Code probiert, was aber nicht unter OS-NT funktioniert!
;Virtual Windows 95       = eb43f2b9930d79d9f32d05dd8b034a72
;Virtual Windows 98       = eb43f2b9930d79d9f32d05dd8b034a72
;Virtual Windows Me       = eb43f2b9930d79d9f32d05dd8b034a72
;Virtual Windows NT       = 3fbcaefc1b93fbc153bc6a90ca85af08
;Virtual Windows 2000 Pro.= 3fbcaefc1b93fbc153bc6a90ca85af08
;Vista UltimateX64        = 3fbcaefc1b93fbc153bc6a90ca85af08
;Virtual Windows7 Ultimate= 3fbcaefc1b93fbc153bc6a90ca85af08



;Mit Stargate's Änderung wegen unverständlichen IMA (invalid memory access). 
;Virtual Windows 95       = 3fbcaefc1b93fbc153bc6a90ca85af08
;Virtual Windows 98       = 3fbcaefc1b93fbc153bc6a90ca85af08
;Virtual Windows Me       = 3fbcaefc1b93fbc153bc6a90ca85af08
;Virtual WinNT4 SP6       = 3fbcaefc1b93fbc153bc6a90ca85af08
;Virtual Windows 2000 Pro.= 3fbcaefc1b93fbc153bc6a90ca85af08 
;VistaUltimate X64        = 3fbcaefc1b93fbc153bc6a90ca85af08
;Virtual Windows7 Ultimate= 3fbcaefc1b93fbc153bc6a90ca85af08

Sorry, wegen dem "unverständlichen IMA". Sollte der Debugger das in PB das nicht auch anzeigen?

Gruß Falko

Re: MD5Fingerprint ergibt auf unterschiedlichen Systemen falsche

Verfasst: 11.10.2009 13:09
von sharkpeter
Und mich würde in dem Zusammenhang durchaus interessieren, darum der Kommentar
"aber richtig ist es trotzdem nicht": Aus welchem kühlen Grund geht es bis 3.94 richtig,
dann aber plötzlich nicht mehr. Diese Tatsache relativiert die Aussage, das "ältere
Windows Versionen gerne mal etwas aufrunden" nämlich ganz gewaltig.

Gruß Jens

Re: MD5Fingerprint ergibt auf unterschiedlichen Systemen falsche

Verfasst: 11.10.2009 13:27
von freak
sharkpeter hat geschrieben:Aus welchem kühlen Grund geht es bis 3.94 richtig,
dann aber plötzlich nicht mehr. Diese Tatsache relativiert die Aussage, das "ältere
Windows Versionen gerne mal etwas aufrunden" nämlich ganz gewaltig.
3.94 kennt den Befehl MemorySize() gar nicht, ich glaube also kaum das du den dort verwendet hast.

> Sorry, wegen dem "unverständlichen IMA". Sollte der Debugger das in PB das nicht auch anzeigen?

Wenn man 1 byte über einen Speicherbereich rausschreibt (hier das 0-Byte von PokeS) dann kommt es gerne mal zu Fehlern bei denen auch der Debugger nichts mehr machen kann: http://www.purebasic.fr/blog/?p=55

Re: MD5Fingerprint ergibt auf unterschiedlichen Systemen falsche

Verfasst: 11.10.2009 13:58
von sharkpeter
@freak, richtig, dort habe ich die Länge direkt angegeben und den String auch.
Ohne das drum herum. Ich wollte einfach nur verstehen, was da schief läuft.

Also passiert offenbar bei MemorySize etwas unerwartetes. In der Regel
liegt die Länge eines Strings für eine derartige Passwortabfrage ja fest
und ist nicht variabel, unabhängig davon ob bei PokeS noch ein Leerbyte
geschrieben wird oder nicht. Somit ist es nur eine Frage des Handlings.

Nichts desto Trotz sollte die entsprechende Korrektur bitte bei André
landen, denn es ist zu erwarten, das irgendwann wieder jemand darüber
fällt, wenn er das Beispiel aus der Hilfe benutzt.

Gruß Jens

Re: MD5Fingerprint ergibt auf unterschiedlichen Systemen falsche

Verfasst: 13.10.2009 20:57
von Andre
Habe Thema auf die englische ToDo-Liste gesetzt, da ich mir für eine "selbst-kreierte" korrekte Beschreibung doch nicht sicher bin...