외로운 Nova의 작업실

안드로이드 앱 리버싱 - 1(달빅 바이트코드, hello world) 본문

Mobile App Penetesting/Android Reversing

안드로이드 앱 리버싱 - 1(달빅 바이트코드, hello world)

Nova_ 2023. 2. 9. 15:43

안녕하세요. 이번 시리즈는 안드로이드 앱을 리버싱해보고 작동 원리를 알아내려고합니다. 안드로이드 앱 리버싱 관련해서는 예제가 많이 없어서 제가 직접 예제를 만들고 리버싱을 해서 작동 부분을 알아내보려고합니다. 그전에 사전 지식 이있습니다.

 

- 사전 지식

구글은 태블릿, pc, 자동차에 들어가는 안드로이드 운영체제를 만들고싶었습니다. 따라서 열악한 환경에서도 잘 돌아가는 운영체제를 만들고싶었습니다. 이에따라 jvm을 사용하고싶었지만 저작권때문에 사용하지못하고 Dalvik 가상머신을 새롭게 만들었습니다. 하지만 Dalvik 가상머신또한 jvm에 영향을 받고 있습니다.

 

<JVM>

jvm은 자바 가상 머신으로 프로그램을 해석하는 기능을 합니다. 이때 기계어가 일반적인 cpu와는 다르다는 특징이 있습니다. 따라서 jvm에서 돌아가는 프로그램은 intel cpu에서는 돌아가지 않습니다. 하드웨어의 소프트웨어화죠. jvm은 .class 확장자 파일을 모아서 jar 파일로 만들고 jar파일을 실행시킵니다. 하지만 우리가 java를 이용해서 프로그래밍 할때는 .java 확장자로 프로그래밍이 됩니다. 이 .java 확장자를 .class 확장자로 변경해주고 jar파일로 만드는 것이 java 컴파일러입니다.

 

<DVM>

DVM은 달빅 가상 머신으로 프로그램을 해석하는 기능을 합니다. DVM도 일반적인 CPU와 기계어가 다르고 JVM와도 기계어가 다릅니다. 따라서 jar파일을 실행시킬 수 없습니다. 안드로이드는 프로그래밍할때 자바의 힘을 빌립니다. 프로그래밍을 .java로 한후 자바 컴파일러의 도움으로 .class 확장자로 변경해주고 jar파일까지 만듭니다. 이후 달빅 컴파일러는 이 jar파일을 dex 파일로 변경한후 이 dex파일을 DVM에서 실행하게됩니다.

 

- 디컴파일러 설치하기

사전지식에서 알아봤듯이 안드로이드 앱을 리버싱 하려면 java 디컴파일러와 달빅 디컴파일러가 필요합니다. 또한, 디컴파일할 환경이 갖춰질려면 java를 설치해야합니다. 해야할 목록은 아래와같습니다.

1. 자바설치하기

2. 달빅 디컴파일로서 dex2jar 설치하기

3. java 디컴파일로서 jd-gui 설치하기 

 

<자바설치하기>

아래 링크로 들어가서 하시면됩니다.

https://www.java.com/ko/download/ie_manual.jsp?locale=ko 

 

Windows용 Java 다운로드

 

www.java.com

<dex2jar 설치하기>

https://github.com/pxb1988/dex2jar

 

GitHub - pxb1988/dex2jar: Tools to work with android .dex and java .class files

Tools to work with android .dex and java .class files - GitHub - pxb1988/dex2jar: Tools to work with android .dex and java .class files

github.com

< jd-gui 설치하기>

http://java-decompiler.github.io/

 

Java Decompiler

The “Java Decompiler project” aims to develop tools in order to decompile and analyze Java 5 “byte code” and the later versions. JD-GUI is a standalone graphical utility that displays Java source codes of “.class” files. You can browse the reco

java-decompiler.github.io

 

- 안드로이드 앱 만들기

이제 디컴파일할 안드로이드 앱을 만들어보겠습니다. 간단하게 하나의 액티비티 화면에 helloworld 라고 적혀있는 텍스트뷰가 있는 앱을 만들어보겠습니다. 먼저 MainActivity.kt 코드입니다.

package com.example.android_reverse

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.android_reverse.databinding.ActivityMainBinding

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

        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
    }
}

그 다음은 activity_main.xml 코드입니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

아래는 실행화면입니다.

 

- 어플을 컴퓨터로 옮기기

이제 만든 어플을 안드로이드에서 컴퓨터로 옮겨주겠습니다. 먼저 안드로이드에서 apk extractor를 설치해줍니다.

https://play.google.com/store/apps/details?id=com.ext.ui 

 

APK Extractor - Google Play 앱

여러분의 기기에 설치된 앱을 SD카드로 추출합니다.

play.google.com

이후 핸드폰에서 실행시키고 어플을 검색해줍니다. 저의 어플의 이름은 Android_Reverse입니다.

저 항목을 클릭하면 apk가 추출되고 경로가 뜹니다.

이후 내파일에서 내장메모리 - 왼쪽 중간에 필수를 전체로 변경하고 - ExtractedApks - Android_reverse 경로로 들어가면 apk 파일이 있습니다. 이 파일을 구글 드라이브에 업로드하고 컴퓨터로 옮겨주고 apk파일을 알집으로 풀어줍니다.

 

 

 

 

이제 이걸 디컴파일 해볼겁니다.

 

- 리버싱

알집으로 푼 파일을 들어가보게되면,

dex파일이 존재합니다. 이는 DVM에서 실행가능한 파일입니다. 이를 .jar 파일로 바꿔보도록 하겠습니다. dex2jar을 이용하겠습니다.

d2j-dex2jar.bat -f 파일경로

이렇게하면 파일이 생성됩니다.

나머지 dex파일도 jar파일로 만들어줍니다.

jar파일들을 원하는 곳으로 옮겨갑니다.

이제 jd-gui를 실행시키고 파일을 drop합니다.

이제 분석해보겠습니다.

 

- 분석

먼저 class4.jar 파일에 MainActivity.class가 있는 걸 확인했습니다.

실제 코드와 비슷하게 ActivityMainBinding 객체를 통해서 setContentview를 하고 있으며 Activity_main.xml을 확인해보겠습니다. 이는 dex파일에 있지않고 apk파일 - res - layout에 있었습니다.

하지만 이때, 알집으로 풀었을때나오는 xml은 난독화가 되어있어 열수가 없습니다. 따라서 이는 apktool로 열으면 나오는 xml을 봐야합니다.

xml파일은 아래와 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android" 
  xmlns:app="http://schemas.android.com/apk/res-auto">
    
    <TextView android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Hello World!" 
    app:layout_constraintBottom_toBottomOf="parent" 
    app:layout_constraintEnd_toEndOf="parent" 
    app:layout_constraintStart_toStartOf="parent" 
    app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

실제와 많이 유사한것을 확인할 수 있었습니다.

Comments