소셜 게임에서는 기본적으로 어떤 게임이라도 프로세스 메모리 편집기를 사용한 치트가 쉽게 이루어진다. 그러나 게임 내 경제가 존재하는 게임에서 이러한 치트를 막는 것은 매우 서툴다. 프로세스 메모리 편집기를 사용한 치트를 막는 방법에 대해서 알아본다.

 

프로세스 메모리 편집기란

프로세스 메모리 편집기란 프로그램 실행 중 메모리 내용을 해석하여 바꾸어서 프로그램의 동작을 변화시킬 수 있는 에디터.

 

왜 소셜 게임으로 이것을 막는 것이 필요한다?

종래의 PC용 온라인 게임에서는 일반적으로 "게임가드"이라고 불리는 보안을 담보하는 소프트웨어를 사용했다. 그러나 iOS Android에서는 "게임가드"를 사용할 수 없다. iOS라면 앱을 AppStore에 등록하기 전에 Apple에 의해 심사되므로 "프로세스 메모리 편집기"와 같은 Apple의 의사에 반대되는 앱은 AppStore에 등록할 수 없는 구조이다. 그러나 "JailBreak"로 불리는 iOS의 보안 구멍을 찌른 크래킹을 통해서 프로세스 메모리 편집기가 사용 가능하게 된다.

Android에서는 Google Play에 의한 앱의 심사 자체가 존재하지 않으므로 일견 매우 위험하게 보이지만 올바른 퍼미션 설정에 의한 프로세스 메모리 편집기를 사용할 수 없게 되어 있지만 "root"라고 불리는 root 권한을 얻는 방법도 존재하므로 프로세스 메모리 편집기를 사용할 수 있다.

 

프로세스 메모리 편집기를 이용한 치트에 대한 대책

치트를 막을려면 우선 치트를 실시하는 방법을 숙지해야 한다.

 

프로세스 메모리 편집기를 이용해 치트 하는 방법

예를 들어 게임 내의 ""을 늘리고 싶은 경우를 보자.

"" 300이므로 메모리 내에서 300을 가리키고 있는 곳을 찾아서 감시한다.

가게에서 쇼핑을 하는 등 하면서 ""이 변동하는 행동을 게임 내에서 한다.

"" 200까지 줄어든 것을 확인한다.

메모리 내에서 ""이 가게에서 쇼핑을 하기 전에 300, 또 가게에서 쇼핑 후에 200이 되어 있는 곳을 압축.

""이 가리키고 있는 곳을 지정하여 10000로 고쳐 쓰다.

 

위와 같은 절차로 프로세스 메모리 편집기를 이용한 치트를 한다.

 

 

프로세스 메모리 편집기를 이용한 치트에 대한 대책 방법

구체적인 대책 방안으로 아래의 2가지를 들 수 있다.

 

1. 처음부터 사용자 인터페이스에 ""을 표시하지 않는다

2. ""의 수치에 salt를 혼입하다

 

처음부터 사용자 인터페이스에 ""을 표시하지 않는다

""의 수치를 사용자에게 공표하지 않음으로 이러한 치트는 미연에 방지할 수 있다. 그러나 ""을 사용자에게 공표하지 않는 게임은 없으므로 이 방법은 실용적이라고 말하기 어렵다.

 

""의 수치에 salt를 혼입하다

다음과 같이 "" 수치에 salt를 혼입함으로써 프로세스 메모리 편집기에 의한 추출을 저해할 수 있다.

아래는 Java에 의한 샘플 코드이다.

private static final Integer CONVERT_NUMERIC=12345; // 정수(salt)

private Integer haveMoney=300+CONVERT_NUMERIC; // 저장용

private Integer outPut=haveMoney-CONVERT_NUMERIC; // 출력용

 

이렇게 하면 300이라는 수치를 프로세스 메모리 편집기에서 찾아도 발견되지 않는다. 그러나 이 방법으로는 ""의 변동치 폭을 감시함으로써 상수(salt)에 사용되고 있는 값이 알려질 가능성이 있다. 이것은 암호화의 하나로 암호화할 때 해독할 때의 CONVERT_NUMERIC의 값만 일치하면 CONVERT_NUMERIC에 난수를 이용하는 것도 가능하다.

암호화에 난수를 사용하면 다음과 같은 코드이다.

import java.util.Random;

 

class TestClass

{

private Integer convertNumeric=0; // 난수를 유지하는 변수

  private Integer haveMoney=0; // 돈을 유지하는 변수

 

  private Integer encryptMoney(Integer money)

{

   convertNumeric=rnd.nextInt(12345); // 0~12345까지 난수를 생성

   return money+convertNumeric;

  }

 

private void displayMoney(Integer haveMoney)

{

    System.out.println(haveMoney-convertNumeric);

  }

 

public static void main(String args[])

{

   haveMoney=encryptMoney(getMoney(); / /돈에 난수를 더한다

   displayMoney(haveMoney); // 화면에 출력

   saveMoney(convertNumeric); // 돈으로부터 난수를 빼고, 복호화 하여 DB에 저장

  }

}

 

위의 salt는 ""이 변동할 때마다 랜덤으로 할 필요가 있다. 이유는 상기와 같이 변동치 폭을 감시해도 salt의 값이 알려지지 않도록 하기 위함이다.

 

 

 

출처: http://promamo.com/?p=3189

 

저작자 표시
신고
by 흥배 2014.04.17 08:00
| 1 |

티스토리 툴바