---->QUESTO E' IL MONDO DEGLI HACKER!<----

Benvenuti nel Forum. =D Saluti il vostro Admin Very Happy

    Come codare un server

    Condividere
    avatar
    Admin
    Admin
    Admin

    Messaggi : 109
    Reputazione : 0
    Data d'iscrizione : 27.03.10
    Località : A casa mia :D xD

    Come codare un server

    Messaggio Da Admin il Lun Mar 29, 2010 10:52 am

    Ciao a tutti, oggi vi spiegherò e mostrerò come codare un server
    Cominciamo.
    Il “protocollo” di Habbo consiste in alcuni messaggi.
    Client>Server:
    Questi messaggi, chiamati anche “pacchetti” possiedono un 'header', che non è altro che il loro ID codificato in Base64, così 'B@' (statistiche dei pets) non è un codice a caso, infatti se si decodifica con un encoder di Habbo in Base64 esso diventerà '128'. Codificandolo di nuovo in Base64, magicamente diventerà di nuovo 'B@'.
    E’ più facile riconoscere i pacchetti dal loro ID, invece che decodificarli tutti. (almeno per me )

    Server>Client :
    Qui continuiamo ad avere la codifica degli IDs in Base64, ma adesso essa riguarda il contenuto dei messaggi dal server>client:
    Il contenuto è spesso un “mix” di testo e codici codificati in VL64; se ci sono più stringhe in uno stesso messaggio, spesso esse vengono divise tramite char2, char13 etc.
    Ogni messaggio ha bisogno di una fine, in modo che il client possa dire: “Cacchio, questo è tutto il pacchetto......Allora lo posso processare!”.
    Nel “protocollo” di Habbo questo processo è effettuato da 'char1', che consente al client di conoscere quando è finito un pacchetto e quindi quando esso non ha più bisogno di “aspettare” per ricevere altre informazioni; in questo modo il client processa il messaggio. (Questa è una cosa molto divertente perché se si potesse “iniettare” la char1 nella missione ad esempio, il client leggerebbe il messaggio come un pacchetto e lo elaborerebbe…..In questo modo funzionano i programmi script )

    Quando il messaggio server/client viene ricevuto dal client/server, esso decoda i primi due caratteri in Base64, così ottiene l’ID del pacchetto.
    Il client/server in seguito processa di nuovo il codice corretto al fine di “dare” il messaggio e il suo contenuto.
    Per quanto riguarda il server di Habbo, è sconosciuto come possa fare ciò per noi “comuni esseri mortali”, dal momento che non ne abbiamo mai avuto del codice sorgente, e per questo possiamo solamente fare delle supposizioni. Il Java non supporta lo scambio di stringhe (perciò, oltre ad essere molto inefficiente e stupido, è molto più lento lo scambio di numeri), così deve funzionare con qualcosa di diverso.
    Io non penso che il server della Sulake funzioni con uno “switch” che seleziona l’azione corretta. (come accade in tutti i retro server fino all’arrivo del Project Thor di Joeh. Thor lavora tramite alcune classi 'reattori' “attaccate” alla connessione; ogni 'reattore' contiene diversi “ascoltatori” per determinare i messaggi; il server ispeziona tutti gli “ascoltatori” e prova ad invocare la giusta funzione…..Questo metodo è molto efficiente, poiché fa risparmiare un sacco di dati ecc.....Per questo motivo Nillus utilizzerà questo metodo per la nuova versione del Woodpecker).

    Ritornando a noi, abbiamo appena visto come il client processa i messaggi, quindi adesso possiamo decompilare i pacchetti per vedere il “cast name”, ossia la loro funzione ecc.
    Ecco un esempio pratico:
    Citazione:
    Questi codici sono di Matt di Script.O.Matic., e si riferiscono a tutti gli handlers del client v26 di Habbo.
    Questi codici servono per farvi capire cosa succede al client a causa dei messaggi del server.
    Per capire meglio:
    Il numero prima dell’handler è l’ID del messaggio, ma credo che voi a voi ragazzi sia più familiare l’header, che è l’ID del messaggio codificato in Base64, così i primi tre risulteranno:
    0 = "@@"
    1 = "@A"
    2 = "@B"

    E una prova finale:
    312: [["One Way Door Manager", #changeStatus]]
    312 in Base64: 'Dx', che è l’ 'header' del pacchetto che si ottiene entrando in una stanza (nel cast name viene chiamato "One Way Door Manager").
    Capito come funziona?
    Codice:

    0: [[#login_handler, #handleHello]]
    1: [[#login_handler, #handleSecretKey]]
    2: [[#login_handler, #handleRights]]
    5: [[#login_handler, #handleUserObj]]
    35: [[#login_handler, #handleUserBanned]]
    50: [[#login_handler, #handlePing]]
    52: [[#login_handler, #handleEPSnotify]]
    139: [[#login_handler, #handleSystemBroadcast]]
    141: [[#login_handler, #handleCheckSum]]
    161: [[#login_handler, #handleModAlert]]
    229: [[#login_handler, #handleAvailableBadges]]
    257: [[#login_handler, #handleSessionParameters]]
    277: [[#login_handler, #handleCryptoParameters]]
    278: [[#login_handler, #handleEndCrypto]]
    287: [[#login_handler, #handleHotelLogout]]
    308: [[#login_handler, #handleSoundSetting]]
    354: [[#login_handler, #handleLatencyTest]]
    290: [[#openinghours_handler, #handleAvailabilityStatus]]
    291: [[#openinghours_handler, #handleInfoHotelClosing]]
    292: [[#openinghours_handler, #handleInfoHotelClosed]]
    293: [[#openinghours_handler, #handleAvailabilityTime]]
    294: [[#openinghours_handler, #handleLoginFailedHotelClosed]]
    12: [[#friend_list_handler, #handleFriendListInit]]
    13: [[#friend_list_handler, #handleFriendListUpdate]]
    132: [[#friend_list_handler, #handleFriendRequest]]
    260: [[#friend_list_handler, #handleError]]
    314: [[#friend_list_handler, #handleFriendRequestList]]
    315: [[#friend_list_handler, #handleFriendRequestResult]]
    349: [[#friend_list_handler, #handleFollowFailed]]
    363: [[#friend_list_handler, #handleMailNotification]]
    364: [[#friend_list_handler, #handleMailCountNotification]]
    134: [[#instant_messenger_handler, #handleIMMessage]]
    135: [[#instant_messenger_handler, #handleIMInvitation]]
    261: [[#instant_messenger_handler, #handleIMError]]
    262: [[#instant_messenger_handler, #handleInvitationError]]
    387: [[#ig_handler, #handle_directory_status]]
    388: [[#ig_handler, #handle_ENTER_ARENA_FAILED]]
    389: [[#ig_handler, #handle_GAME_REJOIN]]
    390: [[#ig_handler, #handle_player_exited_game_arena]]
    391: [[#ig_handler, #handle_level_hall_of_fame]]
    392: [[#ig_handler, #handle_start_failed]]
    393: [[#ig_handler, #handle_join_failed]]
    394: [[#ig_handler, #handle_in_arena_queue]]
    395: [[#ig_handler, #handle_stage_still_loading]]
    396: [[#ig_handler, #handle_game_not_found]]
    399: [[#ig_handler, #handle_game_chat]]
    400: [[#ig_handler, #handle_enter_arena]]
    401: [[#ig_handler, #handle_arena_entered]]
    402: [[#ig_handler, #handle_load_stage]]
    403: [[#ig_handler, #handle_stage_starting]]
    404: [[#ig_handler, #handle_stage_running]]
    405: [[#ig_handler, #handle_stage_ending]]
    406: [[#ig_handler, #handle_game_ending]]
    407: [[#ig_handler, #handle_game_created]]
    408: [[#ig_handler, #handle_game_long_data]]
    409: [[#ig_handler, #handle_create_game_info]]
    410: [[#ig_handler, #handle_game_list]]
    413: [[#ig_handler, #handle_user_joined_game]]
    414: [[#ig_handler, #handle_user_left_game]]
    415: [[#ig_handler, #handle_game_observation_started_short]]
    416: [[#ig_handler, #handle_game_cancelled]]
    417: [[#ig_handler, #handle_game_long_data]]
    418: [[#ig_handler, #handle_game_started]]
    355: [[#guide_handler, #handleInvitation]]
    359: [[#guide_handler, #handleInvitationFollowFailed]]
    360: [[#guide_handler, #handleInvitationCancelled]]
    425: [[#guide_handler, #handleInitTutorServiceStatus]]
    426: [[#guide_handler, #handleEnableTutorServiceStatus]]
    163: [[#getServerDate, #handle_date]]
    300: [[#soundmachine_handler, #handle_song_info]]
    301: [[#soundmachine_handler, #handle_machine_sound_packages]]
    302: [[#soundmachine_handler, #handle_user_sound_packages]]
    332: [[#soundmachine_handler, #handle_invalid_song_name]]
    322: [[#soundmachine_handler, #handle_song_list]]
    323: [[#soundmachine_handler, #handle_play_list]]
    324: [[#soundmachine_handler, #handle_song_missing_packages]]
    325: [[#soundmachine_handler, #handle_play_list_invalid]]
    326: [[#soundmachine_handler, #handle_song_list_full]]
    331: [[#soundmachine_handler, #handle_new_song]]
    333: [[#soundmachine_handler, #handle_user_song_disks]]
    334: [[#soundmachine_handler, #handle_jukebox_disks]]
    335: [[#soundmachine_handler, #handle_jukebox_song_added]]
    336: [[#soundmachine_handler, #handle_song_locked]]
    337: [[#soundmachine_handler, #handle_jukebox_playlist_full]]
    338: [[#soundmachine_handler, #handle_invalid_song_length]]
    339: [[#soundmachine_handler, #handle_song_saved]]
    365: [[#roomdimmer_handler, #handleDimmerPresets]]]
    148: [[#hobba_handler, #handle_forhelp]]
    149: [[#hobba_handler, #handle_picked_]]
    273: [[#hobba_handler, #handle_delete_]]
    274: [[#hobba_handler, #handle__reply]]
    299: [[#error_report_handler, #handle_error_report]]
    59: [[#roomkiosk_handler, #handle_flatcreated]]
    33: [[#roomkiosk_handler, #handle_error]
    [#room_handler, #handle_error]
    [#navigator_handler, #handle_error]
    [#login_handler, #handleErr]]
    353: [[#roomkiosk_handler, #handle_webShortcut]]
    319: [[#dialogs_handler, #handle_get_pending_response]]
    320: [[#dialogs_handler, #handle_pending_CFHs_deleted]]
    321: [[#dialogs_handler, #handle_cfh_sending_response]]
    24: [["Chat Manager", #handle_chat]]
    25: [["Chat Manager", #handle_chat]]
    26: [["Chat Manager", #handle_chat]]
    312: [["One Way Door Manager", #changeStatus]]
    -1: [[#room_handler, #handle_disconnect]
    [#login_handler, #handleDisconnect]]
    18: [[#room_handler, #handle_clc]]
    19: [[#room_handler, #handle_opc_ok]]
    28: [[#room_handler, #handle_users]]
    29: [[#room_handler, #handle_logout]]
    30: [[#room_handler, #handle_OBJECTS]]
    31: [[#room_handler, #handle_heightmap]]
    32: [[#room_handler, #handle_activeobjects]]
    34: [[#room_handler, #handle_status]]
    41: [[#room_handler, #handle_flat_letin]]
    45: [[#room_handler, #handle_items]]
    42: [[#room_handler, #handle_room_rights]]
    43: [[#room_handler, #handle_room_rights]]
    46: [[#room_handler, #handle_flatproperty]]
    47: [[#room_handler, #handle_room_rights]]
    48: [[#room_handler, #handle_idata]]
    62: [[#room_handler, #handle_doorflat]]
    63: [[#room_handler, #handle_doordeleted]]
    64: [[#room_handler, #handle_doordeleted]]
    69: [[#room_handler, #handle_room_ready]]
    70: [[#room_handler, #handle_youaremod]]
    71: [[#room_handler, #handle_showprogram]]
    76: [[#room_handler, #handle_no_user_for_gift]]
    83: [[#room_handler, #handle_items]]
    84: [[#room_handler, #handle_removeitem]
    [#buffer_handler, #handle_removeitem]]
    85: [[#room_handler, #handle_updateitem]
    [#buffer_handler, #handle_updateitem]]
    88: [[#room_handler, #handle_stuffdataupdate]
    [#buffer_handler, #handle_stuffdataupdate]]
    89: [[#room_handler, #handle_door_out]]
    90: [[#room_handler, #handle_dice_value]]
    91: [[#room_handler, #handle_doorbell_ringing]]
    92: [[#room_handler, #handle_door_in]]
    93: [[#room_handler, #handle_activeobject_add]]
    94: [[#room_handler, #handle_activeobject_remove]
    [#buffer_handler, #handle_activeobject_remove]]
    95: [[#room_handler, #handle_activeobject_update]
    [#buffer_handler, #handle_activeobject_update]]
    98: [[#room_handler, #handle_stripinfo]]
    99: [[#room_handler, #handle_removestripitem]]
    101: [[#room_handler, #handle_stripupdated]]
    102: [[#room_handler, #handle_youarenotallowed]]
    103: [[#room_handler, #handle_othernotallowed]]
    105: [[#room_handler, #handle_trade_completed]]
    108: [[#room_handler, #handle_trade_items]]
    109: [[#room_handler, #handle_trade_accept]]
    110: [[#room_handler, #handle_trade_close]]
    112: [[#room_handler, #handle_trade_completed]]
    129: [[#room_handler, #handle_presentopen]]
    131: [[#room_handler, #handle_flatnotallowedtoenter]]
    140: [[#room_handler, #handle_stripinfo]]
    208: [[#room_handler, #handle_roomad]]
    210: [[#room_handler, #handle_petstat]]
    219: [[#room_handler, #handle_heightmapupdate]]
    228: [[#room_handler, #handle_userbadge]]
    230: [[#room_handler, #handle_slideobjectbundle]]
    258: [[#room_handler, #handle_interstitialdata]]
    259: [[#room_handler, #handle_roomqueuedata]]
    254: [[#room_handler, #handle_youarespectator]]
    283: [[#room_handler, #handle_removespecs]]
    266: [[#room_handler, #handle_figure_change]]
    298: [[#room_handler, #handle_spectator_amount]]
    309: [[#room_handler, #handle_group_badges]]
    310: [[#room_handler, #handle_group_membership_update]]
    311: [[#room_handler, #handle_group_details]]
    345: [[#room_handler, #handle_room_rating]]
    350: [[#room_handler, #handle_user_tag_list]]
    361: [[#room_handler, #handle_user_typing_status]]
    362: [[#room_handler, #handle_highlight_user]]
    367: [[#room_handler, #handle_roomevent_permission]]
    368: [[#room_handler, #handle_roomevent_types]]
    369: [[#room_handler, #handle_roomevent_list]]
    370: [[#room_handler, #handle_roomevent_info]]
    419: [[#room_handler, #handle_ignore_user_result]]
    420: [[#room_handler, #handle_ignore_list]]
    3: [[#habbo_club_handler, #handle_ok]
    [#login_handler, #handleLoginOK]
    [#friend_list_handler, #handleOk]]
    7: [[#habbo_club_handler, #handle_scr_sinfo]]
    280: [[#habbo_club_handler, #handle_gift]]
    4: [[#photo_handler, #handle_film]]
    16: [[#navigator_handler, #handle_flat_results]]
    54: [[#navigator_handler, #handle_flatinfo]]
    55: [[#navigator_handler, #handle_flat_results]]
    57: [[#navigator_handler, #handle_noflatsforuser]]
    58: [[#navigator_handler, #handle_noflats]]
    61: [[#navigator_handler, #handle_favouriteroomresults]]
    130: [[#navigator_handler, #handle_flatpassword_ok]]
    220: [[#navigator_handler, #handle_navnodeinfo]]
    221: [[#navigator_handler, #handle_userflatcats]]
    222: [[#navigator_handler, #handle_flatcat]]
    223: [[#navigator_handler, #handle_spacenodeusers]]
    224: [[#navigator_handler, #handle_cantconnect]]
    225: [[#navigator_handler, #handle_success]]
    226: [[#navigator_handler, #handle_failure]]
    227: [[#navigator_handler, #handle_parentchain]]
    286: [[#navigator_handler, #handle_roomforward]]
    351: [[#navigator_handler, #handle_recommended_room_list]]
    6: [[#catalogue_handler, #handle_purse]]
    67: [[#catalogue_handler, #handle_purchase_ok]]
    65: [[#catalogue_handler, #handle_purchase_error]]
    68: [[#catalogue_handler, #handle_purchase_nobalance]]
    126: [[#catalogue_handler, #handle_catalogindex]]
    127: [[#catalogue_handler, #handle_catalogpage]]
    296: [[#catalogue_handler, #handle_purchasenotallowed]]
    295: [[#dynamicdownloader_handler, #handle_furni_revisions]]
    297: [[#dynamicdownloader_handler, #handle_alias_list]]
    303: [[#recycler_handler, #handle_recycler_configuration]]
    304: [[#recycler_handler, #handle_recycler_status]]
    305: [[#recycler_handler, #handle_approve_recycling_result]]
    306: [[#recycler_handler, #handle_start_recycling_result]]
    307: [[#recycler_handler, #handle_confirm_recycling_result]]
    316: [[#poll_handler, #handle_poll_offer]]
    317: [[#poll_handler, #handle_poll_contents]]
    318: [[#poll_handler, #handle_poll_error]]
    352: [[#new_user_help_handler, #handleHelpItems]]
    356: [[#new_user_help_handler, #handleTutorsAvailable]]
    357: [[#new_user_help_handler, #handleInvitingCompleted]]
    358: [[#new_user_help_handler, #handleInvitationExists]]
    421: [[#new_user_help_handler, #handleInvitationSent]]
    423: [[#new_user_help_handler, #handleGuideFound]]
    424: [[#new_user_help_handler, #handleInviterLeftRoom]]
    166: [[#statsBrokerJs, #handle_update_stats]]

    Gli ultimi codici riguardano le Guide ecc, come potete vedere.
    Basta usare un decoder in Base64 per convertire l’ID del messaggio nel proprio equivalente decodificato.


    E’ all’interno del client di Habbo che si può vedere che ogni messaggio server>client (per esempio, 'BK', 139), corrisponde a '[[#login_handler, #handleSystemBroadcast]]', che è esattamente la funzione che il pacchetto compie.
    In seguito abbiamo '@c', 35, che diventa '[[#login_handler, #handleUserBanned]]', e così via….
    Adesso credo che abbiate capito….

    Bisogna solamente ricordarsi che:
    - Il “protocollo” di Habbo consiste in messaggi
    - L’ 'header' non è scelto a caso, ma è l’ID del messaggio codato in Base64
    - I messaggi consistono in: ID codificato + contenuto separati da char2 etc/altri codici codificati in B64/V64 + char1 per concludere il messaggio e per segnalare al client che il pacchetto è completo
    - Nel messaggio niente è statico tranne l’ID codificato in B64 ed il char1 finale, quindi non è possibile usare un semplice packetlogger e incollare i pacchetti nel server
    Ecco un esempio pratico; questo codice è stato usato da Nillus per codare il cambio della missione nella nuova versione del Woodpecker:
    Codice PHP:
    ///
    /// "@d" - "MESSENGER_ASSIGNPERSMSG"
    ///
    public void Listener36()
    {
    string newMotto = Request.getParameter(0);
    Session.User.messengerMotto = newMotto;
    Session.User.updateAppearanceDetails();

    Response.Initialize(147); // "BS"
    Response.appendClosedValue(newMotto);
    sendResponse();
    }
    Guardate, il pacchetto corrente si trova in 'Request', che è una stringa che può direttamente trovare il codice in B64 del pacchetto.......
    Il nuovo messaggio server>client è chiamato 'Response', ed usando il metodo 'Initialize', è possibile assegnare un ID al messaggio.
    In seguito è possibile aggiungere dei valori ad esso, come ad esempio 'appendClosedValue' pr aggiungere il suddetto valore + char2, ma anche 'appendWired(NUMBER)' ecc.
    In fine è possibile usare 'sendResponse' per convertire la 'risposta' corrente in una stringa, ed infine usare char1 per chiudere il pacchetto e inviarlo al client.
    Quindi è possibile usare la funzione 'Response.Initialize' di nuovo per cominciare una nuova “risposta” ecc
    Questa struttura è molto più funzionale degli altri vecchi server.

    La mia speranza è che vi abbia aiutato almeno un poco, e che quindi contribuiate allo sviluppo di retro server.
    Molte persone non sanno che inviare il pacchetto, 'BKHAHAHA DJALEXXSTYLE REGNA' significa associarlo a Chr(1)'.

    - DJAlexxstyle

    Una guida nella guida .
    VL64 è molto utilizzato nei pacchetti server > client.
    Innanzitutto che cos’è VL64? Bene, diciamo che è un “linguaggio” di codifica dei numeri, e li rende incomprensibili per l’uomo ma comprensibili per il client di Habbo.
    Esempio:
    I = 1
    J = 2
    K = 3
    PA = 4

    Si può vedere una scala crescente di numeri, vedete? [1=2-3]
    E anche una scala per le lettere. [I-J-K]
    -1 corrisponde a M in VL64.

    Ok, sembra molto facile…...
    Ma secondo voi come appare un numero grande in VL64?
    Codifichiamo 8123732.
    Risultato: "hUuoG"
    Ok, è molto facile!
    In realtà non proprio semplicissimo…..
    Ma se si da’ un’occhiata al codice del VL64 (che si può trovare nelle classi del JASE, dell’HOLO ecc.....) si può capire che questo è un linguaggio molto “logico”.

    Ma allora perché utilizzare questa criptazione solamente sui numeri?
    Per i pacchetti, Habbo preferisce utilizzare moltissimi numeri, uno dopo l’altro, senza delimitatori.
    Nel senso che se si vogliono utilizzare i numeri 10, 39, 843, e 7 uno dopo l’altro in un pacchetto, nel “protocollo” di Habbo è possibile scriverlo così: 10398437, nonostante il risultato sia un numero completamente diverso!
    E’ qui che entra in gioco il VL64.
    Andiamo a decodificare i numeri 10, 39, 843 e 7...
    10: RB
    39: SI
    843: [RC
    7: SA

    "Fatto, e adesso? Perchè?"
    Bene, dovete sapere che il VL64 ha una parte 'magica', che è possibile spiegare in questo modo:
    Se decodifichiamo un’intera stringa in VL64, come ad esempio nel nostro caso RBSI[RCSA, solamente il primo numero codificato ritornerà un vero e proprio numero!
    Così nel nostro caso, solamente il 10 (il primo numero codificato) sarà il risultato della nostra decodifica, nonostante abbiamo inserito un’intera stinga composta da tre altri numeri in VL64!

    Adesso arriva la parte delicata, ma vi svelerò un trucco su come decodificare un’intera stringa nel numero originale:
    1) Decodifichiamo RBSI[RCSA, I modo da ottenere come risultato 10
    2) Codifichiamo 10 in VL64, così da ottenere RB.
    3) RB è di 2 caratteri, R-B
    4) Adesso non ci resta che 'tagliare' il primo numero (RB = 10) dalla nostra stringa RBSI[RCSA, in modo da ottenere la lunghezza della prima parte. In un linguaggio .NET per esempio, è possibile ottenere lo stesso risultato in questo modo:
    STRING OBJECT.Substring(start,length).
    Se la lunghezza è supportata, otterremo un processo che farà semplicemente in modo che venga eseguita la 'fine della stringa', “prendendo” qualsiasi cosa dopo lo 'start'. Questo è ciò che ci serve, dato che noi vogliamo solamente togliere la prima parte (di cui conosciamo il valore, ossia 10 nel nostro caso), e lasciare intatto il resto della stringa.
    Quindi: STRING OBJECT.Substring(2)
    Risulterà:
    SI[RCSA

    Ok, adesso non ci basta che ripetere il procedimento per tutti gli altri numeri codificati in VL64, e abbiamo finito! =D
    Per aiutarvi a decodificare un’intera stringa in un numero, annotate il primo numero (poi il secondo, il terzo ecc) da qualche parte, poi codificatelo in VL64 (STRING OBJECT.Length in .NET), ed ottenete il resto della stringa tramite un comando di manipolazione come quello che abbiamo spiegato sopra, ossia con .Substring.

    Può sembrarvi difficile, ma fidatevi: è più difficile spiegarlo! Ci vorrebbero migliaia di parole!
    Adesso vi varò vedere un codice, utilizzato da Nillus, che riguarda il VL64 e che permette di ottenere una stringa quando si codifica un numero, e un numero intero quando si decodifica (in pratica ci permette di ottenere quello spiegato appena 10 righi sopra in meno di 10 secondi ).....
    Codice PHP:
    // encodeVL64, returns a string
    // decodeVL64, returns an integer

    string SomeInput = "PAJIKPASASF";
    while(SomeInput != "") // Keep looping this loop till the string is empty (so, completed with decoding)
    {
    int currentNumber = decodeVL64(SomeInput);
    // Do something with current number, write it in database or something, just where you need the number for
    int currentNumberLength = encodeVL64(currentNumber).ToString().Length; // Encode the number to it's VL64 equivalent to see what it would be if you only encoded that number to VL64, and get it's length
    someInput = someInput.Substring(currentNumberLength); // Only keep the part of SomeInput after the string
    } // Proceed to next cycle of the loop (so, decode the next number)
    I questo modo possiamo usare molti numeri uno dopo l’altro senza che si confondano tra loro….Ecco perché Habbo vuole lasciare i propri pacchetti così piccoli.

    Spero che abbiate capito.

    In ogni modo, poiché mi rendo conto che il processo fatto a mano può risultare molto lungo e difficile (soprattutto per pacchetti grandi), sono qui a consigliarvi un’applicazione davvero fatta molto bene, che “guarda caso” è stata codata da Nillus.....Sembra quasi che gli stiamo facendo pubblicità ....Comunque il programma in questione si chiama Nillus Packet Scout, e credo che molti di voi, soprattutto i più esperti e intelligenti lo abbiano già provato e ormai non ne possano fare più a meno......Uno dei motivi è soprattutto il fatto che il programma è capace di analizzare un’intera stringa in VL64 decodificandola nel proprio valore numerico, quindi niente più passaggi fatti a mano! Ma soprattutto, grazie a questa sua funzione, aiuta moltissimo nel trovare la struttura del pacchetto.....

    Adesso vi mostrerò come il programma può decodificare un pacchetto di notevole lunghezza (ad esempio un pacchetto del BattleBall) per voi, senza farvi sforzare.....Cominciamo:
    Pacchetto completo compreso di header:
    CtIQAJPCSAIJPCHJHJXKDX]BIIJQAPCRE
    Allora, abbiamo Ct che è l’header.
    Attenzione: Anche se il VL64 decodifica sottoforma di numeri, non è composto di soli numeri!

    Andiamo a rimuovere l’header ("Ct") e scriviamo il resto nel programma...
    Risultato:
    Quote:
    Result of this VL64 scout session was:
    # I = 1
    # QA = 5
    # J = 2
    # PC = 12
    # SA = 7
    # I = 1
    # J = 2
    # PC = 12
    # H = 0
    # J = 2
    # H = 0
    # J = 2
    # XKD = 1068
    # X]B = 628
    # I = 1
    # I = 1
    # J = 2
    # QA = 5
    # PC = 12
    # RE = 22

    Processed input string summary: I-QA-J-PC-SA-I-J-PC-H-J-H-J-XKD-X]B-I-I-J-QA-PC-RE
    Evviva! Finalmente ecco i numeri!
    Adesso si può fare qualcosa con questi numeri, vero? Si che si può fare qualcosa: si possono codare nel proprio server!
    Questa è una parte che non si può spiegare, altrimenti starei qui a scriverla......
    Non è possibile infatti codare dei server semplicemente usando dei “codici pronti”......Bisogna infatti ragionarci su, e non, come ho già detto prima, solamente fare un “Copia & Incolla”!

    Ritornando a noi, adesso proviamo a eseguire lo stesso passaggio eseguito dal programma, ma questa volta “a mano”.....Noteremo che i numeri che ci verranno fuori sono gli stessi che il programma ci ha fornito......
    E allora come è possibile che un processo per il quale si possono impiegare anche ore viene eseguito in pochi attimi? Come funziona allora questo programma?
    La risposta è semplice: esegue un loop continuo (con i codici visti sopra) finchè la stringa non risulta essere vuota…..E alla fine “outputta” il risultato della decodifica.....
    Un ottimo esempio di utilizzo è il BattleBall, lo SnowStorm e gli Ecotron, nei quali ci sono tantissimi numeri e abbiamo bisogno di averli tutti ordinati.

    ---------------------------------------------------------------------------------------------
    Admin. Cool

      La data/ora di oggi è Mer Apr 26, 2017 7:07 am