일단 Dex 파일이란 무엇일까에 대해 알아 봅시다.
1.Dex 란?
Dex에는 Android 런타임에서 궁극적으로 실행되는 코드가 포함 되어 있습니다.
즉 기계어로 되어있습니다. 이것을 디컴파일 하면 smail 코드가 되는 것입니다.
2. Dex 파일의 구조
어느 파일이나 비슷하겠지만 dex 파일은 헤더와 섹션으로 나뉩니다. (이러고 보면 ole 파일 구조와도 비슷해보이네)
2-1) File Magic Number
위 파일이 무슨 파일인지 알려주는 부분이다. 처음에 dex라는 텍스트와 버전 번호가 있습니다.
2-2) Checksum - uint
체크섬은 이 파일이 변조 되었는지 확인하는 부분입니다. 파일의 바이트 값이 손상 된 경우 체크섬 값이 맞지 않아 Android Framework에서 Apk 설치를 거부 하게 됩니다.
2-3) signature - ubyte[20]
위의 1,2 번과 3번을 제외한 부분의 SHA-1 해시 값이며 파일을 고유하게 식별하는 데 사용되며 Multidex와 같은 기능에 사용 됩니다.
이건 논 외의 이야기 지만 해시값을 사용 하는 이유는 파일의 무결성 때문이다.
※ multidex란?
안드로이드 개발 시 규모가 커지면 코드가 많아지고 라이브러리도 많아 지게 됩니다. 이를 해결하기 위해 나온 것이 Multidex이며 64K 메소드가 넘는 dex 파일을 여러개로 쪼개주고 쪼개진 dex를 읽을수 있게 해줍니다.
2-4) file_size - uint
이 것은 파일의 크기를 알려주는 부분입니다. 위 내용은 리틀 엔디안 방식으로 구성 되어있으며 변환해 보면 0x0021181c 입니다. 이것을 10진수로 변환해보면 2,168,860 byte라고 합니다 맞는지 확인해보면
맞습니다!!
2-5) header_size - uint
헤더의 크기를 보여줍니다. 값은 0x70으로 정해져 있습니다.
2-6) endian_tag - uint
아까 크기를 구할때 리틀 엔디안 방식으로 되어있다고 했는데 정확히 알려면 이 부분을 보면 됩니다.
12345678로 되어 있다면 빅 엔디안
78563412로 되어있으면 리틀 엔디안 입니다.
2-7) link_size , link_off - uint
link_size는 처음 4 byte로 연결 섹션의 크기를 나타냅니다. 파일이 정적으로 연결 되지 않은 경우 0을 갖습니다.
link_off는 뒤에 4 byte 입니다. 파일의 시작 부분에서 연결 섹션까지의 오프셋이며 link_size가 0인 경우 0입니다.
2-8) map_off - uint
map_off는 파일의 시작 부분에서 맵 항목까지의 오프셋입니다.
오프셋은 0이 아니여야 하고, data 섹션으로의 오프셋이어야 합니다.
2-9) string_ids_size, string_ids_off - uint & String_ids
string_ids_size는 문자열 식별자 목록의 문자열 수 입니다.
string_ids_off는 파일의 시작 부분에서 문자열 식별자 목록까지의 오프셋입니다.
그렇다면 String_ids 란 무엇일까요?
Dex 파일에는 각 특징마다 고유한 섹션을 가지고 있습니다.
String_ids 섹션은 dex 파일 내에서 사용하는 모든 문자열을 저장하는 영역입니다 .
string_ids_size : 0x0000530C
string_ids_off : 0x00000007
2-10) type_ids_size, type_ids_off - uint
type_ids_size는 형식 식별자 목록의 요소 개수입니다.
type_ids_off는 파일의 시작 부분에서 형식 식별자 목록까지의 오프셋입니다.
오프셋이 0이 아닌 경우 type_ids 섹션의 시작 부분까지여야 합니다.
type_ids_size : 0x00000867
type_ids_off : 0x00014CA0
Type_ids 섹션은 string_ids 영역에 저장된 문자열의 성격을 저장하고 있는 영역입니다.
2-11) proto_ids_size, proto_ids_off - uint
proto_ids_size는 프로토타입 식별자 목록의 요소 개수 입니다.
proto_ids_off는 파일의 시작 부분에서 프로토타입 식별자 목록까지의 오프셋입니다.
오프셋이 0이 아닌 경우 proto_ids 섹션의 시작 부분까지여야 합니다.
proto_ids_size : 0x00000D46
proto_ids_off : 0x00016E3C
proto_ids 섹션은 dex 파일 내에서 함수의 구조를 저장하고 있는 영역입니다.
2-12) field_ids_size, field_ids_off - uint
field_ids_size는 필드 식별자 목록의 요소 개수 입니다.
field_ids_off는 파일의 시작 부분에서 필드 식별자 목록까지의 오프셋 입니다.
오프셋이 0이 아닌 경우 field_ids 섹션의 시작 부분에 있어야 합니다
field_ids_size : 0x00002C98
field_ids_off : 0x00020D84
field_ids 섹션은 클래스의 이름, type, class , package 이름을 제공하는 영역입니다.
13) method_ids_size, method_ids_off - uint
method_ids_size는 메서드 식별자 목록의 요소 개수입니다.
method_ids_off는 파일의 시작 부분에서 메서드 식별자 목록까지의 오프셋입니다.
오프셋이 0이 아닌 경우 method_ids 섹션의 시작 부분에 있어야 합니다.
method_ids_size : 0x00003EB0
method_ids_off : 0x00037244
method_ids 섹션은 method의 이름, type, 소속 class 이름을 저장하는 영역입니다.
14) class_defs_size, class_defs_off - uint
class_defs_size는 클래스 정의 목록의 요소 개수입니다.
class_defs_off는 파일의 시작 부분에서 클래스 정의 목록까지의 오프셋입니다 .
오프셋이 0이 아닌 경우 class_defs 섹션의 시작 부분까지여야 합니다.
class_defs_size : 0x00000570
class_defs_off : 0x000567C4
class_defs 섹션은 class에 대한 전체적인 정보와 데이터에 대한 기초 정보를 저장하는 영역입니다.
15) data_size, data_off - uint
data_size는 바이트 단위로 나타낸 data 섹션의 크기 입니다. sizeof(unit)의 짝수 배수여야 합니다.
data_off는 파일의 시작 부분에서 data 섹션 시작 부분까지의 오프셋입니다.
data_size : 0x001B0258
data_off : 0x000615C4
휴 드디어 다썼다. dex에 대해 알아 봤습니다. 다음 smail 코드를 분석 해 보겠습니다.
'안드로이드에 관하여 > 안드로이드 공부' 카테고리의 다른 글
APK 보호기법 (0) | 2021.01.06 |
---|---|
what is Smali code? (0) | 2021.01.02 |
Android framework Study[2 - 핸드폰을 부팅 하자] (0) | 2020.12.03 |
Android framework Study[1] (2) | 2020.12.03 |
안드로이드 리버스 엔지니어링 공부 체크 리스트 (0) | 2020.08.30 |