[Problem]Zugriff auf Anrufliste per .NET-Anwendung

tosh

Neuer User
Mitglied seit
23 Feb 2005
Beiträge
53
Punkte für Reaktionen
0
Punkte
0
Hallo,
ich versuche derzeit, eine Anwendung ähnlich InfoFram, jedoch für ASP.NET zu erstellen. Die Fritzbox möchte ich nicht modifizieren, da ich Kabel Deutschland-Kunde bin und Ärger befürchte. Die Anwendung läuft bereits sehr gut, wenn ich aus dem lokalen Netz auf die Fritzbox (bei abeschaltetem Zugriffsschutz) zugreife. Ich hole mir die SID und verwende diese dann bei jedem Zugriff. Schwierigkeiten bekomme ich schon bei der Verwendung des Kennwortschutzes und dem Zugriff aus dem internen Netz.
Ich glaube, dass ich den MD5-Hash der Challenge richtig ermittle, der Code stammt (glaube ich) hier aus dem Forum, für die Beispieldaten von AVM passt es jedenfalls:

Code:
Public Function MD5HashFB(ByVal outStr As String) As String
        Dim data() As Byte = System.Text.Encoding.Unicode.GetBytes(outStr)
        Dim md5 As New System.Security.Cryptography.MD5CryptoServiceProvider()
        outStr = Nothing
        Dim tempStr As String = Nothing
        Dim result As Byte() = md5.ComputeHash(data)
        For i As Byte = 0 To 15
            tempStr = LCase(Hex(result(i)))
            outStr = outStr & tempStr
        Next i
        Return outStr
    End Function
Den ermittelten Response-Wert übergebe ich dann an die Box:

Code:
GetUrlResponse("?login:command/response=" & r & "&getpage=../html/de/menus/menu2.html", sid, "", "", true)
GetURLResponse sieht so aus:

Code:
  Public Shared Function GetUrlResponse(ByVal urltail As String, ByRef sid As String, ByVal username As String, ByVal password As String, ByVal r As Boolean) As String
       
        Dim HttpRequest As WebRequest
        If r = False Then
            HttpRequest = WebRequest.Create(My.Settings.FBBaseURL & "?sid=" & sid & urltail)
        Else
            HttpRequest = WebRequest.Create(My.Settings.FBBaseURL)
            HttpRequest.ContentType = "application/x-www-form-urlencoded"
            HttpRequest.Method = "POST"
            HttpRequest.ContentLength = urltail.Length
            Dim stOut As New StreamWriter(HttpRequest.GetRequestStream(), System.Text.Encoding.ASCII)
            stOut.Write(urltail)
            stOut.Close()
        End If
        Dim IoStream As Stream = HttpRequest.GetResponse.GetResponseStream()
        Dim StrRead As New System.IO.StreamReader(IoStream)
        Dim Str As String = StrRead.ReadToEnd
        IoStream.Dispose()
        StrRead.Close()
        Return Str
    End Function
Es haut alle soweit hin, solange ich das response-Verfahren nicht benötige. Wenn ich dieses benötige, bekomme ich mit obiger Funktion einen Timeout. Die Ermittlung des Response-Wertes ist meines Erachtens richtig. Wo könnte der Fehler sonst noch hocken? Ich bin für jede Anregung dankbar.

Gruß Thorsten
 
Zuletzt bearbeitet:
Hallo,

ich antworte dir mal hier. Support per PM ist nicht so toll.
Ich hab deine Funktion MD5HashFB angeschaut. Sie arbeitet nicht für alle Challenge zuverlässig.
Hier das Ergbnis:
Code:
Challenge: 6824511e
MD5 Hash (getMd5Hash): 7ef982e2f8078fd5227987715d9ccba9
MD5 Hash2 (MD5HashFB): 7ef982e2f878fd5227987715d9ccba9

Frag mich nicht was da schief läuft. Es betrifft nicht alle Kombinationen, da ja "1234567z-äbc" funktioniert. In meinem Projekt wird der MD5-Hash nach der Anleitung von Microsoft erstellt: http://msdn.microsoft.com/de-de/library/system.security.cryptography.md5.aspx. Allerdings mit einer kleinen Anpassung bezüglich der Zeichen deren Unicode Codepoint > 255 ist. Somit ergibt sich die Funktion "getMd5Hash"
Code:
    Function getMd5Hash(ByVal input As String) As String
        ' Anpassung bezüglich der Zeichen deren Unicode Codepoint > 255. 
        ' Diese werden durch "." ersetzt
        Dim ZeichenArray() As Char
        Dim j As Integer
        ZeichenArray = input.ToCharArray
        For j = LBound(ZeichenArray) To UBound(ZeichenArray)
            If Strings.AscW(ZeichenArray(j)) > 255 Then ZeichenArray(j) = CChar(".")
        Next

        ' Create a new instance of the MD5 object.
        Dim md5Hasher As MD5 = MD5.Create()

        ' Convert the input string to a byte array and compute the hash.
        Dim data As Byte() = md5Hasher.ComputeHash(Encoding.Unicode.GetBytes(input))

        ' Create a new Stringbuilder to collect the bytes
        ' and create a string.
        Dim sBuilder As New StringBuilder()

        ' Loop through each byte of the hashed data 
        ' and format each one as a hexadecimal string.
        Dim i As Integer
        For i = 0 To data.Length - 1
            sBuilder.Append(data(i).ToString("x2"))
        Next i

        ' Return the hexadecimal string.
        Return sBuilder.ToString()

    End Function
Als nächstes machst ich einen HTTP-Post, ähnlich wie du.
Code:
MD5 = Crypt.getMd5Hash(Challenge & "-" & FBPassWort)
Response = Challenge & "-" & MD5
formdata = "getpage=../html/de/menus/menu2.html&login:command/response=" & Response
Rückgabe = HTTPTrans.Write("http://" & IPadresse & "/cgi-bin/webcm", formdata
HTTPTrans.Write:
Code:
    Public Function Write(ByVal Link As String, Optional ByVal data As String = "") As String
        Dim uri As New Uri(Link)
        Try
            If (uri.Scheme = uri.UriSchemeHttp) Then
                Dim request As HttpWebRequest = CType(HttpWebRequest.Create(uri), HttpWebRequest)
                request.Method = WebRequestMethods.Http.Post
                request.Timeout = 5000
                request.ContentLength = data.Length
                request.ContentType = "application/x-www-form-urlencoded"
                request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
                request.UserAgent = "Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; Media Center PC 5.0; .NET CLR 3.5.21022; .NET CLR 1.1.4322)"

                Dim wStream As IO.Stream = request.GetRequestStream
                Dim writer As New IO.StreamWriter(wStream)
                writer.Write(data)
                writer.Close()

                Dim response As HttpWebResponse
                response = CType(request.GetResponse, HttpWebResponse)
                Dim reader As New IO.StreamReader(response.GetResponseStream(), System.Text.Encoding.Default)
                Dim tmp As String = reader.ReadToEnd()
                reader.Close()
                response.Close()
                Return tmp
            End If

        Catch e As Exception
            Throw New Exception("Error in HTTP Transfer: " & e.Message & vbCrLf _
            & "Stack Trace: " & e.StackTrace)
            MsgBox("Es is ein Fehler aufgetreten: " & Err.Description, vbCritical)
        End Try

        Return String.Empty

    End Function

Das war es eigentlich schon. Aus der Rückgabe entnehm ich dann die SID.
Noch Fragen?

Gruß Gert

P.S.

Ich empfehle dir abschließend noch ein Logout:
Code:
    Public Function FBLogout(ByVal SID As String) As Boolean
        ' Die Komplementärfunktion zu FBLogin. Beendet die Session, indem ein Logout durchgeführt wird.
        HTTPTrans.Write("http://" & "fritz.box" & "/cgi-bin/webcm", "getpage=../html/de/menus/menu2.html&security:command/logout=" & SID)
        Return True
    End Function
 
Danke

Vielen Dank,
der Hash war schuld. Ich hatte den Thread hier im Forum so interpretiert, dass die Funktion als "validiert" angesehen werden könnte. So kann man sich täuschen...
Gruß Thorsten
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.