Android安全-代碼安全5-模擬器和調試器的檢測
1.模擬器的檢測
一般在分析 APK 的過程中會借助於 Android 模擬器,比如分析網絡行為,動態調試等。
因此從 APK 自我保護的角度出發,可以增加對 APK 當前運行環境的檢測,判斷是否運行在
模擬器中,如果運行在模擬器中可以選擇退出整個應用程序的執行或者跳到其他分支。模擬
器檢測的手段有很多,下面逐一分析。
(1)判斷一些唯一屬性
//判斷當前設備是否是模擬器。如果返回TRUE,則當前是模擬器,不是返回FALSE
public static boolean isEmulator(Context context){
try{
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String imei = tm.getDeviceId();
if (imei != null && imei.equals("000000000000000")){
return true;
}
return (Build.MODEL.equals("sdk")) || (Build.MODEL.equals("google_sdk"));
}catch (Exception ioe) {
}
return false;
}
當然還可以檢查一些其他的值,如電池的電池狀態、電池電量,Secure.ANDROID_ID,
DeviceId,手機號碼等。
(2)虛擬機文件檢測
相 對 於 真 實 設 備 , Android 模 擬 器 中 存 在 一 些 特 殊 的 文 件 或 者 目 錄 , 如
/system/bin/qemu-props,該可執行文件可以用來在模擬器中設置系統屬性。另外還有
/system/lib/libc_malloc_debug_qemu.so 文件以及/sys/qemu_trace 目錄。我們可以通過檢測這些
特殊文件或者目錄是否存在來判斷 Android 應用程序是否運行在模擬器中,關鍵代碼如下:
1. private static String[] known_files = { 2. "/system/lib/libc_malloc_debug_qemu.so", 3. "/sys/qemu_trace", 4. "/system/bin/qemu-props" 5. }; 6. 7. public static boolean hasQEmuFiles() { 8. for(String pipe : known_files) { 9. File qemu_file = new File(pipe); 10. if (qemu_file.exists()) 11. return true; 12. } 13. return false; 14. }
更完整的代碼可以參考 Tim Strazzere 的 Github 中 anti-emulator,該項目中還列舉了其他一些
模擬器檢測的方法,如檢測 socket 文件/dec/socket/qemud。
2.調試器的檢測
在對 APK 逆向分析時,往往會采取動態調試技術,可以使用 netbeans+apktool 對反匯編
生成的 smali 代碼進行動態調試。為了防止 APK 被動態調試,可以檢測是否有調試器連接。
Android 系統在 android.os.Debug 類中提供了 isDebuggerConnected()方法,用於檢測是否有調
試器連接。可以在 Application 類中調用 isDebuggerConnected()方法,判斷是否有調試器連接,
如果有,直接退出程序。
除了 isDebuggerConnected 方法,還可以通過在 AndroidManifest 文件的 application 節點中
加入 android:debuggable=”false”使得程序不可被調試,這樣如果希望調試代碼,則需要修改
該值為 true,因此可以在代碼中檢查這個屬性的值,判斷程序是否被修改過,代碼如下:
1. if(getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE != 0){ 2. System.out.println("Debug"); 3. android.os.Process.killProcess(android.os.Process.myPid()); 4. }
轉自:http://bbs.pediy.com/showthread.php?t=183116