로그인

회원가입 | ID/PW 찾기

취재

[KGC] 떼돈 번 줄 알았더니 가짜? 모바일게임 해킹 사례

에이앤비소프트 송찬호 이사의 ‘스마트폰 게임 해킹과 대응’

김승현(다미롱) 2013-09-26 23:14:30
고생해서 키운 자식이 병에 걸렸다. 집에 있을 때는 아무렇지도 않아 보이던 아이가 가열찬 생업전선에 뛰어들자마자 만신창이가 되어 돌아왔다. 출시한 지 반나절도 되지 않은 게임이 해킹당한 개발자의 마음이다.

모바일 기기와 애플리케이션(이하 앱)의 발전은 눈부시지만, 개발자 입장에서 언제나 보안이 불만이다. 물론 뚫으려는 자와 막으려는 자의 싸움에서 막는 쪽이 불리한 것은 어쩔 수 없다. 하지만 모바일게임 개발자로서 ‘루팅이다, ‘탈옥이다’ 하며 스마트폰 해킹이 대중화된(?) 세상은 못마땅하기만 하다. 도대체 어떻게 하면 고생해서 낳은 자식을 지킬 수 있을까?

회사 설립 후 8년 동안 모바일게임 개발에만 매진한 에이앤비소프트의 송찬호 이사는 26일 서울 코엑스에서 열린 KGC 2013에서 그동안 자신이 겪은 해킹 사례와 대응책을 공유했다. 이제는 코딩보다 디버깅이 더 익숙하다는 그는 그동안 어떻게 해커로부터 자신의 게임을 지켜왔을까? 그가 발표한 ‘스마트폰 게임 해킹과 대응’ 강연을 정리했다. /디스이즈게임 김승현 기자



에이앤비소프트 송찬호 이사


떼돈 번 줄 알고 소고기 먹었더니 위조지폐? 결제 해킹


“게임을 출시한 지 6시간 만에 결제된 금액이 1억 원을 돌파했습니다. 좋아서 죽는 줄 알았죠. 신나서 직원들과 소고기를 먹었습니다. 그리고 숙취에 찌들어 출근한 다음 날, 얼마나 매출이 늘었을까 마켓을 보니 1억 원은커녕 그 반도 없더군요. 결제 해킹이었습니다.”

 

송찬호 이사는 과거에 자신이 실제로 겪었던 해킹 이야기로 강연을 시작했다. 비싼(?) 게임을 공짜로 즐기게 하는 결제 모듈 해킹은 모바일게임 해킹의 대다수를 차지한다. 시도가 많은 만큼 방법도 다양하다.



고전적인 방법으로는 앱 내에 포함된 결제 모듈을 직접 해킹하기도 하고, 최근에는 다른 게임의 영수증이나 가짜 영수증으로 결제 모듈을 속이기도 한다. 과거 송 이사가 개발했던 한 비동기식 게임은 이전에 발급됐던 그 게임의 영수증을 이용해 결제 모듈을 속였던 경우도 있었다.

워낙 해킹 방법이 다양하기 때문에 앱 차원에서 결제 모듈 해킹에 대응하는 것도 쉽지 않다. 때문에 가장 좋은 방법은 단독 구동 앱이든, 네트워크가 필요한 앱이든 별도의 서버를 만들어 결제 과정을 감시∙확인하는 것이다.



물론 이렇게 결제 과정을 감시하는 것만으론 안심하기 힘들다. 어떤 해커는 살을 주고 뼈를 노리는 수를 쓰기 때문이다.

“결제라는 것이 결국 네트워크를 필요로 하기 때문에 앱과 서버 사이를 오가는 패킷을 노리면 결제 모듈을 통과한 뒤에도 불법적인 이득을 얻을 수 있습니다. 가장 많이 사용되는 방법은 결제 완료 직후 타이밍에 맞춰 앱을 강제로 종료시키는 것입니다. 이러면 서버는 결제한 행위는 인지를 하지만, 결제한 품목은 지급하지 못했다고 인식하기 때문에 구매한 캐시나 아이템을 중복해서 지급하게 됩니다.”

때문에 결제 과정 감시 서버를 운영할 때는 결제과정만이 아니라, 유저가 구매한 캐시나 아이템의 지급 과정까지 관여하는 안전한 지급 로직을 만들어야 한다. 꼼꼼한 이는 한 발 더 나아가 해커가 앱과 서버 사이 오가는 패킷을 분석할 수 없게 데이터를 난독화하기도 한다.



물론 이러한 조치들은 게임이 출시된 마켓에 최소한의 안전장치가 있을 때 가능하다. 어떤 마켓은 영수증 처리 로직과 같은 기본적인 결제 안전 시스템이 없는 경우도 있다. 그렇다면 이 경우 개발자는 어떻게 해야 할까? 송 이사의 답변은 간단하다.

“결제 관련 해킹을 막으려면 마켓 차원에서 최소한의 보안 조치가 있어야만 가능합니다. 만약 마켓에 그런 것이 없다면? 그런 마켓에는 게임을 출시하지 않는 것이 답입니다. 개발자가 조치할 수 있는 것은 한계가 있으니까요.”




세이브 파일 때문에 경매장까지 삭제한 사연, 앱 해킹


앱 해킹을 통한 밸런스 조작은 콘텐츠의 수명을 깎고 장기적으로 개발사의 부하를 증대시키는 행위다. 이러한 방식의 해킹은 서버에서 전송되는 데이터보다 클라이언트에 저장된 데이터의 비중이 높은 게임일수록 더 자주 나타난다.

가장 대표적이면서도 단순한 방법은 ‘파일 덧씌우기’다. 피처폰 시절부터 있어왔던 이 기법은 게임의 구 버전 데이터를 백업해 놓았다가, 패치 등으로 게임의 난이도가 높아지면 백업한 데이터를 덮어씌워 구 버전으로 게임을 즐기는 경우다. 워낙 많이 사용된 방법이기 때문에 현재는 중요 파일마다 인증 장치를 넣는 식으로 막고 있다.



‘세이브 파일 덧씌우기’는 활용이 다양한 해킹 기법이다. 고전적인 기법으로는 최고 레벨 캐릭터의 세이브 파일을 배포해 너도나도 최고레벨 캐릭터로 게임을 즐기는 경우가 있다. 사용자 인증 수단이 다양해지고 꼼꼼해진 요즘에는 찾아보기 힘든 기법이다.

최근에 자주 찾아볼 수 있는 것은 세이브 파일 덧씌우기를 이용한 아이템 복제다. 유저가 아이템을 판매하고 그 데이터가 서버로 전송될 때, 팔기 전의 세이브 파일을 덧씌워 캐릭터에게 아이템을 보유한 기록과 판매한 기록 모두를 남기는 기법이다. 송 이사가 과거 개발한 게임 중에는 이러한 해킹을 제때 막지 못해 게임에서 창고와 경매장을 삭제했던 사례도 있었다.

참고로 그가 세이브 파일 덧씌우기를 막기 위해 썼던 방법은 서버에 데이터가 전송될 때마다 세이브 파일과 서버에 카운트를 남겨 그 수치를 비교하는 것이었다.

“가장 좋은 방법은 세이브 파일 덧씌우기가 불가능하게 서버 차원에서 세이브 파일을 관리하는 것입니다. 물론 이 사실을 알았을 때는 너무 늦었었죠.(웃음)”



과거에는 특정 파일을 덧씌우는 방식의 해킹이 많았다면, 최근에는 앱 자체를 직접 해킹하려는 시도가 늘었다. 루팅 등을 통해 일반인들에게도 스마트폰 해킹툴이 널리 퍼졌기 때문이다.

가장 많이 조작되는 수치는 시간이나 속도에 관련된 것이다. 최근 모바일게임의 수익 모델이 시간과 돈을 교환하는 식으로 구성된 여파다. 팜류 게임이라면 건설 시간이나 수확 시간이 조작되고, RPG 방식이라면 캐릭터의 속도나 스킬 쿨타임 등이 조작되는 식이다. 하지만 앱에서 이러한 해킹 시도를 파악하거나 막는 것은 쉽지 않다. 이미 시중에는 ‘Game Chi’와 같은 게임용 해킹툴이 널리 퍼져 있어 약간의 지식만 있다면 앱을 무력화할 수 있기 때문이다.

결국 남는 방법은 서버다. 가장 많이 쓰이는 방법은 서버에서 시뮬레이션한 결과 값과 유저의 플레이 내역을 비교하는 것이다. 시뮬레이션 값과 유저의 내역이 100% 일치할 수는 없지만, 정도 이상으로 앱을 조작한 유저는 이것만으로도 쉽게 찾아낼 수 있다. 물론 오차가 발생할 것을 전제로 하는 작업이기 때문에 의심 유저에 대한 지속적인 모니터링은 필수다.




피하고 싶은 최악의 경우, 메모리 해킹


메모리 해킹은 개발자로서는 피하고 싶은 최악의 해킹 사례다. 메모리 해킹은 게임 내 모든 데이터가 해킹 대상이 되기 때문에 어떤 방식으로 해킹이 들어올지 예측할 수 없다. 레벨이나 피로도와 같은 사용자 정보는 물론이고, 상점 상품 구성이나 가격, 캐릭터 설계 등 모든 것이 해킹 대상이다. 게임 내 데이터를 꿰고 있는 사람이 마음만 먹는다면 마법사가 전사 기술을 쓸 수도 있고, 상점에서 기한이 지나버린 한정 아이템을 다시 판매하게 할 수도 있다.

“얼마 전 개발한 게임에서는 메모리 해킹 때문에 고생해서 얻어야 할 최고 레벨 장비가 상점에서 헐값에 판매됐던 경우도 있었습니다. 과거 만들었던 게임 중에는 아이템 가격을 음수로 만들어 아이템을 살 때마다 게임머니가 늘어나게 만들었던 사례도 있었죠. 몇 번이고 취약점을 수정해 게임을 출시하지만 해커들은 항상 개발자의 의표를 찔러 공격합니다.”



메모리 해킹의 기본은 앱에 저장된 데이터 값이 실제로 어떤 용도로 쓰이는지 파악하는 것에서부터 시작된다. 일반적으로 아이템 가격 같이 수치가 변동되지 않는 값보다 HP나 경험치 같이 수치가 자주 변화하는 값이 해킹의 목표가 된다. 이러한 수치들은 목표 수치의 변화와 앱 내부 데이터의 변화를 비교하면서 이루어진다. 그리고 이렇게 찾아진 데이터는 해커가 원하는 값으로 변경되거나 고정돼 게임에 영향을 끼친다. 고가의 무기가 헐값에 팔리고, 캐릭터의 HP가 절대 줄어들지 않는 식이다.

“데이터가 난독화되어 있지 않다면 보통 10번 이내에서 다섯 개 안팎으로 목표 값들이 줄어듭니다. 흔한 값이라도 이러한 작업을 반복할 때마다 후보가 명확해지기 때문에 해커가 성실할수록 메모리 해킹이 쉬워지죠. 물론 399,900 원과 같은 흔치 않은 값이라면 반복작업의 횟수는 급격히 줄어듭니다.”



메모리 해킹을 막는 가장 좋은 방법은 어떤 데이터가 어떻게 쓰이는지 노출되지 않는 것이다. 가장 많이 사용되는 방식은 데이터 자체를 파악할 수 없게 난독화하는 것이다. 해킹툴로 앱을 열어도 실제 값과 표시되는 값이 다르게 보이는 것은 기본이고, 값이 변화할 때도 복잡한 수식을 써서 변화된 값을 종잡을 수 없게 하기도 한다.

이와 함께 메모리가 해킹됐을 때를 대비해 데이터 로딩 시점마다 인증기호를 부여해 일정한 주기로 이를 체크하기도 한다. 메모리가 허가되지 않은 방법으로 변형돼 게임에 적용되는 것을 막기 위한 조치다.



만약 메모리 값이 노출돼 데이터가 오염됐다면 게임 구조를 바꾸는 것이 최선이다. 노출된 값을 되돌리고 이를 보안 처리된 영역으로 옮겼다고 하더라도, 데이터와 게임 요소와의 관계가 밝혀진 이상 언제라도 해커의 공격에 뚫릴 수 있기 때문이다.

이러한 일을 막기 위해 개발자들이 사용하는 방법은 노출된 데이터의 위치에 더미 데이터를 남겨둔 채, 실제로 필요한 데이터는 서버나 별도의 보안공간에 옮겨 필요할 때마다 불러오는 방식이다. 이렇다면 실제로는 서버에서 작업이 이뤄지기 때문에 앱 자체에 조치를 취하는 것보다 상대적으로 안전하게 해커의 공격을 대비할 수 있다. 조금 더 치밀한 개발자는 실제 데이터가 저장되는 공간을 넓혀 저장되는 위치까지 임의로 지정해 추적을 힘들게 하기도 한다.




해킹 의심 유저도 일단은 고객이다


“게임이 해킹되는 것은 개발자로서 가장 피하고 싶은 경우입니다. 하지만 그렇다고 해킹 의심 유저도 고객이라는 사실을 잊어선 안 됩니다. 시스템이 보이는 오류는 해킹 외에도 다양한 원인이 있기 때문에, 마지막까지도 의심의 끈을 놓지 말아야 합니다.”

송 이사가 해킹 사례와 대응법을 말하며 항상 강조했던 것은 유저 입장에서 생각하라는 것이었다. 그가 이렇게 당부한 까닭은 두 가지다.

첫째, 시스템 상으로 발견된 이상 현상은 직접 개발자가 살펴보기 전까지는 그것이 해킹인지 버그인지 판단할 수 없다. 특정 유저가 이상할 정도로 던전 클리어 속도가 빠르다면, 그것의 원인은 핵이 될 수도 있고 버그가 될 수도 있고 유저의 비상한 컨트롤 실력이 될 수도 있다.

둘째, 해킹을 막기 위한 계정 정지 같은 제재 수단은 개발자가 생각하는 것 이상으로 유저들의 반발을 불러 일으킨다. 개발자로서는 자신의 게임을 정상화하기 위한 수단이겠지만, 유저들에겐 자신이 투자한 시간과 돈이 허공으로 날아가는 것이기 때문이다. 때문에 개발자는 해킹 의심 사례를 대하는 데 있어 신중에 신중을 기해야 한다.

송 이사는 마지막으로 강연을 정리하며 개발자들에게 꾸준히 해커들과 교류(?)할 것을 권했다. 항상 해커들의 공격은 개발자들이 미처 생각하지 못한 허점을 파고 들어온다. 더군다나 게임을 잘 만드는 것과 시스템 보안을 잘 뚫는 것은 서로 목표하는 바가 다르기 때문에 해커는 아는 것을 개발자가 모르는 경우도 많다.

때문에 그가 권하는 방법은 꾸준한 웹 서핑과 해킹 커뮤니티 모니터링이다. 특히 해킹 커뮤니티는 해킹 이슈가 발생할 때마다 활발하게 정보가 오가기 때문에 보안에 신경 쓰는 개발자들에게는 금광과도 같다. 굳이 해킹 커뮤니티를 표방(?)하는 곳이 아니더라도, 앱 유저들이 이용하는 커뮤니티라면 해킹과 관련된 정보도 자연히 오가는 만큼 많은 곳을 모니터링할수록 해킹 대응이 쉬워진다.