MASTG-KNOW-0031: Detecção de Emuladores
No contexto de anti-reversão, o objetivo da detecção de emuladores é aumentar a dificuldade de executar o aplicativo em um dispositivo emulado, o que impede algumas ferramentas e técnicas que os engenheiros reversos costumam utilizar. Essa dificuldade aumentada força o engenheiro reverso a contornar as verificações de emulador ou utilizar um dispositivo físico, impedindo assim o acesso necessário para análises de dispositivos em larga escala.
Existem vários indicadores de que o dispositivo em questão está sendo emulado. Embora todas essas chamadas de API possam ser interceptadas (hooked), esses indicadores fornecem uma primeira linha de defesa modesta.
O primeiro conjunto de indicadores está no arquivo build.prop:
Método da API Valor Significado
Build.ABI armeabi possivelmente emulador
BUILD.ABI2 unknown possivelmente emulador
Build.BOARD unknown emulador
Build.Brand generic emulador
Build.DEVICE generic emulador
Build.FINGERPRINT generic emulador
Build.Hardware goldfish emulador
Build.Host android-test possivelmente emulador
Build.ID FRF91 emulador
Build.MANUFACTURER unknown emulador
Build.MODEL sdk emulador
Build.PRODUCT sdk emulador
Build.RADIO unknown possivelmente emulador
Build.SERIAL null emulador
Build.USER android-build emulador
Você pode editar o arquivo build.prop em um dispositivo Android com root ou modificá-lo durante a compilação do AOSP a partir do código-fonte. Ambas as técnicas permitirão contornar as verificações estáticas de strings acima.
O próximo conjunto de indicadores estáticos utiliza o Gerenciador de Telefonia (Telephony manager). Todos os emuladores Android possuem valores fixos que esta API pode consultar:
API Valor Significado
TelephonyManager.getDeviceId() 0's emulador
TelephonyManager.getLine1 Number() 155552155 emulador
TelephonyManager.getNetworkCountryIso() us possivelmente emulador
TelephonyManager.getNetworkType() 3 possivelmente emulador
TelephonyManager.getNetworkOperator().substring(0,3) 310 possivelmente emulador
TelephonyManager.getNetworkOperator().substring(3) 260 possivelmente emulador
TelephonyManager.getPhoneType() 1 possivelmente emulador
TelephonyManager.getSimCountryIso() us possivelmente emulador
TelephonyManager.getSimSerial Number() 89014103211118510720 emulador
TelephonyManager.getSubscriberId() 310260000000000 emulador
TelephonyManager.getVoiceMailNumber() 15552175049 emulador
Lembre-se de que uma estrutura de interceptação (hooking framework), como Xposed ou Frida, pode interceptar esta API para fornecer dados falsos.