C贸mo encontr茅 el huevo de Pascua en la protecci贸n de Android y no consegu铆 un trabajo en Google

Google ama los huevos de pascua. 脡l ama tanto que puedes encontrarlos en casi todos los productos de la compa帽铆a. La tradici贸n de los huevos de Pascua en Android se extiende desde las primeras versiones del sistema operativo (creo que todos saben lo que suceder谩 si haces clic en la l铆nea con la versi贸n de Android en la configuraci贸n varias veces).

Pero tambi茅n sucede que los huevos de Pascua se encuentran en los lugares m谩s inesperados. Incluso existe una leyenda: una vez que un programador google "bloqueo de mutex", y en lugar de los resultados de b煤squeda, lleg贸 a la p谩gina foo.bar , resolvi贸 todos los problemas y consigui贸 un trabajo en Google.

Reconstrucci贸n de eventos.
imagen

Aqu铆 est谩 la misma historia asombrosa (solo sin un final feliz) que me sucedi贸. Mensajes ocultos donde ciertamente no pueden estar, c贸digo Java inverso y bibliotecas nativas, una m谩quina virtual secreta, una entrevista en Google, todo esto bajo el corte.

Droidguard


Una tarde aburrida, hice un restablecimiento de f谩brica y comenc茅 a reconfigurar el tel茅fono inteligente. En primer lugar, Android nuevo me pidi贸 que ingresara a mi cuenta de Google. "Interesante, pero 驴c贸mo sucede el registro y el inicio de sesi贸n en Android?", Pens茅. La tarde dej贸 de ser l谩nguida.

Para interceptar y analizar el tr谩fico, uso Burp Suite de PortSwigger. Una versi贸n comunitaria gratuita ser谩 suficiente. Para que podamos ver las solicitudes https, primero debe instalar un certificado de PortSwigger en el dispositivo. Para las pruebas, en mis contenedores encontr茅 un Samsung Galaxy S de ocho a帽os con Android 4.4 a bordo. Si tiene algo m谩s nuevo, puede tener problemas con https: fijaci贸n de certificados y todo eso.

De hecho, no hay nada particularmente interesante en acceder a la API de Google. El dispositivo env铆a datos sobre s铆 mismo, a cambio recibe tokens ... El 煤nico momento incomprensible es la solicitud POST al servicio contra el abuso.



Despu茅s de esta solicitud, entre los par谩metros sin importancia, aparece uno misterioso, con el nombre droidguard_result . Es una cadena Base64 muy larga:



DroidGuard es un mecanismo de Google para separar bots y emuladores de dispositivos reales. SafetyNet tambi茅n utiliza datos de DroidGuard en su trabajo. Google tiene una cosa similar para los navegadores: Botguard.

Pero a煤n as铆, 驴qu茅 son estos datos, qu茅 se transmite en ellos? Ahora lo entenderemos.

Tampones de protocolo


驴De d贸nde viene el enlace www.googleapis.com/androidantiabuse/v1/x/create?alt=PROTO&key=AIzaSyBofcZsgLSS7BOnBjZPEkk4rYwzOIz-lTI , exactamente qui茅n hace esta solicitud en el sistema Android? Es f谩cil descubrir que este enlace se almacena directamente en este formulario en una de las clases ofuscadas de Google Play Services:

public bdd(Context var1, bdh var2) {
  this(var1, "https://www.googleapis.com/androidantiabuse/v1/x/create?alt=PROTO&key=AIzaSyBofcZsgLSS7BOnBjZPEkk4rYwzOIz-lTI", var2);
}

Burp, Content-Type POST 鈥 application/x-protobuf (Google Protocol Buffers, Google). json, 鈥 , .

protocol buffers :

  • .proto
  • .proto , protoc ( Android Java)

protobuf . 鈥 - protobuf .proto . 鈥 protoc- Google Play Services. .

apk Google Play Services , ( , apk ). dex2jar .dex .jar . Fernflower JetBrains. IntelliJ IDEA ( Android Studio), Android Studio . proguard , Java protobuf .

, protobuf Build.* (, ):

...
var3.a("4.0.33 (910055-30)");
a(var3, "BOARD", Build.BOARD);
a(var3, "BOOTLOADER", Build.BOOTLOADER);
a(var3, "BRAND", Build.BRAND);
a(var3, "CPU_ABI", Build.CPU_ABI);
a(var3, "CPU_ABI2", Build.CPU_ABI2);
a(var3, "DEVICE", Build.DEVICE);
...

, , protobuf . , . , :

if (!var7.d()) {
    throw new bdf("byteCode");
}
if (!var7.f()) {
    throw new bdf("vmUrl");
}
if (!var7.h()) {
    throw new bdf("vmChecksum");
}
if (!var7.j()) {
	throw new bdf("expiryTimeSecs");
}

, : byteCode, vmUrl, vmChecksum expiryTimeSecs. .

Google Play Services , , Build.* ( ). - , .

:
00:06:26.761 [main] INFO d.a.response.AntiabuseResponse 鈥 byteCode size: 34446
00:06:26.761 [main] INFO d.a.response.AntiabuseResponse 鈥 vmChecksum: C15E93CCFD9EF178293A2334A1C9F9B08F115993
00:06:26.761 [main] INFO d.a.response.AntiabuseResponse 鈥 vmUrl: www.gstatic.com/droidguard/C15E93CCFD9EF178293A2334A1C9F9B08F115993
00:06:26.761 [main] INFO d.a.response.AntiabuseResponse 鈥 expiryTimeSecs: 10

. , vmUrl.

apk


.apk , SHA-1 . apk 鈥 150 . : Android , 270 .



DroidGuardService, Google Play Services, , , .dex .so , reflection, com.google.ccc.abuse.droidguard.DroidGuard. - , DroidGuardService DroidGuard Droidguasso. Droidguasso 鈥 .

, DroidGuard 鈥 JNI .so . ABI , protobuf CPU_ABI: armeabi, x86, mips.

DroidGuardService - DroidGuard. DroidGuard, byteCode protobuf , , . droidguard_result.

, DroidGuard DroidGuardService ( apk, ). .dex APK, .jar . , DroidGuard . loadDroidGuardLibrary():

static
  {
    try
    {
      loadDroidGuardLibrary();
    }
    catch (Exception ex)
    {
      throw new RuntimeException(ex);
    }
  }

, loadDroidGuardLibrary() library.txt ( .apk ) System.load(String filename). , - apk, library.txt .so . .so lib System.loadLibrary(String libname).

. smali/baksmali 鈥 / dex . classes.dex .smali . com.google.ccc.abuse.droidguard.DroidGuard , System.loadLibrary("droidguard") loadDroidGuardLibrary(). smali , :

.method static constructor <clinit>()V
    .locals 1
    const-string v0, "droidguard"
    invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
    return-void
.end method

baksmali .dex, .jar. jar , . , .

DroidGuard . 鈥 , anti-abuse DroidGuard.

private fun runDroidguard() {
        var byteCode: ByteArray? = loadBytecode("bytecode.base64");
        byteCode?.let {
            val droidguard = DroidGuard(applicationContext, "addAccount", it)
            val params = mapOf("dg_email" to "test@gmail.com", "dg_gmsCoreVersion" to "910055-30",
                "dg_package" to "com.google.android.gms", "dg_androidId" to UUID.randomUUID().toString())
            droidguard.init()
            val result = droidguard.ss(params)
            droidguard.close()
        }
    }

Android Studio , DroidGuard.



initNative() java-: hasSystemFeature(), getMemoryInfo(), getPackageInfo()鈥 -, . , , .so .

libdroidguard.so


, , .dex .jar . , Hex-Rays IDA arm x86, . arm, . , x86 .

, Hex-Rays IDA, - c-. Java_com_google_ccc_abuse_droidguard_DroidGuard_ssNative, :

__int64 __fastcall Java_com_google_ccc_abuse_droidguard_DroidGuard_initNative(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9)  
...
  v14 = (*(_DWORD *)v9 + 684))(v9, a5);  
  v15 = (*(_DWORD *)v9 + 736))(v9, a5, 0);
...

. , . JNI, Android NDK jni.h. , JNI 鈥 JNIEnv* jobject (this). Java DroidGuard. , JNI :

__int64 __fastcall Java_com_google_ccc_abuse_droidguard_DroidGuard_initNative(_JNIEnv *env, jobject thiz, jobject context, jstring flow, jbyteArray byteCode, jobject runtimeApi, jobject extras, jint loggingFd, int runningInAppSide)
{
...
  programLength = _env->functions->GetArrayLength)(_env, byteCode);  
  programBytes = (jbyte *)_env->functions->GetByteArrayElements)(_env, byteCode, 0);
...

, anti-abuse , . , 芦 ?禄 . -, 鈥 . AES , - . 鈥 , . , 70: int, byte, , java , , if-goto .

Wake up, Neo


- . : ( ) , . , Java.

- . , , dlsym . java 5 25 - anti-abuse . 26- -. , .
Virtual Machine command #26
Method invocation vm->vm_method_table[2 * 0x77]
Method vmMethod_readString
index is 0x9d
string length is 0x0066
(new key is generated)
encoded string bytes are EB 4E E6 DC 34 13 35 4A DD 55 B3 91 33 05 61 04 C0 54 FD 95 2F 18 72 04 C1 55 E1 92 28 11 66 04 DD 4F B3 94 33 04 35 0A C1 4E B2 DB 12 17 79 4F 92 55 FC DB 33 05 35 45 C6 01 F7 89 29 1F 71 43 C7 40 E1 9F 6B 1E 70 48 DE 4E B8 CD 75 44 23 14 85 14 A7 C2 7F 40 26 42 84 17 A2 BB 21 19 7A 43 DE 44 BD 98 29 1B
decoded string bytes are 59 6F 75 27 72 65 20 6E 6F 74 20 6A 75 73 74 20 72 75 6E 6E 69 6E 67 20 73 74 72 69 6E 67 73 20 6F 6E 20 6F 75 72 20 2E 73 6F 21 20 54 61 6C 6B 20 74 6F 20 75 73 20 61 74 20 64 72 6F 69 64 67 75 61 72 64 2D 68 65 6C 6C 6F 2B 36 33 32 36 30 37 35 34 39 39 36 33 66 36 36 31 40 67 6F 6F 67 6C 65 2E 63 6F 6D
decoded string value is (You're not just running strings on our .so! Talk to us at droidguard@google.com)

, . , , . , , anti-abuse -. 25-30 - . , . , , . 芦droidguard+tag@google.com禄: anti-abuse tag .
droidguard@google.com: Don't be a stranger!
You got in! Talk to us at droidguard@google.com
Greetings from droidguard@google.com intrepid traveller! Say hi!
Was it easy to find this? droidguard@google.com would like to know
The folks at droidguard@google.com would appreciate hearing from you!
What's all this gobbledygook? Ask droidguard@google.com鈥 they'd know!
Hey! Fancy seeing you here. Have you spoken to droidguard@google.com yet?
You're not just running strings on our .so! Talk to us at droidguard@google.com

, ? , DroidGuard Google, .


. , . , - . , . , Hex-Rays IDA, . .

Java . jelf ( ELF ) Java_com_google_ccc_abuse_droidguard_DroidGuard_initNative , Capstone ( , , Java) .

, DroidGuard: anti-abuse , apk, , , , -. , Google. glassdoor . .

. DroidGuard : 芦 ?禄.



芦禄 鈥 . Google , DroidGuard: Android ( !). DroidGuard. .


. DroidGuard . ? !

Google . , 鈥 hr . .

Google . , Google Doc , . 芦禄 coursera, hackerrank, 鈥

. , 鈥 . Google Doc IDE. , . , , 5 . 鈥 . 鈥 , . , 鈥



鈥 . , , . . Base64 . Base64. , Base64, Java.

Google
, , ! . , .

3 , , . Google .

DroidGuard , , . , . , : , .

, Google . , ( , ). .

Source: https://habr.com/ru/post/442872/


All Articles