안드로이드 역공학
"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
(재배포 금지)
'Android > Android Analysis' 카테고리의 다른 글
안드로이드 일부 단말기에서 4yougate.com 사이트로 연결되는 문제에 관한 내용 (2) | 2014.04.09 |
---|---|
MD5 Hash Viewer (0) | 2014.03.29 |
difference between dex2jar and d2j-dex2jar (0) | 2014.02.17 |
Android bootkit Oldboot 분석 (0) | 2014.01.29 |
안드로이드 APK 파일 분석용 OS (0) | 2013.09.29 |