以下的只是分享檢測的一部分實作,并且僅為技術研究,
1.檢測模擬器的實作
1.檢測模擬器的 imsi的 id是否是310260000000000
具體的實作:先判斷是否有android.permission.READ_PHONE_STATE權限,在判斷當前的運行環境的imsi id 是否是310260000000000這個值,以及判斷VoiceMailNumbe是否等于15552175049和 GetDeviceId等于"000000000000000", "012345678912345"這兩串值,
private static boolean a(Context context, String str, String[] strArr, String str2) {
boolean z;
boolean z2;
boolean z3;
String[] strArr2;
if (context.getPackageManager().checkPermission("android.permission.READ_PHONE_STATE", context.getPackageName()) == 0) {
z = true;
} else {
z = false;
}
if (z) {
z2 = false;
for (String str3 : d) {
if (z2 || StringUtils.equal(str3, str)) {
z2 = true;
} else {
z2 = false;
}
}
} else {
z2 = false;
}
if (strArr != null) {
for (String equal : strArr) {
if (StringUtils.equal(equal, "310260000000000") || z2) {
z3 = true;
} else {
z3 = false;
}
}
}
if (z2 || StringUtils.equal(str2, "15552175049")) {
return true;
}
return false;
}
2.檢測模擬器的驅動檔案內容
具體的檢測步驟:判斷/proc/tty/drivers 檔案是否存在是否可讀取,可讀情況下讀取出具體的內容資料進行比對是否包含goldfish字串
private static String[] b = {"goldfish"};
private static Boolean a() {
String str;
File file = new File("/proc/tty/drivers");
if (!file.exists() || !file.canRead()) {
String str2 = "EmulatorChecker";
StringBuilder sb = new StringBuilder("can not read file /proc/tty/drivers ,because");
if (file.exists()) {
str = "not exist";
} else {
str = "not readable";
}
sb.append(str);
Logger.e(str2, sb.toString());
} else {
byte[] bArr = new byte[1024];
try {
FileInputStream fileInputStream = new FileInputStream(file);
fileInputStream.read(bArr);
fileInputStream.close();
} catch (Exception unused) {
}
String str3 = new String(bArr);
for (String contains : b) {
if (str3.contains(contains)) {
return Boolean.TRUE;
}
}
}
return Boolean.FALSE;
}
3.檢測模擬器的特定檔案及檔案屬性
具體的步驟:判斷讀取指定的檔案及檔案屬性,以及判斷特有的Genymotion模擬器,采用的是ro.product.manufacturer 讀取的手機廠商的方式
private static int a(h hVar) {
int i;
int i2;
String[] strArr = {"/system/bin/qemu_props", "/system/bin/androVM-prop", "/system/bin/microvirt-prop", "/system/lib/libdroid4x.so", "/system/bin/windroyed", "/system/bin/microvirtd", "/system/bin/nox-prop", "/system/bin/ttVM-prop", "/system/bin/droid4x-prop", "/data/.bluestacks.prop"};
String[] strArr2 = {"init.svc.vbox86-setup", "init.svc.droid4x", "init.svc.qemud", "init.svc.su_kpbs_daemon", "init.svc.noxd", "init.svc.ttVM_x86-setup", "init.svc.xxkmsg", "init.svc.microvirtd", "ro.kernel.android.qemud", "androVM.vbox_dpi", "androVM.vbox_graph_mode"};
int i3 = 0;
for (int i4 = 0; i4 < 10; i4++) {
if (a(strArr[i4])) {
i2 = 1 << i4;
} else {
i2 = 0;
}
i3 |= i2;
a(strArr[i4]);
}
int i5 = 10;
for (int i6 = 0; i6 < 11; i6++) {
String str = strArr2[i6];
if (StringUtils.isEmpty(hVar.a(str))) {
i = 0;
} else {
i = 1 << i5;
}
i3 |= i;
StringUtils.isEmpty(hVar.a(str));
i5++;
}
Pair pair = new Pair("ro.product.manufacturer", "Genymotion");
String a2 = hVar.a((String) pair.first);
if (StringUtils.isEmpty(a2) || !a2.contains((CharSequence) pair.second)) {
return i3;
}
return i3 | (1 << i5);
}
4.判斷指定的設備檔案是否存在
判斷下面三個檔案是否存在
private static String[] c = {"/dev/socket/qemud", "/dev/qemu_pipe", "/dev/qemu_trace"};
private static boolean a(String str) {
if (StringUtils.isEmpty(str)) {
return false;
}
File file = new File(str);
if (file.exists()) {
return true;
}
try {
new FileInputStream(file);
return true;
} catch (FileNotFoundException e) {
if (!e.getMessage().contains("No such file or directory")) {
return true;
}
return false;
}
}
更多安全技術文章,請關注公眾號,一起學習,一起進步,

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/243874.html
標籤:其他
上一篇:Android 沉浸式狀態欄及View滑動漸變效果與啟發
下一篇:我的2020年終總結
