루팅(Rooting)이란?
모바일 기기에서 구동되는 안드로이드 운영 체제 상에서 최상위 권한(루트 권한)을 얻어 생산자 측에서 걸어놓은 제약을 해제하는 행위
Android 기기 루팅 되었는지 확인하는 방법
단계 1) 기기 루팅 시도
단계 2) Root Checker라는 무료 앱 설치
단계 3) 앱을 실행하고 'Verify Root Access' 버튼을 탭합니다.
단계 4) 앱은 기기를 성공적으로 루팅했는지 여부를 알려줍니다.
단계 5) 기기가 루팅된 경우 좋습니다. 그렇지 않은 경우 One Click Root를 설치하여 문제를 해결하십시오.
루트 검사기는 어떻게 작동합니까?
Root Checker는 Android 스마트폰 또는 태블릿에서 루트 액세스 권한을 테스트하는 간단한 앱입니다. 이를 위해 Root Checker는 Android 기기에서 루트 액세스 권한을 부여하는 데 사용되는 가장 일반적인 바이너리인 'su 바이너리'라는 항목을 확인합니다.
안드로이드 루팅 체크 방법
해마다 ISMS 인증 관련해서 보안업체에서 조사를 합니다.
@JvmStatic
fun isRooting(): Boolean {
val rootingFiles = arrayOf(
"/system/xbin/su",
"/system/bin/su",
"/system/app/superuser.apk",
"/data/data/eu.chainfire.supersu", //SuperSU(eu.chainfire.supersu)
"/data/data/com.noshufou.android.su",
"/sbin/su",
"/system/su",
"/system/sbin/su",
"/system/xbin/mu",
"/system/bin/.ext/.su",
"/system/usr/su-backup",
"/system/app/su.apk",
"/system/bin/.ext",
"/system/xbin/.ext",
"/data/local/xbin/su",
"/data/local/bin/su",
"/system/sd/xbin/su",
"/system/bin/failsafe/su",
"/data/local/su",
"/su/bin/su"
)
for (path in rootingFiles) {
val f = File(path)
if (f.exists()) {
Log.v(TAG, "isRooting : true, path : ${f.absolutePath}")
return true
}
}
var isRooting: Boolean
try {
val process = Runtime.getRuntime().exec("su")
OutputStreamWriter(process.outputStream).use { pOs ->
pOs.write("exit")
pOs.flush()
}
var line = ""
var resultMessage = ""
BufferedReader(InputStreamReader(process.errorStream)).use { pIs ->
while (pIs.readLine().also { line = it } != null) {
resultMessage += line
}
}
Log.d(TAG, "isRooting.su.error : $resultMessage")
resultMessage = ""
BufferedReader(InputStreamReader(process.inputStream)).use { pIs ->
while (pIs.readLine().also { line = it } != null) {
resultMessage += line
}
}
Log.d(TAG, "isRooting.su.input : $resultMessage")
process.waitFor()
resultMessage = ""
val process2 = Runtime.getRuntime().exec(arrayOf("/system/xbin/which", "su"))
BufferedReader(InputStreamReader(process2.inputStream)).use { pIs ->
while (pIs.readLine().also { line = it } != null) {
resultMessage += line
}
}
Log.d(TAG, "isRooting /system/xbin/which/su input : $resultMessage")
process2.waitFor()
isRooting = true
} catch (e: java.lang.Exception) {
isRooting = false
Log.d(TAG, "isRooting.su.exception : ${e.message}")
}
Log.v(TAG, "isRooting.result : $isRooting")
return isRooting
}
참조 :
https://playground.naragara.com/48/
https://rootkey.tistory.com/162#google_vignette
https://oneclickroot.com/ko/%EB%A3%A8%ED%8A%B8-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%EA%B0%80-%EC%84%B1%EA%B3%B5%EC%A0%81%EC%9C%BC%EB%A1%9C-%EB%A3%A8%ED%8C%85%EB%90%98%EC%97%88%EB%8A%94%EC%A7%80-%ED%99%95%EC%9D%B8%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95/
'안드로이드' 카테고리의 다른 글
[Android] 안드로이드 잠금 화면, 슬립 깨우기 (0) | 2024.03.26 |
---|---|
아키텍처는 왜 중요한가? (MVC, MVP, MVVM, Clean Architecture, ViewModel, 모듈) 알아 보자! (0) | 2024.03.26 |
[Android] AudioFocus 관리, MediaPlayer, AudioManager (0) | 2024.03.20 |
[Android] DiffUtil에 대해 알아보자 (0) | 2024.03.20 |
[Android] MediaStore에서 미디어 파일 정보 읽는 방법 (0) | 2024.03.20 |