πŸ’š 개발/μ•ˆλ“œλ‘œμ΄λ“œ

[μ•ˆλ“œλ‘œμ΄λ“œ] Dex 파일 κ΅¬μ‘°λŠ” μ–΄λ–»κ²Œ λ˜μ–΄ μžˆλŠ”κ°€ / Smali Code

devshin.kr 2021. 7. 22. 17:38
728x90

좜처: Dex 파일 κ΅¬μ‘°λŠ” μ–΄λ–»κ²Œ λ˜μ–΄ μžˆλŠ”κ°€

 

Dex 파일 κ΅¬μ‘°λŠ” μ–΄λ–»κ²Œ λ˜μ–΄ μžˆλŠ”κ°€

일단 Dex νŒŒμΌμ΄λž€ λ¬΄μ—‡μΌκΉŒμ— λŒ€ν•΄ μ•Œμ•„ λ΄…μ‹œλ‹€. 1.Dex λž€? Dexμ—λŠ” Android λŸ°νƒ€μž„μ—μ„œ ꢁ극적으둜 μ‹€ν–‰λ˜λŠ” μ½”λ“œκ°€ 포함 λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 즉 κΈ°κ³„μ–΄λ‘œ λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€. 이것을 λ””μ»΄νŒŒμΌ ν•˜λ©΄ smail μ½”λ“œ

r-ever-scp.tistory.com

 

 

일단 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와 같은 κΈ°λŠ₯에 μ‚¬μš© λ©λ‹ˆλ‹€.

이건 λ…Ό μ™Έμ˜ 이야기 μ§€λ§Œ ν•΄μ‹œκ°’μ„ μ‚¬μš© ν•˜λŠ” μ΄μœ λŠ” 파일의 무결성 λ•Œλ¬Έμ΄λ‹€.

 

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 μ½”λ“œλ₯Ό 뢄석 ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

좜처: Dex 파일 κ΅¬μ‘°λŠ” μ–΄λ–»κ²Œ λ˜μ–΄ μžˆλŠ”κ°€

 

Dex 파일 κ΅¬μ‘°λŠ” μ–΄λ–»κ²Œ λ˜μ–΄ μžˆλŠ”κ°€

일단 Dex νŒŒμΌμ΄λž€ λ¬΄μ—‡μΌκΉŒμ— λŒ€ν•΄ μ•Œμ•„ λ΄…μ‹œλ‹€. 1.Dex λž€? Dexμ—λŠ” Android λŸ°νƒ€μž„μ—μ„œ ꢁ극적으둜 μ‹€ν–‰λ˜λŠ” μ½”λ“œκ°€ 포함 λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 즉 κΈ°κ³„μ–΄λ‘œ λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€. 이것을 λ””μ»΄νŒŒμΌ ν•˜λ©΄ smail μ½”λ“œ

r-ever-scp.tistory.com

 

 

 

[ Smali Code λž€? ]

SmaliλŠ” dalvik μ—μ„œ μ‚¬μš©ν•˜λŠ” dex ν˜•μ‹μ˜ μ–΄μ…ˆλΈ”λŸ¬μ΄λ‹€.

Dex νŒŒμΌμ€ κΈ°κ³„μ–΄λ‘œ λ˜μ–΄ μžˆμœΌλ‹ˆ, 이걸 읽기 μ‰½κ²Œ ν•΄μ£ΌλŠ” 것이 Smali code 이닀.

Smali code λŠ” λ‹€μ‹œ μ»΄νŒŒμΌμ„ ν•  수 있기 λ•Œλ¬Έμ— μ½”λ“œλ₯Ό μˆ˜μ •ν•˜κ³ , λ‹€μ‹œ 컴파일 ν•¨μœΌλ‘œμ¨ ν”„λ‘œκ·Έλž¨ μˆ˜μ •μ΄ κ°€λŠ₯ν•˜λ‹€.