Android

[Android] Fake gps 앱 및 모의위치 탐지

park_juyoung 2019. 7. 2. 16:30

앱에서 네트워크 위치 및 gps 위치가 아닌 모의 위치를 사용하는 것을 탐지하려면 아래와 같이 작성 하면 됩니다.

1. 현재 기기에 MockSetting 옵션이 ON 인지를 검사하여 탐지 하는 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
public static boolean isMockSettingsON(Context context){
        boolean isMockLocation=false;
        try{
            if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
                AppOpsManager opsManager=(AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE);
                isMockLocation=(opsManager.checkOp(AppOpsManager.OPSTR_MOCK_LOCATION,android.os.Process.myUid(), BuildConfig.APPLICATION_ID)==AppOpsManager.MODE_ALLOWED);
            }else{
                isMockLocation=!Settings.Secure.getString(context.getContentResolver(),Settings.Secure.ALLOW_MOCK_LOCATION).equals("0");
            }
        }catch (Exception e){
            return isMockLocation;
        }
        return isMockLocation;
cs

2. 설치 된 앱 중에서 모의위치 활용 권한을 가지는 앱이 있는지 탐지

모의 위치 권한이 있는 앱이 있다는 것은 모의 위치를 활용할 가능성이 있기 때문에 이러한 탐지를 활용하는 것도 괜찮은 방법이라고 생각 합니다.

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
  public static boolean areThereMockPermissionApps(Context context){
        boolean isMockLocation=false;
 
        PackageManager packageManager=context.getPackageManager();
 
        // 설치된 어플리케이션 목록을 가져옴.
        List<ApplicationInfo> packages=packageManager.getInstalledApplications(PackageManager.GET_META_DATA);
 
        for(ApplicationInfo applicationInfo:packages){
            try {
                // 해당 패키지의 권한을 가져옴.
                PackageInfo packageInfo=packageManager.getPackageInfo(applicationInfo.packageName,
                        PackageManager.GET_PERMISSIONS);
 
                String[] requestedPermissions=packageInfo.requestedPermissions;
 
                if(requestedPermissions!=null){
                    for(int i=0;i<requestedPermissions.length;i++){
                        if(requestedPermissions[i].equals("android.permission.ACCESS_MOCK_LOCATION")){
                            isMockLocation=true;
                            break;
                        }
                    }
                }
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
        }
        return isMockLocation;
    }
 
 
**uid : app을 설치하면 안드로이드는 package를 base로 unique한 default UID를 생성합니다. 
이 UID를 통해서 개인의 resource를 접근할 수 있고, storage space에 대한 권한도 획득 할 수 있습니다. 
어떤 package가 그 UID를 더 이상 사용하지않는다면 삭제됩니다. 
<manifest> tag의 android:shareUserId 속성을 통해, 그리고 같은 sign key로 서명되어 있다면 어러개의 app에서 UID를 공유할 수 있지만 단점이 있습니다. 
같은 UID를 공유한다는 것은 서로의 private data나 resource에 접근할 수 있다는 것을 의미하며, 같은 process에서 run될 수 도 있습니다. 

 

내용이 도움이 되셨거나 초보 블로거를 응원하고 싶으신 분은 아래 하트♥공감 버튼을 꾹 눌러주세요! 

내용의 수정이 있거나 도움이 필요하신 분은 댓글을 남겨주세요!