技术共享之常见的6中种方法检测手机是否是虚拟机
来源:互联网 发布:linux安装smb服务 编辑:程序博客网 时间:2024/05/16 09:26
如今的移动应用开发,为了保证自己的劳动果实不被窃取,我们常常用到代码混淆、第三方加固 等等手段 。为了防止我们的app运行在虚拟机上被 ‘不良人’ 反编译,我们还需要判断手机是不是处于真机状态,我碰到过的一些用到了 反虚拟机 的软件 。例如 美团 和 饿了么 ,防止用户用虚拟机刷新用户,直接判断手机是否是真机,不是真机就退出程序,这样一方面可以防止用户刷新用户红包 ,也防止那些 xx0xx 反编译我们的软件。 闲话少说,
我就直接 上来一个工具类
package com.anyou.craftsman.utils;import android.annotation.SuppressLint;import android.content.Context;import android.telephony.TelephonyManager;import android.util.Log;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;/** * Created by 梁 on 2017/12/15. */public class EmulatorCheck { private static EmulatorCheck emulatorCheck ; public static EmulatorCheck getInstance() { if(emulatorCheck == null) { emulatorCheck = new EmulatorCheck() ; } return emulatorCheck ; } private static String[]known_pipes = { "/dev/socket/qemud", "/dev/qemu_pipe" };/** 第一种 检测模拟器上特有的几个文件* */ public 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.v("Result:","Not Find pipes!"); return false; } /* * 第二种 检测手机号 是不是以下 号码 * */ private static String[]known_numbers = {"15555215554","15555215556", "15555215558","15555215560","15555215562","15555215564", "15555215566","15555215568","15555215570","15555215572", "15555215574","15555215576","15555215578","15555215580", "15555215582","15555215584",}; public static Boolean CheckPhoneNumber(Context context){ TelephonyManager telephonyManager =(TelephonyManager)context .getSystemService(Context.TELEPHONY_SERVICE); @SuppressLint("MissingPermission") 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 是不是 15 个 0* */ private static String[]known_device_ids = {"000000000000000" // 默认ID }; public static Boolean CheckDeviceIDS(Context context){ TelephonyManager telephonyManager = (TelephonyManager)context .getSystemService(Context.TELEPHONY_SERVICE); @SuppressLint("MissingPermission") 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; }/*** 第四种 检测imesi is 是不是 31026 + 10个 0* */ private static String[]known_imsi_ids = {"310260000000000" // 默认的 imsi id }; public static Boolean CheckImsiIDS(Context context){ TelephonyManager telephonyManager =(TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); @SuppressLint("MissingPermission") 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; } /* * 第六种 检测运营商 如果 是Android 那么就是 模拟器 * */ public static boolean CheckOperatorNameAndroid(Context context){ @SuppressLint("WrongConstant") 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; }}
直接拿来使用,getInstance() 在调用其中的任何一个方法,返回为true 则就是虚拟机 ,false 为 真机 。
如有疑问 请留言 或者 在下方评论
阅读全文
0 0
- 技术共享之常见的6中种方法检测手机是否是虚拟机
- 检测是否是虚拟机
- 检测程序是否在虚拟机运行的两种方法
- 检测浏览器是否是手机
- 检测是否在虚拟机中
- android 判断手机是否是国内的手机的方法
- JS检测是否是手机浏览页面
- php检测是否是手机访问
- 在安卓中检测手机是否联网的方法
- cocos2dx下,检测手机是否联网的方法。。
- 检测手机中是否安装对应的应用
- 仿91助手的PC与android手机通讯(2) --- 检测是否是手机
- 仿91助手的PC与android手机通讯(2) --- 检测是否是手机
- linux检测是否是启动过程的方法
- 常见的WiFi攻击技术及检测方法总结
- 检测输入的字符串是否是数字的几种方法
- php网站判断用户是否是手机访问的方法
- 检测输入框中是否是合法的IP地址
- Java syncronized关键字用法详解
- NAT的原理与类型
- Angular学习笔记(一)
- 操作系统之进程
- 关于signal和fork的思考
- 技术共享之常见的6中种方法检测手机是否是虚拟机
- 从0开始学习SpringCould(6)--SpringBoot 集成swagger2
- Android开发蓝牙与ble设备的通讯
- spring《四》
- https://www.cnblogs.com/Y1Focus/p/6707121.html
- 基于灰度的模板匹配算法
- JDK版本切换
- 面向对象方法
- spring boot配置文件application.properties