본문 바로가기

[칼럼] 모바일 생태계를 위협하는 변조앱(MOD)과 대응 방법

해커들은 모바일 앱을 변조해서 다시 재배포하여 금전적인 이득을 얻고자 합니다.

이와 같은 사례와 변조 유형에 대해서 알아보고 대응 방안에 대해서 가이드 합니다.

▶ 변조 앱(MOD)이란?

  • MOD는 수정과 변경을 의미하는 Modification의 줄임말로 수정되거나 변경된 앱을 의미합니다.
  • 해커들은 MOD를 제작하기 위해서 기존 앱을 디컴파일(역컴파일)하여 소스코드를 확인하고 악의적인 동작을 하도록 소스코드를 수정하여 해킹 사이트, SNS, SMS 등을 통해 배포합니다.

 

▶ 일반 앱의 변조 유형

유형 설명
재화 수정 정상적인 앱에 재화(돈, 포인트) 값을 찾아 코드 변경
개인정보 탈취 정상적인 앱에 개인정보를 찾아 해커의 서버로 전송하는 코드 추가
에드웨어 정상적인 앱에 해커가 이득을 얻기 위한 광고를 실행하는 코드 추가
랜섬웨어 정상적인 앱에 특정 파일(개인 이미지, 동영상, 문서 등)을 암호화거나 휴대폰의 비밀번호를 변경하는 코드 추가

<표 1> 일반 앱의 변조 유형

 

  • 위 <표 1>처럼 PC에 유행하던 악성 행위들이 모바일 환경으로 넘어오고 있으며 이 외에도 다양한 방법으로 해킹사고 사례가 증가하고 있습니다.

 

▶ 게임 앱의 변조 유형

유형 설명
한방핵(1 Hit) 자신의 공격력을 증가시키거나 상대의 HP와 방어력을 감소시켜 한방에 상대(타 유저와 몬스터)를 죽이도록 코드 변경
무적핵(God Mode) 상대의 공격력을 감소 및 제거하거나 자신의 방어력을 증가시켜 자신이 무적이 되도록 코드 변경
스피드핵 공격 속도, 쿨타임 속도, 게임엔진의 속도 관련 값을 변경하여 게임 내의 속도를 증가 및 감소하도록 코드 변경
능력치핵 HP, MP, 스킬 등 능력치와 관련된 값을 변경하여 악의적인 행동을 하도록 코드 변경
재화핵 재화의 습득량, 확률을 변경하여 이득을 얻도록 코드 변경

<표 2> RPG 장르 핵 유형

 

  • 위 <표 2>의 경우 RPG 장르의 변조 앱의 유형이며 이 외에도 게임 장르와 특성에 따라 다양하게 변조가 되고 있습니다.
  • FPS 장르의 게임에서는 월핵(상대방의 위치를 벽을 통과해 확인)과 무반동(총의 반동을 제거) 등이 만들어지고 AOS 및 MOBA(다대다 싸움을 뜻하는 'Multiplayer Online Battle Arena'의 줄임말) 장르에서는 맵핵(지도의 시야를 확보) 등이 제작되어 배포되고 있습니다.
  • 모바일 게임 핵은 PC 게임 핵에 비해 유형 수가 적었으나 모바일 게임의 제작이 증가함에 따라 PC 게임 핵과 같은 다양한 유형의 핵이 발생되고 있습니다.

 

▶ 일반 변조 앱의 사례

<그림 1> 강제 광고 노출  <그림 2> 삭제 방해
  • 대부분의 변조 앱은 유명 인기 앱으로 위장하여 앱 설치를 유도를 합니다.
  • 자사가 서비스했던 앱의 사례로 해커는 정상적인 운수도원 앱에 악의적인 코드를 추가하였고 위 <그림 1>처럼 강제적인 광고 노출을 통해 수익을 얻었으며 위 <그림 2>처럼 권한을 이용해 일반적인 삭제 방법으로 삭제를 못하도록 하였습니다.
  • 해당 변조 앱은 NHN AppGuard 적용을 통해서 대응을 완료하였습니다.

 

▶ 게임 변조 앱의 사례

<그림 3> 정상 게임 미니맵 <그림 4> 변조 게임 미니맵
  • 위 <그림 3>, <그림 4>는 MOBA 장르의 모바일 게임의 화면이며 정상적인 앱의 경우 <그림 3>처럼 게임 시작 시 왼쪽 상단 미니 맵에서 적의 위치가 파악되지 않습니다.
  • 하지만 위 <그림 4>처럼 변조 게임의 경우 레이더핵(맵핵) 사용 시 적의 모든 위치가 노출되어 게임에서 공격 및 방어에 유리하게 됩니다.

 

▶ 개발자 측면 보호 방법

 파일 무결성 검사

 

  • 원본 클라이언트 파일의 해시 값을 미리 클라이언트 혹은 서버에 저장을 하고 앱 실행 시 실행되는 클라이언트 파일의 해시 값과 비교하여 탐지가 가능합니다.
  • 안드로이드에서는 원본 APK 해시 값과 설치된 APK 해시 값의 비교를 통해서 변조를 확인이 가능합니다.
  • 게임의 경우에는 엔진 및 빌드에 따라 검사할 클라이언트 파일이 다르며 아래 <표 3>과 같습니다.
게임 엔진 클라이언트 파일 (안드로이드)
Unity Mono 게임 클라이언트 코드가 있는 dll 파일 (대부분이 Assembly-CSharp.dll에 있음)
Unity Il2cpp libil2cpp.so
Unreal libUE(버전).so / libUE3.solibUE4.so
Cocos2d-x libgame.so 혹은 lib(사용자 지정).so

<표 3> 게임 엔진별 클라이언트 파일 (안드로이드 빌드)

 

 서명 값 검사 (안드로이드)

 

  • 안드로이드 변조 앱의 경우 코드 수정 후 리패키징이란 작업 중에 기존에 배포된 개발자 서명이 아닌 해커의 서명을 통해 배포하게 됩니다.
  • 서명 값은 고유의 값이므로 기존에 배포에 사용하는 서명 값을 미리 저장을 하고 게임 실행 시 비교를 통해 변조 확인이 가능하며 관련 코드는 아래 <표 4>와 같습니다.
Android Code Unity Code
Activity activity = this; // Activity
PackageManager pm = activity.getPackageManager();
String packageName = activity.getPackageName();
PackageInfo packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
Signature[] signature = packageInfo.signatures;
String signatureHash = Integer.toHexString(signature.hashCode());
AndroidJavaClass player = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject activity = player.GetStatic("currentActivity");
AndroidJavaObject packageManager = activity.Call("getPackageManager");
string packageName = activity.Call("getPackageName");
int GET_SIGNATURES = packageManager.GetStatic("GET_SIGNATURES");
AndroidJavaObject packageInfo = packageManager.Call("getPackageInfo", packageName, GET_SIGNATURES);
AndroidJavaObject[] signatures = packageInfo.Get<AndroidJavaObject[]>("signatures");
string signaturesHash = signatures[0].Call.("hashCode").ToString("X");

<표 4> 서명 값을 가져오는 코드

 

코드 난독화

 

  • 난독화가 되지 않은 코드는 분석 시 타겟이 되는 심볼 정보를 이용하여 변조할 위치를 빠르게 찾을 수 있지만 난독화가 된 코드의 경우 변조할 위치를 찾지 못하거나 분석을 어렵게 하는 장점이 있습니다.
  • 코드 난독화의 제품 및 플러그인 사용을 권장하나 사용에 제한된 경우 중요한 클래스, 함수, 변수 이름을 직접 수동으로 변경하는 것을 권장합니다.
<그림 5> 난독화 전 <그림 6> 난독화 후

 

데이터의 서버 검증

 

  • 데이터의 서버 검증은 가장 강력한 방법으로  비정상적인 데이터를 확인하여 차단하는 방법입니다.
  • 가능한 모든 값을 서버에서 처리하도록 구현이 필요하며 랜덤 값이 발생 시 임계값을 설정할 것을 권장합니다.
일반 앱 데이터 검증 예 게임 앱 데이터 검증 예
앱에서 물건을 구매시 포인트 적립 수치가 만약 3%이면 서버에서 3%이상 값이 들어올 경우 차단을 합니다.
앱에서 물건을 구매시 금액과 수량을 검증하여 소액으로 다량의 물건을 구매하는 비정상적인 행위를 차단을 합니다.
공격이 증가시킨 변조앱의 경우 스테이지를 빠르게 클리어하게 됩니다.
여기서 서버에서는 스테이지 클리어 최소시간을 확인하여 비정상적으로 빠르게 클리어할 경우 차단하는 방법을 사용합니다.

 

파일의 무결성 검사와 서명 값 검사는 NHN AppGuard에서 기본적으로 적용되어 탐지 및 차단을 제공하고 있습니다.

 

▶ 사용자 측면 보호 방법

정식 마켓 이용

 

<그림 7> 정식 마켓 <그림 8> 출처를 알 수 없는 앱 설치 설정 (안드로이드)

  • 대부분의 변조 앱들은 비정상적인 경로를 통해서 설치를 유도하므로 위 <그림 7>처럼 정식 마켓을 이용하는 것을 권장합니다.
  • 또한 위 <그림 8>처럼 안드로이드의 경우 설정 -> 보안 및 개인정보 보호 -> 출처를 알 수 없는 앱 설치 기능을 off로 설정하는 것을 권장합니다.

 

불필요한 권한 확인 (안드로이드)

 

<그림 9> 설치 권한 <그림 10> 권한 확인

  • 위 <그림 9>처럼 안드로이드에서는 마켓에서 설치 전에 앱의 권한 목록을 알려주며 불필요한 권한이 있을 경우 설치를 자제해야 합니다.
  • 위 <그림 10>처럼 안드로이드 6.0 이상 기기에서는 앱에서 해당 권한이 필요할 때 사용자로부터 권한을 허가받도록 되었으며 불필요시 거부를 하시는 것을 권장하며 사용자가 권한을 허가를 하여도 설정->애플리케이션 -> 앱 이름 -> 권한 설정에서 변경이 가능합니다.

 

데이터 백업

 

  • 최근에 증가하고 있는 랜섬웨어를 대비해 PC 및 클라우드에 데이터 백업을 권장합니다.