VisualBasic CreateObject erstellt kein Objekt / FritzBox SessionID MD5 Hash

7H0M45

Lt. Commander
Registriert
Jan. 2010
Beiträge
1.165
Hallo zusammen,

ich versuche mich per VBA in meine FritzBox einzuloggen um die Daten über die Heizungsthermostate, ... zu erhalten.
Zum Einloggen wird eine SessionID benötigt, welche über einen speziellen MD5 Hash erzeugt wird. Das ganze ist hier beschrieben:
https://avm.de/fileadmin/user_uploa...ttstellen/AVM_Technical_Note_-_Session_ID.pdf

Ich muss gestehen, dass ich Anhand der Erklärung nicht genau kapiert habe, was und wie das gemacht wird, ich habe aber den entsprechenden Code auch hier im Forum gefunden und für mich abgeleitet:
https://www.computerbase.de/forum/t...ng-der-sessionid-immer-lauter-nullen.1849375/

Im Kern geht es um diesen Code:
Code:
Public Function mfGetFritzBoxMD5Hash_UTF16LE(Zeichenfolge As String) As String
  'Das hier gibt keinen standard MD5 Hash zurück
  'https://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/AVM_Technical_Note_-_Session_ID.pdf
  'Der MD5-Hash wird über die Bytefolge der UTF-16LE-Codierung dieses
  'Strings gebildet (ohne BOM und ohne abschließende 0-Bytes).
  'Aus Kompatibilitätsgründen muss für jedes Zeichen, dessen Unicode Codepoint > 255 ist, die
  'Codierung des "."-Zeichens benutzt werden (0x2e 0x00 in UTF-16LE). Dies betrifft also alle
  'Zeichen, die nicht in ISO-8859-1 dargestellt werden können, z. B. das Euro-Zeichen.
  'Abschließend ein Beispiel mit deutschem Umlaut:
  'Die Challenge
  ' <challenge> = "1234567z"
  'kombiniert mit dem Kennwort
  ' <klartextpassword> = "äbc"
  'ergibt den Wert
  ' <response> = "1234567z-9e224a41eeefa284df7bb0f26c2913e2"

  'Vor der MD5 Codierung muss immer von UTF8(?) nach UTF16LE gewandelt werden.
   

  On Error Resume Next
  Dim MD5Hasher As Object
  Dim TextToHash() As Byte
  Dim bytes() As Byte
  Dim pos As Long
  Dim outstr As String
  Dim oT As Object

  Set oT = CreateObject("System.Text.UnicodeEncoding")
  Set MD5Hasher = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")

  TextToHash = oT.GetBytes_4(Zeichenfolge)
  bytes = MD5Hasher.computeHash_2(TextToHash)

  outstr = ""
  For pos = 1 To UBound(bytes) + 1
      outstr = outstr & LCase(Right("0" & Hex(AscB(MidB(bytes, pos, 1))), 2))
  Next pos

  mfGetFritzBoxMD5Hash_UTF16LE = outstr
End Function


Das ganze Funktioniert mit Excel auf meinem Desktoprechner sehr gut.

Jetzt kommt das Problem: Auf meinem Tablet funktioniert der exakt gleiche Code nicht.

Ich habe das Problem auch schon eingegrenzt.
Code:
  Set oT = CreateObject("System.Text.UnicodeEncoding")
  Set MD5Hasher = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")

Hier wird beides mal kein Objekt erzeugt. Die beiden Objekte sind danach = Nothing
Selbst per Early-Binding, wenn ich den Verweis auf die mscorlib.dll setze, funktioniert es auf dem Tablet nicht.

Kann mir jemand sagen warum das so ist?

Gibt es eine alternative Lösung welche diese Objekte nicht nutzt?
Ich kann den MD5 Hash aus Strings erzeugen, was hier aber nicht funktioniert, da noch irgendwelche 0 Bytes eingefügt und davon dann die Hex Werte verwendet werden. Die Hex-Werte bekomme ich hin. Wenn ich diese dann hier unter Binary-Hash einfüge bekomme ich auch den korrekten Hash zurück.
http://www.fileformat.info/tool/hash.htm?hex=7400
Nur wie kann ich in VBA den Hash aus den Bytes erzeugen?

Ich hoffe ich habe mein Problem einigermaßen verständlich beschrieben und Danke euch schonmal jetzt für eure Hilfe!

Gruß
Thomas
 
  • Gefällt mir
Reaktionen: Hayda Ministral
Ich vermute mal, dass auf deinem Tablet eine abgespeckte
Version von Windows bzw. des .Net-Frameworks installiert ist, in der
diese Objekte einfach fehlen. Vielleicht kannst du da was nachinstallieren.
 
Hab ich versucht. Hab das .Net Framework heruntergeladen. Die Installationsdatei sagt nur das die neuste Version bereits installiert ist. Ich hab auch Testweise mal VisualStudio installiert, es funktioniert trotzdem nicht.
 
Welches Windows ist denn auf deinem Tablet installiert? Das normale Windows 10 x86/x64 oder Windows RT/Arm?

Welches Net Framework wolltest du installieren? 4.8?
 
Windows 10 Pro, Version 1903 32-Bit Betriebssystem. Es sollte .Net 4.8 drauf sein, also das aktuelle.
 
Kannst du mal folgendes in der Powershell Konsole auf deinem PC und Tablet testen? Es sollte das selbe wie bei deinem Code rumkommen. Musst dann "test" durch was anderes ersetzen. Damit will ich herausfinden ob es an VBA oder an .NET liegt.

PowerShell:
function Get-MD5UnicodeHexString {
  param ([String] $value)
  $bytes = [System.Text.Encoding]::Unicode.GetBytes($value);
  $algorithm = New-Object System.Security.Cryptography.MD5CryptoServiceProvider;
  $hash = $algorithm.ComputeHash($bytes);

  [System.BitConverter]::ToString($hash).Replace("-", "");
};

Get-MD5UnicodeHexString("test");

EDIT: Mit "test" sollte C8059E2EC7419F590E79D7F1B774BFE6 als Hash rauskommen.
 
Es kommt bei beiden der korrekte Hash raus
 
Dann ist das Framework wohl in Ordnung. Evtl. läuft dein VBA mit einer alten .NET Version. In .NET kann man die Version des genutzten Frameworks mit Environment.Version herausfinden. Leider hab ich keine Ahnung wie man dieses in VBA aufruft. Evtl. kannst du es ja mal versuchen.

Die Klassen sollten aber schon in .NET Framework 1.1 vorhanden sein, dementsprechend sollte das nicht der Fehler sein.

Kannst du mal eine Beispiel Excel-Datei anhängen wo der Code für den Hash schon drin ist?

Welche Version von Excel nutzt du auf dem Desktop und dem Tablet? Ist es die gleiche?

Ansonsten sieht dein Code sehr ähnlich zu dem Code aus https://en.m.wikibooks.org/wiki/Visual_Basic_for_Applications/String_Hashing_in_VBA Könntest du den mal probieren und sicherstellen, dass du die Referenz auf mscorlib.dll 4.0 64 bit richtig gesetzt hast.

Mehr fällt mir gerade nicht ein woran es liegen könnte.
 
Der Code Funktioniert auf meinem Rechner, auf meinem Tablet dagegen nicht. In der Zeile wo das Objekt erzeugt werden soll kommt jetzt der Laufzeitfehler -2146232576 "Automatisierungsfehler"

In der Beschreibung ist mir aufgefallen, dass dort eine Referenz auf mscorlib 4.0 64-bit gesetzt werden soll. Ich hab aber so wie es aussieht nur ein 32-bit Windows installiert. Könnte es daran liegen?

Ok. Was ich im Bezug auf den Eingangspost übersehen habe, ist die On-Error-Anweisung. Ich hab die Anweisung jetzt entfernt und es wird auch mit dem alten Code ein Fehler erzeugt.
 
Die ersten schnellen Tests heute früh sehen gut aus. Ich werd es die Tage mal in meinem finalen Programm testen.
 
  • Gefällt mir
Reaktionen: marcOcram
Also, ich hab das ganze jetzt getestet. Der Hinweis von @Ocram1992 war genau richtig. Ich weiß zwar immer noch nicht warum, aber das umstellen auf .Net 3.5 hat geholfen.

Vielen Dank an alle die sich mit meinem Problem beschäftigt haben.
 
  • Gefällt mir
Reaktionen: marcOcram
Zurück
Oben