private void CheckTimeTick(byte[] buffer, ref Client client) { uint TickSvrNow = (uint)(int.MaxValue & (Environment.TickCount - client.TickCltUnique)); MSG_ZACL_CHK_TIMETICK cTick = new MSG_ZACL_CHK_TIMETICK(); cTick.Deserialize(ref buffer); if (client.TickCltPre == 0) { //client.TickSvrPre = cTick.dwTickSvr; client.TickSvrPre = TickSvrNow; client.TickCltPre = cTick.dwTickClt; client.TickCountPre = cTick.dwTickCount; return; } if (cTick.dwTickCount - client.TickCountPre != 1) { Logger.WriteSDB(string.Format("[Index] {0} {1} {2} Pre:{3} now:{4} SendTime:{5} {6}", client.Account, client.Character, client.IPadress, client.TickCountPre, cTick.dwTickCount, cTick.dwTickClt - client.TickCltPre, TickSvrNow - client.TickSvr)); client.TickCountPre = cTick.dwTickCount++; client.TickCount = cTick.dwTickCount; return; } if (cTick.dwTickSvr != client.TickSvr) { Logger.WriteSDB(string.Format("[Hack] {0} {1} {2} Changed SvrTick:{3}->{4} {5}", client.Account, client.Character, client.IPadress, client.TickSvr, cTick.dwTickSvr, TickSvrNow - client.TickSvr)); RemoveClient(client.Uid, 4); return; } long TickSvrDiff = Math.Abs(TickSvrNow - client.TickSvrPre); long TickCltDiff = Math.Abs(cTick.dwTickClt - client.TickCltPre); if (Math.Abs(TickSvrDiff - TickCltDiff) > 500) { /* * Logger.WriteSDB(string.Format("[Hack] {0} {1} {2} {3} {4} {5}", client.Account, client.Character, client.IPadress, TickSvrDiff, TickCltDiff, TickSvrNow - client.TickSvr)); * RemoveClient(client.Uid, 4); * return; * */ if (++client.TickErrCount > 1) { Logger.WriteSDB(string.Format("[Hack] {0} {1} {2} {3} {4} {5}", client.Account, client.Character, client.IPadress, TickSvrDiff, TickCltDiff, TickSvrNow - client.TickSvr)); RemoveClient(client.Uid, 4); return; } client.TickCountPre = cTick.dwTickCount; client.TickCltPre = cTick.dwTickClt; client.TickSvrPre = TickSvrNow; return; } client.TickCountPre = cTick.dwTickCount; client.TickCltPre = cTick.dwTickClt; client.TickSvrPre = TickSvrNow; //client.TickSvrPre = cTick.dwTickSvr; client.TickErrCount = 0; }
/// <summary> /// 5초마다 모든 클라이언트에 Tick요청 패킷을 보낸다. 스피드 핵 탐지에 사용. /// </summary> private void ReqTimeTick_Tick(Object state) { foreach (var player in _Players.Where(x => x.Value.ZoneStatus != Config.AS_ID).ToList()) { Client client = player.Value; client.TickSvr = (uint)(int.MaxValue & (Environment.TickCount - client.TickCltUnique)); MSG_ZACL_CHK_TIMETICK reqTick = new MSG_ZACL_CHK_TIMETICK(); reqTick.MsgHeader.dwPCID = client.Uid; reqTick.dwTickCount = client.TickCount++; reqTick.dwTickSvr = client.TickSvr; Write(ref client, reqTick.Serialize()); } }