Packete umrechnen ?! (New: Login-Packete)

  • Hallo stagetwo,


    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Update: 7.März.2011
    23:26Uhr


    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.



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


    ich habe mich grade mal hingesetzt und wollte ein paar Packete in iSro versenden.


    Benutzen tuhe ich den PHMediaPatcher um meine IP auf 127.0.0.1 Port: 15778 zu patchen.
    MultiSocket + nuConnector v8.1 + MultiSocket (By Kaz)
    Silkroad Online Launcher


    Es klappt eigentlich alles ganz gut, nur mit den Packeten umrechnen nicht so.


    z.B. der Code für hinsetzen aus dem 'Silkroad Packet Analysator OS'

    Code
    1. [C->J](704F)04


    Der Code für "hallo" schreiben aus dem 'edxSilkroadLoader5'

    Code
    1. [C -> S][7025]
    2. 01 ................
    3. 02 ................
    4. 06 00 ................
    5. 68 00 61 00 6C 00 6C 00 6F 00 6F 00 h.a.l.l.o.o.....


    Bevor ich den AutoIt poste ist hier mal ein TCPSende der den Char zum hinsetzen bringt. (iSro klappt es zu 100%)

    Code
    1. TCPSend($iSocket, _HexToString("01004F70010004"))


    war nur zufall, dass er klappte.


    So habe ich die Packete fürs hinsetzen/aufstehen ausgelesen.

    Code
    1. [C->J](704F)04


    Wenn ich den _HexToString("01004F70010004") umwandel mit diesem Code.

    Code
    1. $recv = "01004F70010004"; TCPRecv($iSocket, 48)
    2. $recv = BinaryToString($recv)
    3. $recv = _StringToHex($recv)
    4. $opcode2 = StringMid($recv, 5, 2) ;ab 5te Zeichen die 2 Zeichen wählen
    5. $opcode = StringMid($recv, 7, 2) ;ab 7te Zeichen die 2 Zeichen wählen
    6. $opcode = $opcode & $opcode2 ; Hex umtauschen Bsp: 6773 zu 7367
    7. Msgbox(0,"",$opcode)


    Dann kommt da 3030 raus.


    Meine eigentliche frage ist jetzt, wie ich die Opcodes,packete nun richtig umwandel und dann sende.
    z.B. wie könnte ich den text 'hallo' senden ?


    ---
    Ich hoffe ich habe mich verständlich ausgedrückt da es doch schon spät ist :verwirrt:


    Update 17:15 Uhr. AutoIt Quellcode hinzugefügt.


  • Also müsste dann $opcode richtig umgewandelt sein , oder ?


    Ich bekomme beim analysieren ja nur an diese Nummern:


    [C->J](70B1)070041007700650073006F006D006500
    oder
    [C->J](704F)04



    Code
    1. $recv = "704F"; TCPRecv($iSocket, 48)
    2. $opcode2 = StringMid($recv, 5, 2) ;ab 5te Zeichen die 2 Zeichen wählen
    3. $opcode = StringMid($recv, 7, 2) ;ab 7te Zeichen die 2 Zeichen wählen
    4. $opcode = $opcode & $opcode2 ; Hex umtauschen Bsp: 6773 zu 7367
    5. ConsoleWrite(@CRLF &"+------------->Anfang" & @CRLF & $opcode & @CRLF & "+--------------->Ende" & @CRLF)


    Update im 1. Post :)

  • Also du bekommst über TCPRecv die Packete ja direkt in Hex, d.h. du musst du nicht mehr umwandeln.
    Wenn du z.B. [C->J](704F)04 das im Analysor bekommst, dann musst du das so "0x01004F7004" wegschicken.

    Zitat


    0x = Anfang von Hex
    0100 = Länge des Inhalts in Byte verdreht, also 1
    4F70 = Opcode, verdreht
    04 = Eigentlicher Inhalt des Packetes


    Du musst nichts zum String oder Hex umwandeln.

  • Also den Anfang und Ende habe ich verstanden.
    Aber wie weiß ich , wie ich den Opcode verdrehen muss ?


    Code formation war nicht so gut, deshalb ein Bild :)

  • Ich bin grade am ipod und werde es morgen einfach mal testen :)


    Update:
    Ich habe beides mal probiert klappte nicht so wirklich.
    Deshalb habe ich mich erstmal an Packete rangemacht , die gleich aufgebaut sind wie das hinsetzten / aufstehen.


    Update: 09:06Uhr es klappt mit Packeten gleicher größe siehe der Sonne:


    Code
    1. TCPSend($iSocket, _HexToString("01000274010002")) ; Sonne an
    2. sleep(2000) ; 2Sekunden warten
    3. TCPSend($iSocket, _HexToString("01000274010000")) ; Sonne aus


    Update: 09:28Uhr
    Habe es geschaft eine 4er Party auf zu machen mit dem Namen "LTP 24/7 by Awesome" , nur die Packete umgerechnet habe ich nicht , sonder mit:

    Code
    1. $recv = TCPRecv($iSocket, 48) ;Empfangen
    2. $recv = BinaryToString($recv) ;Umwandeln in String
    3. $recv = _StringToHex($recv) ;umwandeln Strin to Hex
    4. ConsoleWrite($recv & @CRLF)


    mir anzeigen lassen und einfach kopiert.


    4er Party:

    Code
    1. TCPSend($iSocket, _HexToString("34006970010000000000000000000400016E13004C00540050002000320034002F003700200062007900200041007700"))
    2. TCPSend($iSocket, _HexToString("650073006F006D006500350069B00200014B690000000000000400016E13004C00540050002000320034002F00370020"))
    3. TCPSend($iSocket, _HexToString("0062007900200041007700650073006F006D006500"))


    - - -
    Meine eigentlich frage ist immer noch offen ^^


    Kann man aus [C->J](704F)04 (was der Analyser ausspuckt) nicht irgendwie so richtig umformen, dass man direkt das richtige umgewandelte hat?



    - - -
    Update: 09:35 Uhr


    Habe nun geschaft das er ein Stall öffnent nur ich kann ihn weder schließen noch ansehen.
    Meine Figur hat zwar den Stall offen mit dem title "awesome" aber mehr nicht.


    Code
    1. TCPSend($iSocket, _HexToString("1000B1700100070041007700650073006F006D0065004500BA700100062100570065006C0063006F006D006500200074"))
    2. TCPSend($iSocket, _HexToString("006F0020005B00540075007400740069005F004E0075007400740069005D002700730020007300740061006C006C002E"))
    3. TCPSend($iSocket, _HexToString("1800B8300200D7D60F02070041007700650073006F006D00650000000000"))
    4. TCPSend($iSocket, _HexToString("0100B1B00200014600BAB0020001062100570065006C0063006F006D006500200074006F0020005B0054007500740074"))
    5. TCPSend($iSocket, _HexToString("0069005F004E0075007400740069005D002700730020007300740061006C006C002E00"))



    Update: 14:47 Uhr
    Ich glaube ich habe es nun ein wenig mehr verstanden.

    Code
    1. 0 = anfang
    2. 100 =länge
    3. 0274 =code
    4. 0=anfang
    5. 100=länge
    6. 02= inhalt
    7. TCPSend($iSocket, _HexToString("01000274010002"))


    Oder irre ich mich ? :stock:

  • also laut drew benton geben die ersten 2 bytes die länge nach den ersten 6 bytes an
    also 0100 muss dann umgedreht werden zu 0001 = länge 1
    die nächsten 2 bytes sind der opcode
    danach kommt jeweils 1 byte für irgendwelche security bytes, falls das packet vom client kommt, ansonsten 0
    und danach kommt der inhalt des packets
    also:

    Code
    1. 0100 = länge (=1 byte)
    2. 0274 = opcode
    3. 01 = security count
    4. 00 = security crc
    5. 02 = inhalt


    [quelle]http://www.scribd.com/doc/14184021/Silk-Road-Security[/quelle]


    weiß jemand wie man mobs angreifen kann? hab mal versucht die packets von mobs zu sniffen und habe bis jetzt das:
    340019300200BF6D0000AC6ABC09305892FDDC4401205044C9A09744D95F01003058E1063903C4040102000000704100005C420000C842000000000018300200
    180021B00200AC6ABC09013058E8064103F904013058D344374050449E2F
    weiß aber nich wie bzw. ob die zusammen gehören und ob es auch die richtigen sind^^

  • Ich habe was sehr tolles von Drew, vll hilft euch das weiter mir weiter zu helfen den dort blicke ich nicht wirklich durch.
    Dort ist doch bestimmt irgendwie, das er die Packete richtig umwandeln kann und direkt senden kann.


  • welche packets willst du denn wie umwandeln?


    und wie kann ich encrypted packets versenden?
    03 00 4C 70 01 00 0D EC 11
    das wäre jetzt z.b. das packet (encrypted) um ein lvl 60 horse zu spawnen, aber wie hab ich das jetzt mit der bit mask 0x8000 zu verstehen

    Zitat

    However, an encrypted packet is marked with a bit mask of 0x8000


    wie kann ich das dann zu einem packet umwandeln und versenden, das er das horse spawnt und ich kein dc bekomme?^^

  • Dc bekommt man, wenn man ein falsches Packet an den Server sendet. D.h. wenn der Inhalt keine Bedeutung hat oder es diesen Opcode nicht gibt.
    Verschlüsseln müsst ihr mit den Keys aus den Handshake Packets, da ihr aber mit SrProxy oder nuConnector oder sowas in der Art arbeitet (wenn ich das richtig nachverfolgt habe) müsst ihr die Packets nicht verschlüsseln das erledigt der Proxy für euch.

  • ich hab mal versucht ein horse zu spawnen.
    ich benutze den nuConnector, wenn ich das packet dann sende, kommt die meldung, "cannot use the selected item while dead" oder so ähnlich und dann bin ich dc.
    wenn ich ingame ein horse spawne kommt da dieses packet:
    [C -> S][704C][3 bytes][Enc]
    0D EC 11
    sollte ich es dann doch verschlüsseln? und wie müsste man das dann ungefähr machen?

  • ich hab mal versucht ein horse zu spawnen.
    ich benutze den nuConnector, wenn ich das packet dann sende, kommt die meldung, "cannot use the selected item while dead" oder so ähnlich und dann bin ich dc.
    wenn ich ingame ein horse spawne kommt da dieses packet:
    [C -> S][704C][3 bytes][Enc]
    0D EC 11
    sollte ich es dann doch verschlüsseln? und wie müsste man das dann ungefähr machen?


    Wie dongi schon gesagt hat, brauchst du nichts verschlüsseln.
    Der Proxy macht das für dich.
    Einfach das Packet senden.

  • Ich habe es gradmal mit einem level 30 pferd benutzt.
    Dies ist der Code:


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


    @kuhkuh:
    Mit dem nix verschlüsseln das der Proxy das macht, meinst du damit das _HexToString ?
    Wenn ja wie sollte dann so ein TCPSend ausehen ?
    So z.B.
    ; Pferd aufsteigen (lvl 30)
    ;~ [C->J](7158 )0107460B000000
    Habe einfach die Klammern weggelassen

    Code
    1. TCPSend($iSocket,"71580107460B000000")