구글 레퍼런스 폰은 새로운 안드로이드 OS를 내놓을 때마다 제일 빠르게 적용되는 폰을 의미한다.

그만큼 레퍼런스 폰은 안드로이드 OS를 탑재하였을 때 최적화 된 상태를 의미하며, 구글은 이러한 테스트 과정을 거치고 난 뒤, 팩토리 이미지(Factory Image) 혹은 OTA로 레퍼런스 폰 사용자에게 가장 빠르게 업데이트를 제공한다.

반면, 각 제조사는 새로 발표한 안드로이드 OS의 오픈소스를 토대로 각 제조사 기기에 커스터마이징을 하여 출시하기 때문에 발표시기와 다르게 업데이트가 늦어질 수 밖에 없다.

(과정 자체는 제조사에서 해본 적이 없기 때문에 정확하지는 않다...)


따라서, 안드로이드 OS에 대한 가장 빠른 최신 업데이트는 레퍼런스 폰의 특권이자 당연한 수순이라고 봐야 할 것이다.

(제조사는 다시 자사의 기기에 맞게 커스터마이징을 해야하니까...)


이와 같은 구글 레퍼런스 폰은 넥서스(Nexus) 시리즈로 판매하고 있으며, 기기는 여러 업체들을 통하여 다양한 업체들에 의해 제조하여 판매하고 있다. (삼성, LG HTC, Motorola, Asus 등등)


이번 포스팅에서는 넥서스 중, LG에서 제조한 넥서스 4을 바탕으로 루팅하는 방법을 설명한다.

(넥서스 루팅 도구로 넥서스 4, 5, 7(2015), 5X 까지 해본 결과 동일한 방법으로 루팅이 가능한 것을 확인하였다.)


루팅을 하기 위해서는 Nexus Root Toolkit(NRT)이 필요하다

Nexus Root Toolkit : http://www.wugfresh.com/nrt

 

루팅을 시작하기 전, 해당 기기는 USB 디버깅 모드가 설정되어 있어야 하며 설정 방법은 이전 포스팅에서 설명을 하였다.
USB 디버깅 모드 설정 : 2017/05/02 - [Android] - 안드로이드 USB 디버깅 모드 설정

 

 

우선 Nexus Root Toolkit을 설치하여 실행하면 아래와 같은 GUI를 볼 수 있다.

 

 

루팅을 하기 전, 해당 기기의 모델과 현재 사용하고 있는 "Change..." 버튼을 눌러 해당 기기와 안드로이드 OS에 대한 설정을 한다.

 

 

 

만일 bootloader에서 폰이 LOCK STATE가 locked로 되어 있다면, Unlock 버튼을 눌러 Yes를 선택하여 LOCK STATE를 unlocked으로 변경한다.

 

 

 

  

 

Root 버튼을 누르면 아래와 같이 USB 디버깅 모드가 활성화 되어 있는지 확인하는 창이 뜬다. 확인을 누른다.

 

 

다음과 같이 어떠한 작업이 수행될 것인지 설명을 한다. 확인을 누르면 루팅 작업을 수행한다.

 

 

다음과 같이 adb를 이용하여 bootloader로 진입한 후, 루팅 작업을 자동으로 수행한다. 

 

 

다음과 같이 adb를 이용하여 bootloader로 진입한 후, 루팅 작업을 자동으로 수행한다. 

 

 

adb로 접근하여 'su' 명령어를 실행하여 정상적으로 루팅이 되었는지 확인한다.

 

 

안드로이드 앱 프로그래밍이나 apk 파일 설치 또는 adb를 이용한 안드로이드 기기 내의 콘솔작업을 하기 위해서는 기기의 USB 디버깅 모드를 활성화 시켜야 한다.

USB 디버깅 모드 활성화는 마치 이스터 에그처럼 안드로이드 OS 내부에 숨겨져 있는데 방법은 아주 간단하며 방법은 다음과 같다.

 

안드로이드의 설정으로 들어가서 맨 하단의 휴대전화 정보를 터치한다.

 

 

다시 맨 하단의 빌드 번호를 7번 터치한다.

 

 

7번 터치 후, 다음과 같이 개발자가 되셨습니다. ​라는 문구를 확인할 수 있다.

 

 

다시 설정으로 되돌아가서 맨 하단으로 내려가면, 이스터 에그처럼 개발자 옵션 메뉴가 추가된 것을 확인할 수 있다. 이를 터치한다.

 

 

USB 디버깅 메뉴의 체크박스를 터치한다.

 

 

다음의 문구에서 확인을 터치한다.

 

 

PC와 안드로이드 기기를 USB로 연결하였다면 다음과 같이 PC의 컴퓨터 RSA 키 지문에 대한 내용과 함께 접근 허용 질문에 대한 팝업이 뜬다. 확인을 터치한다.

 

 

다음과 같이 최종적으로 PC의 컴퓨터 RSA 키 지문에 대한 접근을 허용해야 USB를 통한 안드로이드 기기 접근이 가능하며, 접근 허용을 하지 않을 경우 USB 디버깅 모드를 활성화 하였다고 하더라도 PC를 이용한 adb 콘솔 접근은 불가능하다.

 

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

 

기본적으로 안드로이드 앱의 구성요소는 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