推荐模拟器检测方法:
设备信息检测代码:
private static final String[] known_numbers = {"15555215554", "15555215556", "15555215558", "15555215560", "15555215562", "15555215564", "15555215566", "15555215568", "15555215570", "15555215572", "15555215574", "15555215576", "15555215578", "15555215580", "15555215582", "15555215584",};
private boolean detectEmulator() {
if (Build.FINGERPRINT.startsWith("generic") || Build.FINGERPRINT.startsWith("unknown")
|| Build.MODEL.contains("google\_sdk") || Build.MODEL.contains("Emulator")
|| Build.MODEL.contains("Android SDK built for x86") || Build.MANUFACTURER.contains("Genymotion")
|| (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
|| "google\_sdk".equals(Build.PRODUCT)) {
return true;
}
if (Build.PRODUCT.equals("sdk") || Build.PRODUCT.equals("sdk\_x86")
|| Build.PRODUCT.equals("vbox86p") || Build.PRODUCT.equals("emulator")) {
return true;
}
if (Build.BOARD == null) {
return true;
}
if (Build.BOARD.equals("unknown")
|| Build.BOARD.contains("android")
|| Build.BOARD.contains("droid")) {
return true;
}
if (Build.DEVICE == null) {
return true;
}
if (Build.DEVICE.equals("unknown")
|| Build.DEVICE.contains("android")
|| Build.DEVICE.contains("droid")) {
return true;
}
if (Build.HARDWARE == null) {
return true;
}
if (Build.HARDWARE.equals("goldfish")
|| Build.HARDWARE.equals("ranchu")
|| Build.HARDWARE.contains("ranchu")) {
return true;
}
if (Build.BRAND == null) {
return true;
}
if (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic")) {
return true;
}
if (Build.MANUFACTURER.equals("unknown")) {
return true;
}
if (Build.MANUFACTURER.equals("Genymotion")) {
return true;
}
if ((Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
|| "google\_sdk".equals(Build.PRODUCT)) {
return true;
}
if (Build.PRODUCT == null) {
return true;
}
if (Build.PRODUCT.equals("sdk")
|| Build.PRODUCT.equals("sdk\_x86")
|| Build.PRODUCT.equals("vbox86p")
|| Build.PRODUCT.equals("emulator")) {
return true;
}
if (Build.HARDWARE.equals("goldfish")
|| Build.HARDWARE.equals("ranchu")) {
return true;
}
if (Build.FINGERPRINT.startsWith("generic")
|| Build.FINGERPRINT.startsWith("unknown")
|| Build.MODEL.contains("google\_sdk")
|| Build.MODEL.contains("Emulator")
|| Build.MODEL.contains("Android SDK built for x86")
|| Build.MANUFACTURER.contains("Genymotion")
|| (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
|| "google\_sdk".equals(Build.PRODUCT)) {
return true;
}
if (Build.PRODUCT == null) {
return true;
}
if (Build.PRODUCT.equals("sdk")
|| Build.PRODUCT.equals("sdk\_x86")
|| Build.PRODUCT.equals("vbox86p")
|| Build.PRODUCT.equals("emulator")) {
return true;
}
if (Build.HARDWARE.equals("goldfish")
|| Build.HARDWARE.equals("ranchu")) {
return true;
}
if (new File("/dev/socket/qemud").exists()
|| new File("/dev/qemu\_pipe").exists()) {
return true;
}
try {
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY\_SERVICE);
if (telephonyManager != null) {
String deviceId = telephonyManager.getDeviceId();
List<String> knownNumbers = Arrays.asList(known_numbers);
if (knownNumbers.contains(deviceId)) {
return true;
}
}
} catch (Exception e) {
}
return false;
}
上述代码使用了多种方法来检测设备是否为模拟器,这些方法包括:
- 检测 Build.FINGERPRINT 是否以 “generic” 或 “unknown” 开头
- 检测 Build.MODEL 是否包含 “google_sdk”、“Emulator” 或 “Android SDK built for x86”
- 检测 Build.MANUFACTURER 是否为 “Genymotion”
- 检测 Build.PRODUCT 是否为 “sdk”、“sdk_x86”、“vbox86p” 或 “emulator”
- 检测 Build.BOARD 是否为 “unknown” 或包含 “android” 或 “droid”
- 检测 Build.DEVICE 是否为 “unknown” 或包含 “android” 或 “droid”
- 检测 Build.HARDWARE 是否为 “goldfish”、“ranchu” 或包含 “ranchu”
- 检测 Build.BRAND 是否以 “generic” 开头,且 Build.DEVICE 以 “generic” 开头
- 检测 Build.PRODUCT 是否为 “google_sdk”
- 检测是否存在文件 “/dev/socket/qemud” 或 “/dev/qemu_pipe”
- 检测设备的电话号码是否为已知的模拟器电话号码
上述方法都是基于固件信息的判断,通过测试发现很多模拟器都失效,参考网上的教程,还有蓝牙、光线传感器、cpu检测,配合上面的固件信息,基本可以搞定大部分模拟器。
蓝牙检测代码:
public boolean notHasBlueTooth() {
BluetoothAdapter ba = BluetoothAdapter.getDefaultAdapter();
if (ba == null) {
return true;
} else {
// 如果有蓝牙不一定是有效的。获取蓝牙名称,若为null 则默认为模拟器
String name = ba.getName();
if (TextUtils.isEmpty(name)) {
return true;
} else {
return false;
}
}
}
光传感器检测代码:
public static Boolean notHasLightSensorManager(Context context) {
SensorManager sensorManager = (SensorManager) context.getSystemService(SENSOR\_SERVICE);
Sensor sensor8 = sensorManager.getDefaultSensor(Sensor.TYPE\_LIGHT); //光
if (null == sensor8) {
return true;
} else {
return false;
}
}
CPU检测代码:
public static boolean checkIsNotRealPhone() {
String cpuInfo = readCpuInfo();
if ((cpuInfo.contains("intel") || cpuInfo.contains("amd"))) {
return true;
}
return false;
}
public static String readCpuInfo() {
String result = "";
try {
String[] args = {"/system/bin/cat", "/proc/cpuinfo"};
ProcessBuilder cmd = new ProcessBuilder(args);
Process process = cmd.start();
StringBuffer sb = new StringBuffer();
String readLine = "";
BufferedReader responseReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "utf-8"));
while ((readLine = responseReader.readLine()) != null) {
sb.append(readLine);
## 最后
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**





**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618653875)
**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618653875)
**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**