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.
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
- Tiempo segundosNuestro reloj de ejemplo ajustable
-
bloque de 30 segundosBloque
floor(59 / 30)
30-59 segundos - Código generadoClave 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.
Encuentra el código con REA
-
Reduzca el APK a tres clases
Agente → REAinspect_android_package {"path": "aegis-v3.4.3.apk"} search_android_classes {"path": "aegis-v3.4.3.apk", "query": "Totp"}REA → agente * resultados seleccionadosPackage: com.beemdevelopment.aegis Version: 3.4.3 Classes: 3,077 Three matches: otp.TotpInfo ui.views.TotpProgressBar importers.TotpAuthenticatorImporterTotpInfoes 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. -
Conecte el generador a la pantalla de la aplicación
Agente → REAinspect_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 llamadoresTotpInfo methods: getOtp() · overload 0 getOtp(long) · overload 1 OtpInfo.getOtp callers: ui.views.EntryHolder.getOtp ui.MainActivity.copyEntryCodeREA identifica la sobrecarga de la marca de tiempo y encuentra a los llamantes del método base. Inspección
EntryHolder.getOtpluego muestra la pantalla llamandoTotpInfo.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.
// 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");
}
// 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.
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.
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:
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 :
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
- Lanzamiento oficial de Aegis 3.4.3 · Confirmación de fuente coincidente · Licencia GPL - 3.0
- Casos de referencia RFC 6238 · Datos de prueba de demostración
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.