Caso práctico * Autenticador Aegis

Cómo funciona un autenticador
¿generar un código de inicio de sesión?

Un código de seis dígitos cambia cada 30 segundos. Usa REA para encontrar el cálculo en un APK de Android y luego reconstrúyelo con un reloj que puedas controlar.

Aegis 3.4.3 * Android * Versión oficial APK * 6.9 MB

Ver Aegis en GitHub

Desde un APK hasta un código que puedes reproducir

  1. 01 * Localice la función3.077 clases → generación de métodos REA busca en el paquete y rastrea el código utilizado por las acciones de visualización y copia.
  2. 02 * Leer el cálculoHora + clave de cuenta → seis dígitos REA devuelve los métodos y valores predeterminados. El agente explica cómo encajan.
  3. 03 * Reconstruir y comprobarCambia el reloj. Mira el código.Una nueva demostración del navegador reproduce la regla y la compara con casos de referencia pública.

Pregúntele a su agente

La aplicación muestra un código de inicio de sesión cambiante. Queremos encontrar qué lo hace cambiar y reproduce ese comportamiento.

Su agente de codificación

Analiza aegis-v3.4.3.apk con REA. Explica cómo se genera el código de acceso de seis dígitos y por qué cambia cada 30 segundos. Crea una pequeña demo donde pueda cambiar la hora.

Un mensaje de ejemplo para el APK descargado, con el análisis de Android de REA configurado. Obtenga el APK y la configuración de análisis ↓

Pruebe el generador de código

La aplicación agrupa el tiempo en bloques de 30 segundos. Combina el número de bloque con la clave de cuenta para generar un código. La misma clave y bloque producen el mismo código.

Mueve el reloj 60 segundos

  1. Tiempo59 segundosNuestro reloj de ejemplo ajustable
  2. bloque de 30 segundosBloque 1floor(59 / 30)
    30-59 segundos
  3. Código generado287082Clave de cuenta + bloque → seis dígitos

A los 59 segundos: 287082. A los 60 segundos: 359152. Moverse dentro de un bloque deja el código sin cambios.

La clave es fija, pública Datos de prueba RFC 6238. La demostración implementa el cálculo recuperado del APK .

Encuentra el código con REA

  1. Reduzca el APK a tres clases

    Agente → REA
    inspect_android_package
    {"path": "aegis-v3.4.3.apk"}
    
    search_android_classes
    {"path": "aegis-v3.4.3.apk",
     "query": "Totp"}
    REA → agente * resultados seleccionados
    Package: com.beemdevelopment.aegis
    Version: 3.4.3
    Classes: 3,077
    
    Three matches:
      otp.TotpInfo
      ui.views.TotpProgressBar
      importers.TotpAuthenticatorImporter

    TotpInfo es el candidato de cálculo; los otros dos se refieren a la barra de progreso y las cuentas importadas. TOTP significa una contraseña de un solo uso basada en el tiempo.

  2. Conecte el generador a la pantalla de la aplicación

    Agente → REA
    inspect_android_class
    {"path": "aegis-v3.4.3.apk",
     "class_name":
      "com.beemdevelopment.aegis.otp.TotpInfo"}
    
    trace_android_references
    {"path": "aegis-v3.4.3.apk",
     "class_name":
      "com.beemdevelopment.aegis.otp.OtpInfo",
     "method_name": "getOtp"}
    REA → agente * métodos y llamadores
    TotpInfo methods:
      getOtp()      · overload 0
      getOtp(long)  · overload 1
    
    OtpInfo.getOtp callers:
      ui.views.EntryHolder.getOtp
      ui.MainActivity.copyEntryCode

    REA identifica la sobrecarga de la marca de tiempo y encuentra a los llamantes del método base. Inspección EntryHolder.getOtp luego muestra la pantalla llamando TotpInfo.getOtp(timestamp).

Las solicitudes muestran una ruta de entrada acortada. Los nombres de clase de resultado omiten lo común com.beemdevelopment.aegis prefijo.

Lea el cálculo

REA devoluciones la conversión del reloj, la configuración predeterminada y los métodos de generación. Los constructores establecen un intervalo de 30 segundos y seis dígitos; el método de marca de tiempo convierte los segundos en un número de bloque.

REA * Java descompilado seleccionado
// TotpInfo defaults and clock
setPeriod(30);
getOtp(System.currentTimeMillis() / 1000);

// OtpInfo default algorithm and digits
this(bArr, "SHA1", 6);

// Block passed to the generator
(long) Math.floor(j / ((double) this._period))

// generateOTP → getHash
byte[] hash = getHash(bArr, str, j);

// getHash: account key + encoded block
Mac mac = Mac.getInstance(str);
mac.init(secretKeySpec);
return mac.doFinal(bArrArray);

// OTP.toString, case 0
this._code % ((int) Math.pow(10.0d, i))

// Keep leading zeroes
while (sb.length() < i) {
    sb.insert(0, "0");
}
Resumen legible * interpretación del agente
// Group time into 30-second blocks
seconds = current_time_ms / 1000
block = floor(seconds / 30)

// Generate a number from the key and block
hash = HMAC_SHA1(account_key,
                 big_endian_8_bytes(block))
number = select_31_bits(hash)

// Format the default six-digit code
code = number % 1_000_000
code = pad_with_zeroes(code, 6)

El tiempo elige el bloque. Los segundos 30 a 59 dan todos el bloque 1. A los 60 segundos, el bloque se convierte en 2.

La clave también importa. El generador combina la clave de cuenta con el bloque. Una cuenta con una clave diferente puede mostrar un código diferente al mismo tiempo.

Mantén seis dígitos. El resto después de la división por 1.000.000 se rellena con ceros cuando es necesario, por lo que un código puede comenzar con 0.

Extractos de varios métodos inspeccionados, con envoltura de línea para mostrar. El panel de la derecha es un resumen explicativo. El código Aegis es GPL-3.0.

Dentro del generador

El APK lanzado pone generateOTP en kotlin.ExceptionsKt. REA sigue la llamada de TotpInfo y devuelve este cuerpo; la fuente original llama al ayudante HOTP.

REA * generateOTP, cuerpo completo
public static OTP generateOTP(byte[] bArr, String str,
        int i, long j)
        throws NoSuchAlgorithmException, InvalidKeyException {
    byte[] hash = getHash(bArr, str, j);
    int i2 = hash[hash.length - 1] & 15;
    return new OTP(
        (hash[i2 + 3] & 255)
        | ((hash[i2] & 127) << 24)
        | ((hash[i2 + 1] & 255) << 16)
        | ((hash[i2 + 2] & 255) << 8), i, 0);
}

El último byte hash selecciona una posición. Cuatro bytes en esa posición proporcionan un número positivo de 31 bits; el formateo lo reduce al número solicitado de dígitos. El último argumento del constructor selecciona la rama de formato de código introducida por compilación.

Compare con la fuente de publicación correspondiente.

Compruebe la reconstrucción

Ensamblamos los métodos Java devueltos por REA seleccionados en un pequeño programa de prueba. Su producción coincidió con una reconstrucción independiente en 133 casos de prueba, incluidos los límites de los bloques de tiempo y los códigos que comienzan con cero.

Tiempo de ejemplo Bloque Código de seis dígitos
30 segundos 1 287082
59 segundos 1 287082
60 segundos 2 359152
1,111,111,109 segundos 37,037,036 081804

El generador también coincide con los seis casos de referencia SHA-1 publicados en RFC 6238 (en inglés). Compare la implementación del navegador con ellos:

Lea el cálculo de la demostración

Los casos de referencia usan ocho dígitos. La verificación también verifica sus resultados de seis dígitos.

La verificación ejecuta métodos Java extraídos y la nueva demostración. El Android APK fue inspeccionado estáticamente.

Inspeccione el APK usted mismo

Configurar REA en macOS o Linux , descargue estos dos archivos en la misma carpeta. En Windows, use un entorno Linux como WSL.

El análisis de Android necesita un JDK 17 completo o posterior. Selecciónelo con JAVA_HOME o PATH. Este caso usó JDK 21.

Apunte REA al archivo del proveedor e inspeccione el APK :

macOS / Linux
REA_JADX_MCP_JAR="$PWD/jadx-headless-mcp-0.7.1-all.jar" \
npx rea-agents@latest inspect-android-package \
  ./aegis-v3.4.3.apk --format json --full-output

Su agente puede continuar a través del REA de CLI utilizando el mensaje anterior. Para MCP , agregue REA_JADX_MCP_JAR al entorno del servidor REA y vuelva a conectarlo.

Una pregunta siguiente: ¿qué sucede cuando una cuenta usa ocho dígitos o un intervalo de tiempo diferente?

Fuentes

Inspeccionado con REA 6.1.0 el 9 de octubre de 2026. Los extractos descompilados se acreditan a Aegis; el diagrama, el resumen legible y la reconstrucción del navegador son nuevo material didáctico.

Arriba