Android安全–检测是否为Android模拟器
浏览:3364次 出处信息
从安全上,如何检测是否为Android模拟器?
检测的背景是什么?
有时候需要检测是否在模拟器上运行还是在真机运行,话不多说。检测代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | package com.monkey.antiemulator; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import android.content.Context; import android.telephony.TelephonyManager; import android.util.Log; public class AntiEmulator { private static String[] known_pipes={ "/dev/socket/qemud", "/dev/qemu_pipe" }; private static String[] known_qemu_drivers = { "goldfish" }; private static String[] known_files = { "/system/lib/libc_malloc_debug_qemu.so", "/sys/qemu_trace", "/system/bin/qemu-props" }; private static String[] known_numbers = { "15555215554", "15555215556", "15555215558", "15555215560", "15555215562", "15555215564", "15555215566", "15555215568", "15555215570", "15555215572", "15555215574", "15555215576", "15555215578", "15555215580", "15555215582", "15555215584", }; private static String[] known_device_ids = { "000000000000000" // 默认ID }; private static String[] known_imsi_ids = { "310260000000000" // 默认的 imsi id }; //检测“/dev/socket/qemud”,“/dev/qemu_pipe”这两个通道 public static boolean checkPipes(){ for(int i = 0; i < known_pipes.length; i++){ String pipes = known_pipes[i]; File qemu_socket = new File(pipes); if(qemu_socket.exists()){ Log.v("Result:", "Find pipes!"); return true; } } Log.i("Result:", "Not Find pipes!"); return false; } // 检测驱动文件内容 // 读取文件内容,然后检查已知QEmu的驱动程序的列表 public static Boolean checkQEmuDriverFile(){ File driver_file = new File("/proc/tty/drivers"); if(driver_file.exists() && driver_file.canRead()){ byte[] data = new byte[1024]; //(int)driver_file.length() try { InputStream inStream = new FileInputStream(driver_file); inStream.read(data); inStream.close(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } String driver_data = new String(data); for(String known_qemu_driver : AntiEmulator.known_qemu_drivers){ if(driver_data.indexOf(known_qemu_driver) != -1){ Log.i("Result:", "Find know_qemu_drivers!"); return true; } } } Log.i("Result:", "Not Find known_qemu_drivers!"); return false; } //检测模拟器上特有的几个文件 public static Boolean CheckEmulatorFiles(){ for(int i = 0; i < known_files.length; i++){ String file_name = known_files[i]; File qemu_file = new File(file_name); if(qemu_file.exists()){ Log.v("Result:", "Find Emulator Files!"); return true; } } Log.v("Result:", "Not Find Emulator Files!"); return false; } // 检测模拟器默认的电话号码 public static Boolean CheckPhoneNumber(Context context) { TelephonyManager telephonyManager = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); String phonenumber = telephonyManager.getLine1Number(); for (String number : known_numbers) { if (number.equalsIgnoreCase(phonenumber)) { Log.v("Result:", "Find PhoneNumber!"); return true; } } Log.v("Result:", "Not Find PhoneNumber!"); return false; } //检测设备IDS 是不是 “000000000000000” public static Boolean CheckDeviceIDS(Context context) { TelephonyManager telephonyManager = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); String device_ids = telephonyManager.getDeviceId(); for (String know_deviceid : known_device_ids) { if (know_deviceid.equalsIgnoreCase(device_ids)) { Log.v("Result:", "Find ids: 000000000000000!"); return true; } } Log.v("Result:", "Not Find ids: 000000000000000!"); return false; } // 检测imsi id是不是“310260000000000” public static Boolean CheckImsiIDS(Context context){ TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); String imsi_ids = telephonyManager.getSubscriberId(); for (String know_imsi : known_imsi_ids) { if (know_imsi.equalsIgnoreCase(imsi_ids)) { Log.v("Result:", "Find imsi ids: 310260000000000!"); return true; } } Log.v("Result:", "Not Find imsi ids: 310260000000000!"); return false; } //检测手机上的一些硬件信息 public static Boolean CheckEmulatorBuild(Context context){ String BOARD = android.os.Build.BOARD; String BOOTLOADER = android.os.Build.BOOTLOADER; String BRAND = android.os.Build.BRAND; String DEVICE = android.os.Build.DEVICE; String HARDWARE = android.os.Build.HARDWARE; String MODEL = android.os.Build.MODEL; String PRODUCT = android.os.Build.PRODUCT; if (BOARD == "unknown" || BOOTLOADER == "unknown" || BRAND == "generic" || DEVICE == "generic" || MODEL == "sdk" || PRODUCT == "sdk" || HARDWARE == "goldfish") { Log.v("Result:", "Find Emulator by EmulatorBuild!"); return true; } Log.v("Result:", "Not Find Emulator by EmulatorBuild!"); return false; } //检测手机运营商家 public static boolean CheckOperatorNameAndroid(Context context) { String szOperatorName = ((TelephonyManager) context.getSystemService("phone")).getNetworkOperatorName(); if (szOperatorName.toLowerCase().equals("android") == true) { Log.v("Result:", "Find Emulator by OperatorName!"); return true; } Log.v("Result:", "Not Find Emulator by OperatorName!"); return false; } } |
模拟器运行结果:
真机运行结果:
引用自http://0nly3nd.sinaapp.com/?p=368
本文链接:http://www.blogfshare.com/anti-emulator.html
建议继续学习:
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
后一篇:说说 XcodeGhost 这个事 >>
文章信息
- 作者:AloneMonkey 来源: Coder
- 标签: 模拟器
- 发布时间:2015-09-04 21:45:03
建议继续学习
近3天十大热文
- [55] Oracle MTS模式下 进程地址与会话信
- [54] IOS安全–浅谈关于IOS加固的几种方法
- [53] 如何拿下简短的域名
- [53] android 开发入门
- [51] Go Reflect 性能
- [50] 图书馆的世界纪录
- [48] 读书笔记-壹百度:百度十年千倍的29条法则
- [46] 【社会化设计】自我(self)部分――欢迎区
- [39] 程序员技术练级攻略
- [32] 视觉调整-设计师 vs. 逻辑