IT_Programming/Android_Java

[Android] 루팅 여부 확인하기.

JJun ™ 2013. 7. 16. 07:32

 


 출처: http://lsit81.tistory.com/entry/Android-루팅-여부-확인하기


 

 

안드로이드 루팅은 아래 코드를 실행해 봄으로써 루팅 여부를 알 수 있습니다. 


 

1
2
3
4
5
6
try {
    Runtime.getRuntime().exec("su");
} catch ( Exception e) {
    // 루팅 안되있으면 Exception
    Log.d("test", "rooting X");
}


위에서 보시는 것과 같이 루팅이 되어있다면 정상 작동하고, 루팅이 되어있지 않다면 Exception이

떨어집니다. 왜냐하면 su 는 시스템의 root 권한을 얻는 명령인데, 루팅된 폰에서 실행되기 때문입니다.

 

그러나 일부 루팅 프로그램에서는 "최고 권한"을 얻는 su 명령이 안 먹도록 되기도 합니다. 


이럴때는 system/bin/su 혹은 system/xbin/su Path 가 있는지 확인하면 되겠습니다.

만약 루팅 프로그램이 이 su 명령 자체도 바꾸어 버린다면 (위치를 바꾸거나 이름을 바꾸면)

대략 난감한 상황이 되는데, 이럴때는 뭐 폰 제조사에서 루팅 체크하는 특별한 루틴을 넣어서 확인하도록

하는 방법을 강구해봐야겠습니다.

 

현재 대부분의 금융어플이나 뱅킹어플등에서는 아래의 4개의 파일 Path 여부를 체크해서 루팅 여부를

판단하고 있는데요. 루팅을 한 폰으로는 이러한 금융 어플들을 사용할 수 없기 때문에 ,

루트익스플로러를 사용해서 아래 파일을 삭제하시면 됩니다.

  

대부분 감지하는 어플이 아래 데이타 파일이 있는지 검사하는게 일반적입니다.


/system/bin/su

/system/xbin/su

/system/app/superuser.apk 

/data/data/com.noshufou.android.su


아래 코드는 위 4가지 "최고 권한"을 얻는 프로그램까지 체크 하는 최종 소스 코드 입니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
public static final String ROOT_PATH = Environment.getExternalStorageDirectory() + "";
public static final String ROOTING_PATH_1 = "/system/bin/su";
public static final String ROOTING_PATH_2 = "/system/xbin/su";
public static final String ROOTING_PATH_3 = "/system/app/SuperUser.apk";
public static final String ROOTING_PATH_4 = "/data/data/com.noshufou.android.su";
  
public static String[] RootFilesPath = new String[]{
        ROOT_PATH + ROOTING_PATH_1 ,
        ROOT_PATH + ROOTING_PATH_2 ,
        ROOT_PATH + ROOTING_PATH_3 ,
        ROOT_PATH + ROOTING_PATH_4
};
     
/**
 * 루팅된 디바이스인지 체크.
 *
 * @return
 */
private static boolean checkRootingDevice() {
    boolean isRootingFlag = false;
     
    try {
        Process         process = Runtime.getRuntime().exec("find / -name su");
 
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        if (reader.ready() == false) {
            return false;
        }
 
        String      result = reader.readLine();
        if (result.contains("/su") == true) {
            isRootingFlag = true;
        }
         
    } catch ( Exception e) {
        isRootingFlag = false;
    }
     
    if (!isRootingFlag) {
        isRootingFlag = checkRootingFiles(RootFilesPath);
    }
     
    return isRootingFlag;
}
 
/**
 * 루팅 파일이 존재하는지 체크.
 *
 * @param file
 * @return
 */
private static boolean checkRootingFiles(String[] filePaths) {
    boolean result = false;
    File    file;
     
    for (String path : filePaths) {
        file = new File(path);
         
        if (file != null && file.exists() && file.isFile()) {
            result = true;
            break;
        } else {
            result = false;
        }
    }
     
    return result;
}



* 출처 : http://arabiannight.tistory.com/64