在Android開發過程中,防作弊一直是老生常談的問題,而模擬器的檢測往往是防作弊中的重要一環,接下來有關於模擬器的檢測方法,和大家進行一個簡單的分享。
1.傳統的檢測方法。
傳統的檢測方法主要是對模擬器的IMSI、IDS、默認文件等幾個方面進行檢測。
(1)默認號碼:
- private static String[] known_numbers = {"15555215554", "15555215556",
- "15555215558", "15555215560", "15555215562", "15555215564",
- "15555215566", "15555215568", "15555215570", "15555215572",
- "15555215574", "15555215576", "15555215578", "15555215580",
- "15555215582", "15555215584"};
(2)默認ID:
- private static String[] known_device_ids = {"000000000000000"};
(3)默認IMSI:
- private static String[] known_imsi_ids = {"310260000000000"};
(4)默認文件路徑:
- private static String[] known_files = {
- "/system/lib/libc_malloc_debug_qemu.so",
- "/sys/qemu_trace",
- "/system/bin/qemu-props"};
在得知了這些信息后,只需在運行時進行檢測,如果檢測結果和默認值吻合,那么檢測設備便是模擬器。不過隨着防反作弊技術的迭代,現在很多模擬器都可以改變這些值來逃避檢測,所以上述傳統方法在很多時候未曾達到開發者的預期效果。
2.基於模擬器cpu信息的檢測。
成功率相較於傳統方法,有了更高的成功率。
cpu信息檢測主要是在cpu信息看看是否包含intel、amd等字段,很多模擬器目前對於cpu信息還無法進行模擬。
(1)讀取cpu信息:
- public static String readCpuInfo() {
- String result = "";
- try {
- String[] args = {"/system/bin/cat", "/proc/cpuinfo"};
- ProcessBuilder cmd = new ProcessBuilder(args);
- Process process = cmd.start();
- StringBuffer sb = new StringBuffer();
- String readLine = "";
- BufferedReader responseReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "utf-8"));
- while ((readLine = responseReader.readLine()) != null) {
- sb.append(readLine);
- }
- responseReader.close();
- result = sb.toString().toLowerCase();
- } catch (IOException ex) {
- }
- return result;
- }
(2)進行判定:
- String cpuInfo = readCpuInfo();
- if ((cpuInfo.contains("intel") || cpuInfo.contains("amd"))) {return true;}
類似的還有
- String[] blockList = "google_sdk,sdk,sdk_x86,vbox86p".split(",");
原理相同。
3.關鍵路徑檢測特定模擬器檢測
前面2個方法在很大程度上已經可以鑒定出很多模擬器了,但是對於某些在反防作弊上同樣熱愛的模擬器,需要特定的檢測方法。
bluestacks成功躲避了前兩種檢測方法,所以在這里給予其VIP的待遇。
以下是總結出來的一些bluestacks的關鍵路徑:
- private static String[] known_bluestacks = {"/data/app/com.bluestacks.appmart-1.apk", "/data/app/com.bluestacks.BstCommandProcessor-1.apk",
- "/data/app/com.bluestacks.help-1.apk", "/data/app/com.bluestacks.home-1.apk", "/data/app/com.bluestacks.s2p-1.apk",
- "/data/app/com.bluestacks.searchapp-1.apk", "/data/bluestacks.prop", "/data/data/com.androVM.vmconfig",
- "/data/data/com.bluestacks.accelerometerui", "/data/data/com.bluestacks.appfinder", "/data/data/com.bluestacks.appmart",
- "/data/data/com.bluestacks.appsettings", "/data/data/com.bluestacks.BstCommandProcessor", "/data/data/com.bluestacks.bstfolder",
- "/data/data/com.bluestacks.help", "/data/data/com.bluestacks.home", "/data/data/com.bluestacks.s2p", "/data/data/com.bluestacks.searchapp",
- "/data/data/com.bluestacks.settings", "/data/data/com.bluestacks.setup", "/data/data/com.bluestacks.spotlight", "/mnt/prebundledapps/bluestacks.prop.orig"
- };
檢測方法:
- public static boolean checkBlueStacksFiles() {
- for (int i = 0; i < known_bluestacks.length; i++) {
- String file_name = known_bluestacks[i];
- File qemu_file = new File(file_name);
- if (qemu_file.exists()) {
- FkLog.e("Result : Find BlueStacks Files!");
- return true;
- }
- }
- FkLog.e("Result : Not Find BlueStacks Files!");
- return false;
- }
這種基於關鍵路徑的檢測,便可以成功的檢測出bluestacks。
4.模擬器檢測新思路
模擬器檢測與模擬器反檢測都在不斷的更新迭代中,無法確保哪一種方法會永垂不朽,在這里分享下新的思路。
電池信息檢測
可以從電池的溫度和電量等信息入手,檢測溫度在使用過程中是否一直保持不變、或者是電量一直是固定值並且不是百分之百等等。
親測可以鑒別出genymotion、bluestacks等主流模擬器。
5.寫在最后
其實很多時候在檢測模擬器的過程中,都不是只使用某一種固定的方法,一來需要具體問題具體分析,二來也需要用多種方法來綜合檢測。言而總之,有了十八般武藝才能見招拆招。
ps:如有錯誤或需要補充的地方,請各位多多指正~
http://blog.csdn.net/sinat_33150417/article/details/51320228