외로운 Nova의 작업실

Android LockMalware 연구 - 2 본문

Mobile App Penetesting/Android Malware

Android LockMalware 연구 - 2

Nova_ 2023. 5. 21. 22:50

- 디바이스 관리자 앱을 활용한 홈버튼 기능 마비
디바이스 관리자 앱에대한 권한을 얻으면 홈버튼과 뒤로가기 버튼을 마비시킬 수 있다고합니다. 한번 만들어보겠습니다.
 
<MainActivity.kt>

package com.example.lockmalware

import android.app.Activity
import android.app.admin.DevicePolicyManager
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.provider.Settings
import android.view.View
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import com.example.lockmalware.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private lateinit var devicePolicyManager: DevicePolicyManager
    private lateinit var deviceAdminComponent: ComponentName

    private val REQUEST_CODE_ENABLE_ADMIN = 1

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

        val binding = ActivityMainBinding.inflate(layoutInflater) //activity_main_xml 파일의 객체들을 가져옵니다.

        setContentView(binding.root)

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

        //패스워드 입력시 앱 종료
        binding.button.setOnClickListener(){
            var password = binding.button.text.toString()

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

                if (isTaskRoot) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        finishAndRemoveTask()
                    } else {
                        finishAffinity()
                    }
                }
            }
            else{

            }
        }

        // DevicePolicyManager 및 ComponentName 초기화
        devicePolicyManager = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
        deviceAdminComponent = ComponentName(this, MyDeviceAdminReceiver::class.java)

        if (!devicePolicyManager.isAdminActive(deviceAdminComponent)) {
            // 디바이스 관리자 권한이 비활성화되어 있으면 활성화 요청
            val intent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN)
            intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdminComponent)
            intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "디바이스 관리자 권한을 활성화하세요.")
            resultLauncher.launch(intent)
        } else {
            // 디바이스 관리자 권한이 이미 활성화되어 있음
            // 필요한 기능을 수행하거나 활성화된 상태를 확인하는 로직을 구현할 수 있습니다.
        }

    }

    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)
    }


    val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == Activity.RESULT_OK) {
            // 결과 처리
            // 디바이스 관리자 권한이 성공적으로 부여되었습니다.
            // 홈 버튼 비활성화
            val lockTaskPackages = arrayOf(packageName) // 현재 앱의 패키지명을 사용합니다.
            devicePolicyManager.setLockTaskPackages(deviceAdminComponent, lockTaskPackages)
            startLockTask() // 잠금 화면 모드를 시작합니다.
        } else {
            // 결과 처리
            // 디바이스 관리자 권한이 부여되지 않았습니다.
            // 처리할 예외 로직을 구현할 수 있습니다.
        }
    }



}

 
<manifestfile>

<?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>
        <receiver
            android:name=".MyDeviceAdminReceiver"
            android:permission="android.permission.BIND_DEVICE_ADMIN"
            android:exported="true">
            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/device_admin_receiver" />
            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>
        </receiver>
    </application>
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />

</manifest>

 
<MydeviceAdminRecevier>

package com.example.lockmalware

// MyDeviceAdminReceiver.kt 파일을 생성하고 코드를 추가합니다.

import android.app.admin.DeviceAdminReceiver
import android.content.Context
import android.content.Intent

class MyDeviceAdminReceiver : DeviceAdminReceiver() {

    override fun onDisableRequested(context: Context, intent: Intent): CharSequence {
        return "비활성화 요청 메시지" // 사용자에게 비활성화 요청 시 메시지 표시
    }

    override fun onEnabled(context: Context, intent: Intent) {
        super.onEnabled(context, intent)


    }

    override fun onDisabled(context: Context, intent: Intent) {
        super.onDisabled(context, intent)
        // 디바이스 관리자 권한이 비활성화되었을 때 수행할 작업을 추가합니다.
    }
}

 
- 결과
결과는 작동하지 않았습니다. 현재 nox앱으로 진행중인데, 관리자 권한이 얻어지지않습니다. 관리자 권한이 얻어지지않는 이유는 알고 싶지만 Logcat 기능이 이상이 있었습니다. 내일 다시한번 Logcat 기능으로 오류 이유를 알아내보거나 다른 방법을 찾아봐야겠습니다.

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

Android LockMalware 연구 - 1  (0) 2023.05.20
Comments