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.