diff --git a/Proxy/LocalSocket.cpp b/Proxy/LocalSocket.cpp index 5cb1983..f170cd8 100644 --- a/Proxy/LocalSocket.cpp +++ b/Proxy/LocalSocket.cpp @@ -21,11 +21,11 @@ #include "LocalSocket.h" #include "RemoteSocket.h" -#include +#include #include "Util.h" #include #include "EncryptedPacket.h" -#include "WorldPacket.h" +#include "SequencedPacket.h" #include "Logging.h" extern RemoteSocket *worldRemote; @@ -37,15 +37,15 @@ LocalSocket *globalLocalSocket = NULL; extern CryptoPP::CBC_Mode::Decryption *TFDecryptCTW; extern CryptoPP::CBC_Mode::Encryption *TFEncryptCTW; -extern uint16 CTW_client_sequence; -extern uint16 CTW_server_sequence; +extern uint16 CTW_remoteSeq; +extern uint16 CTW_localSeq; extern uint8 CTW_flags; LocalSocket::LocalSocket(ISocketHandler& h) :UdpSocket(h) { - CTW_client_sequence = 0; - CTW_server_sequence = 0; + CTW_remoteSeq = 0; + CTW_localSeq = 0; CTW_flags = 0; InitializeCriticalSection(&CriticalSection); @@ -53,8 +53,8 @@ LocalSocket::LocalSocket(ISocketHandler& h) LocalSocket::~LocalSocket() { - CTW_client_sequence = 0; - CTW_server_sequence = 0; + CTW_remoteSeq = 0; + CTW_localSeq = 0; CTW_flags = 0; DeleteCriticalSection(&CriticalSection); @@ -70,12 +70,12 @@ void LocalSocket::Replay( const char *p,size_t l) EnterCriticalSection(&CriticalSection); - CTW_client_sequence++; + CTW_remoteSeq++; - if (CTW_client_sequence >= 4096) - CTW_client_sequence=0; + if (CTW_remoteSeq >= 4096) + CTW_remoteSeq=0; - WorldPacket replayMePacket(CTW_server_sequence,CTW_client_sequence,CTW_flags,string(p,l)); + SequencedPacket replayMePacket(CTW_localSeq,CTW_remoteSeq,CTW_flags,string(p,l)); ByteBuffer replayMePlain = replayMePacket.getDataWithHeader(); EncryptedPacket replayMeCryptor; replayMeCryptor.append((const byte*)replayMePlain.contents(),replayMePlain.size()); diff --git a/Proxy/LocalSocket.h b/Proxy/LocalSocket.h index 8b71f43..7901ed5 100644 --- a/Proxy/LocalSocket.h +++ b/Proxy/LocalSocket.h @@ -22,7 +22,7 @@ #ifndef LOCALSOCKET_H #define LOCALSOCKET_H -#include +#include class LocalSocket : public UdpSocket diff --git a/Proxy/Logging.cpp b/Proxy/Logging.cpp index 5e494a8..2cbdec2 100644 --- a/Proxy/Logging.cpp +++ b/Proxy/Logging.cpp @@ -2,7 +2,7 @@ #include "Util.h" #include "TCPVariableLengthPacket.h" #include "EncryptedPacket.h" -#include "WorldPacket.h" +#include "SequencedPacket.h" #pragma pack(1) @@ -67,10 +67,10 @@ void LogPacket(const char *pData,size_t pSize,PacketDirection direction,string c File.close(); } -void LogWorldPacket(const char *pData,size_t pSize,PacketDirection direction,uint16 sSeq,uint16 cSeq,uint8 flags) +void LogWorldPacket(const char *pData,size_t pSize,PacketDirection direction,uint16 localSeq,uint16 remoteSeq,uint8 flags) { stringstream comment; - comment << "PSS: " << hex << (int)flags << " LocalSeq: " << dec << sSeq << " RemoteSeq: " << dec << cSeq; + comment << "PSS: " << hex << (int)flags << " LocalSeq: " << dec << localSeq << " RemoteSeq: " << dec << remoteSeq; LogPacket(pData,pSize,direction,comment.str()); } @@ -1326,12 +1326,12 @@ string MarginToClient( const char* pData,size_t pSize ) } } -uint16 CTW_client_sequence = 0; -uint16 CTW_server_sequence = 0; +uint16 CTW_remoteSeq = 0; +uint16 CTW_localSeq = 0; uint8 CTW_flags = 0; -uint16 WTC_client_sequence = 0; -uint16 WTC_server_sequence = 0; +uint16 WTC_remoteSeq = 0; +uint16 WTC_localSeq = 0; uint8 WTC_flags = 0; string ClientToWorld( const char* pData,size_t pSize ) @@ -1350,13 +1350,13 @@ string ClientToWorld( const char* pData,size_t pSize ) ByteBuffer encryptedContents; encryptedContents.append((const byte*)&pData[1],pSize-1); //skip the first byte EncryptedPacket encryptionless(encryptedContents,TFDecryptCTW); - WorldPacket headerless(encryptionless); + SequencedPacket headerless(encryptionless); - CTW_client_sequence = headerless.getClientSeq(); - CTW_server_sequence = headerless.getServerSeq(); + CTW_remoteSeq = headerless.getRemoteSeq(); + CTW_localSeq = headerless.getLocalSeq(); CTW_flags = headerless.getPSS(); - LogWorldPacket(headerless.contents(),headerless.size(),CLIENT_TO_WORLD,CTW_server_sequence,CTW_client_sequence,CTW_flags); + LogWorldPacket(headerless.contents(),headerless.size(),CLIENT_TO_WORLD,CTW_localSeq,CTW_remoteSeq,CTW_flags); //reencrypt ByteBuffer reencrypted = encryptionless.toCipherText(TFEncryptCTW); @@ -1384,13 +1384,13 @@ string WorldToClient( const char* pData,size_t pSize ) ByteBuffer encryptedContents; encryptedContents.append((const byte*)&pData[1],pSize-1); //skip the first byte EncryptedPacket encryptionless(encryptedContents,TFDecryptWTC); - WorldPacket headerless(encryptionless); + SequencedPacket headerless(encryptionless); - WTC_client_sequence = headerless.getClientSeq(); - WTC_server_sequence = headerless.getServerSeq(); + WTC_remoteSeq = headerless.getRemoteSeq(); + WTC_localSeq = headerless.getLocalSeq(); WTC_flags = headerless.getPSS(); - LogWorldPacket(headerless.contents(),headerless.size(),WORLD_TO_CLIENT,WTC_server_sequence,WTC_client_sequence,WTC_flags); + LogWorldPacket(headerless.contents(),headerless.size(),WORLD_TO_CLIENT,WTC_localSeq,WTC_remoteSeq,WTC_flags); //reencrypt ByteBuffer reencrypted = encryptionless.toCipherText(TFEncryptWTC); diff --git a/Proxy/Proxy.vcproj b/Proxy/Proxy.vcproj index 42a707c..bcef108 100644 --- a/Proxy/Proxy.vcproj +++ b/Proxy/Proxy.vcproj @@ -209,6 +209,14 @@ RelativePath=".\RemoteSocket.cpp" > + + + + @@ -221,14 +229,6 @@ RelativePath=".\Util.cpp" > - - - - - -#ifdef USE_SOLID_MAX -#define MAX_MINIONS 10 -#endif - - - - -class ProxyHandler : public SocketHandler -{ -public: - ProxyHandler(); - ~ProxyHandler(); - - void ViewSockets(); - -}; - - - - -#endif // PROXYHANDLER_H +// ************************************************************************************************* + +#ifndef PROXYHANDLER_H +#define PROXYHANDLER_H + +#include + +#ifdef USE_SOLID_MAX +#define MAX_MINIONS 10 +#endif + + + + +class ProxyHandler : public SocketHandler +{ +public: + ProxyHandler(); + ~ProxyHandler(); + + void ViewSockets(); + +}; + + + + +#endif // PROXYHANDLER_H diff --git a/Proxy/RemoteSocket.cpp b/Proxy/RemoteSocket.cpp index a4f360b..53bd5c1 100644 --- a/Proxy/RemoteSocket.cpp +++ b/Proxy/RemoteSocket.cpp @@ -23,7 +23,7 @@ #include "LocalSocket.h" #include "Util.h" #include -#include "WorldPacket.h" +#include "SequencedPacket.h" #include "Logging.h" #include "EncryptedPacket.h" @@ -34,15 +34,15 @@ extern std::string GlobalIP; RemoteSocket *globalRemoteSocket = NULL; extern LocalSocket *globalLocalSocket; -extern uint16 WTC_server_sequence; -extern uint16 WTC_client_sequence; +extern uint16 WTC_localSeq; +extern uint16 WTC_remoteSeq; extern uint8 WTC_flags; RemoteSocket::RemoteSocket(ISocketHandler& h) :UdpSocket(h) { - WTC_server_sequence = 0; - WTC_client_sequence = 0; + WTC_localSeq = 0; + WTC_remoteSeq = 0; WTC_flags = 0; InitializeCriticalSection(&CriticalSection); @@ -50,8 +50,8 @@ RemoteSocket::RemoteSocket(ISocketHandler& h) RemoteSocket::~RemoteSocket() { - WTC_server_sequence = 0; - WTC_client_sequence = 0; + WTC_localSeq = 0; + WTC_remoteSeq = 0; WTC_flags = 0; DeleteCriticalSection(&CriticalSection); @@ -88,12 +88,12 @@ void RemoteSocket::Replay( const char *p,size_t l) EnterCriticalSection(&CriticalSection); - WTC_server_sequence++; + WTC_localSeq++; - if (WTC_server_sequence >= 4096) - WTC_server_sequence=0; + if (WTC_localSeq >= 4096) + WTC_localSeq=0; - WorldPacket replayMePacket(WTC_server_sequence,WTC_client_sequence,WTC_flags,string(p,l)); + SequencedPacket replayMePacket(WTC_localSeq,WTC_remoteSeq,WTC_flags,string(p,l)); ByteBuffer replayMePlain = replayMePacket.getDataWithHeader(); EncryptedPacket replayMeCryptor; replayMeCryptor.append((const byte*)replayMePlain.contents(),replayMePlain.size()); diff --git a/Proxy/RemoteSocket.h b/Proxy/RemoteSocket.h index ca77ac7..4d35e51 100644 --- a/Proxy/RemoteSocket.h +++ b/Proxy/RemoteSocket.h @@ -1,7 +1,7 @@ #ifndef _REMOTESOCKET_H #define _REMOTESOCKET_H -#include +#include class RemoteSocket : public UdpSocket diff --git a/Proxy/WorldPacket.cpp b/Proxy/SequencedPacket.cpp similarity index 74% rename from Proxy/WorldPacket.cpp rename to Proxy/SequencedPacket.cpp index 533df71..a58e68e 100644 --- a/Proxy/WorldPacket.cpp +++ b/Proxy/SequencedPacket.cpp @@ -19,16 +19,9 @@ // // ************************************************************************************************* -#include "WorldPacket.h" +#include "SequencedPacket.h" -#pragma pack(1) - -typedef struct -{ - -} worldPacketHeader_t; - -WorldPacket::WorldPacket( ByteBuffer &withHeader ) +SequencedPacket::SequencedPacket( ByteBuffer withHeader ) { uint32 packedSeqs; //FL CC CS SS @@ -36,8 +29,8 @@ WorldPacket::WorldPacket( ByteBuffer &withHeader ) withHeader >> packedSeqs; uint32 packed = swap32(packedSeqs); - serverSequence = packed&0xFFF; - clientSequence = (packed>>12)&0xFFF; + localSeq = packed&0xFFF; + remoteSeq = (packed>>12)&0xFFF; playerSetupState = (packed>>24)&0xFF; vector restOfPacket; @@ -46,21 +39,19 @@ WorldPacket::WorldPacket( ByteBuffer &withHeader ) this->clear(); this->append(&restOfPacket[0],restOfPacket.size()); - - withHeader.rpos(0); } -WorldPacket::WorldPacket( string &withHeader ) +SequencedPacket::SequencedPacket( const string &withHeader ) { ByteBuffer simulation; simulation.append((const byte*)withHeader.data(),withHeader.size()); - WorldPacket::WorldPacket(simulation); + SequencedPacket::SequencedPacket(simulation); } -ByteBuffer WorldPacket::getDataWithHeader() +ByteBuffer SequencedPacket::getDataWithHeader() { - uint32 packedSeqs = swap32((playerSetupState << 24) | ((clientSequence & 0xFFF) << 12) | (serverSequence & 0xFFF)); // FL CC CS SS + uint32 packedSeqs = swap32((playerSetupState << 24) | ((remoteSeq & 0xFFF) << 12) | (localSeq & 0xFFF)); // FL CC CS SS ByteBuffer returnMe; returnMe << packedSeqs; diff --git a/Proxy/WorldPacket.h b/Proxy/SequencedPacket.h similarity index 64% rename from Proxy/WorldPacket.h rename to Proxy/SequencedPacket.h index f9cb3d5..0426f22 100644 --- a/Proxy/WorldPacket.h +++ b/Proxy/SequencedPacket.h @@ -22,63 +22,68 @@ #include "Util.h" #include "ByteBuffer.h" -class WorldPacket : public ByteBuffer +class SequencedPacket : public ByteBuffer { public: - WorldPacket() + SequencedPacket() { setSequences(0,0); setPlayerSetupState(0); this->clear(); } - WorldPacket(uint16 sSeq,uint16 cSeq,uint8 pss) + SequencedPacket(uint16 _localSeq,uint16 _remoteSeq,uint8 pss) { - setSequences(sSeq,cSeq); + setSequences(_localSeq,_remoteSeq); setPlayerSetupState(pss); this->clear(); } - WorldPacket(uint16 sSeq,uint16 cSeq,uint8 pss,string &headerless) + SequencedPacket(uint16 _localSeq,uint16 _remoteSeq,uint8 pss,const string &headerless) { - setSequences(sSeq,cSeq); + setSequences(_localSeq,_remoteSeq); setPlayerSetupState(pss); this->clear(); this->append((const byte*)headerless.data(),headerless.size()); } - WorldPacket(uint16 sSeq,uint16 cSeq,uint8 pss,ByteBuffer &headerless) + SequencedPacket(uint16 _localSeq,uint16 _remoteSeq,uint8 pss,const ByteBuffer &headerless) { - setSequences(sSeq,cSeq); + setSequences(_localSeq,_remoteSeq); setPlayerSetupState(pss); this->clear(); this->append((const byte*)headerless.contents(),headerless.size()); } - WorldPacket(ByteBuffer &withHeader); - WorldPacket(string &withHeader); - ~WorldPacket() + SequencedPacket(ByteBuffer withHeader); + SequencedPacket(const string &withHeader); + ~SequencedPacket() { } - void setSequences(unsigned short sSeq,unsigned short cSeq) + void setSequences(uint16 _localSeq,uint16 _remoteSeq) { - serverSequence = sSeq; - clientSequence = cSeq; + this->localSeq = _localSeq; + this->remoteSeq = _remoteSeq; } void setPlayerSetupState(byte pss) { playerSetupState = pss; } - void setData(string &headerless) + void setData(const string &headerless) { this->clear(); this->append((const byte*)headerless.data(),headerless.size()); } - - unsigned short getClientSeq() + void setData(const ByteBuffer &headerless) { - return clientSequence; + this->clear(); + this->append((const byte*)headerless.contents(),headerless.size()); } - unsigned short getServerSeq() + + unsigned short getRemoteSeq() { - return serverSequence; + return remoteSeq; + } + unsigned short getLocalSeq() + { + return localSeq; } byte getPSS() { @@ -93,7 +98,7 @@ public: } ByteBuffer getDataWithHeader(); private: - uint16 serverSequence; - uint16 clientSequence; + uint16 localSeq; + uint16 remoteSeq; uint8 playerSetupState; }; \ No newline at end of file diff --git a/Reality/Source/GameClient.cpp b/Reality/Source/GameClient.cpp index a91051e..3444b7c 100644 --- a/Reality/Source/GameClient.cpp +++ b/Reality/Source/GameClient.cpp @@ -23,10 +23,11 @@ #include "GameClient.h" #include "Timer.h" -#include "InPacket.h" #include "GameResponses.h" #include "Util.h" #include "MersenneTwister.h" +#include "EncryptedPacket.h" +#include "SequencedPacket.h" uint8 twofishkeyz[16] = {0x6C, 0xAB, 0x8E, 0xCC, 0xE7, 0x3C, 0x22, 0x47, 0xDB, 0xEB, 0xDE, 0x1A, 0xA8, 0xE7, 0x5F, 0xB8}; @@ -73,94 +74,103 @@ void GameClient::HandlePacket(char *pData, uint16 nLength) { if (pData[0] == 0x01) { - std::string decrypted; - if (Decrypt(pData,nLength,decrypted)) + SequencedPacket packetData=Decrypt(&pData[1],nLength-1); + client_sequence = packetData.getLocalSeq(); + + cout << "CSeq: " << packetData.getLocalSeq() << " SSeq: " << packetData.getRemoteSeq(); + cout << " " << Bin2Hex(packetData) << endl; + + string contents = string(packetData.contents(),packetData.size()); + + string::size_type loc = contents.find( "Spawnalot", 0 ); + if( loc != std::string::npos ) { - client_sequence++; - if (client_sequence == 4096) - client_sequence=0; - - IncomingPacket thepaxor(decrypted); - - std::cout << "CSeq: " << thepaxor.client_sequence << " SSeq: " << thepaxor.server_sequence; - std::string contents = thepaxor.ToString(); - std::cout << " " << Bin2Hex(contents) << std::endl; - - std::string::size_type loc = contents.find( "Spawnalot", 0 ); - if( loc != std::string::npos ) - { - if (PlayerSetupState==0x7F) - Send(std::string((const char *)rawData,sizeof(rawData))); - else {} //WTF - } - - loc = contents.find( "Spawnanother", 0 ); - if( loc != std::string::npos ) - { - if (PlayerSetupState==0x7F) - Send(std::string((const char *)rawData2,sizeof(rawData2))); - else {} //WTF - } -/* - loc = contents.find( "Move", 0 ); - if( loc != std::string::npos ) - { - if (PlayerSetupState==0x7F) - Send(std::string((const char *)move,sizeof(move))); - else {} //WTF - }*/ + if (PlayerSetupState==0x7F) + Send(std::string((const char *)rawData,sizeof(rawData))); + else {} //WTF } + + loc = contents.find( "Spawnanother", 0 ); + if( loc != std::string::npos ) + { + if (PlayerSetupState==0x7F) + Send(std::string((const char *)rawData2,sizeof(rawData2))); + else {} //WTF + } + /* + loc = contents.find( "Move", 0 ); + if( loc != std::string::npos ) + { + if (PlayerSetupState==0x7F) + Send(std::string((const char *)move,sizeof(move))); + else {} //WTF + }*/ } switch(numPackets) { case 1: - for (unsigned int i=0;i<5;i++) { - int clientlen=sizeof(_address); - sendto(*_sock, (const char *)GAMEResponseTo1_1_2_3_4_5, sizeof(GAMEResponseTo1_1_2_3_4_5), 0, (struct sockaddr*)&_address, clientlen); + for (unsigned int i=0;i<5;i++) + { + int clientlen=sizeof(_address); + sendto(*_sock, (const char *)GAMEResponseTo1_1_2_3_4_5, sizeof(GAMEResponseTo1_1_2_3_4_5), 0, (struct sockaddr*)&_address, clientlen); + } + + Send(ByteBuffer(GAMEResponseTo1_6,sizeof(GAMEResponseTo1_6))); + Send(ByteBuffer(GAMEResponseTo1_7,sizeof(GAMEResponseTo1_7))); + Send(ByteBuffer(GAMEResponseTo1_8,sizeof(GAMEResponseTo1_8))); + Send(ByteBuffer(GAMEResponseTo1_9,sizeof(GAMEResponseTo1_9))); + Send(ByteBuffer(GAMEResponseTo1_10,sizeof(GAMEResponseTo1_10))); + Send(ByteBuffer(GAMEResponseTo1_11,sizeof(GAMEResponseTo1_11))); + Send(ByteBuffer(GAMEResponseTo1_12,sizeof(GAMEResponseTo1_12))); + Send(ByteBuffer(GAMEResponseTo1_13,sizeof(GAMEResponseTo1_13))); + Send(ByteBuffer(GAMEResponseTo1_14,sizeof(GAMEResponseTo1_14))); + Send(ByteBuffer(GAMEResponseTo1_15,sizeof(GAMEResponseTo1_15))); + Send(ByteBuffer(GAMEResponseTo1_16,sizeof(GAMEResponseTo1_16))); + Send(ByteBuffer(GAMEResponseTo1_17,sizeof(GAMEResponseTo1_17))); + Send(ByteBuffer(GAMEResponseTo1_18,sizeof(GAMEResponseTo1_18))); + Send(ByteBuffer(GAMEResponseTo1_19,sizeof(GAMEResponseTo1_19))); + Send(ByteBuffer(GAMEResponseTo1_20,sizeof(GAMEResponseTo1_20))); + break; } - - Send(std::string((const char *)GAMEResponseTo1_6,sizeof(GAMEResponseTo1_6))); - Send(std::string((const char *)GAMEResponseTo1_7,sizeof(GAMEResponseTo1_7))); - Send(std::string((const char *)GAMEResponseTo1_8,sizeof(GAMEResponseTo1_8))); - Send(std::string((const char *)GAMEResponseTo1_9,sizeof(GAMEResponseTo1_9))); - Send(std::string((const char *)GAMEResponseTo1_10,sizeof(GAMEResponseTo1_10))); - Send(std::string((const char *)GAMEResponseTo1_11,sizeof(GAMEResponseTo1_11))); - Send(std::string((const char *)GAMEResponseTo1_12,sizeof(GAMEResponseTo1_12))); - Send(std::string((const char *)GAMEResponseTo1_13,sizeof(GAMEResponseTo1_13))); - Send(std::string((const char *)GAMEResponseTo1_14,sizeof(GAMEResponseTo1_14))); - Send(std::string((const char *)GAMEResponseTo1_15,sizeof(GAMEResponseTo1_15))); - Send(std::string((const char *)GAMEResponseTo1_16,sizeof(GAMEResponseTo1_16))); - Send(std::string((const char *)GAMEResponseTo1_17,sizeof(GAMEResponseTo1_17))); - Send(std::string((const char *)GAMEResponseTo1_18,sizeof(GAMEResponseTo1_18))); - Send(std::string((const char *)GAMEResponseTo1_19,sizeof(GAMEResponseTo1_19))); - Send(std::string((const char *)GAMEResponseTo1_20,sizeof(GAMEResponseTo1_20))); - break; case 2: - PlayerSetupState = 1; - Send(std::string((const char *)GAMEResponseTo2,sizeof(GAMEResponseTo2))); - break; + { + PlayerSetupState = 1; + Send(ByteBuffer(GAMEResponseTo2,sizeof(GAMEResponseTo2))); + break; + } case 5: - Send(std::string((const char *)GAMEResponseTo5,sizeof(GAMEResponseTo5))); - break; + { + Send(ByteBuffer(GAMEResponseTo5,sizeof(GAMEResponseTo5))); + break; + } case 6: - PlayerSetupState = 0x1F; - Send(std::string((const char *)GAMEResponseTo6_1_header,sizeof(GAMEResponseTo6_1_header)) + - name + std::string((const char *)GAMEResponseTo6_1_footer,sizeof(GAMEResponseTo6_1_footer))); - Send(std::string((const char *)GAMEResponseTo6_2,sizeof(GAMEResponseTo6_2))); - Send(std::string((const char *)GAMEResponseTo6_4,sizeof(GAMEResponseTo6_4))); - Send(std::string((const char *)GAMEResponseTo6_6,sizeof(GAMEResponseTo6_6))); - break; + { + PlayerSetupState = 0x1F; + + ByteBuffer response; + response.append(GAMEResponseTo6_1_header,sizeof(GAMEResponseTo6_1_header)); + response.append(name); + response.append(GAMEResponseTo6_1_footer,sizeof(GAMEResponseTo6_1_footer)); + + Send(response); + Send(ByteBuffer(GAMEResponseTo6_2,sizeof(GAMEResponseTo6_2))); + Send(ByteBuffer(GAMEResponseTo6_4,sizeof(GAMEResponseTo6_4))); + Send(ByteBuffer(GAMEResponseTo6_6,sizeof(GAMEResponseTo6_6))); + break; + } case 9: - PlayerSetupState = 0x7F; -/* sendme.FromString(std::string((const char *)GAMEResponseTo9_1_header,sizeof(GAMEResponseTo9_1_header))); - sendme.Append(name); - sendme.Append(std::string((const char *)GAMEResponseTo9_1_footer,sizeof(GAMEResponseTo9_1_footer))); - Send(sendme);*/ - Send(std::string((const char *)GAMEResponseTo9_2,sizeof(GAMEResponseTo9_2))); - Handled_Session=true; - break; + { + PlayerSetupState = 0x7F; + /* sendme.FromString(std::string((const char *)GAMEResponseTo9_1_header,sizeof(GAMEResponseTo9_1_header))); + sendme.Append(name); + sendme.Append(std::string((const char *)GAMEResponseTo9_1_footer,sizeof(GAMEResponseTo9_1_footer))); + Send(sendme);*/ + Send(std::string((const char *)GAMEResponseTo9_2,sizeof(GAMEResponseTo9_2))); + Handled_Session=true; + break; + } } if (Handled_Session) @@ -170,62 +180,25 @@ void GameClient::HandlePacket(char *pData, uint16 nLength) } } -bool GameClient::Decrypt(char *pData, uint16 nLength,std::string &output) +SequencedPacket GameClient::Decrypt(char *pData, uint16 nLength) { - std::string vector(pData+1,16); - TFDecrypt->Resynchronize((const byte *)vector.data()); - std::string input(pData+17,nLength-17); - output.clear(); - CryptoPP::StringSource(input, true, new CryptoPP::StreamTransformationFilter(*TFDecrypt, new CryptoPP::StringSink(output))); - //output now contains crc len time data - std::string crc32 = std::string(output.data(),sizeof(uint32)); - uint16 length; - memcpy(&length,output.data()+sizeof(uint32),sizeof(uint16)); - - std::string computedcrc; - CryptoPP::CRC32 hash; - CryptoPP::StringSource(std::string(output.data()+sizeof(uint32),length+sizeof(uint32)+sizeof(uint16)), true,new CryptoPP::HashFilter(hash,new CryptoPP::StringSink(computedcrc))); - - if (memcmp(crc32.data(),computedcrc.data(),sizeof(uint32))) - return false; - - output = std::string(output.data()+sizeof(uint32)+sizeof(uint16)+sizeof(uint32),length); - return true; + EncryptedPacket decryptedData(ByteBuffer(pData,nLength),TFDecrypt); + return SequencedPacket(decryptedData); } -void GameClient::Send(const std::string &contents) +void GameClient::Send(const ByteBuffer &contents) { server_sequence++; if (server_sequence == 4096) server_sequence=0; - OutgoingPacket packet(PlayerSetupState,client_sequence,server_sequence); - packet.FromString(contents); - - std::string buffer = packet.ToString(); - uint16 lenght = (uint16)buffer.size(); - uint32 time = getTime(); - std::string input = std::string((const char*)&lenght,sizeof(lenght)) + std::string((const char*)&time,sizeof(time)) + buffer; //len+time+data - std::string crc32; - std::string output; - - CryptoPP::CRC32 hash; - CryptoPP::StringSource(input, true,new CryptoPP::HashFilter(hash,new CryptoPP::StringSink(crc32))); //output2 now has crc - output = crc32 + input; //add the rest onto the crc,output now contains crc len time data - - byte vector[16]; - - for (uint32 i=0;i < sizeof(vector); i++) - { - vector[i] = rand()%255; - } - - TFEncrypt->Resynchronize(vector); - input.clear(); - CryptoPP::StringSource(output, true, new CryptoPP::StreamTransformationFilter(*TFEncrypt, new CryptoPP::StringSink(input))); // output now has encrypted shit - input = char(0x01) + std::string((const char*)vector,sizeof(vector)) + input; // input has whole packet now + SequencedPacket withSequences(server_sequence,client_sequence,PlayerSetupState,contents); + EncryptedPacket withEncryption(withSequences.getDataWithHeader()); + ByteBuffer sendMe; + sendMe << uint8(1); + sendMe.append(withEncryption.toCipherText(TFEncrypt)); int clientlen=sizeof(_address); - sendto(*_sock, input.data(), (int)input.size(), 0, (struct sockaddr*)&_address,clientlen); + sendto(*_sock, sendMe.contents(), (int)sendMe.size(), 0, (struct sockaddr*)&_address,clientlen); } diff --git a/Reality/Source/GameClient.h b/Reality/Source/GameClient.h index 882f07e..470b1de 100644 --- a/Reality/Source/GameClient.h +++ b/Reality/Source/GameClient.h @@ -22,8 +22,8 @@ #ifndef MXOSIM_GAMECLIENT_H #define MXOSIM_GAMECLIENT_H -#include "OutPacket.h" #include "Crypto.h" +#include "SequencedPacket.h" class GameClient { @@ -32,7 +32,7 @@ class GameClient bool Valid_Client; bool Handled_Session; - // Master Sock handle, client's address structure, last recieved packet + // Master Sock handle, client's address structure, last received packet SOCKET *_sock; struct sockaddr_in _address; uint32 _last_activity; @@ -46,10 +46,9 @@ class GameClient uint16 client_sequence; // Client tick count - uint16 tick; + uint32 tick; //Player name lol - std::string name; CryptoPP::CBC_Mode::Decryption *TFDecrypt; @@ -57,7 +56,7 @@ class GameClient public: - GameClient(sockaddr_in, SOCKET*); + GameClient(sockaddr_in address, SOCKET *sock); ~GameClient(); inline uint32 LastActive() { return _last_activity; } @@ -65,8 +64,8 @@ class GameClient char *Address() { return inet_ntoa(_address.sin_addr); } void HandlePacket(char *pData, uint16 Length); - bool Decrypt(char *pData, uint16 nLength,std::string &output); - void Send(const std::string &contents); + SequencedPacket Decrypt(char *pData, uint16 nLength); + void Send(const ByteBuffer &contents); }; #endif diff --git a/Reality/Source/GameServer.cpp b/Reality/Source/GameServer.cpp index cec5b29..08c8b44 100644 --- a/Reality/Source/GameServer.cpp +++ b/Reality/Source/GameServer.cpp @@ -24,6 +24,7 @@ #include "Log.h" #include "Timer.h" #include "Config.h" +#include "Sockets.h" initialiseSingleton( GameServer ); diff --git a/Reality/Source/InPacket.cpp b/Reality/Source/InPacket.cpp deleted file mode 100644 index f8e714d..0000000 --- a/Reality/Source/InPacket.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// ************************************************************************************************* -// -------------------------------------- -// Copyright (C) 2006-2010 Rajko Stojadinovic -// -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -// ************************************************************************************************* - -#include "InPacket.h" - -IncomingPacket::IncomingPacket(std::string &source) -{ - uint32 packed; - memcpy(&packed,source.data(),sizeof(packed)); - packed= ntohl(packed); - client_sequence = uint16(packed&0xFFF); - server_sequence = uint16((packed>>12)&0xFFF); - flags = uint8((packed>>24)&0xFF); - contents << std::string(source.data()+sizeof(packed),source.size()-sizeof(packed)); -} - -IncomingPacket::~IncomingPacket() -{ -} \ No newline at end of file diff --git a/Reality/Source/InPacket.h b/Reality/Source/InPacket.h deleted file mode 100644 index b4342c0..0000000 --- a/Reality/Source/InPacket.h +++ /dev/null @@ -1,39 +0,0 @@ -// ************************************************************************************************* -// -------------------------------------- -// Copyright (C) 2006-2010 Rajko Stojadinovic -// -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -// ************************************************************************************************* - -#ifndef MXOSIM_INPACKET_H -#define MXOSIM_INPACKET_H - -#include "Packet.h" - -class IncomingPacket : public Packet -{ -public: - IncomingPacket(std::string &source); - ~IncomingPacket(); - - uint8 flags; - uint16 server_sequence; - uint16 client_sequence; -}; - - -#endif \ No newline at end of file diff --git a/Reality/Source/OutPacket.cpp b/Reality/Source/OutPacket.cpp deleted file mode 100644 index 3ef7be0..0000000 --- a/Reality/Source/OutPacket.cpp +++ /dev/null @@ -1,50 +0,0 @@ -// ************************************************************************************************* -// -------------------------------------- -// Copyright (C) 2006-2010 Rajko Stojadinovic -// -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -// ************************************************************************************************* - -#include "OutPacket.h" -#include "Util.h" - -OutgoingPacket::OutgoingPacket(uint8 flagz,uint16 client_sequencez,uint16 server_sequencez) -{ - flags = flagz; - client_sequence = client_sequencez; - server_sequence = server_sequencez; -} - -OutgoingPacket::~OutgoingPacket() -{} - -void OutgoingPacket::PreSave() -{ - contents.clear(); - uint32 storage = htonl((flags << 24) | ((client_sequence & 0xFFF) << 12) | (server_sequence & 0xFFF)); // FL CC CS SS - contents << storage; -/* - std::string nub; - ConvertBytesintoHex((const byte*)&storage,nub,sizeof(storage)); - std::cout << nub << std::endl;*/ -} - -void OutgoingPacket::FromString(const std::string &string) -{ - PreSave(); - contents.append(string); -} diff --git a/Reality/Source/OutPacket.h b/Reality/Source/OutPacket.h deleted file mode 100644 index 7554e8d..0000000 --- a/Reality/Source/OutPacket.h +++ /dev/null @@ -1,42 +0,0 @@ -// ************************************************************************************************* -// -------------------------------------- -// Copyright (C) 2006-2010 Rajko Stojadinovic -// -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -// ************************************************************************************************* - -#ifndef MXOSIM_OUTPACKET_H -#define MXOSIM_OUTPACKET_H - -#include "Packet.h" - -class OutgoingPacket : public Packet -{ -public: - OutgoingPacket(uint8 flagz,uint16 client_sequencez,uint16 server_sequencez); - ~OutgoingPacket(); - - uint8 flags; - uint16 client_sequence; - uint16 server_sequence; - - void PreSave(); -// virtual void Save() = 0; - void FromString(const std::string &string); -}; - -#endif diff --git a/Reality/Source/Packet.cpp b/Reality/Source/Packet.cpp deleted file mode 100644 index 39dad9f..0000000 --- a/Reality/Source/Packet.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// ************************************************************************************************* -// -------------------------------------- -// Copyright (C) 2006-2010 Rajko Stojadinovic -// -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -// ************************************************************************************************* - -#include "Packet.h" - -Packet::Packet() -{ -} - -Packet::~Packet() -{ -} - -void Packet::Clear() -{ - contents.clear(); -} - -uint16 Packet::Size() -{ - return contents.size(); -} - -void Packet::FromString(std::string &string) -{ - contents.clear(); - contents.append(string); -} - -std::string Packet::ToString() -{ - uint8 *data=new uint8[contents.size()]; - contents.rpos(0); - contents.read(data,contents.size()); - std::string hax = std::string((const char *)data,contents.size()); - delete[] data; - return hax; -} - -void Packet::Append(std::string &string) -{ - contents.append(string); -} \ No newline at end of file diff --git a/Reality/Source/Packet.h b/Reality/Source/Packet.h deleted file mode 100644 index 1458609..0000000 --- a/Reality/Source/Packet.h +++ /dev/null @@ -1,44 +0,0 @@ -// ************************************************************************************************* -// -------------------------------------- -// Copyright (C) 2006-2010 Rajko Stojadinovic -// -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -// ************************************************************************************************* - -#ifndef MXOSIM_PACKET_H -#define MXOSIM_PACKET_H - -#include "Common.h" -#include "ByteBuffer.h" -#include "Sockets.h" - -class Packet -{ -public: - Packet(); - ~Packet(); - - uint16 Size(); - void Clear(); - void FromString(std::string &string); - void Append(std::string &string); - std::string ToString(); -protected: - ByteBuffer contents; -}; - -#endif \ No newline at end of file diff --git a/Reality/Source/Reality.vcproj b/Reality/Source/Reality.vcproj index ee1392a..59e53c7 100644 --- a/Reality/Source/Reality.vcproj +++ b/Reality/Source/Reality.vcproj @@ -332,27 +332,11 @@ > - - - - - - - - diff --git a/Reality/Source/SequencedPacket.cpp b/Reality/Source/SequencedPacket.cpp new file mode 100644 index 0000000..a58e68e --- /dev/null +++ b/Reality/Source/SequencedPacket.cpp @@ -0,0 +1,61 @@ +// ************************************************************************************************* +// -------------------------------------- +// Copyright (C) 2006-2010 Rajko Stojadinovic +// +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// ************************************************************************************************* + +#include "SequencedPacket.h" + +SequencedPacket::SequencedPacket( ByteBuffer withHeader ) +{ + uint32 packedSeqs; //FL CC CS SS + + withHeader.rpos(0); + withHeader >> packedSeqs; + + uint32 packed = swap32(packedSeqs); + localSeq = packed&0xFFF; + remoteSeq = (packed>>12)&0xFFF; + playerSetupState = (packed>>24)&0xFF; + + vector restOfPacket; + restOfPacket.resize(withHeader.size() - withHeader.rpos()); + withHeader.read(&restOfPacket[0],restOfPacket.size()); + + this->clear(); + this->append(&restOfPacket[0],restOfPacket.size()); +} + +SequencedPacket::SequencedPacket( const string &withHeader ) +{ + ByteBuffer simulation; + simulation.append((const byte*)withHeader.data(),withHeader.size()); + + SequencedPacket::SequencedPacket(simulation); +} + +ByteBuffer SequencedPacket::getDataWithHeader() +{ + uint32 packedSeqs = swap32((playerSetupState << 24) | ((remoteSeq & 0xFFF) << 12) | (localSeq & 0xFFF)); // FL CC CS SS + + ByteBuffer returnMe; + returnMe << packedSeqs; + returnMe.append(this->contents(),this->size()); + + return returnMe; +} \ No newline at end of file diff --git a/Reality/Source/SequencedPacket.h b/Reality/Source/SequencedPacket.h new file mode 100644 index 0000000..ade5026 --- /dev/null +++ b/Reality/Source/SequencedPacket.h @@ -0,0 +1,109 @@ +// ************************************************************************************************* +// -------------------------------------- +// Copyright (C) 2006-2010 Rajko Stojadinovic +// +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// ************************************************************************************************* + +#ifndef SEQUENCEDPACKET_H +#define SEQUENCEDPACKET_H + +#include "Util.h" +#include "ByteBuffer.h" + +class SequencedPacket : public ByteBuffer +{ +public: + SequencedPacket() + { + setSequences(0,0); + setPlayerSetupState(0); + this->clear(); + } + SequencedPacket(uint16 _localSeq,uint16 _remoteSeq,uint8 pss) + { + setSequences(_localSeq,_remoteSeq); + setPlayerSetupState(pss); + this->clear(); + } + SequencedPacket(uint16 _localSeq,uint16 _remoteSeq,uint8 pss,const string &headerless) + { + setSequences(_localSeq,_remoteSeq); + setPlayerSetupState(pss); + this->clear(); + this->append((const byte*)headerless.data(),headerless.size()); + } + SequencedPacket(uint16 _localSeq,uint16 _remoteSeq,uint8 pss,const ByteBuffer &headerless) + { + setSequences(_localSeq,_remoteSeq); + setPlayerSetupState(pss); + this->clear(); + this->append((const byte*)headerless.contents(),headerless.size()); + } + SequencedPacket(ByteBuffer withHeader); + SequencedPacket(const string &withHeader); + ~SequencedPacket() + { + + } + void setSequences(uint16 _localSeq,uint16 _remoteSeq) + { + this->localSeq = _localSeq; + this->remoteSeq = _remoteSeq; + } + void setPlayerSetupState(byte pss) + { + playerSetupState = pss; + } + void setData(const string &headerless) + { + this->clear(); + this->append((const byte*)headerless.data(),headerless.size()); + } + void setData(const ByteBuffer &headerless) + { + this->clear(); + this->append((const byte*)headerless.contents(),headerless.size()); + } + + unsigned short getRemoteSeq() + { + return remoteSeq; + } + unsigned short getLocalSeq() + { + return localSeq; + } + byte getPSS() + { + return playerSetupState; + } + ByteBuffer getData() + { + ByteBuffer zeReturn; + zeReturn.append((const byte*)this->contents(),this->size()); + zeReturn.rpos(0); + return zeReturn; + } + ByteBuffer getDataWithHeader(); +private: + uint16 localSeq; + uint16 remoteSeq; + uint8 playerSetupState; +}; + +#endif \ No newline at end of file