public void DealMsg(ReceiveMsgData _data) { if (_data == null) { return; } byte[] _dataBytes = _data.receiveBytes; IPEndPoint receivePoint = _data.receivePoint; ByteBuffer _buff = new ByteBuffer(_dataBytes); int length = _buff.ReadInt32(); //真实长度 byte[] _bytes = _buff.ReadBytes(length); MessageData data = ProtoBufTools.DeSerialize <MessageData>(_bytes); data.receivePoint = receivePoint; DealMsgSwitch(data); }
public void DealMsg(MessageReceiveData _data) { if (_data == null) { return; } byte[] _dataBytes = _data.receiveBytes; IPEndPoint receivePoint = _data.receivePoint; ByteBuffer _buff = new ByteBuffer(_dataBytes); int length = _buff.ReadInt32(); byte[] _bytes = _buff.ReadBytes(length); MessageData <BaseMessageData> data = ProtoBufTools.DeSerialize <MessageData <BaseMessageData> > (_bytes); if (data.body.dealFlg == 0) { if (Main.Self.clientType == ClientType.server) { if (data.head.cmd == 1 && data.head.scmd == 1) { Main.Self.server.AddPlayer(receivePoint); } else if (data.head.cmd == 1 && data.head.scmd == 2) { Main.Self.server.RemovePlayer(receivePoint); } byte[] _serverDealBytes = ServerDealMsg(data, receivePoint); ByteBuffer _serverDealBuff = new ByteBuffer(); _serverDealBuff.WriteInt32(_serverDealBytes.Length); _serverDealBuff.WriteBytes(_serverDealBytes); Main.Self.server.AddSendQueue(_serverDealBuff.ToBytes()); } } else { if (Main.Self.clientType == ClientType.server) { } else { } SwitchMsg(data); } }
public override void HandleHashResult(ByteBuffer buff) { // Verify key if (buff.ReadBytes(20) != WardenModuleWin.ClientKeySeedHash) { Log.outWarn(LogFilter.Warden, "{0} failed hash reply. Action: {0}", _session.GetPlayerInfo(), Penalty()); return; } Log.outDebug(LogFilter.Warden, "Request hash reply: succeed"); // Change keys here _inputKey = WardenModuleWin.ClientKeySeed; _outputKey = WardenModuleWin.ServerKeySeed; _inputCrypto.PrepareKey(_inputKey); _outputCrypto.PrepareKey(_outputKey); _initialized = true; _previousTimestamp = GameTime.GetGameTimeMS(); }
public override void HandleData(ByteBuffer buff) { Log.outDebug(LogFilter.Warden, "Handle data"); _dataSent = false; _clientResponseTimer = 0; ushort Length = buff.ReadUInt16(); uint Checksum = buff.ReadUInt32(); if (!IsValidCheckSum(Checksum, buff.GetData(), Length)) { Log.outWarn(LogFilter.Warden, "{0} failed checksum. Action: {1}", _session.GetPlayerInfo(), Penalty()); return; } // TIMING_CHECK { byte result = buff.ReadUInt8(); // @todo test it. if (result == 0x00) { Log.outWarn(LogFilter.Warden, "{0} failed timing check. Action: {1}", _session.GetPlayerInfo(), Penalty()); return; } uint newClientTicks = buff.ReadUInt32(); uint ticksNow = GameTime.GetGameTimeMS(); uint ourTicks = newClientTicks + (ticksNow - _serverTicks); Log.outDebug(LogFilter.Warden, "ServerTicks {0}", ticksNow); // Now Log.outDebug(LogFilter.Warden, "RequestTicks {0}", _serverTicks); // At request Log.outDebug(LogFilter.Warden, "Ticks {0}", newClientTicks); // At response Log.outDebug(LogFilter.Warden, "Ticks diff {0}", ourTicks - newClientTicks); } BigInteger rs; WardenCheck rd; WardenCheckType type; ushort checkFailed = 0; foreach (var id in _currentChecks) { rd = Global.WardenCheckMgr.GetWardenDataById(id); rs = Global.WardenCheckMgr.GetWardenResultById(id); type = rd.Type; switch (type) { case WardenCheckType.Memory: { byte Mem_Result = buff.ReadUInt8(); if (Mem_Result != 0) { Log.outDebug(LogFilter.Warden, "RESULT MEM_CHECK not 0x00, CheckId {0} account Id {1}", id, _session.GetAccountId()); checkFailed = id; continue; } if (buff.ReadBytes(rd.Length).Compare(rs.ToByteArray())) { Log.outDebug(LogFilter.Warden, "RESULT MEM_CHECK fail CheckId {0} account Id {1}", id, _session.GetAccountId()); checkFailed = id; continue; } Log.outDebug(LogFilter.Warden, "RESULT MEM_CHECK passed CheckId {0} account Id {1}", id, _session.GetAccountId()); break; } case WardenCheckType.PageA: case WardenCheckType.PageB: case WardenCheckType.Driver: case WardenCheckType.Module: { byte value = 0xE9; if (buff.ReadUInt8() != value) { if (type == WardenCheckType.PageA || type == WardenCheckType.PageB) { Log.outDebug(LogFilter.Warden, "RESULT PAGE_CHECK fail, CheckId {0} account Id {1}", id, _session.GetAccountId()); } if (type == WardenCheckType.Module) { Log.outDebug(LogFilter.Warden, "RESULT MODULE_CHECK fail, CheckId {0} account Id {1}", id, _session.GetAccountId()); } if (type == WardenCheckType.Driver) { Log.outDebug(LogFilter.Warden, "RESULT DRIVER_CHECK fail, CheckId {0} account Id {1}", id, _session.GetAccountId()); } checkFailed = id; continue; } if (type == WardenCheckType.PageA || type == WardenCheckType.PageB) { Log.outDebug(LogFilter.Warden, "RESULT PAGE_CHECK passed CheckId {0} account Id {1}", id, _session.GetAccountId()); } else if (type == WardenCheckType.Module) { Log.outDebug(LogFilter.Warden, "RESULT MODULE_CHECK passed CheckId {0} account Id {1}", id, _session.GetAccountId()); } else if (type == WardenCheckType.Driver) { Log.outDebug(LogFilter.Warden, "RESULT DRIVER_CHECK passed CheckId {0} account Id {1}", id, _session.GetAccountId()); } break; } case WardenCheckType.LuaStr: { byte Lua_Result = buff.ReadUInt8(); if (Lua_Result != 0) { Log.outDebug(LogFilter.Warden, "RESULT LUA_STR_CHECK fail, CheckId {0} account Id {1}", id, _session.GetAccountId()); checkFailed = id; continue; } byte luaStrLen = buff.ReadUInt8(); if (luaStrLen != 0) { Log.outDebug(LogFilter.Warden, "Lua string: {0}", buff.ReadString(luaStrLen)); } Log.outDebug(LogFilter.Warden, "RESULT LUA_STR_CHECK passed, CheckId {0} account Id {1}", id, _session.GetAccountId()); break; } case WardenCheckType.MPQ: { byte Mpq_Result = buff.ReadUInt8(); if (Mpq_Result != 0) { Log.outDebug(LogFilter.Warden, "RESULT MPQ_CHECK not 0x00 account id {0}", _session.GetAccountId()); checkFailed = id; continue; } if (!buff.ReadBytes(20).Compare(rs.ToByteArray())) // SHA1 { Log.outDebug(LogFilter.Warden, "RESULT MPQ_CHECK fail, CheckId {0} account Id {1}", id, _session.GetAccountId()); checkFailed = id; continue; } Log.outDebug(LogFilter.Warden, "RESULT MPQ_CHECK passed, CheckId {0} account Id {1}", id, _session.GetAccountId()); break; } default: // Should never happen break; } } if (checkFailed > 0) { WardenCheck check = Global.WardenCheckMgr.GetWardenDataById(checkFailed); Log.outWarn(LogFilter.Warden, "{0} failed Warden check {1}. Action: {2}", _session.GetPlayerInfo(), checkFailed, Penalty(check)); } // Set hold off timer, minimum timer should at least be 1 second uint holdOff = WorldConfig.GetUIntValue(WorldCfg.WardenClientCheckHoldoff); _checkTimer = (holdOff < 1 ? 1 : holdOff) * Time.InMilliseconds; }