1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

AutoIt-Code für Cookies mit WinHttp für ein Game

Dieses Thema im Forum "Support & Discussion" wurde erstellt von Satana, 12. Januar 2019.

  1. Satana

    Satana New Member

    Registriert seit:
    15. Dezember 2018
    Beiträge:
    13
    Zustimmungen:
    4
    Punkte für Erfolge:
    3
    Geschlecht:
    männlich
    Hey, könnte mir jemand bitte jemand ein Beispiel für ein Game erstellen, mit dem ich mich in ein Spiel einloggen kann und wenn ich das Skript nochmal starte, bin ich immer noch eingeloggt, dank Cookies und WinHttp?!

    Ich kriege das nicht richtig gebacken und wäre da echt dankbar für Hilfe. Wenn man bei Cookies durchgestiegen ist, sind das wahrscheinlich nur 10-15 Minuten Arbeit. :)

    Also ich suche wirklich nur funktionierenden Beispielcode, um das zu lernen.

    Es geht um das Spiel: Xh*don2: https://int1*xhodon2*com

    Ich bin gerne bereit, als Dank eine 10 Euro PaySafe- (oder andere Gutschein-) Karte zu kaufen und den Code zu übergeben.

    Vielen Dank
     
  2. gigagames

    gigagames Member

    Registriert seit:
    2. Juli 2017
    Beiträge:
    31
    Zustimmungen:
    12
    Punkte für Erfolge:
    8
    Verstehe ich das richtig?

    Du möchtest dich in deinen Browser einloggen & dann die Cookies in dein Skript Exportieren um diese dort zu nutzen?
    Das geht aber warum?

    Du musst dann in deinen Browser nachschauen wo du die Cookies einsehen kannst / Exportieren kannst, und diese dann einfach bei AutoIt im Header mit angeben
    (s. _WinHttpSimpleRequest -> $sHeader).
    Wenn das Cookie nun verändert wird, musst du es immer wieder neu "setzten" Warum nicht über dein Skript einloggen?


    Ansonsten
    Cookies Speichern -> Mittels $sHeader in WinHttpSimpleRequest mitschicken -> Wenn noch gültig alles gut :)
     
  3. Satana

    Satana New Member

    Registriert seit:
    15. Dezember 2018
    Beiträge:
    13
    Zustimmungen:
    4
    Punkte für Erfolge:
    3
    Geschlecht:
    männlich
    Hey, danke für die Antwort. Nein - ich möchte mich mit WinHttp einloggen (soweit kein Problem), die Cookies ablegen (ich sehe sie im Paket, aber weiß nicht, wie ich damit korrekt umgehe) und dann dann beim nächsten Start nutzen und schauen, ob ich damit noch direkt eingeloggt bin (oder der Cookie abgelaufen ist). Wenn ich eingeloggt bin, dann nicht neu einloggen, wenn nicht, dann einloggen.

    Beim SimpleSendSSLRequest kann ich einfach Header-Informationen mitgeben, ja. Jedoch habe ich dazu folgende Fragen / Probleme:
    • Muss ich das Ablaufdatum berücksichtigen?
    • Wie kriege ich raus, was vom Set-Cookie teil ich dann im Header als Cookie mitgeben muss? Set-Cookie ist wahnsinnig lang, Cookie dann im Header nicht mehr...
      • Und wenn ich mir die Header von Seite aufrufen, Login, nächste Seite aufrufen ausgeben lasse, steht in den Set-Cookies da wenig von dem, was ich für den Cookie dann zu brauchen scheine...
    • ODER: Brauche ich Set-Cookie gar nicht und muss nur den Cookie-Teil irgendwie auslesen, abspeichern und wiederverwenden?

    Mein Ziel ist einfach Logins zu reduzieren.

    Grüße
     
    Zuletzt bearbeitet: 13. Januar 2019
  4. gigagames

    gigagames Member

    Registriert seit:
    2. Juli 2017
    Beiträge:
    31
    Zustimmungen:
    12
    Punkte für Erfolge:
    8
    Du machst es dir damit einfach nur schwieriger ^^

    Der Server Schickt an den Client "Hey Setz das und das Cookie" -> Set-Cookie (was du im Paket siehst)

    Nachdem dieses Cookie "gesetzt" ist, sendet der Client beim Request denn Cookie mit, somit weiß der Server "ahh der hat Cookie XYZ". Somit sendet der Server kein Set-Cookie mehr (weil die Cookies sind ja schon vorhanden).

    Das Ablaufdatum kannst du einfach Ignorieren.

    Welche Cookies brauchst du?
    Entweder kommst du durch die Namensgebung drauf, ansonsten try & error. Oder einfach alle nehmen
     
  5. Satana

    Satana New Member

    Registriert seit:
    15. Dezember 2018
    Beiträge:
    13
    Zustimmungen:
    4
    Punkte für Erfolge:
    3
    Geschlecht:
    männlich
    Wenn ich dich richtig verstehe, muss ich "Set-Cookie" gar nicht auswerten, da ich mich ja einlogge und dann alles automatisch gemacht wird. Ich nehme als aus den Paketen das "Cookie-Zeug", was ich im Header finde, wenn ich nach dem Login etwas mache, korrekt?
    Ich habe mal aus Firefox die Header-Informationen zum Cookie genommen und einfach dem Code hinzugefügt und komme dann auch einfach ins Spiel.

    Die Herausforderung für mich ist, dass das, was ich im Bot als Cookie sehe, viel kürzer ist als das, was in im Browser mit sniffe... Und das ggfls. nicht nur GUI-Sachen, wie Zoom-Faktor...
    Die PHPSESSID steht z. B. dann auch nicht im Cookie.

    Kann ich dich irgendwie überreden, die das mal direkt am Beispiel anzugucken? Versuche das echt schon ewig zu lösen und selbst, wenn es klappen sollte, durch einfach Cookie übernehmen, wäre ich etwas ängstlich, dass man den Unterschied erkennen kann, als Publisher.
    Da braucht es meiner Meinung nach einen etwas geübten Blick, der den Hintergrund versteht...

    Vielen Dank

    Ergänzung:
    Ich habe nun mal sehr viele Experimente gemacht und ich komme ohne Login rein, wenn ich via Cookie nur die UserID mitschicke... Das irritiert mich :D! Das geht aber auch nur bei meiner ID, habe mal eine andere versucht, um zu gucken, ob das ein Bug ist...
    Wie kann das denn funktionieren? Irgendwo her muss das Spiel doch wissen, dass ich ich bin... Legt WinHttp doch irgendwas ab nach dem Login und das wird damit "aktiviert"?!^^

    Ergänzung 2:
    Dann habe ich aber das Problem, dass ich danach wieder ausgeloggt bin, oder ich muss den Cookie dann bei jedem Befehl mitgeben? Was ist denn damit, dass WinHttp das eigenständig verwaltet? Kriegt er das nur hin, wenn er beim SetCookie sozusagen dabei war?
     
    Zuletzt bearbeitet: 13. Januar 2019
  6. krusty

    krusty Moderator Mitarbeiter Moderator

    Registriert seit:
    1. Juli 2017
    Beiträge:
    86
    Zustimmungen:
    33
    Punkte für Erfolge:
    18
    Geschlecht:
    männlich
    Ort:
    Wadiya
    > Paketen das "Cookie-Zeug", was ich im Header finde, wenn ich nach dem Login etwas mache, korrekt?

    Korrekt


    > ich komme ohne Login rein, wenn ich via Cookie nur die UserID mitschicke

    Das wäre eine ziemlich schwere Sicherheitslücke ^^ man könnte verschiedene UserIDs ausprobieren, Brute-Force-Attacke und nach validen UserIDs suchen. Wie lang ist die UserID?

    > Dann habe ich aber das Problem, dass ich danach wieder ausgeloggt bin, oder ich muss den Cookie dann bei jedem Befehl mitgeben?

    Du musst den idr. Cookie jedes mal mitschicken. Wenn WinHTTP das nicht automatisch macht, musst du das machen.

    > Was ist denn damit, dass WinHttp das eigenständig verwaltet? Kriegt er das nur hin, wenn er beim SetCookie sozusagen dabei war?

    Ich weiß nicht, wie genau WinHttp das regelt. Normalerweise baut man eine Art "Cookiecontainer", der sich jede Serverantwort anschaut, nach neuen Cookies sucht und diese direkt in jeden neuen Request einsetzt. Ich bin mir nicht sicher, ob WinHttp das unterstützt.


    Das kannst du aber auch selber bauen. Jedes mal, wenn dir der Server eine Antwort schickt, schaust du welche Cookies gesetzt sind.
    Jedes neue Cookie trägst du in ein Dictionary/Wörterbuch ein. Wenn der Eintrag schon vorhanden ist, aktualisiere ihn.
    Wenn du einen neuen Request sendest, füge alle Cookies aus dem Dictionary/Wörterbuch als Cookie ein
    see: https://www.autoitscript.com/forum/topic/49645-dictionary-object-in-autoit/



    Edit: könntest du eventuell deinen Code posten? Vlt noch einen Testaccount dazu erstellen. Dann können die Forenmitglieder dir besser helfen.
    Vlt auch die Cookies des Testaccounts, vlt Bilder vom Sniffing im Browser und von den Cookies, die du in Autoit bekommst.
     
    Zuletzt bearbeitet: 15. Januar 2019
  7. Satana

    Satana New Member

    Registriert seit:
    15. Dezember 2018
    Beiträge:
    13
    Zustimmungen:
    4
    Punkte für Erfolge:
    3
    Geschlecht:
    männlich
    Bei Fremden UserIDs komme ich nicht rein, nur, wenn ich wirklich schon eingeloggt war. Sehr komisch... Aber kann den Cookie auf UserID einkürzen^^...

    Können sich Entwickler Cookies und/oder die Pakete von Usern anschauen oder ist das unwahrscheinlich? Wenn ich so wenig Daten mitgebe, wie möglich, ist das weniger fehleranfällig, aber auch auffällig...^^

    Den Cookie jedes Mal mitzuschicken ist ja lästig, dann muss ich jeden Aufruf im Skript nochmal anpassen :D... Aber sofern Entwickler Cookies nicht nachverfolgen können, bräuchte ich ja nur fest verdrahtet meine ID (1-4 stellig, glaube ich) hinterlegen und brauche gar nichts vom Cookie auszulesen...
    Dann gehe ich mit dem Cookie, nur aus ID bestehend, auf die Gameseite und prüfe, ob ich eingeloggt bin, wenn nicht, dann tue ich das, wenn ja, dann nutze ich das halt so weiter...

    Spannend ist halt auch, dass der Cookie ganz anders aussieht, wenn ich ihn sniffe, als wenn ich ihn via Code auslese... Wie sollte ich den bestmöglich aufbauen oder meinst du, es reicht sicherheitstechnisch (siehe oben xD) aus, wenn ich nur die ID nutze?
    Dann brauche ich halt auch diese Container-Idee nicht...

    @krusty: Dann verschieb den Eintrag bitte in den Support-Bereich^^ Dachte ja, ich könnte jemanden überreden, mir ein kleines Beispiel zu coden. Mein Code ist schon zu umfangreich zum posten, aber ich kann ein kleines Test-Skript basteln, klar.
     
  8. Satana

    Satana New Member

    Registriert seit:
    15. Dezember 2018
    Beiträge:
    13
    Zustimmungen:
    4
    Punkte für Erfolge:
    3
    Geschlecht:
    männlich
    Wegen IP etc. habe ich mal keinen Acc angelegt, aber so sieht der Login aus:
    Code (Text):
    #include <Array.au3>
    #include <String.au3>
    #include <Json.au3>
    #include <WinHTTP.au3>
    #include <WinHTTPConstants.au3>
    #include <date.au3>
    #include <Timers.au3>

    Global $WORLD = "int1"
    Global $LOGIN = ""
    Global $PASSWORD = ""
    Global $USERID =

    Global $UA = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Safari/537.36"
    Global $HTTP_Host = $WORLD & ".xhodon2.com"
    Global $HTTP_Agent = _WinHttpOpen($UA)
    Global $HTTP_Connect = _WinHttpConnect($HTTP_Agent, $HTTP_Host)

    _LogIn()

    Func _LogIn()
    ;~     _writeLogTech("Funktion: _LogIn")
        Local $sHtml

        _WinHttpSimpleSSLRequest($HTTP_Connect)

        $sHtml = _WinHttpSimpleSSLRequest($HTTP_Connect, "POST", "/game/main.php", Default, Default, "Cookie: user_id=" & $USERID & "; phpbb3_cbigx_u=" & $USERID)

        If StringInStr($sHtml, "Logout") Then
            _writeLogActivities("Erfolgreich Session übernommen")
    ;~         enableGUI()
            Return $sHtml
        Else
            _WinHttpSimpleSSLRequest($HTTP_Connect)
            _WinHttpSimpleSSLRequest($HTTP_Connect, "POST", "/", "", "user=" & $LOGIN & "&passwd=" & $PASSWORD & "&loginn=Login&AGC=on&pass=")
            $sHtml = _WinHttpSimpleSSLRequest($HTTP_Connect, "POST", "/game/main.php")

            If StringInStr($sHtml, "Logout") Then
                _writeLogActivities("Erfolgreich in Xhodon eingeloggt")
    ;~             enableGUI()
                Return $sHtml
            Else
                SetError(1)
                Return False
            EndIf
        EndIf
    EndFunc   ;==>_LogIn

    Func _writeLogActivities($sString)
        ConsoleWrite($sString & @CRLF)
    EndFunc

    User ID kriegt man beim Login gesnifft, bzw. wenn man einfach schaut, wie das Profil links oben verlinkt ist.

    Der Cookie beim Login im Browser sieht so aus (Zahlen und z. T. Buchstaben unkenntlich gemacht):
    Cookie: user_resolution=1920x966; _ga=GA1.2.1989XXX8X6.1XXX79XXX4; cookie_notice_accepted=true; clientRegistered=1; currentMapZoomScale=0.6000000000000001; currentPalaZoomScale=0.7384615384615385; phpbb3_cbigx_k=; user_id=XXX; PHPSESSID=XXXqnXpXXXXqXkaotXrkXXXXXX; _gid=GA1.2.1299994561.1547570552; _gat_gtag_UA_25XX04X_1X=1; _gat_gtag_UA_31X8XXXX_5=1

    Wenn ich mir den Header mit AutoIt hole, dann stehen da Sessid und viele der anderen Werte gar nicht mit drin.
     
  9. Satana

    Satana New Member

    Registriert seit:
    15. Dezember 2018
    Beiträge:
    13
    Zustimmungen:
    4
    Punkte für Erfolge:
    3
    Geschlecht:
    männlich
    Suche immer noch Hilfe... Vllt. reicht mir auch ein Hinweis, wie man aus dem Set-Cookie den Cookie machen kann.

    Oder vllt. reicht mir sogar die Hilfe, ob Publisher sehen können, wie ich mit Cookies umgehe, also dass ich z. B. nur den Minimal-Cookie nutze und nicht alles, was der Server mir schickt.
     
  10. krusty

    krusty Moderator Mitarbeiter Moderator

    Registriert seit:
    1. Juli 2017
    Beiträge:
    86
    Zustimmungen:
    33
    Punkte für Erfolge:
    18
    Geschlecht:
    männlich
    Ort:
    Wadiya
    Bitte mal in den Discord kommen.
     
  11. Satana

    Satana New Member

    Registriert seit:
    15. Dezember 2018
    Beiträge:
    13
    Zustimmungen:
    4
    Punkte für Erfolge:
    3
    Geschlecht:
    männlich
    Bin drin, hier mal mein Code:
    Code (Text):

    #include <WinHTTP.au3>
    #include <Array.au3>
    #include <Date.au3>

    Global $sDomain = "paratus.hr"
    Global $sPage = "ren/login.php"
    Global $sData = "user=somename&pwd=somepassword"
    Global $sStoredCookie, $aStoredCookie

    $hOpen = _WinHttpOpen()
    $hConnect = _WinHttpConnect($hOpen, $sDomain)

    ; Do a login
    _SimpleRequest($hConnect, "POST", $sPage, $sData)

    ; Close session (script closed)
    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)


    ; New session (script started again)
    $hOpen2 = _WinHttpOpen()
    $hConnect2 = _WinHttpConnect($hOpen2, $sDomain)
    $sHtml = _SimpleRequest($hConnect2, "GET", $sPage)
    ; -> logged in again, without doing a login, because session/cookie is not expired
    ConsoleWrite($sHtml & @CRLF)

    _WinHttpCloseHandle($hConnect2)
    _WinHttpCloseHandle($hOpen2)

    ; _FileReadToArray to save the cookie
    ; Use the saved cookie to try to do something, that needs you to be logged in, if it doesnt work, ReDim the Cookie-Var to 0 and Login after

    Func _SimpleRequest($hConnectX, $sType = "GET", $sPath = "", $sPost = $WINHTTP_NO_REQUEST_DATA)
        Local $sCookie = getCookieString()

        $aResponse = _WinHttpSimpleSSLRequest($hConnectX, $sType, $sPath, Default, $sPost, $sCookie, True)
        manageCookies($aResponse[0])

        Return $aResponse[1]
    EndFunc

    Func getCookieString()
        Local $sCookie

        If UBound($aStoredCookie) < 1 Then Return $WINHTTP_NO_ADDITIONAL_HEADERS

        $sCookie &= "Cookie: "

        For $i = 0 To UBound($aStoredCookie) - 1
            $sCookie &= ($i > 0) ? "; " & $aStoredCookie[$i][0] & "=" & $aStoredCookie[$i][1] : $aStoredCookie[$i][0] & "=" & $aStoredCookie[$i][1]
        Next

        Return $sCookie
    EndFunc

    Func manageCookies($sHeader)
        Local $aNewSetCookies, $aCookies, $aCleanedCookies[0][3]

        $aCookies = StringRegExp($sHeader, "Set-Cookie: ([^=]+)=([[:alnum:]]+);*.*?(?:expires=(.*?))*(?:;.*?)*\R", 4)

        $aNewSetCookies = arrangeRegExp($aCookies)

        ; Check, if there are expired Cookies
        If IsArray($aStoredCookie) Then
            For $i = 0 To Ubound($aStoredCookie) - 1
                Local $aTemp[1][3] = [[$aStoredCookie[$i][0], $aStoredCookie[$i][1], $aStoredCookie[$i][2]]]
                If Not isCookieTimeExpired($aStoredCookie[$i][2]) And $aStoredCookie[$i][2] <> "deleted" Then _ArrayAdd($aCleanedCookies, $aTemp)
            Next
        EndIf

        ; Replace Cookie-values and add new Cookies
        For $i = 0 To UBound($aNewSetCookies) - 1
            Local $bFoundCookie = False

            If UBound($aCleanedCookies) > 0 Then
                For $j = 0 To UBound($aCleanedCookies) - 1
                    If $aNewSetCookies[$i][0] = $aCleanedCookies[$j][0] Then
                        $bFoundCookie = True
                        $aCleanedCookies[$j][1] = $aNewSetCookies[$i][1] ; Value ersetzen
                    EndIf
                Next
            EndIf

            If Not $bFoundCookie Then
                Local $aTemp2[1][3] = [[$aNewSetCookies[$i][0], $aNewSetCookies[$i][1], $aNewSetCookies[$i][2]]]
                _ArrayAdd($aCleanedCookies, $aTemp2)
            EndIf
        Next

        $aStoredCookie = $aCleanedCookies ; set global var
    EndFunc

    Func isCookieTimeExpired($sDate) ; True = Expired
        Local $sDateFormatted

        If $sDate = "" Then Return False ; No expire date

        $sDateFormatted = formatCookieDate($sDate)

        Local $iDateDiff = _DateDiff('s', $sDate, _NowCalc())

        If $iDateDiff > 0 Then
            Return True ; Vergangenheit
        Else
            Return False ; Zukunft
        EndIf
    EndFunc

    Func formatCookieDate($sDate)
        Local $aDate
        Dim $aMonth[12] = ["Jan", "Feb", "Mrz", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"]

        $aDate = StringRegExp($sDate, "(\d+)-(\w+)-(\d+)\s(\d+):(\d+):(\d+)", 3) ; Tag, Monat [3], Jahr, Stunde, Minute, Sekunde

        For $i = 0 To UBound($aMonth) - 1
            If $aMonth[$i] = $aDate[1] Then
                $aDate[1] = $i + 1
                If $aDate[1] < 10 Then $aDate[1] = 0 & $aDate[1]
                ExitLoop
            EndIf
        Next

        Return $aDate[2] & "/" & $aDate[1] & "/" & $aDate[0] & " " & $aDate[3] & ":" & $aDate[4] & ":" & $aDate[5]
    EndFunc

    Func arrangeRegExp($aArray) ; SRE: Flag 4 input
        Local $aTemp, $iMaxColumns

        For $i = 0 To Ubound($aArray) - 1
            $aTemp = $aArray[$i]
            $iMaxColumns = Max(Ubound($aTemp), $iMaxColumns)
        Next

        Local $aNewArray[Ubound($aArray)][$iMaxColumns - 1]

        For $i = 0 To UBound($aNewArray) - 1
            $aTemp = $aArray[$i]
            For $j = 1 To Ubound($aTemp) - 1
                $aNewArray[$i][$j - 1] = $aTemp[$j]
            Next
        Next

        Return $aNewArray
    EndFunc

    Func Max($a, $b)
        Return $a > $b ? $a : $b
    EndFunc

     

    Ich habe das dann, weil das ja so klappt, in meinen Code eingebaut, auch schön mit _FileReadArray etc. ergänzt und leider klappt es nur so "halb"...
    Ich kriege zu allen GET-Aufrufen eingeloggte Antworten, zu POST-Aufrufen klappt es leider überhaupt nicht und die sind ja doch ziemlich wichtig! xD

    Ich weiß nicht, ob es Cookies gibt, die ich vllt. gar nicht speichern/verwenden darf oder kA... An sich ist der Code ja schon ganz Schnieke geworden, dachte ich :/...
     

Diese Seite empfehlen

Die Seite wird geladen...