Beiträge von x0rain

    Zitat von felix;167606

    ASM wird meines wissens nich kompilliert. Wieder mal nen Klugscheißer, weißt du
    was Compiller machen? Genau, soe wandeln eine Programmiersprache in ASM
    um. Mir stellt sich also die Frage wieso man ASM in ASM compillieren sollte.

    lustig.


    Mach dir nich gleich ins Hemd .. dann schtreich den einen satz halt.

    Zitat von Sir_Hans;125116

    du kannst wie x0rain das machen. ich weiß nicht wofür du da eine if schleife brauchst, aber so würde es auch gehen:

    da wird die while schleife durch break unterbrochen wenn -1 eingegeben wurde.

    PS: programm nicht getestet...

    wie wärs damit :p

    Als erstes starte flyff ohne proxy und connecte auf den charserver. Dann öffne die cmd console und gib [FONT="Courier New"]netstat -n[/FONT] ein, woraufhin dir eine liste mit allen ausgehenden Verbindungen ausgegeben werden sollte. Die remoteadresse mit dem Port 28000 ist deine gesuchte ip

    wirklichen zufall gibts beim programmieren nicht, soll heißen hätte man das script womit der server die zahlen berrechnet könnte man dies vielleicht (denn ich weiß es nicht) nutzen um die nächst gewürfelte Zahl zu kalkulieren.

    funj0ker hat es grad ausprobiert .. er hat mir ein packet vom worldserver gegeben und die loginserver sessionid. Die errechneten checksums stimmten nicht übereinander.

    die server laufen auf unterschiedlichen IPs .. bei jedem neuen connect zu einem server wird dir eine sessionid zu geteilt. Die Sessionid's der vorherigen server werden nicht übernommen

    [btw: läuft deine crc32 function jetzt?]

    bitwise xor in c++ => "^"

    Beispiel: Berechnung der Length Checksum.

    Als example packet nehmen wir das was funj0ker gepostet hat :

    Code
    SessionID Packet: [5e] [08 00 00 00] [00 00 00 00] [d1 c5 d7 19]
    [5e] [65 72 0e 48] [04 00 00 00] [fa 25 17 18] [14 00 00 00]

    Und so berechnet man den data length checksum:

    Code
    data länge:
    integer      byte array                              bit array
       4    -> {04,00,00,00} -> {0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}

    das bit array muss man nun mit dem datastream in der wikipedia crc32 funktion ersetzen:

    Code
    int datastream[] = {0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; /* int: 4, LSB zuerst */
    	unsigned int crc32_rev = 0xffffffff; /* Schieberegister, Startwert (111...) */
    
    
        for (int i = 0; i < 32; ++i)
            if ((crc32_rev & 1) != datastream[i])
                 crc32_rev = (crc32_rev >> 1) ^ 0xEDB88320; 
            else 
                 crc32_rev >>= 1;
        printf("0x%08X\n", crc32_rev ^ 0x19d7c5d1); /* inverses Ergebnis, MSB zuerst */

    Das ergebeniss musst du jetzt nur noch reversen ( 0x480e7265 -> 0x65720e48 )

    Ach wikipedia hatte ich ganz vergessen :D. Ich hab die crc32 funktion ein wenig umgeschrieben, aber jetzt funktioniert die ohne größeren aufwand ( in bezug auf den datastream ).

    Naja wir sollten mal wieder auf das eigentliche thread Thema zurückkommen.

    naja nimm einfach ne andere sprache als java

    das einzige was ich zum thema bitconverter.getbytes in bezug auf java gefunden hab war folgendes:

    Code
    myByte= ByteBuffer.allocate(4);
    myByte.putInt( myInt);
    
    
    myByte.flip();
    mySocketChannel.write(myByte);


    ich kann kein java aber vllt kannste damit was anfangen ..

    das schaut mir wenig nach einem flyff packet aus, da diese immer mit 5e anfangen .. egal ob das packet vom server kommt oder vom client und in diesem packet ist nirgends ein 5e. Haste teamviewer oder irgnedwas in dieser richtung? .. dann kann ich ma drüber gucken.

    Wo bitteschön siehst du da ein 5e?

    [FONT="Courier New"]CRC32 ( BitConverter.GetBytes(4) ) --> 1373222836
    1373222836 Xor 433571281 --> 1208906341
    1208906341 ---[Hex]---> 480e7265 ---[reverse]---> 65720e48[/FONT]

    Welche CRC32 Funktion benutzt du? (ich hab hier mal das xor 0xffffffff weggelassen das dies schon in meiner crc32 funktion getan wird.

    Edit: Sorry ich hatte die Funktion [FONT="Courier New"]BitConverter.GetBytes()[/FONT] vergessen einzubauen aber eigentlich muss bei deiner CRC32 funktion dabei stehen wie man die benutzt ( Das ist auf die bezogen die ich benutzte .. siehe source code ). [FONT="Courier New"]BitConverter.GetBytes(4) --> {4 & 255, 4 >> 8 & 255, 4 >> 16 & 255, 4 >> 24 & 255}[/FONT]

    berrechnung der sessionid:
    [FONT="Courier New"][d1 c5 d7 19] ---[reverse]---> [19 d7 c5 d1] ---[dec]---> 433571281[/FONT]

    Berechnung der Data Length Checksum:
    [FONT="Courier New"]( CRC32-IEEE-802.3 ( BitConverter.GetBytes(4) ) xor 0xffffffff ) xor 433571281
    Das Ergebnis noch in Hex umwandeln und dann reversen ([01 02 03 04] -> [04 03 02 01])
    (Bei mir gibt die crc32 funktion eine dezimal Zahl wieder anstatt einer hexadecimal Zahl)[/FONT]

    Dein fehler: Du darfst nicht die länge mit 0xffffffff xor'n sondern musst diese erst mit der crc32 funktion hashen. Der errechnete Hash wird anschließend mit 0xffffffff (= -1) gexor'd

    Zitat von Xenox3;76250

    omg TY :D genau das war mein problem wie ich die id raus bekomme

    Anfang ????? Länge ?????? Kp ist immer so LängeData ????? Data

    [5e] [2b 8a 32 93] [0f 00 00 00] [04 e6 68 ce] [ff ff ff ff 00 00 ff 00] [03] [00 00 00] [68 69 31]
    [5e] [4e ed 8e 2b] [0e 00 00 00] [20 25 23 e7] [ff ff ff ff 00 00 ff 00] [02] [00 00 00] [68 69]
    [5e] [b5 5a 2a 14] [14 00 00 00] [8e a5 71 4e] [ff ff ff ff 00 00 ff 00] [08] [00 00 00] [2f 73 20 68 69 31 32 33]
    [5e] [ab 6c 65 28] [0e 00 00 00] [c5 a4 c8 e4] [ff ff ff ff 00 00 ff 00] [02] [00 00 00] [68 69]

    wie man die 2 hashs raus bekommt ist das einzige problem die ändern sich andauernd-.-

    Wir splitten eins deiner packete mal komplett auf:

    Code
    [5e] --> Header
    [2b 8a 32 93] --> Data Length Checksum
    [0f 00 00 00] --> Data Length
    [04 e6 68 ce] --> Data Checksum
    [ff ff ff ff 00 00 ff 00 03 00 00 00 68 69 31] --> Data

    [COLOR="Red"]Data Length Checksum (HASH NR1)[/COLOR]: Wir inverten ( xor 0xffffffff ) den CRC-32-IEEE_802.3 Hash der Data Länge ( die in diesem fall 15 beträgt ( siehe Data Length ) ) und xorn diesen mit der SessionID ( welche dem Client mittels des ersten Packets mitgeteilt wird. Sie setzt sich dort aus den bytes 10 - 13 zusammen )

    [COLOR="Red"]Data Length[/COLOR]: Little endian der byte anzahl der data ( ff ff ff ff 00 00 ff 00 03 00 00 00 68 69 31 )

    [COLOR="Red"]Data Checksum (HASH NR2)[/COLOR]: siehe Data Length Checksum. Replace jedoch die Data Länge mit der Data ( ff ff ff ff 00 00 ff 00 03 00 00 00 68 69 31 )


    Edit:

    Vielleicht helfen dir einer dieser beiden source codes den zusammenhang zu verstehen ( leider kann ich nicht so gut c++):

    generelle Packetstruktur: