원래는 nox로 환경을 맞춰서 같이 해보려고 했지만,,,
애플의 보안 정책으로 nox를 사용할 수가 없어서,
제가 해온 것으로 대체하여 진행하겠습니다. ㅜ
분석을 하려면 제일 먼저 apk부터 구해야 합니다.
apk를 구하는 방법으로는 playstore에서 설치 후 추출하거나,
apkpure.com에서 검색을 해서 받는 방법이 있습니다.
playstore을 통해 설치한 apk를 추출하는 방법입니다.
제일 먼저 해야 할건 뭘까요?
바로 어플리케이션을 설치하는 것입니다.
그다음으로 해야 할 것들이 추출을 위하여
노트북과 안드로이드 장치를 adb로 연결하고,
추출할 패키지의 이름을 확인한 뒤
해당 패키지를 추출하면 끝납니다.
adb 로 안드로이드 장치에 연결하는 방법입니다.
에뮬레이터의 경우 각 에뮬레이터 별로 사용하는 adb 포트로 접속을 하고,
실제 기기의 경우에는 개발자 옵션 중 하나인 usb 디버깅을 허용해주면 됩니다.
[*] nox : 62001
패키지의 목록은 pm list packages -f로
확인할 수 있으며,
설치된 패키지가 많을 경우에는 찾기가 힘들기에,
적당히 grep으로
추려서 확인하시면 됩니다.
추출할 패키지의 이름을 확인했다면,
pull 옵션으로 해당 apk를 추출할 수 있습니다.
반대로 adb로 apk를 설치할 수도 있습니다.
adb의 옵션으로 install을 주면 apk를 설치할 수 있으며,
-r 옵션을 추가로 주는 경우에는 이미 존재하는 패키지를 재설치할 수 있습니다.
하지만 기존에 설치된 서명과 설치하고자 하는 서명이 다른 경우에는
다른 패키지로 인식하여 재설치할 수 없습니다.
그런 경우에는 기존에 충돌되는 패키지를 삭제하고, 설치를 진행해야 합니다.
지금까지 사용한 adb 명령어들입니다.
apkpure.com 에서 apk를 구하는 방법은 간단합니다.
apk 이름만 검색하면 쉽게 다운받을 수 있습니다. 참 쉽쥬 ~?
자 이제 apk 를 구했으니 본격적으로 분석을 시작해 봅니다.
apk의 디코드와 빌드는 apktool을 이용할 수 있습니다.
apktool의 옵션으로
d를 주면 디코드 되며,
b를 주면 빌드되어 dist 폴더에서 확인할 수 있습니다.
루팅 탐지 루틴을 분석하기 위하여
안드로이드 어플리케이션을 분석할 수 있는 방법을 2가지 정도 소개하겠습니다.
물론 정해진 분석 방법은 없으며,
맞는 방법이 아닐 수도 있습니다.
본인이 편한 방법으로 분석을 진행하면 됩니다.
방법은 크게 Top-down 방식과 Bottom-up 방식이 있습니다.
쉽게 이야기하자면 위에서부터 아래로, 아래에서부터 위로 분석하는 방식입니다.
예제를 들며 설명을 하면 이해하기 편할 것 같아서,
native root checker를 대상으로 분석하면서 설명하겠습니다.
우선 이 어플을 선택한 이유는
native 하게 루팅을 탐지해서
조금 뒤에서 루팅 탐지 방법을 설명할 때,
익숙하지 않은 달빅 바이트코드보다는
cpp 코드가 더 이해하기 쉬울 것 같아서 골랐습니다.
Top에서 내려가는 방식보다
Bottom에서 올라가는 것이 더 간단하기에 이것부터 설명하겠습니다.
Bottom-up 분석 방식은 끝에서부터 원하는 분석 부분까지 올라가는 방식입니다.
분석을 하기에 가장 먼저 찾아야 할 것은 시작점을 찾는 것입니다.
여러 방법 중에서 가장 쉽다고 생각하는 방법을 하나 소개하겠습니다.
다시 한번 말하지만 분석 방법에 있어 항상 정답은 없습니다.
어플리케이션을 실행시켜 보면 각 항목 별로 탐지 결과를 보여주는데,
이 항목들은 문자열로 처리를 했을 것이다라고 가정을 하고 시작합니다.
그래서 확인 차 TEST KEYS를 검색해 보니,
strings.xml 파일에서 확인을 할 수 있습니다.
strings.xml 은 다국적의 언어를 처리하기 쉽게 하기 위한 용도의 파일로,
사용자가 선택한 언어에 따라 문자열을 동일한 name으로 처리할 수 있습니다.
이전에 strings.xml 에서 찾은 name을 검색해 보면,
public.xml에서도 사용된 것을 확인할 수 있습니다.
strings.xml 이 변수명과 그 값을 저장한 파일이라면,
public.xml 은 변수명과 변수의 주소를 저장한 파일입니다.
마지막으로 이 주소를 검색해 보면,
달빅 코드 내부에서는 이 주소를 이용하는 것을 확인할 수 있습니다.
아직 분석은 안 했지만 뭔가 감이 오는 switch 문이 보입니다.
이런 식으로 문자열을 기준으로 하여,
분석 지점을 쉽게 파악할 수 있습니다.
하지만 몇 번 말했듯이 이 방법도 정답이 아닐 수도 있습니다.
이것처럼 잘못된 시작은 삽질의 시작이 될 수도 있습니다.
루팅 탐지의 결과를 알려주는 맨 하단부의 초록색 창이
문자열일 것이라고 생각하고 진행을 한다면,
그 문자열은 찾지 못할 것입니다.
왜냐하면 이 문자열은 사진(png)으로 처리되어 있기 때문입니다.
그래서 저 같은 경우에는 이렇게 몇 개 해보고 안되면,
Top-down 방식으로 다시 분석을 합니다.
그다음으로는 Top-down 분석법입니다.
위에서부터 아래로, 큰 범주에서 목표를 향해 분석하는 방식입니다.
마찬가지로 Top-down 분석을 시작하려면 분석을 할 시작점부터 찾아야 합니다.
apk의 경우 그 시작점은 메인 엑티비티로,
메인 엑티비티는 apk 파일 내의
안드로이드 메니페스트 파일에서 확인할 수 있습니다.
이 사진은 메인 엑티비티에 해당하는 엑티비티입니다.
그다음은 어디를 봐야 할까요?
그것을 알려면 안드로이드 라이프사이클에 대하여 알아야 합니다.
안드로이드 라이프 사이클이라고 부르는 관계도입니다.
정확히 말하면 엑티비티 라이프 사이클입니다.
안드로이드 어플리케이션에는 여러 엑티비티가 있고,
이들 중 하나의 엑티비티가 실행되고 소멸하기까지의 관계도를 도식화한 것이 엑티비티 라이프 사이클입니다.
그렇다면 이 엑티비티 라이프사이클은 왜 중요할까요?
안드로이드의 경우 PC 와는 다르게 제한된 환경으로,
정해진 양의 자원을 여러 어플리케이션에서 나눠서 사용해야 합니다.
따라서 각 어플리케이션 별로 사용하는 자원을 효율적으로 관리하기 위하여 나온 것이 라이프 사이클입니다.
어디서 어떻게 사용할지 알아야,
자원을 같이 사용할 수 있는 거죠.
처음에 엑티비티가 호출되면 시스템에서 가장 먼저 호출하는 메소드가
onCreate( ) 메소드입니다.
onCreate( ) 메소드는 엑티비티가 처음 생성될 당시 한 번만 호출되며,
데이터를 초기화하는 단계입니다.
파라미터로 넘어온 데이터를 바인딩하거나
이전에 저장된 instance의 값 등을 불러오는 역할을 합니다.
onStart( ) 메소드에서는
본격적으로 엑티비티와 사용자가 상호작용 할 수 있도록 준비하는 단계입니다.
예를 들면 UI를 관리하는 코드를 초기화하여,
엑티비티를 포그라운드로 보내 상호작용을 할 수 있도록 합니다.
onResume( ) 메소드에서는 엑티비티를 화면에 보여주면서,
사용자와 상호작용을 하는 단계입니다.
사용자와 상호작용을 하며 엑티비티가 실행되며,
별도의 이벤트가 있기 전까지 이 상태에 머무릅니다.
onPause( ) 메소드는 다른 엑티비티가 호출되어,
잠시 멈출 때 호출됩니다.
화면에서 뒤에 흐리게 되어 존재는 하지만,
상호작용을 할 수 없는 상태입니다.
예를 들면 게임에서 일시정지 버튼을 눌러,
게임 관련 엑티비티가 멈춘 상태입니다.
onStop( ) 메소드는 엑티비티가 화면에서 사라질 때 호출되며,
필수로 저장해야 하는 데이터 등을 저장합니다.
예를 들면 게임을 하고 있는데 전화가 온다면,
화면이 변경됨과 동시에
시스템에서 게임의 엑티비티에 onStop( ) 메소드를 콜백 합니다.
그 후 게임으로 다시 돌아가게 된다면,
onRestart( ) 메소드를 호출하여
엑티비티의 onStart( ) 메소드를 호출할 수 있게 준비합니다.
마지막으로 onDestroy( ) 메소드에서는 onCreate( ) 메소드에서 할당했던 변수 등을 해제하며,
엑티비티를 정리합니다.
짝을 지어 보자면
onCreate( ) 메소드와 onDestory( ) 메소드가 대치되며,
nStart( ) 메소드와 onStop( ) 메소드와 대치됩니다.
마지막으로 정리해보면
처음 엑티비티가 호출되면,
onCreate -> onStart -> onResume 메소드를 거치며 엑티비티가 실행되며,
사용자와 상호작용하다가
특별한 이벤트가 발생하면 onPause 메소드가 로 호출되어 일시 정지되며,
사용자의 중지 요청 등으로 onStop 메소드가 호출되며,
onDestroy 메소드를 거쳐 엑티비티가 종료합니다.
네 그러면 native root check 어플리케이션을 이 라이프 사이클에 맞춰서 분석해 보겠습니다.
'0x10 Android' 카테고리의 다른 글
Android :: Android101 (3/3) - APK 루팅탐지 (0) | 2020.03.01 |
---|---|
Android :: Android101 (1/3) - APK 배경지식 (0) | 2020.03.01 |
Android :: KakaoTalk DB 복호화 (5) | 2019.09.09 |
Android :: 중고로운 평화나라 (0) | 2019.04.01 |