技術共享之常見的6中種方法檢測手機是否是虛擬機

如今的移動應用開發,爲了保證自己的勞動果實不被竊取,我們常常用到代碼混淆、第三方加固 等等手段 。爲了防止我們的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 爲 真機 。

如有疑問 請留言 或者 在下方評論

發佈了27 篇原創文章 · 獲贊 12 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章