해당 분류 : 자바에 대한 이야기    스피드핵을 잡아보자! CM_PING & SM_PONG    글을 기록한 날 : 2011/06/21 02:40

Ping-pong : 탁구
위와같이 일반적으로 말하는 ping-pong은 탁구를 의미합니다.
그런데 스피드핵을 잡자면서 왠 탁구냐! 라고 생각하시는분들을 위해서
간략하게 설명하고 소스 올려드리도록 하겠습니다.
탁구는 혼자서 하는 스포츠가 아니죠. 최소한 벽이라도 있어야 합니다.
그리고 탁구는 공이 왔다가 다시 가야하고
일단 규칙에 의해서 왕복하는것입니다.
위에서 말하는 CM_PING, SM_PONG은
클라이언트에서 CM_PING이라는 패킷을 서버측으로 전송하면
서버는 다시 SM_PONG이라는 패킷을 클라이언트로 전송하게 됩니다.
이와같은 확인작업을 아이온에서는 3분(180000ms)에 한번씩 진행합니다.
하지만 이 값이 3분보다 작은 시간에 진행되었다면 이유가 무엇일까요?
그렇죠! 스피드핵의 대부분의 작동 원리는 클라이언트의 시스템타이머를
빠르게 해서 해당 클라이언트의 실행속도를 강제로 높이는 방식을 취합니다.
그에 따라 서로 주고 받는 Ping-Pong에 대한 간격도 함께 빨라지는것이죠.
그걸 이용해서 스피드핵을 검출해내는 것입니다.
자 이제 잡설은 그만! 소스 나갑니다~!

/**
 * This file is part of Aion X Emu <aionxemu.com>
 *
 *  This is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This software 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 Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser Public License
 *  along with this software.  If not, see <http://www.gnu.org/licenses/>.
 */

package gameserver.network.aion.clientpackets;

import gameserver.configs.main.CustomConfig;
import gameserver.network.aion.AionClientPacket;
import gameserver.network.aion.serverpackets.SM_PONG;

import org.apache.log4j.Logger;

/**
 * I have no idea wtf is this
 *
 * @author -Nemsiss-
 */
public class CM_PING extends AionClientPacket
{
  private static final Logger  log      = Logger.getLogger(CM_PING.class);
  private static boolean    firstPing  = true;

  /**
   * Constructs new instance of <tt>CM_PING </tt> packet
   *
   * @param opcode
   */
  public CM_PING(int opcode)
  {
    super(opcode);
  }

  /**
   * {@inheritDoc}
   */
  @Override
  protected void readImpl()
  {
    // 추가적으로 읽어올 값이 없기 때문에 비어있음
  }

  /**
   * {@inheritDoc}
   */
  @Override
  protected void runImpl()
  {
    long lastMS = getConnection().getLastPingTimeMS();
    // 최근에 Ping을 받은 시간

    if(lastMS > 0)
    { // 기록되어 있다면
      long pingInterval = System.currentTimeMillis() - lastMS;
      // 최근에 받은 시간에서 현재시간을 빼서 간격을 구합니다.
      // 일반적인 핑 간격은 3분입니다. (180000ms)
      if(pingInterval < CustomConfig.KICK_PINGINTERVAL)
      // 환경설정에 설정된 값보다 작은 값이 들어있다면
      // 기본값 : 100000ms
      {
        String ip = getConnection().getIP();
        // IP를 얻어와서
        String name = "[unknown]";
        if(getConnection().getActivePlayer() != null)
          name = getConnection().getActivePlayer().getName();
        // 대상 플레이어가 존재한다면 해당 플레이어 이름으로 대상자를 기록하고

        if(CustomConfig.KICK_SPEEDHACK)
        {
          // 스피드핵 사용자를 차단하도록 설정되어 있다면
          if(!firstPing)
          { // 처음 보낸 ping이 아니라면
            log.info("[AUDIT] possible client timer cheat kicking player: "
              + pingInterval + " by " + name + ", ip=" + ip);
            //로그에 기록을 남기고
            getConnection().getActivePlayer().getClientConnection().close(true);
            //플레이어 연결을 강제로 종료 시킨다.
            return;
          }
          firstPing = false; //한번 ping을 받으면 처음 보낸 ping이 아니라고 설정.
        }
        else
        { // 스피드핵 사용자를 차단하지 않도록 설정되어 있다면 그냥 로그만 기록하고 끝.
          log.info("[AUDIT] possible client timer cheat: " + pingInterval
            + " by " + name + ", ip=" + ip);
        }

      }

    }
    getConnection().setLastPingTimeMS(System.currentTimeMillis());
    // 마지막으로 ping을 받은시간을 기록
    sendPacket(new SM_PONG());
    // SM_PONG() 패킷 보내기.
  }
}
Creative Commons License
Creative Commons License

트랙백 주소 : http://www.barahime.org/trackback/13

  1. Subject : garcinia cambogia extract

    Tracked from garcinia cambogia extract / 2014/03/31 09:24  삭제

    아이온으로 풀어보는 자바이야기 ::

  2. Subject : شركة نظافه في جده

    Tracked from شركة نظافه في جده / 2014/08/26 14:39  삭제

    아이온으로 풀어보는 자바이야기 ::

  3. Subject : مؤسسة تنظيف منازل بالرياض

    Tracked from مؤسسة تنظيف منازل بالرياض / 2014/08/26 15:15  삭제

    아이온으로 풀어보는 자바이야기 ::

  4. Subject : lady

    Tracked from lady / 2014/09/09 02:22  삭제

    아이온으로 풀어보는 자바이야기 ::

  5. Subject : شركة تنظيف بالرياض

    Tracked from شركة تنظيف بالرياض / 2014/09/22 00:51  삭제

    아이온으로 풀어보는 자바이야기 :: 스피드핵을 잡아보자! CM_PING & SM_PONG

  6. Subject : شركة تنظيف فلل بالرياض

    Tracked from شركة تنظيف فلل بالرياض / 2014/09/23 03:17  삭제

    아이온으로 풀어보는 자바이야기 :: 스피드핵을 잡아보자! CM_PING & SM_PONG

  7. Subject : My Website

    Tracked from My Website / 2014/10/22 17:12  삭제

    아이온으로 풀어보는 자바이야기 :: 스피드핵을 잡아보자! CM_PING & SM_PONG

Notice

Blogroll

Counter

· Total
: 274246
· Today
: 20
· Yesterday
: 36