[Flutter][Reversing]Webview, JSInterface 통신 앱 분석

안드로이드 설치 파일(APK) 역공학 환경 구성

gomguk.tistory.com/16에서 작성한 앱을 역공학으로 분석해보고 동시에 apk 구조에 대한 학습

다운로드 및 설치

  1. APK Tool(apk → smali)
  2. Dex2Jar(dex → jar)
  3. JD-GUI (jar → java)

위 방법으로 분석이 안될 때

  1. 바이트 코드 뷰어나 Jadx로 코틀린 코드 분석이 어렵다면
    1. 안드로이드 스튜디오 - Tools - Kotlin - Show Kotlin Bytecode
    2. 안드로이드 스튜디오 - Build - Analyze APK

APK Build 및 분석

APK 난독화 옵션인 Proguard 설정 없이 APK를 빌드한다.

  1. apk파일을 dex2jar 폴더 하위 경로로 이동
  2. 터미널을 열어 dex2jar 경로로 이동
  3. 디컴파일 명령 실행

APK 구조

  • DEX(Dalvik Executable): 달빅 코드

    • 명시적인 class, method 형태
  • .so (Native Library) : 네이티브 코드

    • 자바에서 C로 만들어진 코드를 호출할 때의 규약
  • AndroidManifest.xml : App metadata, Service, Activity

    • 앱권한, 액티비티 목록, Intent-filter, Service목록

    • Intent? - 서로 영역에 침범할 수 없는데 필요에 따라서 공유를 해야할 때 사용

      다른 앱, 같은 앱 내에서 Intent로 통신

  • Layout

    • res/layout에 xml파일로 존재
    • 가독성이 높지 않고 계층 구조를 알기 어렵지만 기능을 어떻게 구현 했는지 힌트 제공

분석

분석 전에 Flutter의 구조는 다음과 같다.

Dart 언어로 된 프레임워크로 앱을 코딩하여 C/C++ 엔진을 이용하여 컴파일한다. 다트 언어는 Ahead Of Time(AOF) 컴파일을 통해서 C, C++ 처럼 바이트 코드로 작성한다.

AndroidManifest.xml

URI Scheme 사용을 위한 intent-filter가 등록되어 있다.

AndroidManifest.xml

MainActivity.class

앱이 실행될 때 시작점이다. AndroidManifest.xml에 클래스 명이 명시되어 있다.

URI 스키마를 통한 이벤트 채널 입력을 설정하고 이벤트 처리 구문을 확인한다.

MainActivity.class

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val intent = getIntent()
        startString = intent.data?.toString()
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        if (intent.action === Intent.ACTION_VIEW) {
            linksReceiver?.onReceive(this.applicationContext, intent)
        }
    }

    fun createChangeReceiver(events: EventSink): BroadcastReceiver? {
        return object : BroadcastReceiver() {
            override fun onReceive(context: Context, intent: Intent) { // NOTE: assuming intent.getAction() is Intent.ACTION_VIEW
                val dataString = intent.dataString ?:
                events.error("UNAVAILABLE", "Link unavailable", null)
                events.success(dataString)
            }
        }
    }

[원본코드]

 

  • onNewIntent를 오버라이드해서 각 Intent를 처리하고, 딥 링크 후속 작업인 경우 Broadcast Receiver를 통해 eventChannel로 보낸다.
  • 컴파일 되면서 구조는 약간 변경되었지만 동일한 기능 수행
반응형