Session ID + Integration in die eigenen Programme

mycroft

Neuer User
Mitglied seit
10 Okt 2006
Beiträge
28
Punkte für Reaktionen
0
Punkte
0
Hallo zusammen,
ich suche Hilfe bei der Erstellung des MD5 Hashs für das neue Login-Verfahren für die Boxen 7170+7270 mit neuer Firmware. Ich habe einen MD5 Algo (C++) in mein Programm integriert, bekomme allerdings das entsprechende Beispiel aus der Tech.Note von AVM zu diesem Thema nicht hin. Will damit sagen, ich errechne einen anderen Hash. Wenn ich die Zeichenfolge auf einem der Online Hash-Berechnungsseiten gegenprüfe, dann berechnen diese Seiten die gleichen Hash wie ich. Ergo muß AVM da etwas anderes machen. Die weiteren Technischen Infos in der Tech.Note sind mir etwas zu hoch als Hobby-Programmierer. Ich suche jetzt Kontakt zu jemand, der mit bei der richtigen Umsetzung der Hash Ermittlung helfen kann.
Vielen Dank.

mYCROFT
 
Du könntest Dich bittend an die Autoren von jFritz wenden, die für ihr Programm die Session-ID-Abfrage bewältigt haben. Zudem haben sie den Code auch dem Autor von FBEditor zur Verfügung gestellt (so konnte man lesen).
Vielleicht auch für Dich?
 
Ich hab es erst letzte Woche in einer anderen Programmiersprache programmiert. Schick mir ne Email oder nimm via ICQ Kontakt auf, das ist nicht so schwer, wenn man mal das konfuse Papier von AVM mal kapiert hat.

Happy computing!
R@iner
 
AVM hätte gleich ein Codebeispiel herausbringen sollen... das können die, die es interessiert vermutlich viel besser lesen als deren PDF.

Gregor Meyer hat das für dich schon mal in PHP gemacht... Klick
 
Vielen Dank an Euch. :)
@skyteddy: Hab Dir eine Mail geschickt, auch mit Link zu meinem Programm ;).

Danke+Grüße
Tom
 
Hallo,

Habe das mit dem MD5 selbst Festgestellt, sehr viele Seiten in Netz
und Code Beispiele die man findet berechnen den Wert Falsch, auch eine
berühmte Datenbank hat die Falschen werte dazu, im Outlook Wählhilfe Thread
habe ich ein Beispiel dazu.

Das hier benutzt auch AVM

Gruß Erwin
 
Zuletzt bearbeitet:
Hallo Erwin,

danke für den Hinweis, hab mir mal die md5 Sources von dort gezogen und schau mir das mal an. Mal sehen ob ich das hinbekomme den Hash dann richtig zu berechnen. ;)

Grüße
Tom
 
Hallo Erwin,

ich spiele gerade mit dem Source, welchen Du mir per Link geschickt hast.
Komisch finde ich nur, ich habe den Algo für die MD5 Ermittlung komplett von dort ohne Änderung übernommen und ich kann dieses Sch:mad:-Beispiel von AVM nicht nachstellen. :( Und dort sollte er ja funktionieren. Ich verstehe es einfach nicht.
Grüße
Tom
 
Gern gemachter Hauptfehler:

Es darfst nicht der md5-Hash über "1234567z-äbc" gemacht werden, sondern der String muß vorher in UTF16-LE codieren werden, also 16 bit (2 Byte), Little Endian.

D.h. im Klartext, aus den 12 Zeichen ("1234567z-äbc") werden 24 Byte.
In Hex: 31 00 32 00 33 00 34 00 35 00 36 00 37 00 7A 00 2D 00 E4 00 62 00 63 00

/edit: siehe hier

Happy computing!
R@iner
 
Zuletzt bearbeitet:
AH ! Ok, ich bau das gleich mal in meine Routine ein. Danke.
Grüße
Tom

EDIT: Mist, hab gerade gesehen in dem Beispiel aus dem Netz ist das schon drin, also der Fehler
liegt woanderes. Ich gehe mal auf die Suche. Danke Euch.
 
Zuletzt bearbeitet:
der String muß vorher in UTF16-LE codieren werden, also 16 bit (2 Byte), Little Endian.

Dazu habe ich hier: crypt.c
noch was gefunden.

Code:
112 /* CRYPT_UnicodeTOANSI
113  * wstr - unicode string
114  * str - pointer to ANSI string
115  * strsize - size of buffer pointed to by str or -1 if we have to do the allocation
116  *
117  * returns TRUE if unsuccessful, FALSE otherwise.
118  * if wstr is NULL, returns TRUE and sets str to NULL! Value of str should be checked after call
119  */
120 static inline BOOL CRYPT_UnicodeToANSI(LPCWSTR wstr, LPSTR* str, int strsize)
121 {
122         int count;
123 
124         if (!wstr)
125         {
126                 *str = NULL;
127                 return TRUE;
128         }
129         count = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
130         if (strsize == -1)
131                 *str = CRYPT_Alloc(count * sizeof(CHAR));
132         else
133                 count = min( count, strsize );
134         if (*str)
135         {
136                 WideCharToMultiByte(CP_ACP, 0, wstr, -1, *str, count, NULL, NULL);
137                 return TRUE;
138         }
139         SetLastError(ERROR_NOT_ENOUGH_MEMORY);
140         return FALSE;
141 }
142 
143 /* CRYPT_ANSITOUnicode
144  * str - ANSI string
145  * wstr - pointer to unicode string
146  * wstrsize - size of buffer pointed to by wstr or -1 if we have to do the allocation
147  */
148 static inline BOOL CRYPT_ANSIToUnicode(LPCSTR str, LPWSTR* wstr, int wstrsize)
149 {
150         unsigned int wcount;
151 
152         if (!str)
153         {
154                 *wstr = NULL;
155                 return TRUE;
156         }
157         wcount = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
158         if (wstrsize == -1)
159                 *wstr = CRYPT_Alloc(wcount * sizeof(WCHAR));
160         else
161                 wcount = min( wcount, wstrsize/sizeof(WCHAR) );
162         if (*wstr)
163         {
164                 MultiByteToWideChar(CP_ACP, 0, str, -1, *wstr, wcount);
165                 return TRUE;
166         }
167         SetLastError(ERROR_NOT_ENOUGH_MEMORY);
168         return FALSE;
169 }

:confused: :-Ö ;)
 
Danke Euch allen für Eure Hilfe.

Ich bin jetzt hoffentlich ein Stück weiter. Habe aber immer noch Frage.
Wenn ich den neuen Login-String an die Box geschickt habe, was passiert denn dann? Wie kann ich denn erkennen, dass alles funktioniert hat?

Ich schicke mit curl folgenden Login-String:
Code:
std::string login_url = "http://fritz.box/cgi-bin/webcm&getpage=../html/de/menus/menu2.html&login:command/response=" + fb_challenge + "-" + str + "&sid=0000000000000000" ;
fb_challenge enthält den Wert <Challenge> welchen ich vorher aus login_sid.xml ausgelesen habe und str den MD5-Hash.
Code:
http://fritz.box/cgi-bin/webcm?getpage=../html/login_sid.xml&sid=0000000000000000
Kann ich/Muß ich als SID den Wert 0 nehmen?

Nachdem ich den Login-String geschickt habe, bekomme ich folgendes zurück:
Code:
...
<p>Die angegebene URL wurde nicht gefunden.<p>
					<p class="mb10">Sie werden auf die Startseite der FRITZ!Box weitergeleitet.</p>
					<p>Falls Sie nicht automatisch auf die Startseite der FRITZ!Box weitergeleitet werden, klicken Sie <a href="/">hier</a>.</p>
...
Würde mal vermuten, das ist eher nicht richtig, oder?

Danke schonmal. :)
 
Zuletzt bearbeitet:
Code:
   sResponse = sChallenge + "-" + LCASE$(InMD5(sChallenge + "-" + makeDots(sPassword))) ' 25.07.2009
'
   sFormdata = "getpage=../html/de/menus/menu2.html&login:command/response=" + sResponse 
'
   sRetHTTPTransferRT = HTTPTransferRT(sMode, sLink, sFormdata)

Ist hier etwas anders, aber die sid wird bei Response nicht angehängt,
die wird hier zurückgegeben.

Code:
' Response
'sRetHTTPTransferRT = "<input type=" + Chr$(34) + "hidden" + Chr$(34) + " name=" + Chr$(34) + "sid" + Chr$(34) + " value=" + Chr$(34) + "13e41555bcc92250" + Chr$(34) + " id=" + Chr$(34) + "uiPostSid" + Chr$(34) + ">"
'

Chr$(34) = "
 
Hallo Thomas,

also, wenn Du die Challenge und den MD5 hast, dann sende ich als Postdata folgendes:
Code:
getpage=../html/de/menus/menu2.html&var%3Alang=de&var%3Amenu=home&var%3Apagename=home&login%3Acommand%2Fresponse==CCCCCCCC-MMMMMMMMMMM
CCCCCCCC = Challenge
MMMMMMMMMMM = MD5-Wert ohne führende "0x" (Anzahl der 'M's nicht abgezählt!)

Aus dem Response liest Du dann die SID aus, die zwischen <SessionInfo> und </SessionInfo> steht.

Anschließend kannste alle Aufrufe mit der SessionID machen, z.B.:
Code:
http://fritz.box/cgi-bin/webcm?getpage=../html/de/menus/menu2.html&var:pagename=home&var:menu=home&sid=33b0dbbeex97a62d
Happy computing!
R@iner
 
Hallo,

Hier mal selbst zum Testen eine Dll Datei FBSIDIO.dll
die man zum Beispiel in VBA verwenden kann oder
auch in C usw. es gibt aber keine Garantie das
es unter jedem Windows geht, sollte aber ab W2k Funktionieren.

Das einbinden geht in VBA Normalerweise so, in C ist es natürlich
anders das muss man dann Anpassen.

Code:
'
 DECLARE FUNCTION FB_Login_sid LIB "FBSIDIO.dll" ALIAS "FB_LOGIN_SID" (sHost AS STRING, sPassword AS STRING, sSID AS STRING) AS LONG
 DECLARE FUNCTION FB_Logout_sid LIB "FBSIDIO.dll" ALIAS "FB_LOGOUT_SID" (sHost AS STRING, sSID AS STRING) AS LONG
'
'
 DECLARE FUNCTION FB_FritzBoxDial LIB "FBSIDIO.dll" ALIAS "FB_FRITZBOXDIAL" (sHost AS STRING, sPassword AS STRING, sDialPort AS STRING, sDial AS STRING) AS LONG
 DECLARE FUNCTION FB_FritzBoxDialHangup LIB "FBSIDIO.dll" ALIAS "FB_FRITZBOXDIALHANGUP" (sHost AS STRING, sPassword AS STRING, sDialPort AS STRING) AS LONG
'
'
 DECLARE FUNCTION HTTPTransferRT LIB "FBSIDIO.dll" ALIAS "HTTPTRANSFERRT" (sMode AS STRING, sLink AS STRING, sFormdata AS STRING) AS STRING
'
'
 DECLARE FUNCTION makeDots LIB "FBSIDIO.dll" ALIAS "MAKEDOTS" (sInStr AS STRING) AS STRING
 DECLARE FUNCTION InMD5 LIB "FBSIDIO.dll" ALIAS "INMD5" (sInStr AS STRING) AS STRING
'

Einige Informationen gibt es hier dazu Outlook Wählhilfe Thread


Gruß Erwin ;)

24.01.2013 V2.1.0.9 25.01.2013 ' Änderung FB 7390 FW xx.05.50 SID Login Lua
 

Anhänge

  • FBSIDIO_dll.zip
    24.5 KB · Aufrufe: 31
  • FBSIDIO_dll_V2109.zip
    36.1 KB · Aufrufe: 16
Zuletzt bearbeitet:
Moin zusammen,

danke für Euer feedback :)
wollte mal als Zwischenbescheid mitteilen, dass es immer noch nicht geht, :( :confused: Aber ich hatte auch noch nicht wirklich intensiv Zeit.
 
Hallo,

Ich Frage mich Langsam ob du C überhaupt kannst, :confused:
ich Behersche es leider nicht, aber du hättest anhand
der Beispiele in Netz schon längst den Login hin kriegen müssen.

Beim Session ID Login geht AVM wohl folgenden Weg

Man Ruft zuerst die login_sid.xml auf, existiert
diese Seite nicht dann wird der alte Login
Code:
sMode = "POST "
sLink = "http://" + sHost + "/cgi-bin/webcm"
sFormdata = "getpage=../html/de/menus/menu2.html&login:command/password=" + sPassword
durchgeführt, existiert aber die Login Seite
Code:
 sMode = "POST "
 sLink = "http://" + sHost + "/cgi-bin/webcm"
 sFormdata = "getpage=../html/login_sid.xml"
dann werden die Werte
Code:
<SessionInfo>
<iswriteaccess>0</iswriteaccess>
<SID>0000000000000000</SID>
<Challenge>129b3320</Challenge>
</SessionInfo>
zurück gegeben, ist hier der Wert iswriteaccess = 0
dann wird ein Response aufgerufen mit dem Wert
was in Challenge steht und dem Passwort das eingegeben wurde.
Code:
   sResponse = sChallenge + "-" + LCASE$(InMD5(sChallenge + "-" + makeDots(sPassword))) ' 25.07.2009
'
   sFormdata = "getpage=../html/de/menus/menu2.html&login:command/response=" + sResponse 
'
   sRetHTTPTransferRT = HTTPTransferRT(sMode, sLink, sFormdata)
danach wenn der Login erfolgreich war steht dann die Session ID
im zurückgelieferten Response Text
Code:
<!-- Post Form -->
<form method="POST" action="../cgi-bin/webcm" target="_self" id="uiPostForm" name="uiPostForm">
<!-- Refresh Form -->
<input type="hidden" name="sid" value="13e41555bcc92250" id="uiPostSid">
<input type="hidden" name="getpage" value="../html/de/menus/menu2.html" id="uiPostGetPage">
<input type="hidden" name="errorpage" value="../html/de/menus/menu2.html" id="uiPostErrPage">
<input type="hidden" name="var:pagename" value="" id="uiPostPageName">
<input type="hidden" name="var:errorpagename" value="" id="uiPostErrorPageName">
<input type="hidden" name="var:menu" value="" id="uiPostMenu">
<input type="hidden" name="var:pagemaster" value="" id="uiPostPageMaster">
<input type="hidden" name="time:settings/time" value="" id="uiPostDateTime">
<input type="hidden" name="box:settings/webui_cookie" value="" disabled>
<!-- END Refresh Form -->

</form>
<!-- END Post Form -->

<form name="logoutForm" action="../cgi-bin/webcm" method="POST">
<input type="hidden" name="sid" value="13e41555bcc92250">
<input type="hidden" name="security:command/logout" value="">
<input type="hidden" name="getpage" value="../html/confirm_logout.html">
</form>
</body>
</html>
oder man Ruft so wie es AVM vorgesehen hat wieder die login_sid.xml auf
Code:
 sMode = "POST "
 sLink = "http://" + sHost + "/cgi-bin/webcm"
 sFormdata = "sid=" + sRetSID + "&" + "getpage=../html/login_sid.xml"
wenn dann der Login erfolreich war dann müsste jetzt
die Session ID darin stehen und mann muss sie nur noch auslesen
Code:
<SessionInfo>
<iswriteaccess>1</iswriteaccess>
<SID>13e41555bcc92250</SID>
<Challenge>129b3320</Challenge>
</SessionInfo>
wenn der Wert iswriteaccess = 1 ist dann war der Login erfolgreich
und man hat jetzt eine gültige Session ID,
wenn der Wert iswriteaccess = 0 ist dann geht der
Login Spass wieder von vorne Los.

17.08.2011 Änderung hier:

Erst Login:
Code:
 sRetSID = "0000000000000000"
 sMode = "POST "
 sLink = "http://" + sHost + "/cgi-bin/webcm"
 sFormdata = "sid=" + sRetSID + "&" + "getpage=../html/login_sid.xml"
rückgabe:
Code:
<SessionInfo>
<iswriteaccess>0</iswriteaccess>
<SID>0000000000000000</SID>
<Challenge>129b3320</Challenge>
</SessionInfo>

zurück gegeben, ist hier der Wert iswriteaccess = 0
dann wird ein Response aufgerufen mit dem Wert
was in Challenge steht und dem Passwort das eingegeben wurde.
Code:
   sResponse = sChallenge + "-" + LCASE$(InMD5(sChallenge + "-" + makeDots(sPassword))) ' 25.07.2009
'
   sFormdata = "getpage=../html/login_sid.xml&login:command/response=" + sResponse 
'
   sRetHTTPTransferRT = HTTPTransferRT(sMode, sLink, sFormdata)
danach wenn der Login erfolgreich war steht dann die Session ID
im zurückgelieferten Response Text
Code:
<SessionInfo>
<iswriteaccess>1</iswriteaccess>
<SID>13e41555bcc92250</SID>
<Challenge>129b3320</Challenge>
</SessionInfo>
wenn dann der Login erfolreich war dann müsste jetzt
die Session ID darin stehen und mann muss sie nur noch auslesen

Jeder weitere Login mit übergabe der zuletzt erhaltenen SessionID

Code:
 sRetSID = "13e41555bcc92250"
 sMode = "POST "
 sLink = "http://" + sHost + "/cgi-bin/webcm"
 sFormdata = "sid=" + sRetSID + "&" + "getpage=../html/login_sid.xml"

Ist diese SessionID noch gültig bekommt man sie wieder zurück,
ansonsten bekommt man eine neue SessionID, nach dem ein Response erfolgt ist.

17.08.2011 Änderung

AVM 02.02.2012 AVM_Technical_Note_-_Session_ID.pdf

02.12.2012 Anhang anzeigen AVM_Technical_Note_Session-ID_Lua_02122012.txt

Gruß Erwin ;)

:-Ö :done:
 
Zuletzt bearbeitet:
Hi Erwin,
danke für die ausführliche Info. Ich hab nie gesagt, dass ich C/C++ kann. ;)
Ich lerne mit jedem Projekt was neues. Mag sein, dass dieses Projekt etwas zu sportlich war/ist. Fakt ist aber auch, dass es immer sehr schwer ist, fremden Code zu verstehen. Ich werde das schon noch hinbekommen, es dauert halt etwas länger bei mir.:) Was ich jetzt nicht so schlimm finde. ;)
Grüße
Thomas
 
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.