Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to prevent Rooted Android Phones from Installing my app?

The purpose in this context is to prevent false high scores(my app is a game) from being reported in LeaderBoard. This occurred for Flappy Birds - see this link - http://www.androidpit.com/forum/589832/flappy-bird-high-score-cheat-set-your-own-high-score

Since a root user can do anything he wants with his mobile, I suppose none of the other work around will work and the only solution is to prevent rooted users from installing the app. Am I right? Is there a way to do it?

PS: My game doesn't need internet connection always, hence reporting the scores as and when it happens to another server is not viable. The high scores are reported to leaderboard only when internet connection is available.

like image 599
DroidHeaven Avatar asked Dec 18 '14 05:12

DroidHeaven


People also ask

How do you trick apps into thinking your Android is not rooted?

In Settings, tap on the Configure DenyList option. Now, select the app for which you want to hide root detection. In our case, we're hiding it for Google Pay. Finally, clear the data of the app that you've just selected.

How do I block my rooted phone?

Here's the short answer: you can't prevent it — at least, not entirely. Rooting phones, no matter what the operating system, means discovering a bug of some sort that lets you bypass internal protections and gain complete control over the operating system.

Why do apps Block rooted phones?

Blocking rooted devices can minimize cheating on Android games and apps. Small app developers that rely on mobile ads also benefit from the ability to block rooted devices. The problem is that rooted device users could just ignore the rewards/incentivized ads served by Google or Facebook (FB).

Can a rooted Android be tracked?

Access Phone Settings From Anywhere With WebKey Mobile Defense only allowed for very general tracking. Now, with a rooted Android, full remote access is possible, and that's what WebKey accomplishes. With WebKey, you can access your Android's GPS, SD card, location and a whole lot more.


1 Answers

I had a similar requirement. I couldn't achieve that app should not be installed on rooted device, but I used a work around for that:

  • Check if your device is rooted in your activity's onResume.
  • If its rooted, just show him alert "This device is rooted. You can't use this app.", and exit from application.

Example:

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    if(new DeviceUtils().isDeviceRooted(getApplicationContext())){
        showAlertDialogAndExitApp("This device is rooted. You can't use this app.");
    }
}


public void showAlertDialogAndExitApp(String message) {

    AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
    alertDialog.setTitle("Alert");
    alertDialog.setMessage(message);
    alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                    Intent intent = new Intent(Intent.ACTION_MAIN);
                    intent.addCategory(Intent.CATEGORY_HOME);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                    finish();
                }
            });

    alertDialog.show();
}

DeviceUtis.java was a Utility class which returned if a device is rooted or not.

public class DeviceUtils {

    public Boolean isDeviceRooted(Context context){
        boolean isRooted = isrooted1() || isrooted2();
        return isRooted;
    }

    private boolean isrooted1() {

        File file = new File("/system/app/Superuser.apk");
        if (file.exists()) {
            return true;
        }
        return false;
    }

    // try executing commands
    private boolean isrooted2() {
        return canExecuteCommand("/system/xbin/which su")
                || canExecuteCommand("/system/bin/which su")
                || canExecuteCommand("which su");
    }
}

We had used 5 methods for testing, and I have just shown 2 here. You can use any of methods you find good.

Hope this helps.

P.S: I have put this call in all activity's onResume as user (with intention of hacking) can install application, navigate to some other activity, and then root device.

like image 112
MysticMagicϡ Avatar answered Oct 22 '22 17:10

MysticMagicϡ