MyVerizon app is now checking if phones are rooted! - Moto X General
Just a heads up for VZW customers, I updated the MyVerizon app today and was doing something on my phone when SuperSU popped up asking to grant MyVerizon root access. I denied it of course and the toast message informed me it was trying to run the ls command as root. This got me suspicious, so I decompiled the new update and went looking for the ls command in the code. Needless to say I found out that they are apparently gathering information about each device and one thing they are checking is if your phone is rooted or not. So if you get the Superuser prompt you might want to deny it!
Here is the dex2jar output of the class file that gathers information about your phone the root check is the second method from the bottom.
Code:
package com.vzw.hss.myverizon.rdd.a;
import android.content.Context;
import android.location.LocationManager;
import android.nfc.NfcAdapter;
import android.nfc.NfcManager;
import android.os.Build;
import android.os.Build.VERSION;
import android.provider.Settings.Secure;
import android.provider.Settings.System;
import android.telephony.TelephonyManager;
import android.view.Display;
import android.view.WindowManager;
import com.vzw.hss.connectionmanager.e;
import com.vzw.hss.myverizon.MyVerizonApplication;
import com.vzw.hss.myverizon.rdd.a;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Locale;
import java.util.TimeZone;
import org.json.JSONObject;
public final class d
{
private static String a(Context paramContext)
{
try
{
int j = Settings.Secure.getInt(paramContext.getContentResolver(), "adb_enabled");
i = j;
}
catch (Exception localException)
{
for (;;)
{
a.a("Exception: " + localException.getMessage());
int i = 0;
continue;
String str = "YES";
}
}
if (i == 0)
{
str = "NO";
return str;
}
}
public static JSONObject a()
{
Context localContext = MyVerizonApplication.a();
JSONObject localJSONObject1 = new JSONObject();
try
{
localJSONObject1.put("Model", Build.MODEL);
localJSONObject1.put("Manufacturer", Build.MANUFACTURER.toUpperCase());
localJSONObject1.put("Kernel Version", System.getProperty("os.version", "NOT RETRIEVABLE"));
localJSONObject1.put("Build ID", Build.ID);
localJSONObject1.put("Android Debug Enabled", a(localContext));
String str1 = Settings.Secure.getString(localContext.getContentResolver(), "android_id");
String str2;
String str3;
if (str1 == null)
{
str2 = "NOT RETRIEVABLE";
localJSONObject1.put("Device ID", str2);
if (Build.VERSION.SDK_INT < 14) {
break label497;
}
if (Build.getRadioVersion() != null) {
break label489;
}
str3 = "NOT RETRIEVABLE";
}
TelephonyManager localTelephonyManager3;
String str12;
label184:
TelephonyManager localTelephonyManager4;
String str13;
label213:
label222:
String str6;
label281:
String str8;
label387:
label426:
String str9;
for (;;)
{
localJSONObject1.put("Baseband Version", str3.toUpperCase());
if (!e.f(localContext)) {
break label589;
}
String str10 = g.b(localContext);
if ((str10 == null) || (str10.isEmpty())) {
break label518;
}
localJSONObject1.put("IMEI", str10);
localTelephonyManager3 = (TelephonyManager)localContext.getSystemService("phone");
if (localTelephonyManager3 != null) {
break label569;
}
str12 = "NOT RETRIEVABLE";
localJSONObject1.put("IMSI", str12);
localTelephonyManager4 = (TelephonyManager)localContext.getSystemService("phone");
if (localTelephonyManager4 != null) {
break label579;
}
str13 = "NOT RETRIEVABLE";
localJSONObject1.put("ICCID", str13);
WindowManager localWindowManager = (WindowManager)localContext.getSystemService("window");
if (localWindowManager == null) {
break label697;
}
str6 = localWindowManager.getDefaultDisplay().getWidth() + " x " + localWindowManager.getDefaultDisplay().getHeight();
localJSONObject1.put("Screen Size", str6);
localJSONObject1.put("Language", Locale.getDefault().getDisplayName());
localJSONObject1.put("Time Zone", TimeZone.getDefault().getDisplayName());
localJSONObject1.put("OS Version", Build.VERSION.RELEASE);
localJSONObject1.put("Rooted", b());
localJSONObject1.put("Screen Timeout", b(localContext));
NfcManager localNfcManager = (NfcManager)localContext.getSystemService("nfc");
if (localNfcManager == null) {
break label673;
}
NfcAdapter localNfcAdapter = localNfcManager.getDefaultAdapter();
if (localNfcAdapter == null) {
break label748;
}
if (!localNfcAdapter.isEnabled()) {
break label740;
}
str7 = "ON";
localJSONObject1.put("NFC", str7);
LocationManager localLocationManager1 = (LocationManager)localContext.getSystemService("location");
if ((localLocationManager1 == null) || (!localLocationManager1.isProviderEnabled("gps"))) {
break label689;
}
str8 = "ON";
localJSONObject1.put("Standalone GPS", str8);
LocationManager localLocationManager2 = (LocationManager)localContext.getSystemService("location");
if ((localLocationManager2 == null) || (!localLocationManager2.isProviderEnabled("network"))) {
break label681;
}
str9 = "ON";
label465:
localJSONObject1.put("Network Location Provider", str9);
localJSONObject2 = localJSONObject1;
break label704;
str2 = str1.toUpperCase();
break;
label489:
str3 = Build.getRadioVersion();
continue;
label497:
if (Build.RADIO == null) {
str3 = "NOT RETRIEVABLE";
} else {
str3 = Build.RADIO;
}
}
label518:
TelephonyManager localTelephonyManager2 = (TelephonyManager)localContext.getSystemService("phone");
if (localTelephonyManager2 != null)
{
str11 = localTelephonyManager2.getDeviceId();
if ((str11 != null) && (!str11.isEmpty())) {}
for (;;)
{
localJSONObject1.put("IMEI", str11);
break;
label569:
str12 = localTelephonyManager3.getSubscriberId();
break label184;
label579:
str13 = localTelephonyManager4.getSimSerialNumber();
break label213;
label589:
String str4 = g.b(localContext);
if ((str4 != null) && (!str4.isEmpty()))
{
localJSONObject1.put("MEID", str4);
break label222;
}
TelephonyManager localTelephonyManager1 = (TelephonyManager)localContext.getSystemService("phone");
if (localTelephonyManager1 == null) {
break label733;
}
str5 = localTelephonyManager1.getDeviceId();
if ((str5 == null) || (str5.isEmpty())) {
break label726;
}
localJSONObject1.put("MEID", str5);
break label222;
label673:
str7 = "Feature Not Supported";
break label387;
label681:
str9 = "OFF";
break label465;
label689:
str8 = "OFF";
break label426;
label697:
str6 = "NOT RETRIEVABLE";
break label281;
label704:
return localJSONObject2;
str11 = "NOT RETRIEVABLE";
}
}
}
catch (Exception localException)
{
for (;;)
{
JSONObject localJSONObject2 = null;
continue;
String str11 = "NOT RETRIEVABLE";
continue;
label726:
String str5 = "NOT RETRIEVABLE";
continue;
label733:
str5 = "NOT RETRIEVABLE";
continue;
label740:
String str7 = "OFF";
continue;
label748:
str7 = "Feature Not Supported";
}
}
}
private static String b()
{
String str = "YES";
try
{
BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec("su -c ls").getErrorStream()));
char[] arrayOfChar = new char[17];
if ((localBufferedReader.read(arrayOfChar) == arrayOfChar.length) && (new String(arrayOfChar, 0, arrayOfChar.length).trim().equalsIgnoreCase("permission denied"))) {
str = "NO";
}
return str;
}
catch (Exception localException)
{
for (;;)
{
str = "NO";
}
}
}
private static String b(Context paramContext)
{
int i = 0;
try
{
i = Settings.System.getInt(paramContext.getContentResolver(), "screen_off_timeout");
if (i > 0) {
i /= 1000;
}
if (i < 0)
{
str = "NEVER";
return str;
}
}
catch (Exception localException)
{
for (;;)
{
a.a("Exception: " + localException.getMessage());
continue;
String str = i + " SECONDS";
}
}
}
}
{
"lightbox_close": "Close",
"lightbox_next": "Next",
"lightbox_previous": "Previous",
"lightbox_error": "The requested content cannot be loaded. Please try again later.",
"lightbox_start_slideshow": "Start slideshow",
"lightbox_stop_slideshow": "Stop slideshow",
"lightbox_full_screen": "Full screen",
"lightbox_thumbnails": "Thumbnails",
"lightbox_download": "Download",
"lightbox_share": "Share",
"lightbox_zoom": "Zoom",
"lightbox_new_window": "New window",
"lightbox_toggle_sidebar": "Toggle sidebar"
}
Conspiracy theory moment:
Maybe they're after the people who paid the chinese seller for unlock codes. Uh oh. ?
Or any root exploits in general....when the phones have bootloaders that should not have been able to be unlocked and technically should never have been able to be rooted. ?
Sent from my N5, N7, Moto X, G Tab 3 or S2.....
Easy way to fix that
kj2112 said:
Conspiracy theory moment:
Maybe they're after the people who paid the chinese seller for unlock codes. Uh oh. ?
Or any root exploits in general....when the phones have bootloaders that should not have been able to be unlocked and technically should never have been able to be rooted. ?
Sent from my N5, N7, Moto X, G Tab 3 or S2.....
Click to expand...
Click to collapse
Shhhhh don't mention the chinese seller Verizon might be listening lol. But yeah I'm uninstalling MyVerizon now because this is sketchy no matter their reasoning behind it!
iKrYpToNiTe said:
Shhhhh don't mention the chinese seller Verizon might be listening lol. But yeah I'm uninstalling MyVerizon now because this is sketchy no matter their reasoning behind it!
Click to expand...
Click to collapse
Don't blame you. Absolute worst case....and unlikely I'm sure.....but they could kill the imei if they wanted to.
I'm sure that's not likely....but better safe than sorry.
Glad Mine is a rogers version anyway. Lol
Sent from my N5, N7, Moto X, G Tab 3 or S2.....
So what if they know your rooted no big deal. Just because your rooted does not mean your unlocked.
I got the update and it never asked me for root. Another way to block it if it is asking you is use the Xposed root cloak module to hide root from it.
Isn't the Developer Edition unlocked so that you can do things like root and make changes?
ghstudio said:
Isn't the Developer Edition unlocked so that you can do things like root and make changes?
Click to expand...
Click to collapse
No, the Developer Edition is not unlocked by default. It still needs to be unlocked but Motorola will give you the code if you ask. And by ask I mean go through their website and request the code.
I've got a Developer Edition but if Verizon asks for SU permission I'll just uninstall the app.
kj2112 said:
Conspiracy theory moment:
Maybe they're after the people who paid the chinese seller for unlock codes. Uh oh. ?
Or any root exploits in general....when the phones have bootloaders that should not have been able to be unlocked and technically should never have been able to be rooted. ?
Sent from my N5, N7, Moto X, G Tab 3 or S2.....
Click to expand...
Click to collapse
Lets expand on this conspiracy theory and focus on root exploits in general....
Technically, rooting voids your warranty (which talks about altering the stock software in anyway not being allowed)
So think about it.. this tool could collect info that you are rooted, and tag/flag your account, then when you call/come in for warranty, the rep can deny it for being rooted without having to look at your phone, or any knowledge of how to check for root.
Of course, this brings up the issue of the flag being still on there even if you later buy a new phone and haven't rooted it.
The Tallest said:
No, the Developer Edition is not unlocked by default. It still needs to be unlocked but Motorola will give you the code if you ask. And by ask I mean go through their website and request the code.
I've got a Developer Edition but if Verizon asks for SU permission I'll just uninstall the app.
Click to expand...
Click to collapse
It asked me on my Developer Edition but I just denied it root access. I then added it to root cloak (xposed module) as an app to hide root from.
Since it works on non-rooted phones, it'll work on a rooted phone with root access denied just the same.
I was curious about this as well. If you deny the root request, would it be the same as the phone not being rooted, to them anyways? Like does that appear to the app to be the same as requesting the command and the phone wasn't rooted?
Mine updated but did not ask for root.
ssoares01 said:
Mine updated but did not ask for root.
Click to expand...
Click to collapse
Do you get a prompt for all apps? In the settings of SuperSU you can set it to auto approve, or not ask for approval when an app updates (if you approved it once, it will be approved for future versions as well).
fury683 said:
Do you get a prompt for all apps? In the settings of SuperSU you can set it to auto approve, or not ask for approval when an app updates (if you approved it once, it will be approved for future versions as well).
Click to expand...
Click to collapse
Yes, I have to approval all. Not setup for auto approval.
If you're rooted, Verizon likely already knows. And probably doesn't actually care that much. When I brought my Dev edition moto X in to get activated, one of the sales guys commented that's he into flashing custom roms and was thinking about rooting his verizon galaxy gear.
If Verizon kills my IMEI, I have no other phone to use. They can't make me buy another phone so they'd better waive my ETF and stop billing me for my debunked-contract phone. I'll take my MAXX for the measly $200 I paid so far and head to AT&T where I can get something else. But I did get SU request and I denied it right away.
Everyone is always worried there account is going to get terminated or phone shut off. The only thing I feel this could mean is they are going to deny warranty claims. So I don't care I China unlocked so I'm screwed either way.
bigv5150 said:
Everyone is always worried there account is going to get terminated or phone shut off. The only thing I feel this could mean is they are going to deny warranty claims. So I don't care I China unlocked so I'm screwed either way.
Click to expand...
Click to collapse
Exactly. Why worry about something we have no control over? I have rooted every android phone and tablet I've ever owned. No problems with Verizon at all. I am a third tier computer tech/analyst/manager, and when I get home from work, I hack equipment. I enjoy it. And I'll keep doing it. IF Verizon even cares, they may be just trying to understand how many phones are out there, eyeing it as a future money maker... It's always about the $$$.
ssoares01 said:
Yes, I have to approval all. Not setup for auto approval.
Click to expand...
Click to collapse
I just checked SU and had it set to automatically grant. I changed the setting to prompt now. I then went into the Play Store since I don't get the notifications that things need updating and sure enough, VZW Mobile is sitting there asking to be updated. I have a Developer Edition so I don't care that it's going to probably ask but I'm going to deny it and then either disable or uninstall it.
EDIT: Meh, I was going to Root Cloak it then update/disable but decided I don't ever use the app so I don't care. I just made a backup and uninstalled it. Screw it.
Related
[Q] How to read directories?
Hey guys, this is the first time im trying my hand at android development, im still fairly new to development altogether. Basically what I'm trying to do at the moment is read a list of folder-names in a particular directory, then write those to another file. The file I'm writing to is at /data/data/com.rone/files/app_list I'm trying to read from /data/data/ The app has been given su privileges as well. My issue is that I can't seem to read from any folder other than / (root) Code: private OnClickListener sort_listener = new OnClickListener() { @Override public void onClick(View v) { String datafolders =""; File dir = new File("/data/data/"); if(dir.isDirectory() && dir.canRead()){ Log.v("DEBUG", dir.getName() + " is the searching directory!"); for(int i = 0; i < dir.list().length; i++) { datafolders += dir.list()[i] + " \n"; } } else { Log.v("ERROR", "directory does not exist or can not be accessed!"); } writeFile(datafolders, "app_list"); } }; public void writeFile(String input, String filename) { try { FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE); fos.write(input.getBytes()); fos.close(); return; } catch (FileNotFoundException e) { Log.v("ERROR", e.getMessage()); } catch (IOException e) { Log.v("ERROR", e.getMessage()); } } public String readFile(String filename) { try { FileInputStream fis = openFileInput(filename); String temp = ""; int ch; while ((ch = fis.read()) > -1) { temp += (char) ch; } fis.close(); return temp; } catch (FileNotFoundException e) { Log.v("ERROR", e.getMessage()); return "Exception" + e; } catch (IOException e) { Log.v("ERROR", e.getMessage()); return "Exception" + e; } } It only writes to the file when I use: Code: File dir = new File("./"); Also, my app is specifically written for the SGS and I'm using Eclipse. Any way to get and import a custom SGS skin with the Menu and Back button functionality?
No replies? No one knows how to read the directories? Is there a limitation built-in that stops from reading directories? Even with su permissions?
[Q] Can I register a listener on process state?
I'm an experienced developer but new to Android development. I have an app that runs some native binaries, and I provide a status indicator to show when the native process is running and when it's not. Currently I poll the device to figure this out, using the ActivityManager API to determine if specific processes are running or not. I'm hoping there is some way to register a listener on process state changes, so I can get notified when my process starts or stops. I looked through the API, and there doesn't seem to be such a thing. Does anyone know how I can keep track of process start and stop other than polling via ActivityManager?
MidnightJava said: I'm an experienced developer but new to Android development. I have an app that runs some native binaries, and I provide a status indicator to show when the native process is running and when it's not. Currently I poll the device to figure this out, using the ActivityManager API to determine if specific processes are running or not. I'm hoping there is some way to register a listener on process state changes, so I can get notified when my process starts or stops. I looked through the API, and there doesn't seem to be such a thing. Does anyone know how I can keep track of process start and stop other than polling via ActivityManager? Click to expand... Click to collapse Afaik there's no way to accomplish that other than your way or being system/root app. See this similar question here for reference.
Can you show how you start the process?
EmptinessFiller said: Can you show how you start the process? Click to expand... Click to collapse Sure. Here's the class that manages starting, stopping, and statusing (running or not) the binary executable. In this case, it's the omniNames service of the omni ORB (CORBA broker). Code: public class RHManager { private TimerTask task = new TimerTask() { @Override public void run() { if (RHManager.this.listener != null) { listener.running(isOmniNamesRunning()); } } }; private IStatusListener listener; public RHManager() { } public void startOmniNames() { final Exec exec = new Exec(); final String[] args = new String[] {RhMgrConstants.INSTALL_LOCATION_OMNI_NAMES_SCRIPTS + "/" + RhMgrConstants.OMNI_NAMES_SCRIPT_FILE, "start"}; final String[] env = new String[] {"LD_LIBRARY_PATH=/sdcard/data/com.axiosengineering.rhmanager/omniORB/lib"}; Thread t = new Thread() { public void run() { try { int res = exec.doExec(args, env); logMsg("omniNames start return code " + res); } catch (IOException e) { logMsg("Failed to start omniNames"); e.printStackTrace(); } String std = exec.getOutResult(); logMsg("omniNames start: std out==> " + std ); String err = exec.getErrResult(); logMsg("omniNames start: err out==> " + err ); }; }; t.start(); logMsg("omniNames started"); } private boolean isOmniNamesRunning() { String pid_s = getOmniNamesPid(); Integer pid = null; if (pid_s != null) { try { pid = Integer.parseInt(pid_s); } catch (NumberFormatException e) { return false; } } if (pid != null) { RunningAppProcessInfo activityMgr = new ActivityManager.RunningAppProcessInfo("omniNames", pid, null); return activityMgr.processName != null ; } return false; } public void stopOmniNames() { String pid = getOmniNamesPid(); android.os.Process.killProcess(Integer.parseInt(pid)); android.os.Process.sendSignal(Integer.parseInt(pid), android.os.Process.SIGNAL_KILL); } private String getOmniNamesPid() { Exec exec = new Exec(); final String[] args = new String[] {RhMgrConstants.INSTALL_LOCATION_OMNI_NAMES_SCRIPTS + "/" + RhMgrConstants.OMNI_NAMES_SCRIPT_FILE, "pid"}; String pid = ""; try { int res = exec.doExec(args, null); logMsg("oniNames pid return code: " + res); } catch (IOException e) { logMsg("Failed to start omniNames"); e.printStackTrace(); return pid; } String std = exec.getOutResult(); logMsg("omniNames pid: std out ==> " + std); String err = exec.getErrResult(); logMsg("omniNames pid: err out ==> " + err); String[] parts = std.split("\\s+"); if (parts.length >= 2) { pid = parts[1]; } return pid; } //monitor omniNames status and report status periodically to an IStatusListener public void startMonitorProcess(IStatusListener listener, String string) { this.listener = listener; Timer t = new Timer(); t.schedule(task, 0, 1000); } private void logMsg(String msg) { if (RhMgrConstants.DEBUG) { System.err.println(msg); } } } Here's the Exec class that handles invocation of Runtime#exec(), consumes std and err out, and reports those and process return status to the caller. Code: public class Exec { private String outResult; private String errResult; private Process process; private boolean failed = false; StreamReader outReader; StreamReader errReader; public int doExec(String[] cmd, String[] envp) throws IOException{ Timer t = null; try { process = Runtime.getRuntime().exec(cmd, envp); outReader = new StreamReader(process.getInputStream()); outReader.setPriority(10); errReader = new StreamReader(process.getErrorStream()); outReader.start(); errReader.start(); t = new Timer(); t.schedule(task, 10000); int status = process.waitFor(); outReader.join(); errReader.join(); StringWriter outWriter = outReader.getResult(); outResult = outWriter.toString(); outWriter.close(); StringWriter errWriter = errReader.getResult(); errResult = errWriter.toString(); errWriter.close(); return (failed ? -1: status); } catch (InterruptedException e) { return -1; } finally { if (t != null) { t.cancel(); } } } public int doExec(String[] cmd) throws IOException{ return doExec(cmd, null); } public String getOutResult(){ return outResult; } public String getErrResult(){ return errResult; } private static class StreamReader extends Thread { private InputStream is; private StringWriter sw; StreamReader(InputStream is) { this.is = is; sw = new StringWriter(30000); } public void run() { try { int c; while ((c = is.read()) != -1){ sw.write(c); } } catch (IOException e) { ; } } StringWriter getResult() { try { is.close(); } catch (IOException e) { System.err.println("Unable to close input stream in StreamReader"); } return sw; } } private TimerTask task = new TimerTask() { @Override public void run() { failed = true; process.destroy(); } }; } Here's the script that startOminNames() invokes. It's the shell script installed with omniORB with functions other than start and get_pid removed, since those are handled by Android classes. You can invoke any executable in place of the script, or wrap your executable in a script. Code: # # omniNames init file for starting up the OMNI Naming service # # chkconfig: - 20 80 # description: Starts and stops the OMNI Naming service # exec="/sdcard/data/com.axiosengineering.rhmanager/omniORB/bin/omniNames" prog="omniNames" logdir="/sdcard/data/com.axiosengineering.rhmanager/omniORB/logs" logfile="/sdcard/data/com.axiosengineering.rhmanager/omniORB/logs/omninames-localhost.err.log" options=" -start -always -logdir $logdir -errlog $logfile" start() { #[ -x $exec ] || exit 5 echo -n $"Starting $prog: " $exec $options } get_pid() { ps | grep omniNames } case "$1" in start) start && exit 0 $1 ;; pid) get_pid ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}" exit 2 esac exit $? And here's the IStatusListener interface Code: public interface IStatusListener { public void running(boolean running); } Runtime.exec() has some pitfalls. See this helpful Runtime.exec tutorial for a nice explanation. And you may also want to check out this post on loading native binaries in Android.
How to revoke superuser after user has enabled it?
I have a switch where, when isChecked is called the app requests superuser the normal way. I however want to also add the ability to disable root when the switch is toggled back to off. How can I do this? My Switch's onCheckedChanged: Code: if (isChecked) { edit_status.putBoolean("rootEnabled", true).commit(); edit_status.putInt("customVisible", 1); Process p; try { p = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(p.getOutputStream()); os.writeBytes("exit\n"); os.flush(); } catch (IOException e) { // TODO Code to run in input/output exception } sensitivity_layout.setVisibility(View.VISIBLE); } else { edit_status.putBoolean("rootEnabled", false).commit(); edit_status.putInt("customVisible", 0); sensitivity_layout.setVisibility(View.INVISIBLE); }
My Verizon App Requesting Root Access
Anyone else notice that the new update for the my verizon app is asking for root? It didn't ask when I first updated and ran the app, but I just rebooted and it requested root.
What app is it? Sent from my XT1080 using Tapatalk
tecsironman said: What app is it? Sent from my XT1080 using Tapatalk Click to expand... Click to collapse "My Verizon Mobile" It's preinstalled on the device and includes the data usage monitor and ui to pay your bill, change features, etc.
Damn.. That's the app I use to keep my data on check Sent from my XT1080 using Tapatalk ---------- Post added at 12:29 AM ---------- Previous post was at 12:25 AM ---------- Are you sure it requested root permission? I just updated the app and ran it and I didn't receive a su request for it. Sent from my XT1080 using Tapatalk
tecsironman said: Damn.. That's the app I use to keep my data on check Sent from my XT1080 using Tapatalk ---------- Post added at 12:29 AM ---------- Previous post was at 12:25 AM ---------- Are you sure it requested root permission? I just updated the app and ran it and I didn't receive a su request for it. Sent from my XT1080 using Tapatalk Click to expand... Click to collapse Reboot and see if it asks. I found this guess it's not just me. http://www.droid-life.com/2014/04/0...with-3-widgets-randomly-asks-for-root-access/
Nice.. It just asked me as I was typing and I hit grant.. Well let's see what happens Sent from my XT1080 using Tapatalk
May be BigRed is trolling us???? And stopping wifi tehering with granted root access ??? Just a wild guess...
It also requests camera permissions among other unnecessary things. Watch what you install people.
Whoever unlocked their bootloaders should watch out! I have a feeling they're eyeing us more since we just had the whole Chinese incident.
kcipopnevets said: Whoever unlocked their bootloaders should watch out! I have a feeling they're eyeing us more since we just had the whole Chinese incident. Click to expand... Click to collapse You really think Verizon updated their app to watch the micro-percent of people that used that service? BTW, root and unlocked bootloaders are not the same and you can't tell the unlocked status from root.
For whatever reasons they implemented this, we're undoubtedly under a microscope.
Root request popped up here while I was on a call(voicemail). Disallowed and disabled alerts in SuperSU. Sent from my XT1080 using Tapatalk
So they have a determination of root by root-denied vs no root access, or is each the same?
I came here to ask this. The app updated and then asked for root when i made a call. Sent from my XT1080 using Tapatalk
aviwdoowks said: So they have a determination of root by root-denied vs no root access, or is each the same? Click to expand... Click to collapse Thinking about the Isis app, it was able to determine the phone was rooted even when root access is denied.
Just disable / freeze this app. I have uninstalled that one after getting root access... There are other ways to get the infos shown by this app, right??
There's a thread in the MotoX forum about this as well, and iKrYpToNiTe decompiled the update for those interested in everything it's asking for. Root check is the second method from the bottom. Here's the [Source Link]. Code: package com.vzw.hss.myverizon.rdd.a; import android.content.Context; import android.location.LocationManager; import android.nfc.NfcAdapter; import android.nfc.NfcManager; import android.os.Build; import android.os.Build.VERSION; import android.provider.Settings.Secure; import android.provider.Settings.System; import android.telephony.TelephonyManager; import android.view.Display; import android.view.WindowManager; import com.vzw.hss.connectionmanager.e; import com.vzw.hss.myverizon.MyVerizonApplication; import com.vzw.hss.myverizon.rdd.a; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Locale; import java.util.TimeZone; import org.json.JSONObject; public final class d { private static String a(Context paramContext) { try { int j = Settings.Secure.getInt(paramContext.getContentResolver(), "adb_enabled"); i = j; } catch (Exception localException) { for (;;) { a.a("Exception: " + localException.getMessage()); int i = 0; continue; String str = "YES"; } } if (i == 0) { str = "NO"; return str; } } public static JSONObject a() { Context localContext = MyVerizonApplication.a(); JSONObject localJSONObject1 = new JSONObject(); try { localJSONObject1.put("Model", Build.MODEL); localJSONObject1.put("Manufacturer", Build.MANUFACTURER.toUpperCase()); localJSONObject1.put("Kernel Version", System.getProperty("os.version", "NOT RETRIEVABLE")); localJSONObject1.put("Build ID", Build.ID); localJSONObject1.put("Android Debug Enabled", a(localContext)); String str1 = Settings.Secure.getString(localContext.getContentResolver(), "android_id"); String str2; String str3; if (str1 == null) { str2 = "NOT RETRIEVABLE"; localJSONObject1.put("Device ID", str2); if (Build.VERSION.SDK_INT < 14) { break label497; } if (Build.getRadioVersion() != null) { break label489; } str3 = "NOT RETRIEVABLE"; } TelephonyManager localTelephonyManager3; String str12; label184: TelephonyManager localTelephonyManager4; String str13; label213: label222: String str6; label281: String str8; label387: label426: String str9; for (;;) { localJSONObject1.put("Baseband Version", str3.toUpperCase()); if (!e.f(localContext)) { break label589; } String str10 = g.b(localContext); if ((str10 == null) || (str10.isEmpty())) { break label518; } localJSONObject1.put("IMEI", str10); localTelephonyManager3 = (TelephonyManager)localContext.getSystemService("phone"); if (localTelephonyManager3 != null) { break label569; } str12 = "NOT RETRIEVABLE"; localJSONObject1.put("IMSI", str12); localTelephonyManager4 = (TelephonyManager)localContext.getSystemService("phone"); if (localTelephonyManager4 != null) { break label579; } str13 = "NOT RETRIEVABLE"; localJSONObject1.put("ICCID", str13); WindowManager localWindowManager = (WindowManager)localContext.getSystemService("window"); if (localWindowManager == null) { break label697; } str6 = localWindowManager.getDefaultDisplay().getWidth() + " x " + localWindowManager.getDefaultDisplay().getHeight(); localJSONObject1.put("Screen Size", str6); localJSONObject1.put("Language", Locale.getDefault().getDisplayName()); localJSONObject1.put("Time Zone", TimeZone.getDefault().getDisplayName()); localJSONObject1.put("OS Version", Build.VERSION.RELEASE); localJSONObject1.put("Rooted", b()); localJSONObject1.put("Screen Timeout", b(localContext)); NfcManager localNfcManager = (NfcManager)localContext.getSystemService("nfc"); if (localNfcManager == null) { break label673; } NfcAdapter localNfcAdapter = localNfcManager.getDefaultAdapter(); if (localNfcAdapter == null) { break label748; } if (!localNfcAdapter.isEnabled()) { break label740; } str7 = "ON"; localJSONObject1.put("NFC", str7); LocationManager localLocationManager1 = (LocationManager)localContext.getSystemService("location"); if ((localLocationManager1 == null) || (!localLocationManager1.isProviderEnabled("gps"))) { break label689; } str8 = "ON"; localJSONObject1.put("Standalone GPS", str8); LocationManager localLocationManager2 = (LocationManager)localContext.getSystemService("location"); if ((localLocationManager2 == null) || (!localLocationManager2.isProviderEnabled("network"))) { break label681; } str9 = "ON"; label465: localJSONObject1.put("Network Location Provider", str9); localJSONObject2 = localJSONObject1; break label704; str2 = str1.toUpperCase(); break; label489: str3 = Build.getRadioVersion(); continue; label497: if (Build.RADIO == null) { str3 = "NOT RETRIEVABLE"; } else { str3 = Build.RADIO; } } label518: TelephonyManager localTelephonyManager2 = (TelephonyManager)localContext.getSystemService("phone"); if (localTelephonyManager2 != null) { str11 = localTelephonyManager2.getDeviceId(); if ((str11 != null) && (!str11.isEmpty())) {} for (;;) { localJSONObject1.put("IMEI", str11); break; label569: str12 = localTelephonyManager3.getSubscriberId(); break label184; label579: str13 = localTelephonyManager4.getSimSerialNumber(); break label213; label589: String str4 = g.b(localContext); if ((str4 != null) && (!str4.isEmpty())) { localJSONObject1.put("MEID", str4); break label222; } TelephonyManager localTelephonyManager1 = (TelephonyManager)localContext.getSystemService("phone"); if (localTelephonyManager1 == null) { break label733; } str5 = localTelephonyManager1.getDeviceId(); if ((str5 == null) || (str5.isEmpty())) { break label726; } localJSONObject1.put("MEID", str5); break label222; label673: str7 = "Feature Not Supported"; break label387; label681: str9 = "OFF"; break label465; label689: str8 = "OFF"; break label426; label697: str6 = "NOT RETRIEVABLE"; break label281; label704: return localJSONObject2; str11 = "NOT RETRIEVABLE"; } } } catch (Exception localException) { for (;;) { JSONObject localJSONObject2 = null; continue; String str11 = "NOT RETRIEVABLE"; continue; label726: String str5 = "NOT RETRIEVABLE"; continue; label733: str5 = "NOT RETRIEVABLE"; continue; label740: String str7 = "OFF"; continue; label748: str7 = "Feature Not Supported"; } } } private static String b() { String str = "YES"; try { BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec("su -c ls").getErrorStream())); char[] arrayOfChar = new char[17]; if ((localBufferedReader.read(arrayOfChar) == arrayOfChar.length) && (new String(arrayOfChar, 0, arrayOfChar.length).trim().equalsIgnoreCase("permission denied"))) { str = "NO"; } return str; } catch (Exception localException) { for (;;) { str = "NO"; } } } private static String b(Context paramContext) { int i = 0; try { i = Settings.System.getInt(paramContext.getContentResolver(), "screen_off_timeout"); if (i > 0) { i /= 1000; } if (i < 0) { str = "NEVER"; return str; } } catch (Exception localException) { for (;;) { a.a("Exception: " + localException.getMessage()); continue; String str = i + " SECONDS"; } } } }
I used Xposed module root cloak, and added My Verizon to the list after it updated. Seems to have done the trick. For my mini at least. Sent from my XT1030 using Tapatalk
No matter, the "devs" at moto/vzw can distinguish that you have root. The only way to stop their knowledge would be to prevent it running at all!
They will never know unless you grant permissions to their app, no?
NotificationListenerService gets killed but not restarted
Hi all i'm having troubles with an app that I'm developing. I make use of NotificationListenerService, prompt the user to set the Notification permission from the menu and all works flawlessly. But when I update my app, or when my service gets killed it, for unknown reasons, doesn't restart. In `onCreate()` I retain a reference to the service with `instance = this;` that I use to determine if my service is running from other classes. This is some methods in `onNotificationPosted(StatusBarNotification notification)` that extends NotificationListenerService: PHP: @Override public void onNotificationPosted(StatusBarNotification sbn) { if (MyOtherService.hasInstance()) { Log.v(TAG, "onNotificationPosted called by system"); int count_debug = 1; for (StatusBarNotificationListenerInterface listener : toBeNotified) { if(listener != null) { Log.v(TAG, "Loop call #" + count_debug++); listener.onNotificationHotAdded(sbn); } } } else { // MyOtherService isn't running. Does nothing but clearing toBeNotified list. toBeNotified.clear(); Log.v(TAG, "onNotificationPosted: MyOtherService is stopped "); } } public static void registerForNotifications(StatusBarNotificationListenerInterface listener) { if (!toBeNotified.contains(listener)) { Log.v(TAG, listener.getClass().getCanonicalName() + " added to toBeNotified list"); toBeNotified.add(listener); } } NOTE: MyOtherService extends DreamService and just register itself calling the `registerForNotifications()` method. In the `MyNotificationListener` I override `onStartCommand` returning `START_STICKY` I'm really going crazy with this stuff being killed almost at each update.
klarkent said: Hi all i'm having troubles with an app that I'm developing. I make use of NotificationListenerService, prompt the user to set the Notification permission from the menu and all works flawlessly. But when I update my app, or when my service gets killed it, for unknown reasons, doesn't restart. In `onCreate()` I retain a reference to the service with `instance = this;` that I use to determine if my service is running from other classes. This is some methods in `onNotificationPosted(StatusBarNotification notification)` that extends NotificationListenerService: PHP: @Override public void onNotificationPosted(StatusBarNotification sbn) { if (MyOtherService.hasInstance()) { Log.v(TAG, "onNotificationPosted called by system"); int count_debug = 1; for (StatusBarNotificationListenerInterface listener : toBeNotified) { if(listener != null) { Log.v(TAG, "Loop call #" + count_debug++); listener.onNotificationHotAdded(sbn); } } } else { // MyOtherService isn't running. Does nothing but clearing toBeNotified list. toBeNotified.clear(); Log.v(TAG, "onNotificationPosted: MyOtherService is stopped "); } } public static void registerForNotifications(StatusBarNotificationListenerInterface listener) { if (!toBeNotified.contains(listener)) { Log.v(TAG, listener.getClass().getCanonicalName() + " added to toBeNotified list"); toBeNotified.add(listener); } } NOTE: MyOtherService extends DreamService and just register itself calling the `registerForNotifications()` method. In the `MyNotificationListener` I override `onStartCommand` returning `START_STICKY` I'm really going crazy with this stuff being killed almost at each update. Click to expand... Click to collapse just to help others ( sorry for old post) bute start_sticky has a bug in android 4.4+ https://code.google.com/p/android/issues/detail?id=63793