흔히 구글 플레이와 같은 공식 스토어에서 제공하는 앱 스토어 이외의 유료 앱의 경우 사용자가 이에 대한 금액을 지불하지 않고, 블랙마켓과 같은 사이트에서 무료로 제공하는 앱들을 받아서 사용하는 경우가 많다.

 

기본적으로 안드로이드 앱의 구성요소는 iOS에 비해 단순하며(DRM, 암호화, 인증 등등), iOS 탈옥처럼 안드로이드에서는 루팅 절차를 거치지 않고 USB 디버깅 모드를 통하여 콘솔로 apk 파일을 설치하고 지우는것이 가능하다.

 

그래서 유료 앱을 결제하여 설치를 하더라도 해당 앱을 다운 받은 기기에서 apk 추출이 손쉽게 가능하며, 이를 이용해서 유료 앱을 블랙마켓과 같은 스토어 사이트나 커뮤니티 사이트에서 재 업로드 하여 무료로 배포하는 사이트들이 무수히 많이 성행하고 있다.

 

단순히 무료로 사용하기 위해 이와 같은 방법을 사용하여 앱을 사용함에 있어서 도덕적인 문제의 소지는 있을수도 있겠으나 정상적인 원본 앱이라면 사용자에게 미치는 영향은 없다고 무방하다.

 

하지만 안드로이드 앱의 특성상 앱의 위/변조가 손쉬우며, 이와 같이 안드로이드의 개방성과 앱의 위/변조의 쉬운점으로 인해 사용자에게 일반 유료 앱을 위/변조하여 악의적인 행위를 수행한 리패키징 앱을 제공할 가능성도 존재하게 된다.


이번 글에서는 이와 같은 리패키징앱에 대한 위험성과 발생할 수 있는 가능성에 대한 내용을 설명하고자 한다.

 

앞서 설명한 포스팅 글처럼(2017/05/02 - [Analysis/Android] - Apktool을 이용한 안드로이드 apk 파일 디컴파일 및 리패키징) apk는 디컴파일 및 리패키징을 위한 방법을 설명하며, 그 절차가 까다롭지 않다.


다음과 같이, 리패키징 과정을 거쳐 보여줄 예시의 샘플 앱을 선정하였다. 일단, 심플하면서도 변조하기 손쉬울 앱으로 선정하였기 때문에 설명할 내용은 간단하겠지만, 그 위험성에 대한 잠재력은 방대한 응용에 있다고 보여진다.


다음의 앱은 구글 플레이 스토어에서 무료로 설치할 수 있는 안드로이드용 메모장 앱이다.
 

Notepad for Android : https://play.google.com/store/apps/details?id=com.blogspot.logpedia.note2

 

다음과 같은 앱은 말그대로 단순히 메모장 기능만 제공하며, 기입한 내용들을 단순 저장하는 방식으로 동작한다.

 

 

이번 포스팅에서는 이 메모장 앱을 디컴파일하여 해당 앱에서 저장되는 시점에 Log.e() API를 호출하고 Eclipse에서 사용자에 의해 저장되는 문자를 Logcat으로 출력하도록 변조하는 과정에 대해 설명할 것이다.

 

먼저, 안드로이드용 메모장 앱을 디컴파일 도구를 이용하여 소스를 분석한다.

 

 

다음과 같이 저장하는 시점은 onPause()가 수행될 때인 것을 확인할 수 있다. 또한 이 변수는 최종적으로 String을 Byte형으로 변형하여 저장한다. 따라서, 이 시점 사이에 Log.e() API를 호출하는 기능을 넣어 editText1에 있는 문자열을 Logcat으로 찍을 수 있는 기능을 추가해야 할 것이다.

 

앞서 설명한 Logcat으로 문자열을 찍어낼 수 있는 기능을 추가하기 위해서는 Log.e()을 호출하는 Smali 코드를 얻어야 할 것이다.
Log.e()의 Smali 코드를 얻기 위해 간단한 Project를 생성하여 Log.e() API를 호출하는 코드를 추가하고 이를 컴파일한 후, 다시 디컴파일을 하여 Smali 코드를 얻어 낸다.

 

 

다음으로, 안드로이드용 메모장 앱을 디컴파일하여 Smali 코드를 분석한다. 실제 원본코드와 비교해 보면, 다음과 같이 Smali 코드가 흘러 가는 것을 확인할 수 있다. 또한, 여기서 사용자가 작성한 내용에 대한 내용을 담는 변수는 v1이라는 것이 유추 가능하다.

 

 

다음과 같이 디컴파일된 이 2개의 Smali 코드를 적절히 버무려서 저장하는 시점에 Log.e() API를 호출하도록 기능을 수정한다.

v1 변수는 이미 메모장 앱에서 사용자가 입력한 내용을 저장하기 위한 용도로 사용 중이다. 따라서 변수명을 변경해주고, Byte를 String형으로 바꿔주는 부분에서는 이 v1을 삽입하여 사용자가 입력한 내용의 Byte 변수가 String형으로 변환하는 흐름을 타도록 한다.

 

 

수정이 완료되면 이를 저장하여 다시 리패키징을 진행한다. 그리고 리패키징된 apk를 디컴파일 도구를 이용하여 제대로 소스코드가 삽입되었는지 확인한다.

 

 

이제 리패키징된 apk를 설치하여 실제 Eclipse환경에서 사용자가 입력하고 저장되는 내용이 Logcat에 정상적으로 Log가 남겨지는지 확인해본다.

 

 

 

다음과 같이 정상적으로 Log가 찍힌것을 확인할 수 있다.


지금까지 Smali 코드 수정으로 리패키징을 통해 간단히 보여준 사례 예시는 다른 방법으로도 응용이 가능하다. 예를 들어 Log.e() API를 호출하는 지점에 E-mali이나 특정 서버에 해당 메시지를 전송하게 한 Class를 생성하고 호출 하는 코드를 삽입하여, 리패키징된 앱을 배포를 한다면 그에 따른 정보는 고스란히 넘어가게 될 것이다. 따라서 이러한 리패키징 앱에 대한 위험성을 염두하고 있어야 하며 앱 사용시 각별히 주의를 해야할 것이다.

+ Recent posts