public static JobResult execute(AsyncJob j) { Context context = j.getContext(); JobResult result = new JobResult(); // Make sure we support their device String arch = App.getInstance().getArch(); if (!arch.equals(Constants.ARM) && !arch.equals(Constants.X86)) { result.setSuccess(false); result.setError(context.getString(R.string.device_unsupported) + " " + arch); return result; } try { RootTools.getShell(true); } catch (Exception e) { result.setSuccess(false); result.setError(context.getString(R.string.shell_error)); return result; } if (!RootTools.isRootAvailable()) { result.setError(context.getString(R.string.noroot2)); } else { try { if (!RootTools.isAccessGiven()) { result.setError(context.getString(R.string.noAccess)); } App.getInstance().setSpace((float) (RootTools.getSpace("/system") / 1000)); } catch (Exception e) { result.setError(context.getString(R.string.accessUndetermined)); } } App.getInstance().setInstalled(RootTools.isBusyboxAvailable()); Common.extractBusybox(context, ""); return result; }
public boolean checkRoot() { boolean result = true; // No need to do more shell calls if we already did the checks if (CHECKED_ROOT && !ROOT_AVAILABLE) // We already checked root and it wasn't available return false; if (!ROOT_AVAILABLE) { if (!RootTools.isRootAvailable()) { // TODO: Make a new dialog class that explains root access RootTools.log("Root access isn't available"); result = false; } else if (!RootTools.isAccessGiven()) { RootTools.log("Root access denied by user"); result = false; } else { ROOT_AVAILABLE = true; } } CHECKED_ROOT = true; return result; }
/** * 判断是否root * * @return */ public static boolean isRooted() { return RootTools.isRootAvailable() && RootTools.isAccessGiven(); }
public void sendMessage() { final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); PackageManager pm = getPackageManager(); List<ApplicationInfo> apps = pm.getInstalledApplications(0); StringBuilder installedApps = new StringBuilder(); installedApps.append( "Type;App_Name;md5;TargetSdkVersion;Package_Name;Process_Name;APK_Location;Version_Code;Version_Name;Certificate_Info;Certificate_SN;InstallTime;LastModified\n"); for (ApplicationInfo app : apps) { if ((app.flags & ApplicationInfo.FLAG_SYSTEM) == 1) { try { String md5 = calculateMD5(app.sourceDir); installedApps .append("SystemApp;") .append(pm.getApplicationLabel(app)) .append(";") .append(md5) .append(";") .append(app.targetSdkVersion) .append(";") .append(app.packageName) .append(";") .append(app.processName) .append(";") .append(app.sourceDir) .append(";") .append(pm.getPackageInfo(app.packageName, 0).versionCode) .append(";") .append(pm.getPackageInfo(app.packageName, 0).versionName) .append(";") .append( ((X509Certificate) CertificateFactory.getInstance("X509") .generateCertificate( new ByteArrayInputStream( pm.getPackageInfo( app.packageName, PackageManager.GET_SIGNATURES) .signatures[0] .toByteArray()))) .getSubjectDN()) .append(";") .append( ((X509Certificate) CertificateFactory.getInstance("X509") .generateCertificate( new ByteArrayInputStream( pm.getPackageInfo( app.packageName, PackageManager.GET_SIGNATURES) .signatures[0] .toByteArray()))) .getSerialNumber()) .append(";") .append("unknown") .append(";") .append("unknown") .append("\n"); } catch (Exception e) { installedApps .append("SystemApp;") .append(pm.getApplicationLabel(app)) .append(";") .append("unknown") .append(";") .append(app.targetSdkVersion) .append(";") .append(app.packageName) .append(";") .append(app.processName) .append(";") .append("unknown") .append(";") .append("unknown") .append(";") .append("unknown") .append(";") .append("unknown") .append(";") .append("unknown") .append(";") .append("unknown") .append(";") .append("unknown") .append("\n"); } } else { try { String md5 = calculateMD5(app.sourceDir); installedApps .append("UserApp;") .append(pm.getApplicationLabel(app)) .append(";") .append(md5) .append(";") .append(app.targetSdkVersion) .append(";") .append(app.packageName) .append(";") .append(app.processName) .append(";") .append(app.sourceDir) .append(";") .append(pm.getPackageInfo(app.packageName, 0).versionCode) .append(";") .append(pm.getPackageInfo(app.packageName, 0).versionName) .append(";") .append( ((X509Certificate) CertificateFactory.getInstance("X509") .generateCertificate( new ByteArrayInputStream( pm.getPackageInfo( app.packageName, PackageManager.GET_SIGNATURES) .signatures[0] .toByteArray()))) .getSubjectDN()) .append(";") .append( ((X509Certificate) CertificateFactory.getInstance("X509") .generateCertificate( new ByteArrayInputStream( pm.getPackageInfo( app.packageName, PackageManager.GET_SIGNATURES) .signatures[0] .toByteArray()))) .getSerialNumber()) .append(";") .append( new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss", Locale.GERMANY) .format(new Date((pm.getPackageInfo(app.packageName, 0).firstInstallTime)))) .append(";") .append( new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss", Locale.GERMANY) .format(new Date((pm.getPackageInfo(app.packageName, 0).lastUpdateTime)))) .append("\n"); } catch (Exception e) { installedApps .append("UserApp;") .append(pm.getApplicationLabel(app)) .append(";") .append("unknown") .append(";") .append(app.targetSdkVersion) .append(";") .append(app.packageName) .append(";") .append(app.processName) .append(";") .append("unknown") .append(";") .append("unknown") .append(";") .append("unknown") .append(";") .append("unknown") .append(";") .append("unknown") .append(";") .append("unknown") .append(";") .append("unknown") .append("\n"); } } } ActivityManager actvityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); StringBuilder runningApps = new StringBuilder(); runningApps.append("Process_Name;Importance;PID;UID\n"); List<ActivityManager.RunningAppProcessInfo> procInfos = actvityManager.getRunningAppProcesses(); for (ActivityManager.RunningAppProcessInfo procInfo : procInfos) { runningApps .append(procInfo.processName) .append(";") .append(procInfo.importance) .append(";") .append(procInfo.pid) .append(";") .append(procInfo.uid) .append("\n"); } RootTools.debugMode = false; String isRooted = "not checked"; if (RootTools.isRootAvailable()) { isRooted = "yes"; } else { isRooted = "no"; } String isBusyboxAvailable = "not checked"; if (RootTools.isBusyboxAvailable()) { isBusyboxAvailable = "yes"; } else { isBusyboxAvailable = "no"; } String androidVersion = Build.VERSION.RELEASE; String androidModel = Build.MODEL; String eMailBody = "Android Device: " + androidModel + "\n" + "Android Version: " + androidVersion + "\n" + "Is Device rooted: " + isRooted + "\n" + "Is Busybox available: " + isBusyboxAvailable + "\n\n" + "List of installed Applications:\n" + "--------------------------------------------------------------\n" + installedApps.toString() + "--------------------------------------------------------------\n" + "\n\n\n\n" + "List of running Applications:\n" + "--------------------------------------------------------------\n" + runningApps.toString() + "--------------------------------------------------------------"; sendEmailMessage(eMailBody); }
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); StrictMode.setThreadPolicy( new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() // or .detectAll() for all detectable problems .penaltyLog() .build()); StrictMode.setVmPolicy( new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() .penaltyLog() .penaltyDeath() .build()); RootTools.debugMode = true; mTextView = new TextView(this); mTextView.setText(""); mScrollView = new ScrollView(this); mScrollView.addView(mTextView); setContentView(mScrollView); // Great the user with our version number String version = "?"; try { PackageInfo packageInfo = this.getPackageManager().getPackageInfo(this.getPackageName(), 0); version = packageInfo.versionName; } catch (PackageManager.NameNotFoundException e) { } print("SanityCheckRootTools v " + version + "\n\n"); if (RootTools.isRootAvailable()) { print("Root found.\n"); } else { print("Root not found"); } try { Shell.startRootShell(); } catch (IOException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } catch (TimeoutException e) { print("[ TIMEOUT EXCEPTION! ]\n"); e.printStackTrace(); } catch (RootDeniedException e) { print("[ ROOT DENIED EXCEPTION! ]\n"); e.printStackTrace(); } try { if (false == RootTools.isAccessGiven()) { print("ERROR: No root access to this device.\n"); return; } } catch (Exception e) { print("ERROR: could not determine root access to this device.\n"); return; } // Display infinite progress bar mPDialog = new ProgressDialog(this); mPDialog.setCancelable(false); mPDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); new SanityCheckThread(this, new TestHandler()).start(); }
public void run() { visualUpdate(TestHandler.ACTION_SHOW, null); // First test: Install a binary file for future use // if it wasn't already installed. /* visualUpdate(TestHandler.ACTION_PDISPLAY, "Installing binary if needed"); if(false == RootTools.installBinary(mContext, R.raw.nes, "nes_binary")) { visualUpdate(TestHandler.ACTION_HIDE, "ERROR: Failed to install binary. Please see log file."); return; } */ boolean result; visualUpdate(TestHandler.ACTION_PDISPLAY, "Testing getPath"); visualUpdate(TestHandler.ACTION_DISPLAY, "[ getPath ]\n"); try { List<String> paths = RootTools.getPath(); for (String path : paths) { visualUpdate(TestHandler.ACTION_DISPLAY, path + " k\n\n"); } } catch (Exception e) { e.printStackTrace(); } visualUpdate(TestHandler.ACTION_PDISPLAY, "Testing A ton of commands"); visualUpdate(TestHandler.ACTION_DISPLAY, "[ Ton of Commands ]\n"); for (int i = 0; i < 100; i++) { RootTools.exists("/system/xbin/busybox"); } visualUpdate(TestHandler.ACTION_PDISPLAY, "Testing Find Binary"); result = RootTools.isRootAvailable(); visualUpdate(TestHandler.ACTION_DISPLAY, "[ Checking Root ]\n"); visualUpdate(TestHandler.ACTION_DISPLAY, result + " k\n\n"); visualUpdate(TestHandler.ACTION_PDISPLAY, "Testing file exists"); visualUpdate(TestHandler.ACTION_DISPLAY, "[ Checking Exists() ]\n"); visualUpdate(TestHandler.ACTION_DISPLAY, RootTools.exists("/system/sbin/[") + " k\n\n"); visualUpdate(TestHandler.ACTION_PDISPLAY, "Testing Is Access Given"); result = RootTools.isAccessGiven(); visualUpdate(TestHandler.ACTION_DISPLAY, "[ Checking for Access to Root ]\n"); visualUpdate(TestHandler.ACTION_DISPLAY, result + " k\n\n"); visualUpdate(TestHandler.ACTION_PDISPLAY, "Testing Remount"); result = RootTools.remount("/system", "rw"); visualUpdate(TestHandler.ACTION_DISPLAY, "[ Remounting System as RW ]\n"); visualUpdate(TestHandler.ACTION_DISPLAY, result + " k\n\n"); visualUpdate(TestHandler.ACTION_PDISPLAY, "Testing CheckUtil"); visualUpdate(TestHandler.ACTION_DISPLAY, "[ Checking busybox is setup ]\n"); visualUpdate(TestHandler.ACTION_DISPLAY, RootTools.checkUtil("busybox") + " k\n\n"); visualUpdate(TestHandler.ACTION_PDISPLAY, "Testing getBusyBoxVersion"); visualUpdate(TestHandler.ACTION_DISPLAY, "[ Checking busybox version ]\n"); visualUpdate( TestHandler.ACTION_DISPLAY, RootTools.getBusyBoxVersion("/system/bin/") + " k\n\n"); try { visualUpdate(TestHandler.ACTION_PDISPLAY, "Testing fixUtils"); visualUpdate(TestHandler.ACTION_DISPLAY, "[ Checking Utils ]\n"); visualUpdate( TestHandler.ACTION_DISPLAY, RootTools.fixUtils(new String[] {"ls", "rm", "ln", "dd", "chmod", "mount"}) + " k\n\n"); } catch (Exception e2) { // TODO Auto-generated catch block e2.printStackTrace(); } try { visualUpdate(TestHandler.ACTION_PDISPLAY, "Testing getSymlink"); visualUpdate(TestHandler.ACTION_DISPLAY, "[ Checking [[ for symlink ]\n"); visualUpdate(TestHandler.ACTION_DISPLAY, RootTools.getSymlink("/system/bin/[[") + " k\n\n"); } catch (Exception e2) { // TODO Auto-generated catch block e2.printStackTrace(); } visualUpdate(TestHandler.ACTION_PDISPLAY, "Testing getInode"); visualUpdate(TestHandler.ACTION_DISPLAY, "[ Checking Inodes ]\n"); visualUpdate( TestHandler.ACTION_DISPLAY, RootTools.getInode("/system/bin/busybox") + " k\n\n"); visualUpdate(TestHandler.ACTION_PDISPLAY, "Testing GetBusyBoxapplets"); try { visualUpdate(TestHandler.ACTION_DISPLAY, "[ Getting all available Busybox applets ]\n"); for (String applet : RootTools.getBusyBoxApplets("/data/data/stericson.busybox.donate/files/bb")) { visualUpdate(TestHandler.ACTION_DISPLAY, applet + " k\n\n"); } } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } visualUpdate(TestHandler.ACTION_PDISPLAY, "Testing getFilePermissionsSymlinks"); Permissions permissions = RootTools.getFilePermissionsSymlinks("/system/bin/busybox"); visualUpdate(TestHandler.ACTION_DISPLAY, "[ Checking busybox permissions and symlink ]\n"); if (permissions != null) { visualUpdate(TestHandler.ACTION_DISPLAY, "Symlink: " + permissions.getSymlink() + " k\n\n"); visualUpdate( TestHandler.ACTION_DISPLAY, "Group Permissions: " + permissions.getGroupPermissions() + " k\n\n"); visualUpdate( TestHandler.ACTION_DISPLAY, "Owner Permissions: " + permissions.getOtherPermissions() + " k\n\n"); visualUpdate( TestHandler.ACTION_DISPLAY, "Permissions: " + permissions.getPermissions() + " k\n\n"); visualUpdate(TestHandler.ACTION_DISPLAY, "Type: " + permissions.getType() + " k\n\n"); visualUpdate( TestHandler.ACTION_DISPLAY, "User Permissions: " + permissions.getUserPermissions() + " k\n\n"); } else { visualUpdate(TestHandler.ACTION_DISPLAY, "Permissions == null k\n\n"); } visualUpdate(TestHandler.ACTION_PDISPLAY, "JAVA"); visualUpdate(TestHandler.ACTION_DISPLAY, "[ Running some Java code ]\n"); Shell shell; try { shell = RootTools.getShell(true); JavaCommandCapture cmd = new JavaCommandCapture( 43, false, SanityCheckRootTools.this, "com.stericson.RootToolsTests.NativeJavaClass") { @Override public void commandOutput(int id, String line) { super.commandOutput(id, line); visualUpdate(TestHandler.ACTION_DISPLAY, line + "\n"); } }; shell.add(cmd); } catch (Exception e) { // Oops. Say, did you run RootClass and move the resulting anbuild.dex " file to res/raw? // If you don't you will not be able to check root mode Java. e.printStackTrace(); } visualUpdate(TestHandler.ACTION_PDISPLAY, "Testing df"); long spaceValue = RootTools.getSpace("/data"); visualUpdate(TestHandler.ACTION_DISPLAY, "[ Checking /data partition size]\n"); visualUpdate(TestHandler.ACTION_DISPLAY, spaceValue + "k\n\n"); try { shell = RootTools.getShell(true); CommandCapture cmd = new CommandCapture(42, false, "find /") { boolean _catch = false; @Override public void commandOutput(int id, String line) { super.commandOutput(id, line); if (_catch) { RootTools.log("CAUGHT!!!"); } } @Override public void commandTerminated(int id, String reason) { synchronized (SanityCheckRootTools.this) { _catch = true; visualUpdate(TestHandler.ACTION_PDISPLAY, "All tests complete."); visualUpdate(TestHandler.ACTION_HIDE, null); try { RootTools.closeAllShells(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @Override public void commandCompleted(int id, int exitCode) { synchronized (SanityCheckRootTools.this) { _catch = true; visualUpdate(TestHandler.ACTION_PDISPLAY, "All tests complete."); visualUpdate(TestHandler.ACTION_HIDE, null); try { RootTools.closeAllShells(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }; shell.add(cmd); } catch (Exception e) { e.printStackTrace(); } }