public override void OnPacketInbound(Packet pPacket) { // Console.WriteLine("Got packet from server -> client: " + pPacket.ToString()); base.PrintPacket(pPacket, " SERVER -> BYPASS", true); ushort header = pPacket.ReadUShort(); if ((ClientSession.Instance != null) && !ClientSession.Instance.Disconnected) { if (header == 0x000B) ConnectToChannelServer(pPacket); else if (header == 0x0011) //old:0x010 ChangeChannel(pPacket); else { ClientSession.Instance.SendPacket(pPacket); } } }
private void ChangeChannel(Packet pPacket) { byte status = pPacket.ReadByte(); string ip = string.Format("{0}.{1}.{2}.{3}", pPacket.ReadByte(), pPacket.ReadByte(), pPacket.ReadByte(), pPacket.ReadByte()); // Ignore IP ushort port = pPacket.ReadUShort(); byte[] leftover = pPacket.ReadLeftoverBytes(); CCing = true; NextPort = port; Packet packet = new Packet(); packet.WriteUShort(0x0011); packet.WriteByte(1); packet.WriteBytes(Constants.MapleStory_LoginIP_Bytes); packet.WriteUShort(8484); packet.WriteBytes(leftover); ClientSession.Instance.SendPacket(packet); Console.WriteLine("1 Status "+status+": Change Channel: " + packet.ToString()); }
/// <summary> /// Used as IAsyncResult parser for ContinueReading(). /// </summary> /// <param name="pIAR">The result AsyncCallback makes</param> private void EndReading(IAsyncResult pIAR) { int amountReceived = 0; try { amountReceived = _socket.EndReceive(pIAR); } catch (Exception ex) { amountReceived = 0; Console.WriteLine(TypeName + " amountReceived == 0! " + ex.ToString()); } if (amountReceived == 0) { Console.WriteLine(TypeName + " amountReceived == 0! OnDisconnectInternal()"); // We got a disWvsBeta.Common.Sessions here! OnDisconnectINTERNAL(); return; } // Add amount of bytes received to _bufferpos so we know if we got everything. _bufferpos += amountReceived; try { // Check if we got all data. There is _no_ way we would have received more bytes than needed. Period. if (_bufferpos == _bufferlen) { // It seems we have all data we need // Now check if we got a header if (_header) { if (!_encryption && _receivingFromServer) { // Unencrypted packets have a short header with plain length. ushort length = (ushort)(_buffer[0] | _buffer[1] << 8); StartReading(length); } else { int length = GetHeaderLength(_buffer); StartReading(length); } } else { Packet packet; if (_encryption) { _buffer = Decrypt(_buffer); packet = new Packet(_buffer); DoAction((date) => { try { OnPacketInbound(packet); } catch (Exception ex) { Console.WriteLine("Handling Packet Error: {0}", ex.ToString()); } }); } else { _encryption = true; // First packet received or sent is unencrypted. All others are. packet = new Packet(_buffer); _mapleVersion = packet.ReadUShort(); _maplePatchLocation = _maplePatchLocation = packet.ReadString(); _encryptIV = packet.ReadBytes(4); _decryptIV = packet.ReadBytes(4); _mapleLocale = packet.ReadByte(); Console.WriteLine(TypeName + " MapleVersion: {0}; Patch Location: {1}; Locale: {2}", _mapleVersion, _maplePatchLocation, _mapleLocale); if (_mapleLocale == 8 && _mapleVersion >= 118) { SwitchAESByVersion(_mapleVersion); } packet.Reset(); DoAction((date) => { try { OnHandshakeInbound(packet); } catch (Exception ex) { Console.WriteLine("Handling Packet Error: {0}", ex.ToString()); } }); } StartReading(4, true); } } else { ContinueReading(); } } catch (SocketException socketException) { Console.WriteLine(TypeName + " Socket Exception while receiving data: {0}", socketException.Message); OnDisconnectINTERNAL(); } catch (Exception ex) { Console.WriteLine(TypeName + " [ERROR] EndReading(): {0}", ex.ToString()); OnDisconnectINTERNAL(); } }
public virtual void OnPacketInbound(Packet pPacket) { Console.WriteLine(TypeName + " No Handler for 0x{0:X4}", pPacket.ReadUShort()); }
/// <summary> /// Used as IAsyncResult parser for ContinueReading(). /// </summary> /// <param name="pIAR">The result AsyncCallback makes</param> private void EndReading(IAsyncResult pIAR) { int amountReceived = 0; try { amountReceived = _socket.EndReceive(pIAR); } catch (Exception ex) { Trace.WriteLine("EXCEPT" + " : " + ex.ToString()); amountReceived = 0; } if (amountReceived == 0) { OnDisconnectINTERNAL("No data received"); return; } // Add amount of bytes received to _bufferpos so we know if we got everything. _bufferpos += amountReceived; try { // Check if we got all data. There is _no_ way we would have received more bytes than needed. Period. if (_bufferpos == _bufferlen) { // It seems we have all data we need // Now check if we got a header if (_header) { if (!_encryption && _receivingFromServer) { // Unencrypted packets have a short header with plain length. ushort length = (ushort)(_buffer[0] | _buffer[1] << 8); StartReading(length); } else { int length = GetHeaderLength(_buffer, _bufferlen, _decryptIV, _mapleVersion, _receivingFromServer); if (length == HEADER_ERROR_MORE_DATA) { _bufferlen += 4; ContinueReading(); } else { StartReading(length); } } } else { Packet packet; if (_encryption) { // Small scope hack; this will be on the stack until the // callback in DoAction leaves scope byte[] tmpIV = new byte[4]; Array.Copy(_decryptIV, 0, tmpIV, 0, 4); // Make a copy of the data because it will be transformed var tempBuff = new byte[_bufferlen]; Array.Copy(_buffer, 0, tempBuff, 0, _bufferlen); var data = Decrypt(tempBuff, _bufferlen, _decryptIV); packet = new Packet(data, _bufferlen); byte opcode = data[0]; DoAction((date) => { if (Disconnected) { return; } try { Array.Copy(tmpIV, 0, previousDecryptIV, 0, 4); OnPacketInbound(packet); } catch (Exception ex) { ////Console.WriteLine("Handling Packet Error: {0}", ex.ToString()); } }, "Packet handling opcode: " + opcode); } else { _encryption = true; // First packet received or sent is unencrypted. All others are. packet = new Packet(_buffer, _bufferlen); _mapleVersion = packet.ReadUShort(); _maplePatchLocation = packet.ReadString(); _encryptIV = packet.ReadBytes(4); _decryptIV = packet.ReadBytes(4); _mapleLocale = packet.ReadByte(); StartSendAndEncryptLoop(); initCipher(); packet.Reset(); DoAction((date) => { try { OnHandshakeInbound(packet); } catch (Exception ex) { ////Console.WriteLine("Handling Packet Error: {0}", ex.ToString()); } }, "Handshake handling"); } StartReading(4, true); } } else { ContinueReading(); } } catch (SocketException socketException) { Trace.WriteLine(TypeName + " Socket Exception while receiving data: " + socketException); OnDisconnectINTERNAL("EndRead socket exception"); } catch (ObjectDisposedException) { OnDisconnectINTERNAL("EndRead object disposed"); } catch (Exception ex) { Trace.WriteLine(TypeName + " [ERROR] EndReading(): " + ex); OnDisconnectINTERNAL("EndRead exception"); } }
public override void OnPacketInbound(Packet pPacket) { Console.WriteLine("Got packet from client -> Server: " + pPacket.ToString()); base.PrintPacket(pPacket, " CLIENT -> BYPASS", true); //string header = pPacket.ToString().Substring(0, 2); // NOTE: Do not use this. It'll slow down the connection a whole lot. Just read the first ushort and use it. if (Program.ServerSession != null) { ushort header = pPacket.ReadUShort(); Program.ServerSession.SendPacket(pPacket); switch (header) { case 0x0036: SendLoginData(Form1.Username, Form1.Password); break; case 0x002F: HandleIntAuth(pPacket); break; } } }
public virtual void OnPacketInbound(Packet pPacket) { MWLR_Logging.Logger.WriteLine(TypeName + " No Handler for 0x{0:X4}", pPacket.ReadUShort()); }
/// <summary> /// Used as IAsyncResult parser for ContinueReading(). /// </summary> /// <param name="pIAR">The result AsyncCallback makes</param> private void EndReading(IAsyncResult pIAR) { int amountReceived = 0; try { amountReceived = _socket.EndReceive(pIAR); } catch (Exception ex) { MWLR_Logging.Logger.WriteLine(TypeName + " : " + ex.ToString()); amountReceived = 0; } if (amountReceived == 0) { // We got a disconnection here! OnDisconnectINTERNAL(); return; } // Add amount of bytes received to _bufferpos so we know if we got everything. _bufferpos += amountReceived; try { // Check if we got all data. There is _no_ way we would have received more bytes than needed. Period. if (_bufferpos == _bufferlen) { // It seems we have all data we need // Now check if we got a header if (_header) { if (!_encryption && _receivingFromServer) { // Unencrypted packets have a short header with plain length. ushort length = (ushort)(_buffer[0] | _buffer[1] << 8); StartReading(length); } else { int length = GetHeaderLength(_buffer); StartReading(length); } } else { Packet packet; if (_encryption) { _buffer = Decrypt(_buffer, _mapleLocale == 1); packet = new Packet(_buffer); DoAction((date) => { try { OnPacketInbound(packet); } catch (Exception ex) { MWLR_Logging.Logger.WriteLine("Handling Packet Error: {0}", ex.ToString()); } }); } else { _encryption = true; // First packet received or sent is unencrypted. All others are. packet = new Packet(_buffer); _mapleVersion = packet.ReadUShort(); _maplePatchLocation = packet.ReadString(); _encryptIV = packet.ReadBytes(4); _decryptIV = packet.ReadBytes(4); _mapleLocale = packet.ReadByte(); MWLR_Logging.Logger.WriteLine(TypeName + " MapleVersion: {0}; Patch Location: {1}; Locale: {2}", _mapleVersion, _maplePatchLocation, _mapleLocale); if (_mapleLocale == 1) { int test = int.Parse(_maplePatchLocation); ushort t1 = (ushort)(test & 0x7FFF); int t2 = (test >> 15) & 1; int t3 = (test >> 16) & 0xFF; MWLR_Logging.Logger.WriteLine("Logging KMS connection. Version {0} | {1} | {2}", t1, t2, t3); _mapleVersion = t1; _maplePatchLocation = t3.ToString(); } else if (_mapleLocale == 8 && _mapleVersion >= 118) { if (!MWLR_Logging.GMSKeys.ContainsKey(_mapleVersion)) { MWLR_Logging.GMSKeys.Initialize(); } if (MWLR_Logging.GMSKeys.ContainsKey(_mapleVersion)) { SwitchAESByVersion(_mapleVersion); } else { MWLR_Logging.Logger.WriteLine("There's no key for this version, yet."); MWLR_Logging.TwitterClient.Instance.SendMessage("HEY, @Diamondo25! Update da keyzz!!"); Disconnect(); System.Threading.Thread.Sleep(15 * 60 * 1000); } } packet.Reset(); DoAction((date) => { try { OnHandshakeInbound(packet); } catch (Exception ex) { MWLR_Logging.Logger.WriteLine("Handling Packet Error: {0}", ex.ToString()); } }); } StartReading(4, true); } } else { ContinueReading(); } } catch (SocketException socketException) { MWLR_Logging.Logger.WriteLine(TypeName + " Socket Exception while receiving data: {0}", socketException.Message); OnDisconnectINTERNAL(); } catch (Exception ex) { MWLR_Logging.Logger.WriteLine(TypeName + " [ERROR] EndReading(): {0}", ex.ToString()); OnDisconnectINTERNAL(); } }
/// <summary> /// Used as IAsyncResult parser for ContinueReading(). /// </summary> /// <param name="pIAR">The result AsyncCallback makes</param> private void EndReading(IAsyncResult pIAR) { int amountReceived = 0; try { amountReceived = _socket.EndReceive(pIAR); } catch (Exception ex) { MWLR_Logging.Logger.WriteLine(TypeName + " : " + ex.ToString()); amountReceived = 0; } if (amountReceived == 0) { // We got a disconnection here! OnDisconnectINTERNAL(); return; } // Add amount of bytes received to _bufferpos so we know if we got everything. _bufferpos += amountReceived; try { // Check if we got all data. There is _no_ way we would have received more bytes than needed. Period. if (_bufferpos == _bufferlen) { // It seems we have all data we need // Now check if we got a header if (_header) { if (!_encryption && _receivingFromServer) { // Unencrypted packets have a short header with plain length. ushort length = (ushort)(_buffer[0] | _buffer[1] << 8); StartReading(length); } else { int length = GetHeaderLength(_buffer); StartReading(length); } } else { Packet packet; if (_encryption) { _buffer = Decrypt(_buffer, _mapleLocale == 1); packet = new Packet(_buffer); DoAction((date) => { try { OnPacketInbound(packet); } catch (Exception ex) { MWLR_Logging.Logger.WriteLine("Handling Packet Error: {0}", ex.ToString()); } }); } else { _encryption = true; // First packet received or sent is unencrypted. All others are. packet = new Packet(_buffer); _mapleVersion = packet.ReadUShort(); _maplePatchLocation = packet.ReadString(); _encryptIV = packet.ReadBytes(4); _decryptIV = packet.ReadBytes(4); _mapleLocale = packet.ReadByte(); MWLR_Logging.Logger.WriteLine(TypeName + " MapleVersion: {0}; Patch Location: {1}; Locale: {2}", _mapleVersion, _maplePatchLocation, _mapleLocale); if (_mapleLocale == 1) { int test = int.Parse(_maplePatchLocation); ushort t1 = (ushort)(test & 0x7FFF); int t2 = (test >> 15) & 1; int t3 = (test >> 16) & 0xFF; MWLR_Logging.Logger.WriteLine("Logging KMS connection. Version {0} | {1} | {2}", t1, t2, t3); _mapleVersion = t1; _maplePatchLocation = t3.ToString(); } else if (_mapleLocale == 8 && _mapleVersion >= 118) { if (!MWLR_Logging.GMSKeys.ContainsKey(_mapleVersion)) MWLR_Logging.GMSKeys.Initialize(); if (MWLR_Logging.GMSKeys.ContainsKey(_mapleVersion)) { SwitchAESByVersion(_mapleVersion); } else { MWLR_Logging.Logger.WriteLine("There's no key for this version, yet."); MWLR_Logging.TwitterClient.Instance.SendMessage("HEY, @Diamondo25! Update da keyzz!!"); Disconnect(); System.Threading.Thread.Sleep(15 * 60 * 1000); } } packet.Reset(); DoAction((date) => { try { OnHandshakeInbound(packet); } catch (Exception ex) { MWLR_Logging.Logger.WriteLine("Handling Packet Error: {0}", ex.ToString()); } }); } StartReading(4, true); } } else { ContinueReading(); } } catch (SocketException socketException) { MWLR_Logging.Logger.WriteLine(TypeName + " Socket Exception while receiving data: {0}", socketException.Message); OnDisconnectINTERNAL(); } catch (Exception ex) { MWLR_Logging.Logger.WriteLine(TypeName + " [ERROR] EndReading(): {0}", ex.ToString()); OnDisconnectINTERNAL(); } }
public virtual void OnPacketInbound(Packet pPacket) { MWLR_Logging.Logger.WriteLine(TypeName + " No Handler for 0x{0:X4}", pPacket.ReadUShort()); }