Android模擬器檢測常用方法


Android開發過程中,防作弊一直是老生常談的問題,而模擬器的檢測往往是防作弊中的重要一環,接下來有關於模擬器的檢測方法,和大家進行一個簡單的分享。

1.傳統的檢測方法。

傳統的檢測方法主要是對模擬器的IMSI、IDS、默認文件等幾個方面進行檢測。

(1)默認號碼:

 

[java]  view plain  copy
 
  1. private static String[] known_numbers = {"15555215554", "15555215556",  
  2.             "15555215558", "15555215560", "15555215562", "15555215564",  
  3.             "15555215566", "15555215568", "15555215570", "15555215572",  
  4.             "15555215574", "15555215576", "15555215578", "15555215580",  
  5.             "15555215582", "15555215584"};  

(2)默認ID:

 

 

[java]  view plain  copy
 
  1. private static String[] known_device_ids = {"000000000000000"};  

(3)默認IMSI:

 

 

[java]  view plain  copy
 
  1. private static String[] known_imsi_ids = {"310260000000000"};  

(4)默認文件路徑:

 

 

[java]  view plain  copy
 
  1. private static String[] known_files = {  
  2.             "/system/lib/libc_malloc_debug_qemu.so",  
  3.             "/sys/qemu_trace",  
  4.             "/system/bin/qemu-props"};  

在得知了這些信息后,只需在運行時進行檢測,如果檢測結果和默認值吻合,那么檢測設備便是模擬器。不過隨着防反作弊技術的迭代,現在很多模擬器都可以改變這些值來逃避檢測,所以上述傳統方法在很多時候未曾達到開發者的預期效果。

 

 

2.基於模擬器cpu信息的檢測。

成功率相較於傳統方法,有了更高的成功率。

cpu信息檢測主要是在cpu信息看看是否包含intel、amd等字段,很多模擬器目前對於cpu信息還無法進行模擬。

(1)讀取cpu信息:

 

[html]  view plain  copy
 
  1. public static String readCpuInfo() {  
  2.        String result = "";  
  3.        try {  
  4.            String[] args = {"/system/bin/cat", "/proc/cpuinfo"};  
  5.            ProcessBuilder cmd = new ProcessBuilder(args);  
  6.   
  7.            Process process = cmd.start();  
  8.            StringBuffer sb = new StringBuffer();  
  9.            String readLine = "";  
  10.            BufferedReader responseReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "utf-8"));  
  11.            while ((readLine = responseReader.readLine()) != null) {  
  12.                sb.append(readLine);  
  13.            }  
  14.            responseReader.close();  
  15.            result = sb.toString().toLowerCase();  
  16.        } catch (IOException ex) {  
  17.        }  
  18.        return result;  
  19.    }  

(2)進行判定:

 

 

[java]  view plain  copy
 
  1. String cpuInfo = readCpuInfo();  
  2. if ((cpuInfo.contains("intel") || cpuInfo.contains("amd"))) {return true;}  

類似的還有

 

 

[java]  view plain  copy
 
  1. String[] blockList = "google_sdk,sdk,sdk_x86,vbox86p".split(",");  

原理相同。

 

 

3.關鍵路徑檢測特定模擬器檢測

前面2個方法在很大程度上已經可以鑒定出很多模擬器了,但是對於某些在反防作弊上同樣熱愛的模擬器,需要特定的檢測方法。

bluestacks成功躲避了前兩種檢測方法,所以在這里給予其VIP的待遇。

以下是總結出來的一些bluestacks的關鍵路徑:

 

[java]  view plain  copy
 
  1. private static String[] known_bluestacks = {"/data/app/com.bluestacks.appmart-1.apk", "/data/app/com.bluestacks.BstCommandProcessor-1.apk",  
  2.            "/data/app/com.bluestacks.help-1.apk", "/data/app/com.bluestacks.home-1.apk", "/data/app/com.bluestacks.s2p-1.apk",  
  3.            "/data/app/com.bluestacks.searchapp-1.apk", "/data/bluestacks.prop", "/data/data/com.androVM.vmconfig",  
  4.            "/data/data/com.bluestacks.accelerometerui", "/data/data/com.bluestacks.appfinder", "/data/data/com.bluestacks.appmart",  
  5.            "/data/data/com.bluestacks.appsettings", "/data/data/com.bluestacks.BstCommandProcessor", "/data/data/com.bluestacks.bstfolder",  
  6.            "/data/data/com.bluestacks.help", "/data/data/com.bluestacks.home", "/data/data/com.bluestacks.s2p", "/data/data/com.bluestacks.searchapp",  
  7.            "/data/data/com.bluestacks.settings", "/data/data/com.bluestacks.setup", "/data/data/com.bluestacks.spotlight", "/mnt/prebundledapps/bluestacks.prop.orig"  
  8.    };  


檢測方法:

 

 

[java]  view plain  copy
 
  1. public static boolean checkBlueStacksFiles() {  
  2.         for (int i = 0; i < known_bluestacks.length; i++) {  
  3.             String file_name = known_bluestacks[i];  
  4.             File qemu_file = new File(file_name);  
  5.             if (qemu_file.exists()) {  
  6.                 FkLog.e("Result : Find BlueStacks Files!");  
  7.                 return true;  
  8.             }  
  9.         }  
  10.         FkLog.e("Result : Not Find BlueStacks Files!");  
  11.         return false;  
  12.     }  

 

這種基於關鍵路徑的檢測,便可以成功的檢測出bluestacks。

 

 

4.模擬器檢測新思路

模擬器檢測與模擬器反檢測都在不斷的更新迭代中,無法確保哪一種方法會永垂不朽,在這里分享下新的思路。

電池信息檢測

可以從電池的溫度和電量等信息入手,檢測溫度在使用過程中是否一直保持不變、或者是電量一直是固定值並且不是百分之百等等。

親測可以鑒別出genymotion、bluestacks等主流模擬器。


5.寫在最后

其實很多時候在檢測模擬器的過程中,都不是只使用某一種固定的方法,一來需要具體問題具體分析,二來也需要用多種方法來綜合檢測。言而總之,有了十八般武藝才能見招拆招。

ps:如有錯誤或需要補充的地方,請各位多多指正~

  http://blog.csdn.net/sinat_33150417/article/details/51320228


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM