본문 바로가기

Android/Android Analysis

[Android Reverse Engineering] Hello World

반응형

안드로이드 역공학

"Hello World" 예제


솔직히 말씀드리면 안드로이드 같은 경우에는 디컴파일러가 존재해 코드를 원 코드와 유사하게 복구가 가능합니다.

그러나 이번 포스팅에서는 디컴파일러를 이용하지 않고, 오직 코드로 원 코드를 복구하는 방법을 포스팅 하려고 합니다.

이 포스팅의 기술을 악용하는 경우 

컴퓨터프로그램보호법 제 12조 2에 의거하여 (프로그램코드역분석의 대상이 되는 프로그램과 표현이 실질적으로 유사한 프로그램을 개발·제작·판매하거나 기타의 프로그램저작권을 침해하는 행위에 이용하는 경우) 처벌받을 수 있으며 이에 대한  책임은 저작권자는 지지 않음을 강조합니다.

법령 참조 (http://www.law.go.kr/LSW/LsInfoP.do?lsiSeq=84165#0000)


일단 준비물은

apktool (https://code.google.com/p/android-apktool/)

notepad (다른 편집기를 사용하셔도 무방합니다)

개념 (이 기술을 악용하지 않고 기술 연구에만 사용하는 개념)


이 있으시면 됩니다.


시작~

일단 첨부된 HelloWorld.apk 파일을 다운받아 apktool을 이용하여 resource 파일과 smail 코드를 복구합니다.

APKTOOL 명령어 (apktool d (복구하려는 파일) (복구한 파일을 저장할 곳의 이름))

ex) apktool d HelloWorld.apk Helloworld


복구를 하여서 복구 파일에 들어가 보면

res, smali이 존재하는데 그 중 smali 폴더에 접근하시면

android 와 kr 이라는 두 파일이 보이시게 될 겁니다.

그 중에 안드로이드 파일은 자동으로 생성되는 것으로 구지 안 건드리셔도 됩니다.

(물론 저처럼 호기심 많은 분들은 한번...ㅎ_ㅎ)


일단

kr -> reversergoodboy -> reverse_example_helloworld 에 접근하시면


의...읭?

저는 분명 MainActivity 하나만 생성했는데.. 왜 이리 많은 파일이..?


원인은 바로

apk 파일로 빌드 하는 과정에서 res 폴더에 있는 것들이 같이 읽히기 때문입니다.

(그리고 R.smali에 대한 설명은 포스팅 아래에 하겠습니다.)


그래서 여기 있는 것들 중에 진짜 소스코드는

MainActivity.smali 가 되는 것입니다.


이를 메모장으로 접근해 보면

어쩔 수 없이 포스팅 길이를 예상해서.. 했습니다 ㅎ


하나 하나 해설을 달고 싶지만 이는 같이 첨부한 것을 참고해 주시고..

여기서 집중하셔야 될 부분은 .line 21 부분에 "const/high16 v1, 0x7f08"

이 부분입니다.


const/high16 부분은 16비트를 상수로 넣어준다는 뜻이고..

0x7f08의 정체는.. 아까 보신 R$id.smali 에 비밀이 숨어 있습니다.



안드로이드 개발을 해 보신분이면 알겠지만

안드로이드에서 자동으로 R.java 라는 파일을 생성합니다.

R.java의 역할은 바로 resource나 이런 것들을 잘 연결하고 띄울 수 있게 하는 역할을 해 주는데요.

이때 0x~~~ 16진수를 사용합니다. 메모리 주소인 것이지요.


.field public static final textview:I = 0x7f080000

textview 라는 변수이고 이 변수의 메모리 주소는 0x7f080000 인 것입니다.

그래서 MainActivity 에서 0x7f08 이라고 뜬 것입니다.


그러면.. 해석을 해 보면?

0x7f08 을 정의 하는 것이 됩니다.


이 소스코드의 풀 해석은 첨부한 파일을 참고해 주시면 됩니다.

이번에는 간단하게 smali code 에 대하고 Dalvik Opcode 에 대해 

간단하게 알아보았습니다.


질문이나 오타, 틀린 내용은 댓글..^


HelloWorld_Smalicode_Recovery.pdf

HelloWorld.apk


(재배포 금지)

반응형