Packete umrechnen ?! (New: Login-Packete)


  • müssen da nicht noch diese security bytes rein?


    Habe nie Security Bytes benutzt. Bin da überfragt, aufjedenfall hat das so immer bei mir funktioniert, wenn man NuConnector, o.a. benutzt.
    Hier ein Code um das vllt besser zu verstehen.


    [cs]#Include <String.au3>
    $String = "0107460B000000"
    $Opcode = "7158"
    $StringLength = ChangeStringLength(Hex(StringLen($String)/2,4))
    $Opcode = ChangeOpcode($Opcode)
    $Packet = "0x"&$StringLength&$Opcode&$String
    MsgBox(0,"",$Packet)


    Func ChangeStringLength($StringLength)
    $StringLength = StringMid($StringLength,3,2)&StringMid($StringLength,1,2)
    Return $StringLength
    EndFunc


    Func ChangeOpcode($Opcode)
    $Opcode = StringMid($Opcode,3,2)&StringMid($Opcode,1,2)
    Return $Opcode
    EndFunc[/cs]

  • Dr.No , leider klappt das nicht.
    Wenn ich das mit diesem Packet mache:


    Code
    1. ; Pferd aufsteigen (lvl 30)
    2. ;~ [C->J](7158)0107460B000000


    Kommt bei mir das raus:


    Code
    1. 0x070058710107460B000000


    Habe es dann so mit TCPSend versucht:

    Code
    1. TCPSend($iSocket, "0x070058710107460B000000")


    vergebens.


    Wie es richtig aussehen müsste und klappt ist dieser code:

    Code
    1. TCPSend($iSocket, _HexToString("03004C70030018EC11")


    Wie ich dadrauf komme ?
    Habe einfach ein AutoIt code gestartet wo er alle Packete empfängt, bin an eine verlassene Stelle in Downhang gegangen und habe ein Pferd gespawnt.
    Dann stand unten in der Console (von au3) dieser Code 03004C70030018EC11.
    Nunja ich finde es doof, dass ich immer noch nicht weiß wie man es anders machen könnte.

  • Der Befehl würde dann so ausehen:
    TCPSend($iSocket,"0x070058710107460B000000")
    Glaube ich jedenfalls^^


    @Awesome
    Ich schau mir das jetzt auch mal genauer an und werde ein Lv10 Horse spawnen lassen.
    (Hab keinen höheren Char als 13 in iSRO) xD


    Kuh :>


    EDIT: Ich werd's in rSRO testen.



    Also:
    Das Packet ist wie folgt aufgebaut:
    S->C(eigentlich C->S)
    Encrypted !
    Opcode(rSRO):
    704C


    DATA:
    [BYTE] InventoryPosition Wichtig: Erster Slot, erste Seite = 0D ! Nicht 00, weil man die CharSlots mitrechnen muss.
    [BYTE] EC (bleibt konstant)
    [BYTE] 11 (Evtl. sowas wie eine TypID) 11 = Horse !?

    Nun zu deinem Packet:

    Code
    1. 03004C70030018EC11


    0300 - SecurityBytes
    4C70 - Opcode 704C, da 4C70 inversed werden muss. Sprich: Die beiden Bytes werden gedreht.
    0300 - PacketLength
    18 - InventoryPosition = 18(16) = 24(10)
    EC - Konstante
    11 - TypID = Horse


    Fazit:
    Genau das, was ich auch herausgefunden habe :>
    Nichts da mit dem Packet mit dem Opcode "7158" ^^



    Kuh geht pennen :sleeping:

  • Danke kuhkuh für deine Antwort & hilfe.


    Habe das Pferd mal auf 30verschiedene Slots gepackt.
    Resultat:

    Code
    1. ;~ Pferd level (30) spawnen
    2. ;~ TCPSend($iSocket, _HexToString("03004C7003000DEC11"))
    3. ; 03004C7003000DEC11 = Slot 1
    4. ; 03004C7003000EEC11 = Slot 2
    5. ; 03004C7003000FEC11 = Slot 3


    Packete die ich empfangen habe durch 'Silkroad Packet Analysator OS'

    Code
    1. [C->J](7158)0107460B000000


    Nun habe ich 2. fragen ;)


    1 :Gibt es eine möglichkeit raus zu finden wo sich Pferde im Inventar befinden ?
    2 :Gibt es eine möglichkeit die Packete die sich im laufe des Spiels ändern zu analysieren ? z.B. Skills ? Pot menge ?

  • Natürlich kannst du das machen :)


    Aber noch kurz zur Berichtigung:
    Ihr redet über das "Use Item" Packet, dass erste (data) Byte ist der Slot das stimmt schonmal, danach kommt allerdings ein Word was angibt, welchen "Effekt" das Item hat. Das "0xEC" ist also nicht konstant.
    Alle Angaben in Network Order, müssten also eig. noch umgedreht werden (aber so im Packet stehen)
    0xEC09 = ret Scroll
    0xEC08 = hp pot
    0xEC10 = mp pot
    0x6C31 = universal pill


    So und wenn ihr ein Packet versenden wollt, solltet ihr schon wissen wie das aufgebaut sein soll:
    Zunächst kommt der Header:
    [Word]Length
    [Word]Opcode
    [Byte]Security Byte
    [Byte]Security Byte
    Danach kommt der Data Abschnitt, der genau Length Bytes lang ist und den eig. Inhalt des Packets beinhaltet.
    Da Ihr mit Nuconnector arbeitet müsst ihr über die Security Bytes die Richtung angeben, ob das Packet zum Client oder zum Server gesendet werden soll und ob es gecryptet sein soll oder nicht
    (Auschnitt aus DickerNoobs Analyzer)


    Gecryptet wird dann durch den Proxy. Wenn ihr die Length setzt, müsst ihr daran denken, dass der Header nicht mitgerechnet wird. Und die Bytes im Packet müssen Network Order sein (ich glaube so nennt man das sicher bin ich mir aber nicht :P), d.h. die Bytes werden so zusagen von hinten nach vorne geschrieben. Also wenn ihr ein Packet mit der Länge 9 habt (Data Abschnitt!) dann ist das als Word ausgeschrieben 00 09 = 9 und im Packet muss dann 09 00 stehen. Bei einem DWORD A2 B5 56 34, dann ist das Network Order 34 56 B5 A2.
    Ich hoffe ich konnte euch dadurch etwas klarer machen, wie das mit den Packets funktioniert.


    So und jetzt nochmal zu Awesome:
    1. Wenn dein Charakter gespawned wird bekommst du ein Packet mit den Daten zu deinem Character. Da kommt dann auch der Inventory Inhalt mit. Den musst du parsen und abspeichern. Auch wenn du ingame ein Item kaufst, aufsammelst, verschiebst, usw. bekommst du ein Inventory Update Packet. Da steht dann der Slot usw. drin, dass kannst du dann auch parsen und weißt was du wie zu verschieben hast.


    2. Du musst alle Packets die du receivest nach dem Opcode untersuchen. Also du holst dir den Opcode und machst dann eine Switch Case Abfrage und kannst das Packet dann weiter analysieren.

  • dongdong : Erstmal ein riesen dankeschön :)


    - - -
    Habe nun aus dem AutoIt-Clientless von drew benton den Aufbau fürs Char auslesen genommen und es klappt wunderbar.
    Nun weiß ich auch wie des genauer geht.
    Hier mal die Packete von dem "edxSilkroadLoader"



    Der Aufbau um alles einzelnd auszulesen:


    So wie ich das verstanden habe ist an der 6.ten Data-stelle des Packetes der Char Name

    Code
    1. 54 75 74 74 69 5F 4E 75 74 74 69 Tutti_Nutti.....


    Beim auslesen in Autoti ist an der 6.ten Stelle

    Code
    1. $charName = ParseAscii($charNameLength)


    - - -
    Frage dazu.
    Woher weiß ich wann ich welches Func zum auslesen brauche.


    Fürs Level wird das benutzt:
    $charLvl = Dec(ParseByte())


    Für den Namen wird das benutzt:
    $charNameLength = Dec(ParseWord())
    $charName = ParseAscii($charNameLength)


    Das Packet des Inventars habe ich glaube ich auch schon.
    Entweder "3013 "oder "0000", muss ich einfach mal ausprobieren.

  • dongdong
    Kleiner Nachtrag:
    Bei diesem konkretem Beispiel(Horse) ist das "0xEC" insofern konstant, dass sich das Byte "EC" beim spawnen eines Pferdes nie ändern wird.
    Allgemein betrachtet hast du natürlich Recht.
    Das ich das "EC" als konstant angesehen habe, beruht auf meinen Tests :>



    Kuh :>


  • das wird wahrscheinlich abhängig, von der länge der jeweiligen daten sein.
    da das lvl denke ich mal nur aus einem byte besteht, wird parseByte() benutzt.
    die länge von etwas besteht ja meistens aus 2 byte und deswegen wird parseWord() benutzt, usw.


  • das wird wahrscheinlich abhängig, von der länge der jeweiligen daten sein.
    da das lvl denke ich mal nur aus einem byte besteht, wird parseByte() benutzt.
    die länge von etwas besteht ja meistens aus 2 byte und deswegen wird parseWord() benutzt, usw.


    Wollte es nun mit x & y probieren.
    Weiß aber leider nicht was ich wo nehmen muss.


  • Die Kunst besteht ja gerade darin herauszufinden, was in dem Packet was bedeuted.
    Move Packet:
    [DWORD]UniqueID
    [Byte] xSec
    [Byte] ySec
    [Word] X
    [Word] Z
    [Word] Y
    wenn ich das jetzt richtig aus dem Kopf weiß :P (die Formel wie man dass dann umrechnet findet ihr in nem anderen Thread hiern :))


    PS: Fehler sind auf die Faasend zurück zuführen ^^

  • Bisschen anders aber sonst okay.
    Klappt trozdem nicht, hier mal der Code wo es nicht klappt.



    Und hier so es klappt, aber noch mit StringMid gemacht ist.


    Code
    1. $areax = StringMid($recv, 15, 2)
    2. $areay = StringMid($recv, 17, 2)
    3. $x = StringMid($recv, 19, 4)
    4. $y = StringMid($recv, 27, 4)
    5. calccord($areax, $areay, $x, $y)
    6. ConsoleWrite(@CRLF & "+>Gemovet " & $cordx & ", " & $cordy & @CRLF)
  • Trozdem vergebens.
    Ich denke, dass in dem Packet folgendes steht.

    Code
    1. ;~ 01 - Erfolgreich gelaufen oder nicht
    2. ;~ 99 67 -area X
    3. ;~ D2 02 - area Y
    4. ;~ A2 FF - X
    5. ;~ 7D 06 - Y


    Weil dort auch kein Y ist *verwirr*

    Code
    1. $areax = StringMid($recv, 15, 2)
    2. $areay = StringMid($recv, 17, 2)
    3. $x = StringMid($recv, 19, 4)
    4. $y = StringMid($recv, 27, 4)


    Hier mal der jetzige Code mit Y:

    Code
    1. Case "7021" ;Send Movement 7021
    2. BeginParse($packetData, Dec($packetSize))
    3. $areax = Dec(ParseByte())
    4. $areay = Dec(ParseByte())
    5. $x = Dec(ParseWord())
    6. $z = Dec(ParseWord())
    7. $y = Dec(ParseWord())
    8. calccord($areax, $areay, $x, $y)
    9. $recvtitle = "Moved: "
    10. AppendStatusText(@CRLF & $recvtitle & "x: " & $cordx & ", y: " & $cordy); & ", z: " & $z)


    Hier die Calcoord Funktion + Funcs die dazu gehöhren:


    (Das komische ist mit StringMid klappt es zwar, aber dafür brauche ich immer ein TCPRev deswegen bin ich umgestiegen auf Dec(ParseWord)

  • Ich hab gerade nach geschaut, dass Packet ist so aufgebaut:


    [DWord]PlayerID
    [Byte] StatusFlag 1 = OK
    --- falls StatusFlag = 1
    [Byte]xSec
    [Byte]ySec
    [Signed Word]X
    [Signed Word]Z
    [Signed Word]Y


    (Signed Word = short bzw. int16, also mit Vorzeichen)

  • Wuhu 300Post.
    - - -
    Ehm nimmst du Packet 7021 wo der C->S oder S->C ?
    Weil bei mir "iSro" ist C->S nur das bei Packet 7021.

    Code
    1. [C -> S][7021]
    2. 01 ................
    3. 99 67 .g..............
    4. D2 02 ................
    5. A2 FF ................
    6. 7D 06 }...............
  • Danke :) Mit Paket B021 klappt es wunderbar.



    - - - - - - - - - - - - - - - - -


    Update: 23:33



    So, mein Tcp-Programm ist weiter als vorher.
    Wollte nun einen Login machen nur ich wüsste nicht welches Packet das ist.
    Habe mit 3Programmen die Packete ausgelesen aber da steht nix was dem Login ähnlich sein könnte.



    Ausschnitte des Codes fürs einloggen.



  • Loginserver Auth
    Opcode 0x6102

    Code
    1. 12 locale
    2. 05 00 username len
    3. 12 23 34 45 56 username
    4. 05 00 password len
    5. 12 23 34 45 56 password
    6. 96 00 server id


    Loginserver Response
    Opcode 0xa102

  • Die SroPackets.rar habe ich auch, nur ob das alles noch stimmt ist fraglich.
    Charlistining stimme auch nicht mehr mit dem Opcode von der SroPackets.rar & iSro überein.


    Wenn das nicht der richtige ist, wie könnte ich den neuen rausfinden ?