LINE Corporation이 2023년 10월 1일부로 LY Corporation이 되었습니다. LY Corporation의 새로운 기술 블로그를 소개합니다. LY Corporation Tech Blog

Blog


게임 보안 운영 관점에서 바라본 게임 치트 방지 모니터링

들어가며

안녕하세요. LINE Game Security 팀에서 LINE GAME의 보안 운영을 담당하고 있는 이명재입니다. LINE GAME이 탄생한 지 벌써 6년이 지났습니다. 지난 6년 간의 경험을 토대로 '게임 보안 운영 관점에서 바라본 게임 치트(cheat) 방지 모니터링'에 대하여 여러분께 소개하려고 합니다. 게임 치트란, 악의적인 유저(이하, 어뷰저(abuser)로 지칭)가 앱을 조작하거나 데이터를 조작하는 등 비정상적인 방법으로 게임이 본인에게 유리하게 진행되도록 만드는 행위라고 정의할 수 있습니다. 

LINE에서는 LINE GAME 사용자 여러분이 안심하고 게임을 즐길 수 있도록 게임 앱을 릴리스한 뒤 다양한 방법으로 게임 내 어뷰저를 분석하고 이에 대응하고 있습니다. 최근에는 모바일 환경에서 작동하는 게임 앱이 인기를 누리고 있고, LINE이 릴리스하는 게임도 대부분 iOS나 Android 기반의 모바일 게임 앱입니다. 따라서 이번 글은 모바일 게임 앱을 주 대상으로 삼고 있습니다. 또한, 치트 방지를 위한 앱 자체의 대비보다는, 릴리스 후 모니터링 관점에서의 대책에 초점을 맞춘 이야기로 생각하고 읽어주시면 좋겠습니다

LINE GAME의 특징

게임 치트에 대해서 말씀드리기 전에, 먼저 LINE GAME의 특징을 소개하겠습니다.

첫 번째 특징은 LINE 로그인 연동입니다. 게임에서 LINE 로그인을 하면 LINE 친구와 랭킹을 겨루거나, 게임 진행에 필요한 하트를 서로 보내는 등 게임을 좀 더 다양한 방식으로 즐길 수 있습니다. 또한 휴대폰을 교체하거나 통신사를 변경한 후에도 기존 LINE 계정에 연결하여 게임을 이어서 진행할 수 있습니다.

두 번째 특징은 게임 내 통화가 2종류 존재한다는 점입니다. 과금해서 구입하는 통화를 1차 통화라고 하고, 1차 통화로 교환할 수 있는 통화를 2차 통화라고 합니다. 예를 들어 최근 릴리스한 LINE CHEF에선 다이아몬드가 1차 통화고, 코인이 2차 통화라고 생각하시면 됩니다. 1차 통화와 2차 통화는 게임 내에서 확률형 아이템이나 기타 다른 아이템을 구입하는데 사용할 수 있습니다.

세 번째 특징은 게임 내에서 통화 및 아이템을 다른 사용자에게 주거나 거래할 수 없다는 점입니다. 본인이 획득한 게임 내 통화와 아이템은 본인만 사용할 수 있습니다.

게임 치트의 종류

게임에서의 치트가 최근에 등장한 것은 아닙니다. 오래 전부터 PC 게임이나 콘솔 게임에서도 게임 치트는 존재해 왔고, 인터넷과 휴대폰이 널리 보급되어 온라인과 모바일 상에서 게임을 즐기는 지금까지 게임과 치트는 공존하고 있습니다.

지난 6년 간 게임 보안 운영 관점에서 바라본 치트의 종류는 아래와 같이 크게 3가지로 나눌 수 있습니다.

메모리 조작

메모리 상에서 값을 바꾸는 치트입니다. 예를 들어 메모리에서 게임 내 통화 및 아이템의 수를 검색해서 변경하는 방법입니다. 최근에는 메모리 검색과 변경을 손쉽게 할 수 있도록 도와주는 치트 도구가 인터넷에 많이 공개되어 있어서 누구나 입수해 시도할 수 있습니다. 이 글에서 치트 도구의 이름이나 사용 방법에 대해선 언급하지 않겠습니다. 도구 사용법 또한 인터넷에서 쉽게 찾을 수 있기 때문에 전문지식이 없어도 메모리 치트에 도전하는 어뷰저가 많을 겁니다. 아래 그림은 메모리에서 Coin의 수량을 변경한 메모리 치트의 예시입니다.

메모리 치트 방지 대책으로는 게임 내 통화나 아이템 수 등의 중요 변수를 암호화하는 방법이 있습니다.

패킷 조작

게임에서 통신할 때 사용하는 패킷을 조작하는 치트입니다. 예를 들어 게임 플레이 결과의 패킷을 분석, 조작하여 게임 내 통화나 아이템의 수를 변경합니다. 많은 네이티브(native)게임1은 클라이언트 쪽에서 게임을 플레이하고 그 결과를 서버로 전송하는 방식입니다. 이때 전송되는 플레이 결과의 패킷을 분석하고 조작하려면 경우에 따라서 전문 지식이 필요할 수도 있는데요. 그럼에도 빈번히 발견되는 치트 방식입니다. 아래 그림은 플레이 결과 패킷을 조작하여 실제 결과와는 다른 결과를 서버로 전송한 예시입니다. 

패킷 조작의 대책으로는, 게임 서버 측에서 게임 플레이 결과(파라미터)가 타당한지 체크하는 것입니다. 또한 플레이 1번으로 얻을 수 있는 통화나 아이템의 수 등을 제한하면 혹시 치트가 발생하더라도 그로 인한 피해를 최소화할 수 있는 효과를 얻을 수 있습니다.

바이너리 파일 조작

게임 클라이언트 측의 바이너리 파일을 조작하는 치트입니다. 예를 들어, Android에선 .apk파일을, iOS에선 .ipa파일을 조작합니다. 바이너리 파일의 내부에는 게임 연산에 사용되는 변수와 로직이 많이 존재합니다. 이런 변수나 로직을 조작하여 게임 내 통화 및 아이템의 수를 증가시키거나, 아군을 강하게 만들기도 하고, 적군을 약하게 만들기도 합니다.

바이너리 파일은 각 모바일 환경에 맞게 실행 파일의 형태로 변환되어 있기 때문에 아무나 쉽게 조작할 수 없습니다. 따라서 주로 전문지식을 갖고 있는 사람이 일명 리버스 엔지니어링 방법으로 진행하는 경우가 많습니다.2 아래 그림은 바이너리 파일을 조작하여 exp 값을 변경한 예시입니다.

바이너리 파일 조작은 방지하는 게 굉장히 어렵습니다. 단말기에 설치한 게임 앱은 사용자가 추출하는 게 가능하여 사용자가 마음만 먹으면 아무때나 클라이언트 모듈을 추출하여 손댈 수 있기 때문입니다. 

바이너리 파일 조작을 방지하기 위한 대책으로는 리버스 엔지니어링 분석을 어렵게 만드는 난독화와 같은 방법이 있습니다. 하지만 이런 대책이 완벽하다고 생각하지는 않습니다. 전문 지식을 갖춘 사람이 시간과 노력을 들이면 언젠가는 클라이언트 모듈을 파헤칠 수 있다고 생각하기 때문입니다. 물론 그럼에도 난독화를 적용하면 조작에 대한 내성을 키울 수 있어서 적용하는 걸 추천합니다. 다만, 난독화는 난독화 방법이나 난독화 수행에 사용한 제품에 따라서 파일의 크기나 앱 기동 시간이 늘어나는 경우도 있어서 고려할 점이 많은데요. 이 글에선 난독화 적용 방법에 대한 자세한 설명은 생략하겠습니다.

이상 3가지 종류의 치트 방식에 대해서 설명했는데요. 대부분 클라이언트 측을 해킹하는 방식입니다. 클라이언트 측 해킹 방지는 매일 치트 방식의 동향을 관찰하며 클라이언트 모듈을 개선해 나가는 일련의 노력이라고 할 수 있습니다. 경우에 따라서는 비슷한 수정이 계속 되풀이되는 경우도 있습니다만 그러한 노력이 절대 헛되진 않다고 생각합니다.

치트를 방지하기 위한 모니터링

앞서 설명드린 것처럼 LINE에서는 클라이언트 측 해킹을 방지하기 위해 꾸준히 노력하고 있는데요. 이렇게 클라이어트 측 해킹을 방지하는 것만큼이나 어뷰저를 모니터링할 수 있는 체계를 만드는 것도 치트로 인한 피해를 방지하는데 중요하다고 LINE에선 생각하고 있습니다.

모바일 환경의 네이티브 게임에선 게임에서 칼을 휘두르거나 피하는 등의 움직임을 사용자가 정교하게 조작할 수 있도록 관련 기능을 클라이언트 모듈에 넣는 경우가 많은데요. 앞서 말씀드렸듯 이 클라이언트 모듈은 언제라도 사용자가 파헤쳐서 살펴볼 수 있는 부분이기 때문에 어뷰저가 가장 먼저 치트 대상으로 삼는 부분이고 언젠가는 파헤쳐질 수도 있는 부분입니다. 따라서 클라이언트 측 해킹 방지 대책의 다음 단계로 치트 행위를 측정할 수 있는 지표를 모니터링하여 발견된 어뷰저에게 사후 대응3하는 관점이 등장하였습니다.

LINE에서는 치트 방지 모니터링의 기본 관점을 크게 3가지로 나누고 있는데요. 첫 번째는 '게임 클라이언트 측에서 악의적인 행위가 없었는지' 확인하는 것이고, 두 번째는 '게임 서버 측에 치트 행위의 결과로 발생한 부정한 데이터가 없는지' 확인하는 것입니다(이런 모니터링이 가능하려면 클라이언트 측에 전용 모듈을 탑재해야 하는데 자세한 설명은 이 글에서는 생략합니다). 마지막으로 세 번째는 '환불 처리를 악용하는 행위와 같은 기타 다른 악의적인 행위가 없었는지' 확인하는 것입니다.

게임 클라이언트 측의 악의적인 행위 모니터링

게임 클라이언트 측의 악의적인 행위를 모니터링할 때는 다음과 같은 지표를 사용하고 있습니다.

  • 실제 단말기 이외의 환경(rootingjailbreakemulator)에서 게임 앱을 설치, 실행한 사용자가 얼마나 존재하는가
  • 치트 도구를 설치, 실행한 사용자가 얼마나 존재하는가
  • 정상과는 다른 해시값을 갖는 바이너리 파일을 설치, 실행한 사용자는 얼마나 존재하는가
  • 하나의 단말기에서 복수의 계정으로 로그인한 기록이 있는가

예를 들어 rooting이나 jailbreak 환경에서 치트 도구를 설치하고 실행한 사용자는 메모리 조작 종류의 치트를 시험해 봤을 가능성이 있습니다. 따라서 모니터링 중 이 지표값이 갑자기 증가한다면 메모리를 조작하는 어뷰저가 존재한다고 추측할 수 있습니다. 또한 emulator 환경에서 앱 설치를 반복하는 사용자는 이른바 리세마라4라고 부르는 치트 방법을 시험해 봤을 가능성이 있습니다. 모니터링 중 이 지표값이 갑자기 증가한다면 계정 매매와 같은 행위가 발생했을 가능성이 있다고 추측할 수 있습니다(반드시 그런 것은 아닙니다).

하나의 단말기에서 복수 계정의 로그인이 발생했다면 치트를 대행해주는 사람이 존재한다고 추측할 수 있습니다.

아래는 누군가 rooting, jailbreak, emulator 환경을 사용하거나 치트 도구를 사용했는지 탐지한 데이터를 표시하는 모니터링 화면입니다. 이런 지표를 모니터링하여 어뷰저의 존재 여부를 추측할 수 있습니다.

또한 정상과는 다른 해시값을 갖는 바이너리 파일을 설치하고 실행한 사용자는 바이너리 파일을 조작하는 치트를 시험해 봤을 가능성이 있기 때문에 모니터링 중 갑자기 이 지표값이 증가한다면 관련 어뷰저가 존재한다고 추측할 수 있습니다.

아래는 정상 바이너리 파일과 다른 해시값을 갖는 파일의 일부를 모니터링한 화면입니다. 이런 경우엔 조작된 바이너리 파일이 많은 사용자에게 배포되어 사용되었을 가능성도 있습니다. 현재 조작 바이너리 파일을 입수하면 누가 언제 사용했는지 모니터링할 수 있도록 조치하고 있습니다.

아래는 정상 바이너리 파일과 다른 해시값을 갖는 Assembly-Csharp.dll 파일 탐지 수(왼쪽)와 해시값 별 개수(오른쪽)를 그래프로 나타낸 모니터링 화면입니다.

LINE에서는 위와 같은 지표를 매일 모니터링하며 게임 클라이언트 측에서 악의적인 행위가 얼마나 존재하는지 파악하고, 이를 통해 어뷰저가 게임에 영향을 미치지 못하도록 리스크를 관리하고 있습니다. 아래는 모니터링 도구의 대시보드 화면입니다.

게임 서버 측 비정상 데이터 모니터링

게임 서버 측에 비정상적인 데이터가 발생했는지 모니터링할 때는 다음과 같은 지표를 사용하고 있습니다.

  • 한 번의 플레이로 게임 내 통화를 기대 이상으로 많이 획득한 사용자가 얼마나 존재하는가
  • 한 번의 플레이로 기대 이상으로 높은 점수를 기록한 사용자가 얼마나 존재하는가
  • 굉장히 짧은 시간 내에 게임을 클리어한 사용자가 얼마나 존재하는가
  • 게임 클리어(WIN) 로그는 있지만 그에 상응하는 플레이 상세 로그가 없는 사용자가 얼마나 존재하는가

예를 들어 한 번의 플레이에서 게임 내 통화를 비정상적으로 많이 획득하거나 비정상적으로 높은 점수를 기록한 사용자는 메모리 조작이나 패킷 조작 치트를 시험해 봤을 가능성이 있습니다. 따라서 모니터링 중 이 지표값이 갑자기 증가한다면 메모리 조작이나 패킷 조작 치트를 사용한 어뷰저가 존재한다고 추측할 수 있습니다.

아래는 획득한 통화가 마이너스 값인 사용자들을 추려낸 결과인데요. 메모리 조작 치트를 이용해 게임 내 통화를 저장하는 변수를 조작했는데, 변수 타입의 범위를 넘어서는 숫자로 잘못 조작하여 값이 마이너스가 되어버린 사례입니다. 만약 게임 내 통화를 저장하는 변수의 타입이 signed int라면 -2,147,483,648부터 2,147,483,647까지의 값을 저장할 수 있는데요. 이때 2,147,483,647를 넘는 값이 변수에 들어오면 integer overflow가 발생하여 마이너스 숫자로 값이 바뀌게 됩니다.

또한 게임의 클리어 시간이 기대 이상으로 짧거나, 짧은 시간동안 연속으로 플레이가 기록되는 사용자는 바이너리 파일 조작이나 패킷 조작 치트를 시험해 봤을 가능성이 있습니다. 모니터링 중 이 지표값이 갑자기 증가한다면 바이너리 파일 조작이나 패킷 조작 치트를 사용하는 어뷰저가 존재한다고 추측할 수 있습니다.

예를 들어 적 보스(boss)의 체력(HP)을 0으로 바꾸는 바이너리 파일 조작 치트를 사용하면 게임 클리어 시간이 비정상적으로 짧아집니다. 또한 게임을 플레이하는 과정 없이 결과 패킷만 보낼 수 있는 치트를 사용해서 결과 패킷을 연속으로 보내면 짧은 시간 동안 연속적인 플레이가 기록됩니다.

아래는 원래 플레이하는데 적어도 30초 이상 소요되는 게임에서 굉장히 짧은 시간인 5초(클라이언트 측에서 그래픽 묘사하는 시간을 포함하기 때문에 실제로 플레이 시간은 5초보다 짧음)의 플레이가 기록된 로그입니다. 바이너리 파일 조작 치트로 게임을 실제 플레이 없이 바로 클리어한 사례라고 할 수 있습니다.

플레이 시간이 굉장히 짧은 사용자를 모니터링한 결과

추가로, 정규로 앱을 설치하지 않아도 패킷만으로 플레이가 가능한 non-client 봇이나 웹사이트가 어딘가에 출현할 가능성도 있습니다. non-client 봇과 웹사이트에서는 게임에 필요한 패킷만을 보내기 때문에 정규 앱과는 달리 기록되는 로그가 적은 경우가 많습니다. 예를 들어 클리어(WIN) 로그는 있는데 그에 상응하는 플레이 상세 로그가 없는 경우를 생각할 수 있습니다.

LINE에서는 위와 같은 지표를 매일 모니터링하면서 게임 서버 측에 부정한 데이터가 발생했는지 관측하여 어뷰저가 게임에 영향을 미치지 못하도록 관리하고 있습니다.

환불 처리를 악용하는 사용자 모니터링

게임 치트가 예상치 못한 곳에서 발생하는 경우도 있습니다. 대표적으로 Google IAP(In App Purchase)의 환불 정책을 악용하는 사례입니다. Android 앱에는 Google IAP를 이용한 결제 기능이 있습니다. 그리고 Google에서는 자사의 환불 정책에 근거하여 IAP로 구입한 일부 아이템에 대해선 환불 처리를 해주는데요. 이런 Google의 IAP 환불 정책을 악용하는 행위는 다음과 같은 과정으로 진행됩니다.

1. 어뷰저가 Google의 IAP로 게임 내 통화인 1차 통화를 구입
2. 어뷰저가 1차 통화를 게임 내에서 사용(확률형 아이템을 구입하거나 게임 내 2차 통화로 교환)
3. 어뷰저가 Google에 환불 요청
4. Google은 자사의 환불 정책에 근거하여 환불 처리

만약 어뷰저가 위 과정을 거쳐 환불을 받았는데 게임 운영 측에서 이러한 사실을 파악하지 못한다면, 어뷰저는 자신이 구입한 1차 통화로 게임 내 아이템을 구입한 후 환불까지 받았기에 결과적으로 과금없이 아이템을 획득하게 됩니다.

Google에서 제공하는 Voided Purchases API(사용자가 취소한 구입 내역과 관련된 앱 내 주문 리스트 제공)를 이용하면 이런 행위를 모니터링할 수 있습니다. LINE에서는 환불 정책을 악용한 사례가 발생했는지 모니터링하여 어뷰저가 게임에 영향을 미치지 못하도록 관리하고 있습니다. 

마지막으로

이상으로 게임 치트 방지 대책 관점에서의 모니터링에 대해 몇 가지 예시와 함께 소개드렸습니다. 클라이언트 측에서 해킹을 방어하기 위한 노력을 '사전 대응'이라고 한다면, 치트 행위를 가늠할 수 있는 지표를 모니터링하고 발견된 어뷰저를 조치(치트로 획득한 통화와 아이템 회수, 플레이 정지 등)하는 것은 '사후 대응'이라고 할 수 있습니다.

사전 대응의 성격이 강한 클라이언트 측 해킹 방지는 매일 치트 수법의 동향을 관찰하고 이를 바탕으로 클라이언트 측을 개선해 나가는 일련의 노력이라고 할 수 있고, 확실하게 성과를 거두고 있습니다. 또한 사후 대응의 성격이 강한 '어뷰저 모니터링 및 조치'도 게임 치트를 방지하기 위해 빼놓을 수 없는 치트 대책이라고 할 수 있습니다.

예를 들어 누군가 악의적으로 바이너리 파일을 조작하여 아래와 같이 비정상적인 특징을 가진 조작된 파일(.ipa)을 인터넷에 배포한다면, 이런 파일을 악용하는 사용자가 급속히 많아질 가능성이 있습니다. 이런 사태는 당연히 게임에 악영향을 미칠 것입니다.

  • 과금하지 않고도 게임을 유리하게 진행할 수 있음
  • Jailbreak 환경과 같은 특별한 환경이 아니더라도 동작
  • 웹사이트에 접속해서 설치하면, .ipa 파일 설치에 필요한 사전 지식이나 직접 설치해야 하는 번거로움 없이 이용 가능

하지만 클라이언트 측 치트 행위를 측정할 수 있는 모니터링 체계가 미리 준비되어 있다면, 이런 조작된 파일이 인터넷을 통해 유통되더라도 게임에 영향을 미치지 못하도록 적절하게 대응할 수 있습니다.

이처럼 적절한 모니터링 체계는 게임 보안 운영 측면에서 꼭 필요합니다. LINE에선 모니터링을 포함한 여러 치트 방지 대책을 통해 악의적인 행위가 게임에 영향을 미치지 못하도록 철저히 관리하고 있습니다.


  • 모바일 게임 중 브라우저와 같은 다른 앱을 경유하지 않고 직접 실행 가능한 형태의 게임을 의미합니다.
  • 예를 들어 Unity로 개발된 앱은 Assembly-CSharp.dll 파일을 리버스 엔지니어링으로 분석하는 경우가 많이 있습니다. 이 글에선 치트에 대한 상세한 설명은 생략하겠습니다. 궁금하신 분은 아래 자료를 참고해 주시기 바랍니다.
  • 모니터링 결과 어뷰저라고 판단된 경우, 행해지는 조치를 의미합니다. 치트로 획득한 통화 및 아이템 회수, 게임 플레이 정지 등의 조치가 이뤄집니다.
  • 리셋마라톤(reset marathon)을 생략해서 리세마라라고 부릅니다. 게임 앱의 설치와 삭제(uninstall)를 계속 반복하여 자신이 원하는 아이템을 입수하는 방법으로 알려져 있습니다.