Under the Hood: Reversing Android 번역문서 해당문서는연구목적으로진행된번역프로젝트입니다. 상업적으로사용을하거나, 악의적인목적에의한사용을할시 발생하는법적인책임은사용자자신에게있음을경고합니다. 원본 : http://resources.infosecinstitute.com/reversing-android-applications/ 번역자 : 김재기님 (jack2) 편집 / 감수 : 조정원님 ( 니키 )
내용 1. 들어가며... 2 2. 상세내역... 2 2.1. 미리보기... 2 2.2. 안드로이드개발에대한간략한설명... 3 2.3. Android Packages Dissected... 3 2.4. Security... 4 2.5. 역공학분석 ( 리버스엔지니어링 )... 5 2.6. 다음레벨을향하여... 7 2.7. 예제어플리케이션... 8 3. 마무리... 9 4. 끝맺음... 9
1. 들어가며 최근몇년동안모바일사용량은폭발적으로증가했다. 모바일소프트웨어의엄청난증가에는개인적이고민감한정보를저장, 처리, 전송하는어플리케이션도포함된다. 구글안드로이드와애플 IOS 플랫폼이유일한것은아니지만구글안드로이드와애플 IOS 플랫폼은우리일상컴퓨터습관을변화시켰다. 좋아하는모바일앱의숨겨진실제모습에놀란적이있는가? 이글에서숨겨진것들을발견하는법과안드로이드플랫폼에서좋아하는어플리케이션의숨겨진실제모습을보는방법을탐구할것이다. 안드로이드개발프로세스와안드로이드어플리케이션의내부그리고그것들을검토하는데사용할도구에대해대략적으로알아볼것이다. 또한현재있는안드로이드어플리케이션을변경하는방법과그것을할수있는범위그리고일부경고사항에대해알아볼것이다. 2. 상세내역 2.1. 미리보기 좋아하는모바일어플리케이션을정확히크랙하는방법에대해본격적으로알아보기전에, 이러한 프로그램을개발하는것에대해이야기해보도록하자. 안드로이드어플리케이션은실제로 java.lang.object 를확장시킨구글의 R 클래스기반 Java 어플리케이션이다. 구글은 Java 에서안드로이드 API 를개발했다. 그리고모든안드로이드어플리케이션은이기능의일부분을확장했다. 다른요소들은그래픽리소스를정의한 XML 설정파일 (AndroidManifest.xml, strings.xml 그리고 main.xml ), 어플리케이션에필요한권한, 화면상의위치와배치방법뿐만아니라다른기술적요구사항을포함한다. 바이트코드로컴파일되었을때, 안드로이드앱들은궁극적으로.dex(Dalvik executable) 파일이된다. 이러한.dex 파일들은달빅 (Dalvik) 가상머신에의해해석되고어플리케이션으로실행된다. 우리가안드로이드어플리케이션을리버싱하기위해사용하는도구들을커버할때.dex 포맷에대해더자세히이야기할것이다. 안드로이드플랫폼에대한한가지흥미로운점은패키지어플리케이션은리버싱을방지하기위해보호메커니즘이설계되어있지않다는것이다. 여러분의기기에서파일시스템일부분에접근하는것을허용시키지않는방식으로안드로이드운영체제는본질적으로보호기법이설계되어있다. 이러한환경에서해석된코드와컴파일되지않은코드만있기때문에,
어플리케이션리버싱은본질적으로올바른도구를찾는것과그것들을효율적으로사용하는것 만큼쉽다. 물론, 코드에대한더많은직접적인접근은비지니스로직, 구현결함또는안좋은 코딩관습사용에서결함을찾을수있는기회가될수있다는것을의미한다. 2.2. 안드로이드개발에대한간략한설명.apk 아카이브를떨어져분리하는경우, 안드로이드개발절차에대한일반적인이해가매우 유용하다. 아래내용은모든작업에대한방법에대해기본적인이해를하기위한프로세스의상위 버전을일반화한것이다. - 안드로이드개발환경설치. 이과정에대해구글에서는 'Installing the SDK' 문서에서설명하고 있다. 모든대부분운영체제를지원한다. - Java 코드개발. 나중에예제어플리케이션을통해알아볼것이다. - 패키치설치. 이것은 Eclipse IDE 통하거나또는커맨드라인도구를이용하여수행할수있다. - VM 또는실제기기에서어플리케이션테스트. - 마켓에배포. 이개발과정개요는본문에서의목적을위해충분하다. 그러나, 안드로이드어플리케이션개발에 대해더자세히알고싶다면, 구글안드로이드개발자가이드를참조해라. 이제우리는엔드 - 투 - 엔드개발과정이어떤지에대한생각을가지고.apk 파일의내부를 살펴보자. 2.3. ANDROID PACKAGES DISSECTED.apk 파일이어떤일이일어나는지에대해간력히살펴보자. 안드로이드어플리케이션은따라야 할기본구조를갖는다. 이목록은포괄적인것을의미하기보다는시작하는것을의미한다. 다음은안드로이드소스프로젝트가포함된중요항목들의간략한목록이다. AndroidManifest.xml - 패키지이름, 최소권장안드로이드버전어플리케이션을위한필수적인 XML 설정파일이다. /src - 소스파일 (.java) 위치. /res - 사용자프리젠테이션과관련된파일을포함하는리소스폴더. 일반적으로여기에그래픽 / 레이아웃 XML 문서들이존재한다. /res/layout/main.xml - 이설정파일은메인어플리케이션의레이아웃을설정하는정의를포함한다.
기본파일명은 'main.xml' 이다. /res/values/strings.xml - 무언가를상상할수있는경우, strings.xml 설정파일은문자열을포함한 다. 어플리케이션에의해다른곳에서참조하는정적 (static) 문자열정의들이다. 한가지중요한 문자열오브젝트이름은 "app_name" 이다. "app_name" 은안드로이드어플리케이션의이름을 포함한다. 기본파일명은 'strings.xml' 이다..apk 를리버싱하면, 아래의파일들을만날수있다. AndroidManifest.xml - 소스프로젝트에있는원본과동일한설정파일. 하지만바이너리형태로변환됨. /META-INF - CERT.RSA, CERT.SF 그리고 MANIFEST.MF 파일을포함하는폴더. 이파일들은어플리케이션디지털증명서뿐만아니라.apk 에서각파일에대한상대경로와 SHA1 다이제스트를포함한다. classes.dex - 모든자바.class 파일을포함하는.dex 아카이브 2.4. SECURITY 이전에우리는 AndroidManifest.xml 설정파일과그리고어플리케이션권한정의가어떤식으로 포함되어있는지언급했다. 다음라인은어플리케이션에권한을추가할수있는지침의예다. <uses-permission android:name="android.permission.internet" /> "android.permission.internet" 은어떤권한이필요되는지표시한다. 이특정값은어플리케이션이네트워크소켓을만들수있게하고, 효율적으로인터넷에인터넷에액세스권한을제공한다. 아래표는몇가지일반적인값을보여준다. 더완전한목록을보려면 android.manifest.permission 페이지를참조하길바란다. 몇몇일반적인 android.manifest.permission 값들 : ACCESS_COARSE_LOCATION - 포괄적인위치액세스 (Cell / WiFi) 허용 ACCESS_FINE_LOCATION - 자세한위치액세스 (GPS) 허용 ACCESS_WIFI_STATE - WiFi 네트워크정보에대한액세스허용 GET_ACCOUNTS - 기기에서계정목록에대한액세스허용 INTERNET - 네트워크및인터넷액세스허용 READ_CONTACTS - 연락처데이터액세스허용 VIBRATE - 진동설정 / 상태에대한액세스허용 WRITE_EXTERNAL_STORAGE - 외부저장소에대한쓰기허용 ( 예. SD Card)
안드로이드마켓에서아래의다이얼로그가나타나는이유는 AndroidManifest.xml 에서위에서 언급한권한관련항목이존재하기때문이다. 2.5. 역공학분석 ( 리버스엔지니어링 ) 이제우리는안드로이드어플리케이션의내부에무엇이있는지생각해보자. 어떻게하면이모바일프로그램들의본래모습이나타나도록분해해볼수있을까? 안드로이드어플리케이션을생성하는데필요한패킹과변환과정을리버싱할수있는다양한오픈소스도구들이있다. 안드로이드 apk 파일에서정보를추출하기위해사용되는도구들 : apktool -.apk 파일조작에사용되는도구 Download: http://code.google.com/p/android-apktool/
jad - 자바디컴파일러 ( 윈도우전용 ) Download: http://www.varaneckas.com/jad JD-Core + JD-GUI - 자바디컴파일러, 새로운자바버전과기능지원 Download: http://java.decompiler.free.fr dex2jar -.dex 파일을.class 파일로변환하는도구 Download: http://code.google.com/p/dex2jar/downloads/list (dex2jar) 안드로이드앱을디컴파일 / 리버싱하는과정은아래와같다 : - 분석하기원하는앱을마켓에서안드로이드기기에다운로드한다. - 안드로이드기기에서 PC 로.apk 파일을복사. 해당기기의파일시스템에대한전체액세스 권한을필요로한다. 이와같은이유로루팅된 Motorola Droid 를사용했다. 기기에있는.apk 파일의기본경로는 /data/app 이다. 여기에서목표를결정해야한다. 단순히어플리케이션에서 XML 문서또는그래픽을검토하거나 변경하는경우에는아래의방법을사용하는것으로충분하다. java jar apktool.jar d file.apk destination_directory 이명령은.apk 파일을압축해제할것이다. 그리고프로젝트의디렉토리구조를다시생성한다. 바이너리 XML 파일을평문 XML 로변환할것이다. 이방법은 AndroidManifest.xml 에서어플리케이션이요청하는특정권한을볼수있는빠르고간단한검사방법이다. 이과정이진행되는동안.dex 코드는.smali 포맷으로변환된다..smali 포맷은원래.dex 바이트코드의디스어셈블버전이다. C 언어로작성된바이너리에서어셈블리언어를생성하기위해유틸리티를사용하는것과대략적으로동일하다. 반면에이과정에서원본소스코드를얻지못하는경우에는바이트코드로변환할수있는원본코드에대한매우정확한설명을얻을수있을것이다..java 소스코드를검증하기위한것이목적인경우에는, 더많은수동적인접근이필요하다. 자세한 과정은아래와같다. -.apk 파일압축해제 (unzip file.apk) dex2jar classes.dex
- classes.dex 를.jar 파일로변환 (dex2jar classes.dex) -.jar 파일압축해제 (unzip classes_dex2jar.jar) jad s.java *.class - jad( 또는유사한도구 ) 로바이트코드를디컴파일 (jad s.java *.class) 이시점에서이제원본어플리케이션과본질적으로동일한자바소스파일을갖는다. 이러한두가지방법을결합하는경우, XML 설정파일과자바소스파일을리뷰해서원본어플리케이션이작동하는방식에대한좋은이해를할수있다. 모든게좋은동안에스스로에게물어볼수있다 - 여기에서우리는어디로가야하는것인가? 한가지간단한리뷰를통해서좀더실질적인측면에대해살펴보자. 2.6. 다음레벨을향하여심사숙고할수있는한가지는어플리케이션을변경할수있는방법과기기에설치를위해어플리케이션을리빌드하는방법이다. 보안관점에서, 지금까지설명한방법을이용한리버싱된안드로이드어플리케이션의가장쉬운타겟은 XML 설정파일이다. 해당파일을바꾸는것은자바소스코드상에서변경이필요없다. 또한권한변경은전체어플리케이션에부여될수있다. 이것은어떤리소스를접근하거나추가적인권한을더하는것을방지하길원할경우유용할수있다. AndroidManifest.xml 에서 android.permission.internet 을제거하는것은한가지좋은예이다. 이것은효과적으로어플리케이션에서내장된광고를사용하기위한목적과같은네트워크연결을차단할수있다. 그러나이러한변경는자바소스자체를변경하는것보다는훨씬더적은영향을미친다. 응용프로그램이코딩되어있는방법을고려하지않아서이러한접근은문제가될수있다. 특정권한집합을제거하는것은어플리케이션을무력화하고사용할수없게만들수있을가능성이크다. 기존안드로이드어플리케이션의자바소스를변경하고리패키징하는것에는몇가지문제가있다. 첫째로패키지는키로서명이되어야한다. 가상머신과기기에서안드로이드어플리케이션을테스트하는데사용되는디버그키가있다. 그러나, 해당키로서명하는것은몇가지부작용이있다. 마켓에서소프트웨어를설치하지않았기때문에안드로이드기기는출처를알수없는소프트웨어의설치를허용하도록설정해야한다. 다른문제는 zipalign 도구는패키지에서사용되지않는점이다. 안드로이드문서에따르면어플리케이션이더많은메모리를사용하게된다고한다. 이것은자신의어플리케이션을개발자키없이적합하지않게사용하는것이다.
이전두문장에서설명된내용에딱맞는주목할만한어플리케이션이있다. 즉, 압축해제한.apk 파일에서보여지는 AndroidManifest.xml 상에서부적합한권한을제거하고확인한다. 그다음다시빌드한뒤유효한키로서명된패키지를재설치한다. 아래의 URL 을통해관련된더많은내용을알수있다. https://market.android.com/details?id=com.xeudoxus.privacy.blocker&hl=en 2.7. 예제어플리케이션 여기서다루는부분의일부를설명하기위해매우단순한샘플어플리케이션을만들었다. 이 프로그램은단순히사전에정의된 URL( 구글파비콘 ) 을가지고온다. 그리고이것을 Webview 컨테이너에나타낸다. 해당어플리케이션은 android.permission.internet 권한이필요하다. 아래의스크린샷중왼쪽은적절한권한이있는어플리케이션을보여준다. 그리고오른쪽스크린 샷은해당권한이제거된어플리케이션이다. 어플리케이션이리소스에접근할적절한권한이없음에도불구하고프로그램이그래픽을표시하고로드하려는시도를주의해라. 이와같은결과는검사하기위한코딩을하지않았기때문이다. 이것은설정파일에서권한을변경하는것은의도하지않은결과를가져온다는것을나타낸다. 해당소스와어플리케이션은각각의링크를통해다운로드받을수있다. (fetch.zip, fetch.apk)
3. 마무리안드로이드어플리케이션을구성하는요소, 내용을검토하기 위한.apk 분해하는방법, 프로그램의요소를더분석하는데사용할수있는도구들에대해다루어보았다. 그리고 AndroidManifest.xml 에있는시스템기반의안드로이드권한, 기기리소스에접근하는방법, 리소스 제어를 변경하는 방법에 대해서도 살펴보았다. 추후에는.smali 코드를 사용한 어플리케이션변경과.apk 파일리패키징그리고취약성평가도구를다루어볼예정이다. 관련된컨텐츠 infosec android resources reversing android applications reversing android apps ollydbg resource rebuilding reverse android apps quickview apk converting smali code legality of reverse engineering android apps how to break the source code for a android application reverse engineering android apps 저자에관하여 Carl Benedict 은보안엔지니어이고취약점리서치와개발, 웹어플리케이션보안, 리버시엔지니어링에열정을가지고있는컨설턴트이다. 그는현재 Forbes에서발표한 200개의최고소규모회사 에포함되어있는한회사에서일하고있다. 그외에 Carl은작은비지니스들, 포춘 500의회사들, 연방정부를위해일하고있다 4. 끝맺음 http://resources.infosecinstitute.com/ 사이트에서는다양한해킹공격시연문서및방어들이정기적으로배포되고있습니다. 입문자들대상으로설명한문서들이많아서연구목적으로번역을시작하였습니다. 앞으로도좋은컨텐츠에대해서는정기적으로번역을해서배포하도록하겠습니다. 또한꾸준히활동하는멤버들에게번역출판의기회를드리고있습니다. 번역에참여해주신멤버들에게감사합니다.