Exemplo n.º 1
0
        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;
        }
Exemplo n.º 2
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());
     }
 }