ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [μ•ˆλ“œλ‘œμ΄λ“œ 리버싱] μ•ˆλ“œλ‘œμ΄λ“œ μ‹œμŠ€ν…œ 이해 :: μž„λ² λ””λ“œ, μ•„ν‚€ν…μ²˜, Dalvik, ART, 슀마트폰 λ³΄μ•ˆ 동ν–₯
    SECURITY/Android Reversing 2022. 1. 12. 16:17

     

    μž„λ² λ””λ“œ μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜

    μž„λ² λ””λ“œ μ‹œμŠ€ν…œμ΄λž€, ν•˜λ“œμ›¨μ–΄μ™€ μ†Œν”„νŠΈμ›¨μ–΄κ°€ μ‘°ν•©λœ μ‹œμŠ€ν…œμ΄κ³ , λŒ€ν‘œμ μœΌλ‘œ 슀마트폰, TV 등이 μžˆμŠ΅λ‹ˆλ‹€.

    μ΅œμ ν™”λ₯Ό μœ„ν•΄ 보톡 μœ λ‹‰μŠ€/λ¦¬λˆ…μŠ€ 기반의 운영체제λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. (μ˜€ν”ˆμ†ŒμŠ€, κ²½λŸ‰ν™”, λ“± 용이)

     

    μž„λ² λ””λ“œ μ‹œμŠ€ν…œμ˜ μ•„ν‚€ν…μ²˜λŠ” 크게 Software, Hardware 둜 λ‚˜λ‰  수 μžˆμŠ΅λ‹ˆλ‹€.

    SW μ—λŠ” λ² μ΄μŠ€λΆ€ν„° λ””λ°”μ΄μŠ€ λ“œλΌμ΄λ²„, 운영체제, 미듀웨어, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.

    HW μ—λŠ” CPU, λ©”λͺ¨λ¦¬, μž…μΆœλ ₯ μž₯치 등이 μžˆμŠ΅λ‹ˆλ‹€.

    μ—¬κΈ°μ„œ λ””λ°”μ΄μŠ€ λ“œλΌμ΄λ²„κ°€ SW 와 HW κ°„μ˜ μš”μ²­, 처리λ₯Ό λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

     

    μ•ˆλ“œλ‘œμ΄λ“œ μ•„ν‚€ν…μ²˜

    μž„λ² λ””λ“œ μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜μ™€ 거의 λ™μΌν•©λ‹ˆλ‹€.

    λ‹€λ§Œ 일반적인 μž„λ² λ””λ“œ μ‹œμŠ€ν…œλ³΄λ‹€λŠ” λ³΅μž‘ν•œ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€κ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

     

    https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%9D%BC:Android-System-Architecture.svg

    Linux Kernel 을 μ‚¬μš©ν•˜κ³ , λ‹€μ–‘ν•œ SSL(μΈμ¦μ„œ), SQLite (λ‚΄μž₯ DB) 와 같은 library λ₯Ό μ‚¬μš©ν•˜λŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

    κ·Έ μœ„λ‘œλŠ” 이제 Application 의 λ‹€μ–‘ν•œ κΈ°λŠ₯을 μ œκ³΅ν•˜κ³  μ œμ–΄ν•˜λŠ” Framework κ°€ λ“€μ–΄κ°€ μžˆλŠ”λ°μš”,

    Activity, Notification, Location λ“± μ•ˆλ“œλ‘œμ΄λ“œ κ°œλ°œν•  λ•Œ λ³Ό 수 μžˆλŠ” ꡬ성 μš”μ†Œλ“€μ΄ μžˆμŠ΅λ‹ˆλ‹€.

    μ•ˆλ“œλ‘œμ΄λ“œ κ°œλ°œμžλŠ” Application Framework λΆ€ν„°λ₯Ό κ°€μž₯ 많이 μ ‘ν•  것이고, κ·Έ μš”μ†Œλ“€μ„ 적절히 μ‚¬μš©ν•˜μ—¬ Application 을 λ§Œλ“€κ²Œ λ©λ‹ˆλ‹€.

     

    λŒ€ν‘œμ μœΌλ‘œ Android κ°œλ°œν•  λ•Œ Activity 와 Fragment λ₯Ό κ°€μž₯ λ¨Όμ € μ ‘ν•˜κ²Œ 될텐데,

    κ·Έ μΉœκ΅¬λ“€μ΄ Android μ‹œμŠ€ν…œμ—μ„œ μ œκ³΅ν•΄μ£ΌλŠ” 것이고 λ˜ν•œ κ°œλ³„ 생λͺ…μ£ΌκΈ°λ₯Ό κ°€μ§‘λ‹ˆλ‹€.

     

    즉, Android λΌλŠ” μš΄μ˜μ²΄μ œκ°€ 각 μš”μ†Œλ₯Ό μ œμ–΄ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

     

    μš°λ¦¬κ°€ 컴퓨터 ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€ λ•Œμ—λ„ μš΄μ˜μ²΄μ œλ‚˜ νƒ€κ²Ÿ λ””λ°”μ΄μŠ€μ— μ•Œλ§žμ€ λΌμ΄λΈŒλŸ¬λ¦¬λ‚˜ κΈ°λŠ₯을 ν™œμš©ν•˜λŠ” κ²ƒμ²˜λŸΌ,

    μ•ˆλ“œλ‘œμ΄λ“œ μ•± κ°œλ°œλ„ Android λΌλŠ” 운영체제의 νŠΉμ„±μ— 맞게 μ–Όλ§ˆλ‚˜ 효율적으둜 μž‘μ„±ν•˜λŠ”μ§€κ°€ μ€‘μš”ν•΄μ§€κ²Œ λ©λ‹ˆλ‹€.

    (ex. νŠΉμ • ν™”λ©΄μ—μ„œ Activity λ₯Ό μ‚¬μš©ν• μ§€, Fragment λ₯Ό μ‚¬μš©ν• μ§€ λ“±)

     

    λ”°λΌμ„œ μ•ˆλ“œλ‘œμ΄λ“œ 리버싱을 ν•˜κΈ° μœ„ν•΄μ„œ λ¨Όμ € μ•Œμ•„μ•Ό ν•˜λŠ” 것은, Android λŠ” linux kernel 을 기반으둜 ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

    즉, μ•ˆλ“œλ‘œμ΄λ“œ 리버싱도 결ꡭ은 λ¦¬λˆ…μŠ€λ₯Ό 기반으둜 뢄석해야 ν•œλ‹€λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

    (단, μ•ˆλ“œλ‘œμ΄λ“œμ—μ„œ μ‚¬μš©ν•˜λŠ” Linux Kernel 은 일반 λ¦¬λˆ…μŠ€ μ»€λ„κ³ΌλŠ” μ’€ λ‹€λ₯΄κ²Œ, κ²½λŸ‰ν™” 등을 ν•΅μ‹¬μœΌλ‘œ μž¬κ΅¬μ„±λœ κ²ƒμž…λ‹ˆλ‹€.)

     

    Dalvik VM, ART, JVM

    Dalvik VM 은 λ ˆμ§€μŠ€ν„° λ¨Έμ‹  ν˜•νƒœμ˜ 가상 λ¨Έμ‹ μœΌλ‘œ, μ•ˆλ“œλ‘œμ΄λ“œ 용으둜 λ§Œλ“€μ–΄μ‘Œλ‹€κ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    가상 λ¨Έμ‹ μœΌλ‘œλŠ” Dalvik VM 뿐만 μ•„λ‹ˆλΌ ART, JVM 등이 μžˆλŠ”λ°, Dalvik 은 λ ˆμ§€μŠ€ν„° ν˜•νƒœλ‘œ μž‘μ„±λ˜μ–΄ λͺ…λ Ήμ–΄ 수λ₯Ό μ€„μ΄λŠ” κ²ƒμœΌλ‘œ νš¨μœ¨μ„ 높인 ν˜•νƒœμž…λ‹ˆλ‹€.

    java νŒŒμΌμ„ λ°”λ‘œ μ‹€ν–‰ν•  μˆ˜λŠ” μ—†κ³ , dex 포맷으둜 바꿔야지 Dalvik VM μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

     

    일반적으둜 많이 μ‚¬μš©ν•˜λŠ” μžλ°”μ˜ JVM 은 μŠ€νƒ 기반의 가상 λ¨Έμ‹ μœΌλ‘œ, νš¨μœ¨μ„±κ³Ό λΌμ΄μ„ μŠ€ λ¬Έμ œκ°€ μžˆμ–΄μ„œ μ˜€ν”ˆ μ†ŒμŠ€μΈ Android λŠ” Dalvik VM 을 κ°œλ°œν•˜μ—¬ μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

    그런데 μ΅œκ·Όμ—λŠ” Dalvik VM 의 ν•œκ³„μ μ„ κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄ ART (Android Runtime) λ₯Ό μƒˆλ‘­κ²Œ κ°œλ°œν•˜μ˜€μŠ΅λ‹ˆλ‹€.

     

    Android 5.0 (Lolipop) μ΄ν›„λΆ€ν„°λŠ” ART κ°€ κΈ°λ³Έ λŸ°νƒ€μž„μ΄ λ˜μ—ˆκ³ , 이후 λ§Žμ€ κ°œμ„ μ΄ 이루어지고 μžˆμŠ΅λ‹ˆλ‹€.

     

    https://medium.com/@logishudson0218/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%BB%B4%ED%8C%8C%EC%9D%BC-%EB%B0%A9%EC%8B%9D-dalvikvm-art-b5d64350489f

     

     

    Dalvik VM κ³Ό ART 의 κ°€μž₯ 큰 차이점은 Dalvik VM 은 JIT Compiler λ₯Ό μ‚¬μš©ν•˜κ³ , ART λŠ” AOT Compiler λ₯Ό μ‚¬μš©ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

    • JIT Compiler: ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œ 컴파일 -> 배터리 μ†Œλͺ¨, ν™”λ©΄ μ „ν™˜ μ‹œ 느림 / 인터프리터 방식에 λΉ„ν•΄ μ„±λŠ₯ κ°œμ„ 
    • AOT Compiler: ν”„λ‘œκ·Έλž¨ μ„€μΉ˜ μ‹œ 컴파일 -> 곡간을 많이 차지 / μ‹€ν–‰ μ‹œκ°„μ€ 쀄어듦

     

    이에 따라 두 VM μ—μ„œμ˜ μž₯단점도 λ‹¬λΌμ§€λŠ”λ°, ART λ„μž… ν›„ κ°œμ„  μž‘μ—…μ„ ν•˜λ©΄μ„œ AOT 와 JIT 방식을 μ‘°ν•©ν•΄μ„œ μ‚¬μš©ν•˜κΈ°λ„ ν–ˆμŠ΅λ‹ˆλ‹€.

     

    μ΄λ ‡κ²Œ μ–΄λ–€ VM 을 μ‚¬μš©ν•˜λŠ”μ§€μ— 따라 μ½”λ“œμ˜ '처리' 방식과 μˆœμ„œκ°€ 달라지기 λ•Œλ¬Έμ—, 이 λ‚΄μš©μ„ μ•Œκ³  μžˆμ–΄μ•Ό μ•ˆλ“œλ‘œμ΄λ“œ 리버싱을 ν•  λ•Œ νƒ€κ²Ÿ μ†ŒμŠ€λ₯Ό νŒŒμ•…ν•˜κ³  μ μ ˆν•œ νˆ΄μ„ 선택할 수 μžˆμŠ΅λ‹ˆλ‹€.

    (μ–΄λ–€ νˆ΄μ€ Dalvik 만 μ§€μ›ν•˜κΈ°λ„, 32 bit 만 μ§€μ›ν•˜κΈ°λ„ ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€)

     

     

    μ•ˆλ“œλ‘œμ΄λ“œ μ•± 이해

    μ•ˆλ“œλ‘œμ΄λ“œ 4λŒ€ μ»΄ν¬λ„ŒνŠΈ: Activity, Service, Content Provider, Broadcast Receiver

    • Activity: Application 의 κΈ°λ³Έ μ‹€ν–‰ λ‹¨μœ„, ν•˜λ‚˜μ˜ 화면을 κ΅¬μ„±ν•©λ‹ˆλ‹€. (activity class + layout xml)
    • Service: λ°±κ·ΈλΌμš΄λ“œ μž‘μ—…μ„ μœ„ν•œ μ»΄ν¬λ„ŒνŠΈ
    • Content Provider: μ•± κ°„μ˜ 데이터 곡유λ₯Ό λͺ©μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈ
    • Broadcast Receiver: μ•ˆλ“œλ‘œμ΄λ“œ μ‹œμŠ€ν…œ λ˜λŠ” λ‹€λ₯Έ μ•±κ³Όμ˜ λ©”μ‹œμ§€ μ†‘μˆ˜μ‹ 

     

    λ˜ν•œ, λ‹€μŒμ˜ μš”μ†Œλ“€λ„ μ€‘μš”ν•˜λ‹ˆ μ•Œμ•„λ‘λ©΄ μ’‹μŠ΅λ‹ˆλ‹€.

    • Fragment: Activity 처럼 ν•œ 화면을 κ΅¬μ„±ν•˜λ˜, 더 가벼움 (fragment class + layout xml)
    • Intent: μ•± ꡬ성 μš”μ†Œ μ‚¬μ΄μ˜ λ©”μ‹œμ§€ 객체. 주둜 Activity μ—μ„œ Activity μ‚¬μ΄μ˜ λ©”μ‹œμ§€ 전달을 ν•©λ‹ˆλ‹€.

     

    사싀 κ°€μž₯ 쒋은 것은 예제λ₯Ό λ³΄λŠ” κ²ƒμž…λ‹ˆλ‹€.

    말둜만 μ •μ˜λ₯Ό 보면 λͺ…ν™•νžˆ 이해가 μ•ˆλ˜κ³ , μš°λ¦¬λŠ” '리버싱', 즉 μ½”λ“œλ₯Ό λŒλ €μ„œ λœ―μ–΄λ³Ό κ²ƒμ΄λ―€λ‘œ Android 개발 μ½”λ“œμ— λŒ€ν•΄ μ–΄λŠμ •λ„ μ΄ν•΄ν•˜κ³  μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

    κ·Έλ ‡μ§€λ§Œ μ•ˆλ“œλ‘œμ΄λ“œ 리버싱을 ν•˜κΈ° μœ„ν•΄μ„œ μ•ˆλ“œλ‘œμ΄λ“œ κ°œλ°œμ„ ν•˜λŠ” 것은 무쑰건 ν•„μš”ν•œ 것은 μ•„λ‹™λ‹ˆλ‹€.

    μ½”λ“œλ₯Ό 보고 이해할 수 μžˆλŠ” μˆ˜μ€€μ΄λ©΄ μΆ©λΆ„ν•˜κ³ , μ•ˆλ“œλ‘œμ΄λ“œ κ°œλ°œμ„ ν•  수 μžˆλ‹€λ©΄ ν”ŒλŸ¬μŠ€ μ•ŒνŒŒλ‘œ 도움이 더 되긴 ν•©λ‹ˆλ‹€.

     

    μ €μ˜ 경우 μ•ˆλ“œλ‘œμ΄λ“œ 개발 κ²½ν—˜μ΄ μžˆκΈ°μ— μ•± μ΄ν•΄λŠ” μ΄μ •λ„λ‘œ μ •λ¦¬ν•˜κ³  λ„˜μ–΄κ°€κ² μŠ΅λ‹ˆλ‹€.

    μ•ˆλ“œλ‘œμ΄λ“œ 개발 지식이 λ”±νžˆ μ—†μ§€λ§Œ μ•ˆλ“œλ‘œμ΄λ“œ 리버싱을 ν•˜κ³  μ‹ΆμœΌμ‹œλ©΄ μœ„μ˜ μ»΄ν¬λ„ŒνŠΈ 6가지λ₯Ό μ˜ˆμ œμ™€ ν•¨κ»˜ μ΅νžˆμ‹œκ³ , μΆ”κ°€λ‘œ 생λͺ…μ£ΌκΈ°, ViewModel, LiveData 등에 λŒ€ν•œ κ°œλ…μ„ μ•Œμ•„λ‘μ‹œλ©΄ μ’‹μŠ΅λ‹ˆλ‹€.

     

    λ§ˆμ§€λ§‰μœΌλ‘œ μ•ˆλ“œλ‘œμ΄λ“œ μ•± λΉŒλ“œ ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•΄ κ°„λ‹¨νžˆλ§Œ 짚고 λ„˜μ–΄κ°€μžλ©΄,

    1) 일단 java μ½”λ“œμ™€ layout 에 ν•΄λ‹Ήν•˜λŠ” xml μ½”λ“œλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.

    2) μœ„ μ½”λ“œλ₯Ό μ»΄νŒŒμΌν•˜μ—¬ DEX νŒŒμΌμ„ λ§Œλ“­λ‹ˆλ‹€.

    3) DEX 파일둜 APK λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

     

    μ΄λ ‡κ²Œ μƒμ„±λœ APK λ₯Ό Android 에 μ„€μΉ˜ν•˜μ—¬ μš°λ¦¬κ°€ ν•Έλ“œν°μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.

     

     


    μ΄λ ‡κ²Œ μ•ˆλ“œλ‘œμ΄λ“œ μ‹œμŠ€ν…œμ— λŒ€ν•œ 이해λ₯Ό μœ„ν•΄ μ•„ν‚€ν…μ²˜λΆ€ν„° μ•ˆλ“œλ‘œμ΄λ“œ μ»΄ν¬λ„ŒνŠΈκΉŒμ§€ λ‹€λ€„λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

    APK 와 μ„œλͺ… 등에 λŒ€ν•œ λ‚΄μš©μ€ λ‹€μŒμ— 닀뀄보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

     

    λŒ“κΈ€

Designed by Tistory.