안드로이드

[Android] 루팅이란? 루팅 체크 방법

코딩하는후운 2024. 3. 22. 11:25
반응형

루팅(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/


반응형