Salve ospite, se leggi questo messaggio vuol dire che non sei registrato, cosa aspetti ? Premi qui per registrarti La registrazione è completamente gratuita e ti permetterà di usufruire di tutte le funzionalità del nostro forum. Buona navigazione.


Vendo, Compro, Scambio NosTale! Riapre il Black Market, concludi i tuoi scambi NosTale gratuitamente! Più info  -   Accedi alla sezione
Download file Server : File Retro Server NosTale
Visita la nuova sezione di BorderGame dedicata a Blade & Soul! Sezione Blade and Soul

 
Valutazione discussione:
  • 6 voti - 2.5 media
  • 1
  • 2
  • 3
  • 4
  • 5
DecryptSessionPacket big problem
28-01-2013 06:56 AM
Messaggio: #1
DecryptSessionPacket big problem
°Jin°
*

Novizio

Messaggi : 2

Registrato dal : Dec 2012

Reputazione : 0

Stato : Offline


Premi :



Hi I want to start out learning to write a small game server in C + +
But I get the not Decrypt Session

My code
Codice:
int iSessionID; // for SessionID  
std::string sSessionID = DecryptSessionPacket(Recv); // save Decrypt SessionID
std::vector<std::string> pSessionID = split(sSessionID.c_str(),  ' ');  // Split sSessionID and save on vector
std::stringstream ss(pSessionID[1].c_str());  // save result from pSessionID
ss >> iSessionID;  // convert string to int
std::cout << iSessionID << std::endl;  // replay iSessionID

But it does not want to play the session
NosTale has one new decryption / encryption?

This is my SessionPacketDecrpytion of Trollface

std::string DecryptSessionPacket(std::string str)
{
    std::string    encrypted_string;

    for (int i = 1; i < str.length(); i++)
    {
        if (str[i] == 0xE) { return encrypted_string; }

        unsigned char firstbyte = str[i] - 0xF;
        unsigned char secondbyte = firstbyte;
        secondbyte &= 0xF0;
        firstbyte =    firstbyte - secondbyte;
        secondbyte >>=    0x4;

        switch (secondbyte)
        {
        case 0:
            encrypted_string +=    ' ';
        break;

        case 1:
            encrypted_string +=    ' ';
        break;

        case 2:
            encrypted_string +=    '-';
        break;

        case 3:
            encrypted_string +=    '.';
        break;

        default:
            secondbyte += 0x2C;
            encrypted_string +=    secondbyte;
        break;
        }

        switch (firstbyte)
        {
        case 0:
            encrypted_string +=    ' ';
        break;

        case 1:
            encrypted_string += ' ';
        break;

        case 2:
            encrypted_string += '-';
        break;

        case 3:
            encrypted_string += '.';
        break;

        default:
            firstbyte += 0x2C;
            encrypted_string +=    firstbyte;
        break;
        }
    }

    return encrypted_string;
}
Hope someone can help me

Ps: Sorry for my bad english
(Questo messaggio è stato modificato l'ultima volta il: 31-01-2013 01:34 PM da Utente.)
Torna al primo messaggio
Email Cerca Rispondi
28-01-2013 01:22 PM
Messaggio: #2
RE: DecryptSessionPacket big problem
Ð3V!L
Bannati
Utente Saggio
Utente Storico

Banned

Messaggi : 1,416

Registrato dal : Apr 2012


Stato : Offline


Premi :



session decrypt is correct..
if i don't know your code for receive i can't help you..
contact me on skype: thesmilux..

on bordergame just i'm, thekingprogrammer, trollface and ernilos know how complete a server..
other people don't know sockets, c++ etc.. D:
Torna al primo messaggio
Email Cerca Rispondi
29-01-2013 07:41 AM
Messaggio: #3
RE: DecryptSessionPacket big problem
°Jin°
*

Novizio

Messaggi : 2

Registrato dal : Dec 2012

Reputazione : 0

Stato : Offline


Premi :



Okay I have the Session

my Code
Codice:
#pragma comment(lib, "Ws2_32.lib")

// Define
#define MAX_SOCKET 10
#define RECV_BUFFER 512

// Includes
#include <iostream>
#include <WinSock2.h>
#include <Windows.h>
#include <vector>
#include <sstream>

using namespace std;

int WsaStart(void); // Simpel WSA-Start Function
std::string DecryptSessionPacket(std::string str); // Decrypt Session Function  
std::vector<std::string> split( std::string str, char delimiter ); // Split Function
std::string DecryptGamePacket2(unsigned char str[]); // DecryptGame2 Function
std::string DecryptGamePacket(int session_id, unsigned char *str, int length); // DecryptGame Function


int main()
{
    SetConsoleTitle(L"Simpel Server");
    
    int iResult;
    long lRc;
    SOCKET sAcceptSocket;
    SOCKADDR_IN sAddr;
    char cBuf[RECV_BUFFER];
    char rBuf[RECV_BUFFER];
    FD_SET FdSet;
    SOCKET sClient[MAX_SOCKET];

    lRc = WsaStart();

    if(lRc != 0)
    {
        cout << "Error: WsaStart : " << WSAGetLastError() << endl;
        return 1;
    }else
    {
        cout << "WinSock Started" << endl;
    }

    sAcceptSocket = socket(AF_INET, SOCK_STREAM, NULL);

    if(sAcceptSocket == INVALID_SOCKET)
    {
        cout << "Error: Socket can not Creat : " << WSAGetLastError() << endl;
        return 1;
    }else
    {
        cout << "AcceptSocket Creat" << endl;
    }

    // Socket bind
    memset(&sAddr, NULL, sizeof(SOCKADDR_IN));
    sAddr.sin_family = AF_INET;
    sAddr.sin_port   = htons(4017);
    sAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    lRc = bind(sAcceptSocket, (SOCKADDR*)&sAddr, sizeof(SOCKADDR_IN));

    if(lRc == SOCKET_ERROR)
    {
        cout << "Error: Bind : " << WSAGetLastError() << endl;
        return 1;
    }else
    {
        cout << "Socket bind on port 4017" << endl;
    }

    lRc = listen(sAcceptSocket, MAX_SOCKET);

    if(lRc == SOCKET_ERROR)
    {
        cout << "Error: listen : " << WSAGetLastError() << endl;
        return 1;
    }else
    {
        cout << "sAcceptSocket on list mod" << endl;
    }

    for(int i = 0; i < MAX_SOCKET; i++)
    {
        sClient[i] = INVALID_SOCKET;
    }

    while(1)
    {
        FD_ZERO(&FdSet);
        FD_SET(sAcceptSocket, &FdSet);

        for(int i = 0; i < MAX_SOCKET; i++)
        {
            if(sClient[i] != INVALID_SOCKET)
            {
                FD_SET(sClient[i], &FdSet);
            }
        }

        lRc = select(0, &FdSet, NULL, NULL, NULL);

        if(lRc == SOCKET_ERROR)
        {
            cout << "Error: select : " << WSAGetLastError() << endl;
        }

        if(FD_ISSET(sAcceptSocket, &FdSet))
        {
            for(int i = 0; i < MAX_SOCKET; i++)
            {
                if(sClient[i] == INVALID_SOCKET)
                {
                    sClient[i] = accept(sAcceptSocket, NULL, NULL);
                    cout << "New Client" << endl;

                    iResult = recv(sClient[i], rBuf, RECV_BUFFER, NULL);

                    string sSessionID = DecryptSessionPacket(rBuf);
                    vector<string> pSessionID = split(sSessionID.c_str(), ' ');
                    stringstream tSessionID(pSessionID[0].c_str());
                    int iSessionID;
                    tSessionID >> iSessionID;

                    cout << "Session-ID: " << iSessionID << "\n" << endl;
                    cout << "Size: " << iResult << endl;

                    iResult = recv(sClient[i], rBuf, RECV_BUFFER, NULL);
                    cout << "DecryptGamePacket: " << DecryptGamePacket(iSessionID, (unsigned char*)rBuf, iResult) << endl;
                    cout << "Size: " << iResult << endl;


                    break;
                }
            }
        }

        for(int i = 0; i < MAX_SOCKET; i++)
        {
            if(sClient[i] == INVALID_SOCKET)
            {
                continue;
            }

            if(FD_ISSET(sClient[i], &FdSet))
            {
                lRc = recv(sClient[i], rBuf, RECV_BUFFER, NULL);

                if(lRc == 0 || lRc == SOCKET_ERROR)
                {
                    cout << "Client " << i << " have close connection" << endl;
                    closesocket(sClient[i]);
                    sClient[i] = INVALID_SOCKET;
                }else
                {
                    // Recv
                }
            }

        }

    }


    return 0;  
}

int WsaStart(void)
{
    WSADATA dWsa;
    return WSAStartup(MAKEWORD(2, 0), &dWsa);
}
std::string DecryptSessionPacket(std::string str)
{
    std::string    encrypted_string;

    for (int i = 1; i < str.length(); i++)
    {
                if (str[i] == 0xE) { return encrypted_string; }

        unsigned char firstbyte = str[i] - 0xF;
        unsigned char secondbyte = firstbyte;
        secondbyte &= 0xF0;
        firstbyte =    firstbyte - secondbyte;
        secondbyte >>=    0x4;

        switch (secondbyte)
        {
        case 0:
            encrypted_string +=    ' ';
        break;

        case 1:
            encrypted_string +=    ' ';
        break;

        case 2:
            encrypted_string +=    '-';
        break;

        case 3:
            encrypted_string +=    '.';
        break;

        default:
            secondbyte += 0x2C;
            encrypted_string +=    secondbyte;
        break;
        }

        switch (firstbyte)
        {
        case 0:
            encrypted_string +=    '\0';
        break;

        case 1:
            encrypted_string += ' ';
        break;

        case 2:
            encrypted_string += '-';
        break;

        case 3:
            encrypted_string += '.';
        break;

        default:
            firstbyte += 0x2C;
            encrypted_string +=    firstbyte;
        break;
        }
    }

    return encrypted_string;
}
std::vector<std::string> split( std::string str, char delimiter )
{
    std::vector<std::string> ret;

    size_t pos = str.find_first_of( delimiter );

    while ( !str.empty() )
    {
        std::string cur = str.substr( 0, pos );
        if ( !cur.empty() )
            ret.push_back( cur );

        if ( pos == std::string::npos )
            break;

        str = str.substr( pos + 1 );

        pos = str.find_first_of( delimiter );
    }

    return ret;
}    
std::string DecryptGamePacket2(unsigned char str[])
{
    std::string decrypted_string;
    char table[] = {' ','-','.','0','1','2','3','4','5','6','7','8','9','n'};
    int count = 0;

    for (count = 0; count < strlen((const char*)str); )
    {
        if (str[count] <= 0x7A)
        {
            unsigned char len = str[count];

            for (int i = 0; i < (int)len; i++)
            {
                count++;
                decrypted_string += str[count] ^ 0xFF;
            }

            count++;
        } else
        {
            unsigned char len = str[count];
            len &= 0x7F;

            for (int i = 0; i < (int)len;)
            {
                count++;

                unsigned char highbyte = str[count];
                highbyte &= 0xF0;
                highbyte >>= 0x4;

                unsigned char lowbyte = str[count];
                lowbyte &= 0x0F;

                if (highbyte != 0x0 && highbyte != 0xF)
                {
                    decrypted_string += table[highbyte-1];
                    i++;
                }

                if (lowbyte != 0x0 && lowbyte != 0xF)
                {
                    decrypted_string += table[lowbyte-1];
                    i++;
                }
            }
            count ++;
        }
    }

    return decrypted_string;
}
std::string DecryptGamePacket(int session_id, unsigned char *str, int length)
{
    std::string encrypted_string = "";
    int session_key = session_id & 0xFF;
    unsigned char session_number = session_id >> 6;
    session_number &= 0xFF;
    session_number &= 0x80000003;

    switch (session_number)
    {
    case 0:
        for (int i = 0; i < length; i++)
        {
                unsigned char firstbyte = session_key + 0x40;
                unsigned char highbyte = str[i] - firstbyte;
                encrypted_string += highbyte;
        }
    break;

    case 1:
        for (int i = 0; i < length; i++)
        {
                unsigned char firstbyte = session_key + 0x40;
                unsigned char highbyte = str[i] + firstbyte;
                encrypted_string += highbyte;
        }
    break;

    case 2:
        for (int i = 0; i < length; i++)
        {
                unsigned char firstbyte = session_key + 0x40;
                unsigned char highbyte = str[i] - firstbyte ^ 0xC3;
                encrypted_string += highbyte;
        }
    break;

    case 3:
        for (int i = 0; i < length; i++)
        {
                unsigned char firstbyte = session_key + 0x40;
                unsigned char highbyte = str[i] + firstbyte ^ 0xC3;
                encrypted_string += highbyte;
        }
    break;

    default:
        encrypted_string += 0xF;
    break;
    }

    std::vector<std::string> temp = split(encrypted_string, 0xFF);
    std::string save;

    for (int i = 0; i < temp.size(); i++)
    {
        save += DecryptGamePacket2((unsigned char*) temp[i].c_str());
        save += 0xFF;
    }

    return save;
}

But I get the game not decrypt packet


A photo of the console
Spoiler:
İmage
(Questo messaggio è stato modificato l'ultima volta il: 31-01-2013 01:35 PM da Utente.)
Torna al primo messaggio
Email Cerca Rispondi
30-01-2013 06:46 PM
Messaggio: #4
RE: DecryptSessionPacket big problem
ernilos
*

Novizio

Messaggi : 14

Registrato dal : Sep 2012

Reputazione : 0

Stato : Offline


Premi :



Codice:
string sSessionID = DecryptSessionPacket(rBuf);
vector<string> pSessionID = split(sSessionID.c_str(), ' ');
stringstream tSessionID(pSessionID[0].c_str());
int iSessionID;
tSessionID >> iSessionID;
That is better
Codice:
int SessionID = atoi(split(sSessionID.c_str(),0x20)[1].c_str());
and you bug, is because the Session is [1] not [0] Tongue
(Questo messaggio è stato modificato l'ultima volta il: 31-01-2013 01:36 PM da Utente.)
Torna al primo messaggio
Email Cerca Rispondi
31-01-2013 01:32 PM
Messaggio: #5
RE: DecryptSessionPacket big problem
Utente
*
Staf Away - Gruppo Onorario
Elite Coder
Utente Saggio
Utente Storico

official Mod -ON-

Messaggi : 1,844

Registrato dal : Nov 2010

Reputazione : 57

Stato : Away


Premi :



Please boyz use the "[code]" and the "[spoiler]" tag for write and toggle your source code.
I edit your post this time Smile

Thx for all, nice development
Citazione:Potete (dovreste) leggere i Regolamenti di questa community.

Problemi? Inviami una Mail così possiamo parlare meglio.
Problemi qui sul Forum? Inviami un PM (Messaggio Privato) cosi possiamo discutere direttamente qui, sulla board.
Il mio Profilo sulla community di BorderGame.
Tutti i miei Thread (e le mie risposte) su BorderGame.

Il nostro Staff.
Ti sono stato d'aiuto? Reputami come meglio credi.
(Questo messaggio è stato modificato l'ultima volta il: 31-01-2013 01:36 PM da Utente.)
Torna al primo messaggio
Email WWW Cerca Rispondi

PubblicitàLa tua pubblicità qui, clicca per informazioni e per le offerte!

Stanno visualizzando la discussione :

  • Versione stampabile
  • Invia ad un amico
  • Sottoscrivi questa discussione