android应用 暴力测试,[原创]Android应用完整性保护总结

package com.tencent.StubShell;

public class CheckVirtual {

private static final java.lang.String TAG = "CheckVirtual";

private static java.lang.String exec(java.lang.String str) {

java.io.BufferedOutputStream bufferedOutputStream;

java.lang.Object obj;

java.lang.Object obj2;

java.io.BufferedInputStream obj3;

java.lang.Throwable th;

java.lang.Throwable th2;

java.lang.String str2 = null;

java.lang.Process exec;

try {

exec = java.lang.Runtime.getRuntime().exec("sh");

try {

bufferedOutputStream = new java.io.BufferedOutputStream(exec.getOutputStream());

} catch (java.lang.Exception e) {

obj3 = str2;

obj2 = str2;

if (bufferedOutputStream != null) {

}

if (obj3 != null) {

}

if (exec != null) {

}

return str2;

} catch (java.lang.Throwable th3) {

obj2 = str2;

java.lang.String str3 = str2;

th = th3;

obj3 = str3;

if (bufferedOutputStream != null) {

}

if (obj3 != null) {

}

if (exec != null) {

}

throw th;

}

try {

obj3 = new java.io.BufferedInputStream(exec.getInputStream());

try {

bufferedOutputStream.write(str.getBytes());

bufferedOutputStream.write(10);

bufferedOutputStream.flush();

bufferedOutputStream.close();

exec.waitFor();

str2 = getStrFromBufferInputSteam(obj3);

if (bufferedOutputStream != null) {

try {

bufferedOutputStream.close();

} catch (java.io.IOException e2) {

e2.printStackTrace();

}

}

if (obj3 != null) {

try {

obj3.close();

} catch (java.io.IOException e3) {

e3.printStackTrace();

}

}

if (exec != null) {

exec.destroy();

}

} catch (java.lang.Exception e4) {

} catch (Throwable th4) {

th = th4;

if (bufferedOutputStream != null) {

}

if (obj3 != null) {

}

if (exec != null) {

}

throw th;

}

} catch (java.lang.Exception e5) {

obj3 = str2;

if (bufferedOutputStream != null) {

try {

bufferedOutputStream.close();

} catch (java.io.IOException e22) {

e22.printStackTrace();

}

}

if (obj3 != null) {

try {

obj3.close();

} catch (java.io.IOException e32) {

e32.printStackTrace();

}

}

if (exec != null) {

exec.destroy();

}

return str2;

} catch (java.lang.Throwable th32) {

th2 = th32;

obj3 = str2;

th = th2;

if (bufferedOutputStream != null) {

try {

bufferedOutputStream.close();

} catch (java.io.IOException e222) {

e222.printStackTrace();

}

}

if (obj3 != null) {

try {

obj3.close();

} catch (java.io.IOException e322) {

e322.printStackTrace();

}

}

if (exec != null) {

exec.destroy();

}

throw th;

}

} catch (java.lang.Exception e6) {

exec = str2;

obj3 = str2;

bufferedOutputStream = str2;

} catch (java.lang.Throwable th5) {

obj3 = str2;

bufferedOutputStream = str2;

th2 = th5;

exec = str2;

th = th2;

if (bufferedOutputStream != null) {

}

if (obj3 != null) {

}

if (exec != null) {

}

throw th;

}

return str2;

}

private static java.lang.String getStrFromBufferInputSteam(java.io.BufferedInputStream bufferedInputStream) {

if (bufferedInputStream == null) {

return "";

}

byte[] bArr = new byte[512];

java.lang.StringBuilder stringBuilder = new java.lang.StringBuilder();

int read;

do {

try {

read = bufferedInputStream.read(bArr);

if (read > 0) {

stringBuilder.append(new java.lang.String(bArr, 0, read));

continue;

}

} catch (java.lang.Exception e) {

e.printStackTrace();

}

} while (read >= 512);

return stringBuilder.toString();

}

public static java.lang.String getUidStrFormat() {

java.lang.String exec = exec("cat /proc/self/cgroup");

if (exec == null || exec.length() == 0) {

return null;

}

int lastIndexOf = exec.lastIndexOf("uid");

int lastIndexOf2 = exec.lastIndexOf("/pid");

if (lastIndexOf 

return null;

}

if (lastIndexOf2 <= 0) {

lastIndexOf2 = exec.length();

}

try {

if (!isNumber(exec.substring(lastIndexOf + 4, lastIndexOf2).replaceAll("\n", ""))) {

return null;

}

return java.lang.String.format("u0_a%d", new java.lang.Object[]{java.lang.Integer.valueOf(java.lang.Integer.valueOf(exec.substring(lastIndexOf + 4, lastIndexOf2).replaceAll("\n", "")).intValue() - 10000)});

} catch (java.lang.Exception e) {

e.printStackTrace();

return null;

}

}

public static boolean isNumber(java.lang.String str) {

if (str == null || str.length() == 0) {

return false;

}

for (int i = 0; i 

if (!java.lang.Character.isDigit(str.charAt(i))) {

return false;

}

}

return true;

}

public static boolean isRunInVirtual() {

java.lang.CharSequence uidStrFormat = getUidStrFormat();

java.lang.String exec = exec("ps");

if (exec == null || exec == "") {

return false;

}

java.lang.String[] psLine = exec.split("\n");

if (psLine == null || psLine.length <= 0) {

return false;

}

int i = 0;

for (int i2 = 0; i2 

if (psLine[i2].contains(uidStrFormat)) {

int lastIndexOf = psLine[i2].lastIndexOf(" ");

java.lang.String substring = psLine[i2].substring(lastIndexOf <= 0 ? 0 : lastIndexOf + 1, psLine[i2].length());

if (new java.io.File(java.lang.String.format("/data/data/%s", new java.lang.Object[]{substring, java.util.Locale.CHINA})).exists()) {

i++;

}

}

}

return i > 1;

}

}