1. 程式人生 > >技術共享之常見的6中種方法檢測手機是否是虛擬機器

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

如今的移動應用開發,為了保證自己的勞動果實不被竊取,我們常常用到程式碼混淆、第三方加固 等等手段 。為了防止我們的app執行在虛擬機器上被 ‘不良人’ 反編譯,我們還需要判斷手機是不是處於真機狀態,我碰到過的一些用到了 反虛擬機器 的軟體 。例如 美團 和 餓了麼 ,防止使用者用虛擬機器重新整理使用者,直接判斷手機是否是真機,不是真機就退出程式,這樣一方面可以防止使用者重新整理使用者紅包 ,也防止那些 xx0xx 反編譯我們的軟體。 閒話少說,
我就直接 上來一個工具類

  1 package com.anyou.craftsman.utils;
  2 
  3 import
android.annotation.SuppressLint; 4 import android.content.Context; 5 import android.telephony.TelephonyManager; 6 import android.util.Log; 7 8 import java.io.File; 9 import java.io.FileInputStream; 10 import java.io.FileNotFoundException; 11 import java.io.IOException; 12 import
java.io.InputStream; 13 14 /** 15 * Created by 樑 on 2017/12/15. 16 */ 17 18 public class EmulatorCheck { 19 20 private static EmulatorCheck emulatorCheck ; 21 22 public static EmulatorCheck getInstance() { 23 if(emulatorCheck == null) 24 { 25 emulatorCheck = new
EmulatorCheck() ; 26 } 27 return emulatorCheck ; 28 } 29 30 private static String[]known_pipes = { "/dev/socket/qemud", "/dev/qemu_pipe" }; 31 32 /* 33 * 第一種 檢測模擬器上特有的幾個檔案 34 * */ 35 public boolean checkPipes() 36 { 37 for(int i =0;i <known_pipes.length;i++){ 38 String pipes =known_pipes[i]; 39 File qemu_socket= new File(pipes); 40 if(qemu_socket.exists()){ 41 Log.v("Result:","Find pipes!"); 42 return true; 43 } 44 } 45 Log.v("Result:","Not Find pipes!"); 46 return false; 47 } 48 49 50 /* 51 * 第二種 檢測手機號 是不是以下 號碼 52 * */ 53 private static String[]known_numbers = {"15555215554","15555215556", 54 "15555215558","15555215560","15555215562","15555215564", 55 "15555215566","15555215568","15555215570","15555215572", 56 "15555215574","15555215576","15555215578","15555215580", 57 "15555215582","15555215584",}; 58 59 public static Boolean CheckPhoneNumber(Context context){ 60 TelephonyManager telephonyManager =(TelephonyManager)context 61 .getSystemService(Context.TELEPHONY_SERVICE); 62 63 @SuppressLint("MissingPermission") String phonenumber =telephonyManager.getLine1Number(); 64 65 for(String number :known_numbers){ 66 if(number.equalsIgnoreCase(phonenumber)){ 67 Log.v("Result:","Find PhoneNumber!"); 68 return true; 69 } 70 } 71 Log.v("Result:","Not Find PhoneNumber!"); 72 return false; 73 } 74 75 76 /* 77 * 第三種 檢測裝置IDS 是不是 15 個 0 78 * */ 79 80 private static String[]known_device_ids = {"000000000000000" // 預設ID 81 }; 82 83 public static Boolean CheckDeviceIDS(Context context){ 84 TelephonyManager telephonyManager = (TelephonyManager)context 85 .getSystemService(Context.TELEPHONY_SERVICE); 86 87 @SuppressLint("MissingPermission") String device_ids =telephonyManager.getDeviceId(); 88 89 for(String know_deviceid : known_device_ids){ 90 if(know_deviceid.equalsIgnoreCase(device_ids)){ 91 Log.v("Result:","Find ids: 000000000000000!"); 92 return true; 93 } 94 } 95 Log.v("Result:","Not Find ids: 000000000000000!"); 96 return false; 97 } 98 99 100 /* 101 * 102 * 第四種 檢測imesi is 是不是 31026 + 10個 0 103 * */ 104 private static String[]known_imsi_ids = {"310260000000000" // 預設的 imsi id 105 }; 106 public static Boolean CheckImsiIDS(Context context){ 107 TelephonyManager telephonyManager =(TelephonyManager) 108 context.getSystemService(Context.TELEPHONY_SERVICE); 109 110 @SuppressLint("MissingPermission") String imsi_ids =telephonyManager.getSubscriberId(); 111 112 for(String know_imsi :known_imsi_ids){ 113 if(know_imsi.equalsIgnoreCase(imsi_ids)){ 114 Log.v("Result:","Find imsi ids: 310260000000000!"); 115 return true; 116 } 117 } 118 Log.v("Result:","Not Find imsi ids: 310260000000000!"); 119 return false; 120 } 121 122 123 124 /* 125 * 第五種 檢測裝置資訊 126 * */ 127 public static Boolean CheckEmulatorBuild(Context context){ 128 String BOARD =android.os.Build.BOARD; 129 String BOOTLOADER =android.os.Build.BOOTLOADER; 130 String BRAND =android.os.Build.BRAND; 131 String DEVICE =android.os.Build.DEVICE; 132 String HARDWARE =android.os.Build.HARDWARE; 133 String MODEL =android.os.Build.MODEL; 134 String PRODUCT =android.os.Build.PRODUCT; 135 if(BOARD== "unknown"|| BOOTLOADER== "unknown" 136 ||BRAND =="generic" ||DEVICE =="generic" 137 ||MODEL =="sdk" ||PRODUCT =="sdk" 138 ||HARDWARE =="goldfish") 139 { 140 Log.v("Result:","Find Emulator by EmulatorBuild!"); 141 return true; 142 } 143 Log.v("Result:","Not Find Emulator by EmulatorBuild!"); 144 return false; 145 } 146 147 148 /* 149 * 第六種 檢測運營商 如果 是Android 那麼就是 模擬器 150 * */ 151 152 153 public static boolean CheckOperatorNameAndroid(Context context){ 154 @SuppressLint("WrongConstant") String szOperatorName = ((TelephonyManager) 155 context.getSystemService("phone")).getNetworkOperatorName(); 156 157 if(szOperatorName.toLowerCase().equals("android")== true){ 158 Log.v("Result:","Find Emulator by OperatorName!"); 159 return true; 160 } 161 Log.v("Result:","Not Find Emulator by OperatorName!"); 162 return false; 163 } 164 165 166 167 } 168

直接拿來使用,getInstance() 在呼叫其中的任何一個方法,返回為true 則就是虛擬機器 ,false 為 真機 。

相關推薦

技術共享常見6方法檢測手機是否是虛擬機器

如今的移動應用開發,為了保證自己的勞動果實不被竊取,我們常常用到程式碼混淆、第三方加固 等等手段 。為了防止我們的app執行在虛擬機器上被 ‘不良人’ 反編譯,我們還需要判斷手機是不是處於真機狀態,我碰到過的一些用到了 反虛擬機器 的軟體 。例如 美團 和 餓了麼 ,防止使用者用虛擬機器重新整理使用者,直接判

Hadoop共享全域性資訊的幾方法

在編寫Hadoop MapReduce程式的過程中有時候需要在各個Mapper或者Reducer中使用一些共享的全域性資料,例如在處理整數資料表格的時候有時候需要讓每個Reducer知道各個列的取值範圍或是一些圖演算法中需要讓各個Reducer知道圖的連通關係。 加入ke

android呼叫共享庫.so的幾方法

底層呼叫共享庫中函式的方法 > 首先使用dlopen("libmedia.so", RTLD_LAZY); 載入對應的庫檔案libmedia.so; > 之後使用dlsym(libhand

MYSQL 事務處理常見有兩方法

直接 操作 mysql www. 數據庫引擎 大量 .com 比較 lba MYSQL在操作大量的數據或者比較重要的數據的時候,事務處理很重要,比如銀行的轉賬,支付,等等,作為開發人員事務是必須的一步。 1、用 BEGIN, ROLLBACK, COM

執行緒 建立(兩方法)和啟動

java使用Thread類代表執行緒,所有的執行緒物件都必須是Thread 類或者子類的例項。 每個執行緒的任務是完成一定的任務,就是執行一段程式流。 目前有兩種建立方式(第三種後續補充) 一種是繼承Thread類 一種是實現Runnable介面` 一、繼承Thread類 1.定

高考數學快速解題法常見的放縮方法

放縮法是一種常用的證明技巧,主要用於研究與正整數有關的數學問題猜想與遞推是數列中常見的問題而放縮法時常是數列證明問題中至關重要的一種策略, 不等式要放縮怎麼破,高考數學快速解題法今天給小夥伴們帶來常見的放縮方法。 一、基本放縮 ① e^x≥x+1當x=0時等號成立   

UnityC#——非同步委託開啟執行緒,三方法檢測結束

Unity之C#——非同步委託開啟執行緒,三種方法檢測結束 原始碼如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using

資料結構 常見的幾“排序”

排序(sorting)是演算法家族裡比較重要也比較基礎的一類,內容也是五花八門了: 1、有“基於比較”的,也有“不基於比較”的; 2、有迭代的(iterative)也有遞迴的(recursive); 3、有利用分治法(divide and conquer)思路解決的;(除了顯而易見的“二路歸併”演算法,“代入

執行緒 建立(兩方法)和啟動

java使用Thread類代表執行緒,所有的執行緒物件都必須是Thread 類或者子類的例項。 每個執行緒的任務是完成一定的任務,就是執行一段程式流。 目前有兩種建立方式(第三種後續補充) 一種是繼承Thread類 一種是實現Runnable介面` 一、繼承Th

Java 延時常見的幾方法

1、 用Thread就不會iu無法終止 new Thread(new Runnable() { public void run() { while (true) { test(

iOS-延時執行常見的幾方法

本節主要介紹幾種我們通常用到的實現延時的方法。 延時方法我們統一呼叫- (void)delayMethod - (void)delayMethod { NSLog(@"delayMethodEnd = %@",[NSThread currentT

Java常見的幾排序演算法-插入、選擇、冒泡、快排、堆排等 .

本文就是介紹一些常見的排序演算法。排序是一個非常常見的應用場景,很多時候,我們需要根據自己需要排序的資料型別,來自定義排序演算法,但是,在這裡,我們只介紹這些基礎排序演算法,包括:插入排序、選擇排序、氣泡排序、快速排序(重點)、堆排序、歸併排序等等。看下圖: 給定陣

Java常見的幾排序演算法-插入、選擇、冒泡、快排、堆排等

Java面試寶典系列之基礎排序演算法 作者:egg 郵箱:[email protected] 本文就是介紹一些常見的排序演算法。排序是一個非常常見的應用場景,很多時候,我們需要根據自己需要排序的資料型別,來自

linux實現共享記憶體同步的四方法

本文主要對實現共享記憶體同步的四種方法進行了介紹。共享記憶體是一種最為高效的程序間通訊方式,程序可以直接讀寫記憶體,而不需要任何資料的拷貝。它是IPC物件的一種。為了在多個程序間交換資訊,核心專門留出了一塊記憶體區,可以由需要訪問的程序將其對映到自己的私有地址空間。程序就可以

php5 的 session 詳解二:有兩方法傳遞 一個會話 ID:

cookie URL 引數 會話模組支援這兩種方法。cookie 更優化,但由於不總是可用,也提供替代的方法。第二種方法直接將會話 ID 嵌入到 URL 中間去。PHP 可以透明地轉換連線。除非是使用 PHP 4.2 或更低版本,需要手工在編譯PHP 時啟用。在 Unix

Entity Framework技術系列2:三開發模式實現資料訪問

前言 Entity Framework支援Database First、Model First和Code Only三種開發模式,各模式的開發流程大相徑庭,開發體驗完全不一樣。三種開發模式各有優缺點,對於程式設計師沒有哪種模式最好,只有哪種模式更適合。接下來我將分別使用這

正則表示式Matcher類group方法

前言 同事把一個excel表給我,裡面的資料大概有幾千的樣子吧。自己需要把裡面的資料一個一個拿出來做一個http請求,對得到的結果進行過濾,然後再寫到上面去。這是就涉及到用指令碼來進行操作了,於是自己搞了一個Java的指令碼出來,裡面涉及到一些正則表示式,自己雖然說會,但是一直對 Matcher類中的grou

詳細解說Tomcat 設定虛擬路徑的幾方法及為什麼設定虛擬路徑

說明:此次使用的是Tomcat 7.0   很多朋友都會很疑惑,既然我們都知道在Tomcat伺服器上部署專案只要將專案打包,然後放到webapps目錄下就可以了,為什麼還需要配置虛擬路徑?的確,把專案放到webapps目錄下非常方便,至少在部署一個專案時,直接把專案扔到webapps目錄下所進行

【資訊科技】【2011】【含部分原始碼】影象處理和機器學習技術在數字乳腺影象癌組織檢測與分類的應用

本文為馬來西亞馬來亞大學(作者:JAWAD NAGI)的電腦科學碩士論文,共355頁。 乳腺癌是最常見的癌症之一,也是導致女性死亡的主要原因。乳腺攝影是目前最有效的乳腺癌影像學檢查方法,可用於鑑別異常癌細胞。研究顯示,在當前的乳腺癌篩查中,大約15%到30%的

方法檢測你的 Linux 是32位還是64位

1. 執行‘uname -a’ 命令例如,在我的系統裡,它顯示了以下資訊:$ uname-aLinux ubuntu 3.11.0-12-generic#19-Ubuntu SMP WedOct916:12:00 UTC 2013 i686 athlon i686 GNU/L