1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

[Entwicklung] Wurzelimperium Login / Bot

Discussion in 'Tipps & Tricks' started by hoschi111, Jan 24, 2013.

  1. hoschi111

    hoschi111 Administrator Staff Member Administrator

    Joined:
    Dec 19, 2017
    Messages:
    1,445
    Likes Received:
    0
    Hallo zusammen!
    Ich habe zur Zeit immer weniger Zeit und komme deshalb nicht großartig zum programmieren.
    Allerdings möchte ich das Login von "Wurzelimperium" knacken und daraus einen Bot machen.
    Hier sind alle Logininformationen:
    [ATTACHMENT NOT FOUND]

    [ATTACHMENT NOT FOUND]

    krustys HttpRequest Klasse:
    Code:
    Public Class HttpRequest
    
        Private cookiecontainer As System.Net.CookieContainer
    
        Public Function postRequest(ByVal url As String, ByVal postParam As HttpParamList) As String
            Dim postString As String = vbNullString
            If Not postParam.isEmpty() Then
                postString = postParam.getItem(0).key & "=" & postParam.getItem(0).value
    
                For i As Integer = 1 To postParam.getSize() - 1
                    postString &= "&" & postParam.getItem(i).key & "=" & postParam.getItem(i).value
                Next
    
                Return Me.postRequest(url, postString)
            End If
            Return Nothing
        End Function
    
        Public Function postRequest(ByVal url As String, ByVal postParam As String) As String
            Dim request As System.Net.HttpWebRequest = CType(System.Net.WebRequest.Create(url), System.Net.HttpWebRequest)
            request.Method = "POST"
            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20130122 Firefox/20.0"
            ' request.Referer = url
            request.CookieContainer = Me.cookiecontainer
            request.Accept = "application/json, text/javascript, */*; q=0.01"
            request.ContentLength = postParam.Length
            request.Headers.Add("Accept-Language", "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3")
            request.Headers.Add("DNT", "1")
            request.KeepAlive = True
            request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"
            request.ServicePoint.Expect100Continue = False
    
            postParam = Me.encodeUrl(postParam)
    
            Dim byteArray() As Byte = System.Text.Encoding.UTF8.GetBytes(postParam)
            'request.ContentLength = byteArray.Length
            Dim postStream As IO.Stream = request.GetRequestStream()
            postStream.Write(byteArray, 0, byteArray.Length)
    
            postStream.Close()
    
    
    
            Dim s As System.IO.Stream = request.GetResponse().GetResponseStream()
    
            Dim requestStreamReader As System.IO.StreamReader = New System.IO.StreamReader(s)
            Dim response As String = requestStreamReader.ReadToEnd()
            requestStreamReader.Close()
    
            Return response
        End Function
    
        Public Function getRequest(ByVal url As String, ByVal getParam As HttpParamList) As String
            If (Not getParam.isEmpty()) Then
                Dim getString As String = vbNullString
                For Each param As HttpParamList.KeyValue In getParam.getList
                    getString &= "&" & param.key & "=" & param.value
                Next
    
                getString = Me.encodeUrl(getString)
    
                Return Me.getRequest(url, If(url.EndsWith("?"), "", "?") & getString)
            End If
            Return Me.getRequest(url)
        End Function
    
        Public Function getRequest(ByVal url As String, ByVal getParam As String)
            If (Not url.EndsWith("?")) And (Not getParam.StartsWith("?")) And (Not getParam = "") Then
                url &= "?"
            End If
            Return Me.getRequest(url & getParam)
        End Function
    
        Public Function getRequest(ByVal url As String) As String
            Dim request As System.Net.HttpWebRequest = CType(System.Net.WebRequest.Create(url), System.Net.HttpWebRequest)
            request.Method = "GET"
            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1"
            request.Referer = url
            request.CookieContainer = Me.cookiecontainer
            request.Accept = "text/javascript, text/html, application/xml, text/xml, */*"
            request.Headers.Add("Accept-Language", "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3")
            request.KeepAlive = True
            request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"
    
            Dim requestStreamReader As System.IO.StreamReader = New System.IO.StreamReader(request.GetResponse().GetResponseStream())
            Dim response As String = requestStreamReader.ReadToEnd()
            requestStreamReader.Close()
    
            Return response
        End Function
    
        Private Function encodeUrl(ByVal url As String) As String
            url = url.Replace(" ", "+")
            url = url.Replace("ö", "%C3%B6")
            Return url
        End Function
    
    End Class
    
    

    HttpParamList:
    Code:
    Public Class HttpParamList
    
    	Private paramList As New List(Of KeyValue)
    
    	Public Class KeyValue
        	Public Sub New(ByVal key As String, ByVal value As String)
            	Me.key = key
            	Me.value = value
        	End Sub
        	Public key As String
        	Public value As String
    	End Class
    
    	Public Function add(ByVal key As String, ByVal value As String) As HttpParamList
        	Me.paramList.Add(New KeyValue(key, value))
        	Return Me
    	End Function
    
    	Public Function getItem(ByVal index As Integer) As KeyValue
        	If Me.getSize() > index Then
            	Return Me.paramList.Item(index)
        	End If
        	Return Nothing
    	End Function
    
    	Public Function getSize() As Integer
        	Return Me.paramList.Count
    	End Function
    
    	Public Function add(ByVal key As String, ByVal value As Integer) As HttpParamList
        	Return Me.add(key, value.ToString)
    	End Function
    
    	Public Function add(ByVal key As String, ByVal value As Boolean) As HttpParamList
        	Return Me.add(key, If(value, "true", "false"))
    	End Function
    
    	Public Function getList() As List(Of KeyValue)
        	Return Me.paramList
    	End Function
    
    	Public Function isEmpty() As Boolean
        	Return Me.getSize < 1
    	End Function
    End Class
    

    Danke schon mal für die Hilfe ;)
     
  2. krusty

    krusty New Member

    Joined:
    Sep 8, 2012
    Messages:
    182
    Likes Received:
    0
    lol, da fehlt die HttpParamList Klasse !
    Finde den Token leider nicht auf anhieb.


    EDIT:
    interessant:
    diese seiten werden angeseuert, ich schätze dass man sich dort den logintoken holt.
    http://www.wurzelimperium.de/js/prototype.js?v=2
    http://www.wurzelimperium.de/js/main.js?v=2
    http://www.wurzelimperium.de/loginsrc/main.php
    http://upjers.com/agb/ga_anonym.js


    Code:
    Public Class HttpParamList
    
        Private paramList As New List(Of KeyValue)
    
        ''' <summary>
        ''' Stellt ein Schlüssel-Wert Paar dar.
        ''' </summary>
        ''' <remarks></remarks>
        Public Class KeyValue
            Public Sub New(ByVal key As String, ByVal value As String)
                Me.key = key
                Me.value = value
            End Sub
            Public key As String
            Public value As String
        End Class
    
        ''' <summary>
        ''' Liefert den Parameter mit dem entsprechenden Index.
        ''' </summary>
        ''' <param name="index">Index des Parameters in der Liste</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function getItem(ByVal index As Integer) As KeyValue
            If Me.getSize() > index Then
                Return Me.paramList.Item(index)
            End If
            Return Nothing
        End Function
    
        ''' <summary>
        ''' Liefert die Größe der Liste.
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function getSize() As Integer
            Return Me.paramList.Count
        End Function
    
        ''' <summary>
        ''' Liefert die Liste als iterierbares Objekt.
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function getList() As List(Of KeyValue)
            Return Me.paramList
        End Function
    
        ''' <summary>
        ''' Gibt an, ob die Liste leer ist.
        ''' </summary>
        ''' <returns>True, wenn die Liste leer ist, sonst False</returns>
        ''' <remarks></remarks>
        Public Function isEmpty() As Boolean
            Return Me.getSize < 1
        End Function
    
        ''' <summary>
        ''' Fügt einen neuen Parameter hinzu.
        ''' </summary>
        ''' <param name="key">Schlüssel</param>
        ''' <param name="value">Wert</param>
        ''' <returns>Das eigene Objekt vom Typ HttpParamList</returns>
        ''' <remarks></remarks>
        Public Function add(ByVal key As String, ByVal value As String) As HttpParamList
            Me.paramList.Add(New KeyValue(key, value))
            Return Me
        End Function
    
        ''' <summary>
        ''' Fügt einen neuen Parameter hinzu.
        ''' </summary>
        ''' <param name="key">Schlüssel</param>
        ''' <param name="value">Wert</param>
        ''' <returns>Das eigene Objekt vom Typ HttpParamList</returns>
        ''' <remarks></remarks>
        Public Function add(ByVal key As String, ByVal value As Integer) As HttpParamList
            Return Me.add(key, value.ToString)
        End Function
    
        ''' <summary>
        ''' Fügt einen neuen Parameter hinzu.
        ''' </summary>
        ''' <param name="key">Schlüssel</param>
        ''' <param name="value">Wert</param>
        ''' <returns>Das eigene Objekt vom Typ HttpParamList</returns>
        ''' <remarks></remarks>
        Public Function add(ByVal key As String, ByVal value As Boolean) As HttpParamList
            Return Me.add(key, If(value, "true", "false"))
        End Function
    End Class
    
     
  3. hoschi111

    hoschi111 Administrator Staff Member Administrator

    Joined:
    Dec 19, 2017
    Messages:
    1,445
    Likes Received:
    0
    Hab die 2. Klasse noch hinzugefügt.
    Ich komm bei WI auch nicht auf Anhieb weiter, wenn ich nur mit POST/GET arbeiten will.
     
  4. hoschi111

    hoschi111 Administrator Staff Member Administrator

    Joined:
    Dec 19, 2017
    Messages:
    1,445
    Likes Received:
    0
    Zusatz:
    Hier wird das Passwort (Ausschnitt des Screens oben) im Plain übergeben:
    [ATTACHMENT NOT FOUND]

    Was hat es damit aufsich?
     
  5. hoschi111

    hoschi111 Administrator Staff Member Administrator

    Joined:
    Dec 19, 2017
    Messages:
    1,445
    Likes Received:
    0
    Kann mir jemand den Code mit dem oben geposteten VB.Net POST-Code übersetzen?
    AutoIt
    Code:
    Func _login($name,$pw,$server)
        $randomZahl = Random(1,9,1)&Random(1,9,1)&Random(1,9,1)&Random(1,9,1)&Random(1,9,1)&Random(1,9,1)&Random(1,9,1)&Random(1,9,1)&Random(1,9,1)
        $qc = _navigierenPOST("/dispatch.php?r="&$randomZahl,"do=login&server=server"&$server&"&user="&$name&"&pass="&$pw)
        $token = StringRegExp($qc,'token=(\w+)',3)
        Global $HTTP_Host = "s"&$server&".wurzelimperium.de"
        Global $HTTP_Connect = _WinHttpConnect($HTTP_Agent, $HTTP_Host)
        If IsArray($token) Then
            TrayTip("Wurzelimperium Bot","Login erfolgreich!",1)
            $qc = _navigierenGET("/logw.php?USR="&$name&"&token="&$token[0]&"&embed=&ref=&retid=")
            Clipput($qc)
            Msgbox(0, '', $qc)
        Else
            TrayTip("Wurzelimperium Bot","Login fehlgeschlagen!",1)
        Endif
    Endfunc
     
  6. krusty

    krusty New Member

    Joined:
    Sep 8, 2012
    Messages:
    182
    Likes Received:
    0
    lol, wo ist das problem ?
    Code:
    $randomZahl = Random(1,9,1)&Random(1,9,1)&Random(1,9,1)&Random(1,9,1)&Random(1,9,1)&Random(1,9,1)&Random(1,9,1)&Random(1,9,1)&Random(1,9,1)
    erstelle eine Randomzahl der Länge 9, mit jeweils zahlen zwichen 1 und 9. (wobei das falsch ist, weil im Token auch 0 vorkommen kann).

    Code:
    $qc = _navigierenPOST("/dispatch.php?r="&$randomZahl,"do=login&server=server"&$server&"&user="&$name&"&pass="&$pw)
    Sende einen Postrequest an http://www.wurzelimperium.de/dispatch.php?r= und der Randomzahl. Als Postparameter werden Username und Password und Server übergeben.

    Code:
    StringRegExp($qc,'token=(\w+)',3)
    Als Antwort bekommt man wohl eine XML Message, in der ein weiterer Token versteckt ist, den Regex verstehe ich nicht auf anhieb, aber das sollte man leicht rausbekommen, auf jeden fall steht er hinter dem Wort "token=".

    Rexeg wird standartmäßig ein Array zurückgeben:
    Code:
     $qc = _navigierenGET("/logw.php?USR="&$name&"&token="&$token[0]&"&embed=&ref=&retid=")
    Damit ließt man dann wohl die Seite aus, nachdem man eingeloggt ist.



    Warum hast du alle Kommentare aus dem Quellcode entfernt ???
    Wir stellen diesen HTTP Post nach:
    [​IMG]

    Code:
    Dim h as new HttpRequest
    Dim params as new HttpParamList
    
    params.add("do","login")
    params.add("server","server46")
    params.add("user","hoschi111")
    params.add("pass","1337killerpassword")
    
    Dim antwort as string = h.postRequest("http:/www./wurzeldeineMutter.keineLust.alles.zu.schreiben.de/dispatch.php?r=133713371337",params)
    
    
     
  7. hoschi111

    hoschi111 Administrator Staff Member Administrator

    Joined:
    Dec 19, 2017
    Messages:
    1,445
    Likes Received:
    0
    Alles klar,
    wenn ich aber jetzt testweise mir den gesamten response-stream returnen will kommt das:
    [ATTACHMENT NOT FOUND]
     
  8. krusty

    krusty New Member

    Joined:
    Sep 8, 2012
    Messages:
    182
    Likes Received:
    0
    Okay, wir haben den Fehler gefunden und oben im Quellcode berichtigt.
    ein simples
    Code:
    request.ServicePoint.Expect100Continue = False
    hats gelößt.


    Okay, halten wir mal fest.

    Beim Login müssen folgende Sachen übergeben werden:
    als Postparameter:
    do:login
    server:server46 wobei die Zahl für den ausgewählten Server steht
    user:username
    pass:password

    im Getparameter muss eine 9 Zeichen lange Zahl angegeben werden, die man einfach zufällig generieren kann, ein sehr schlechter Schutz.

    Als Antwort bekommt man vom Server einen XML String, in dem sich ein bestimmter Token befindet. Diesen Token muss man unbedingt speichern. Er wird später wichtig für weitere Operationen im Game sein.

    Außerdem ist es wichtig dass man die URL im Format "http://www.wurzel...." angibt. Lässt man das www weg, so leitet der Webserver uns auf eine andere Webseite um, der Request mit der Randomzahl wird 2 mal abgeschickt und es kommt zum Fehler.
     
  9. hoschi111

    hoschi111 Administrator Staff Member Administrator

    Joined:
    Dec 19, 2017
    Messages:
    1,445
    Likes Received:
    0
    Ich werde nach und nach einige Klassen hinzufügen und dann immer mit Source veröffentlichen.
    Nachdem man sich eingeloggt hat, kann man bei WI ganz einfach via GET anpflanzen, bewässern und ernten.
    @krusty, ich konnte erfolgreich das Token extrahieren.

    Der DS-Bot wird auch wieder weiter programmiert.
     
  10. Tommy94

    Tommy94 New Member

    Joined:
    Aug 1, 2012
    Messages:
    223
    Likes Received:
    0
    DS Bot?
     
  11. krusty

    krusty New Member

    Joined:
    Sep 8, 2012
    Messages:
    182
    Likes Received:
    0
    Community Projekt

    wäre schon cool, wenn man den weiter macht, da stehtn gutes grundgerüst.
     
  12. Tommy94

    Tommy94 New Member

    Joined:
    Aug 1, 2012
    Messages:
    223
    Likes Received:
    0
    Da wäre ich dabei! DS hab ich bis vor kurzem 4 Jahr gespielt!
     
  13. hoschi111

    hoschi111 Administrator Staff Member Administrator

    Joined:
    Dec 19, 2017
    Messages:
    1,445
    Likes Received:
    0
    Hab ein neues Problem:
    Sobald man sich erfolgreich einloggt, bekommt man einen Cookie.
    Um nun etwas anzupflanzen muss man folgendes machen:
    Beispiel:
    Code:
    http://s46.wurzelimperium.de/save/pflanz.php?pflanze[]=32&feld[]=55&felder[]=55&cid=7
    
    HTTP Header muss aber den Cookie enthalten:
    Beispiel:
    Code:
    Host: s46.wurzelimperium.de
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20130124 Firefox/20.0
    Referer: http://s46.wurzelimperium.de/main.php?page=garden
    Cookie: __utma=1.1339686419.1358725678.1359128834.1359208643.22; __utmz=1.1359208643.22.21.utmcsr=wurzelimperium.de|utmccn=(referral)|utmcmd=referral|utmcct=/login.php; PHPSESSID=bsjk64b80a3teo9hbfl889bna0; wunr=30454060; __utmc=1; __utmb=1.1.10.1359208643
    DNT: 1
    Connection: keep-alive
    Mein GET-Request:
    Code:
        Public Function getRequest(ByVal url As String) As String
            Dim request As System.Net.HttpWebRequest = CType(System.Net.WebRequest.Create(url), System.Net.HttpWebRequest)
            request.Method = "GET"
            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20130122 Firefox/20.0"
            ' request.Referer = url
            request.CookieContainer = Me.cookiecontainer
            request.Accept = "application/json, text/javascript, */*; q=0.01"
            request.Headers.Add("Accept-Language", "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3")
            request.Headers.Add("DNT", "1")
            request.KeepAlive = True
            request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"
            request.ServicePoint.Expect100Continue = False
            Dim requestStreamReader As System.IO.StreamReader = New System.IO.StreamReader(request.GetResponse().GetResponseStream())
            Dim response As String = requestStreamReader.ReadToEnd()
            requestStreamReader.Close()
    
            Return response
        End Function
    
    Ich verwende den gleichen CookieContainer wie der vom POST-Request, damit ich die SessionID etc mitbekomme.
    Trotzdem wird laut Sniffer nur dieses hier übergeben:
    Code:
    GET /save/pflanz.php?pflanze%5B%5D=32&feld%5B%5D=54&felder%5B%5D=54&cid=10 HTTP/1.1
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20130122 Firefox/20.0
    Accept: application/json, text/javascript, */*; q=0.01
    Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
    DNT: 1
    Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    Host: s46.wurzelimperium.de
    
    
    HTTP/1.1 200 OK
    Set-Cookie: PHPSESSID=22fr6ckof6qi7ik3r122fjeoc2; path=/; domain=.s46.wurzelimperium.de
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
    Content-type: text/html
    Transfer-Encoding: chunked
    Date: Sat, 26 Jan 2013 14:25:10 GMT
    Server: lighttpd/1.4.28
    
    36
    {"elems":0,"deko":null,"success":1,"jetzt":1359210310}
    0
    
    Die Anfrage failed also. Warum?
     
  14. krusty

    krusty New Member

    Joined:
    Sep 8, 2012
    Messages:
    182
    Likes Received:
    0
    Ich hoffe du benutzt fuer beide requests das gleiche httprequest objekt.
    Ansonste mal probieren, debuggen...
    Bin ersp spaeter zu haus.
     
  15. hoschi111

    hoschi111 Administrator Staff Member Administrator

    Joined:
    Dec 19, 2017
    Messages:
    1,445
    Likes Received:
    0
    Ich denke schon, dass es das gleiche ist, da es für Form1 global ist, und die Anfrage aus Form1 gesendet wird.
    Code:
    Public Class Form1
        Dim server As Integer = 1
        Dim user As String = ""
        Dim pass As String = ""
        Public httpRequest As New HttpRequest()
    [...]
    
     
  16. hoschi111

    hoschi111 Administrator Staff Member Administrator

    Joined:
    Dec 19, 2017
    Messages:
    1,445
    Likes Received:
    0
    Hier das Projekt bis jetzt:
    Token wird erfolgreich übergeben, allerdings gibt es Probleme mit den Cookies.
    Ihr könnt euch gerne hier dran versuchen.