Demandez à votre agent
L'application affiche un code de connexion changeant. Nous voulons trouver ce qui le fait changer et reproduisez ce comportement.
Analyse aegis-v3.4.3.apk avec REA. Explique comment le code de connexion à six chiffres est généré et pourquoi il change toutes les 30 secondes. Crée une petite démo où je peux modifier l’heure.
Un exemple d'invite pour le APK téléchargé, avec l'analyse Android de REA configurée. Obtenez le APK et la configuration de l'analyse ↓
Essayez le générateur de code
L'application regroupe le temps en blocs de 30 secondes. Il combine le numéro de bloc avec la clé de compte pour générer un code. La même clé et le même bloc produisent le même code.
Déplacez l'horloge sur 60 secondes
- Temps secondesNotre horloge d'exemple réglable
-
bloc de 30 secondesBloquer
floor(59 / 30)
30-59 secondes - Code généréClé de compte + bloc → six chiffres
À 59 secondes: 287082. À 60 secondes: 359152. Le déplacement à l'intérieur d'un bloc laisse le code inchangé.
Trouver le code avec REA
-
Limitez le APK à trois classes
Agent → REAinspect_android_package {"path": "aegis-v3.4.3.apk"} search_android_classes {"path": "aegis-v3.4.3.apk", "query": "Totp"}REA → agent · résultats sélectionnésPackage: com.beemdevelopment.aegis Version: 3.4.3 Classes: 3,077 Three matches: otp.TotpInfo ui.views.TotpProgressBar importers.TotpAuthenticatorImporterTotpInfoest le calcul candidat; les deux autres concernent la barre de progression et les comptes importés. TOTP signifie un mot de passe à usage unique basé sur le temps. -
Connectez le générateur à l'écran de l'application
Agent → 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 → méthodes et appelants de l'agent ·TotpInfo methods: getOtp() · overload 0 getOtp(long) · overload 1 OtpInfo.getOtp callers: ui.views.EntryHolder.getOtp ui.MainActivity.copyEntryCodeREA identifie la surcharge d'horodatage et trouve les appelants de la méthode de base. Inspection
EntryHolder.getOtppuis affiche l'appel d'affichageTotpInfo.getOtp(timestamp).
Les requêtes affichent un chemin d'entrée raccourci. Les noms de classe de résultat omettent le commun com.beemdevelopment.aegis préfixe.
Lire le calcul
Retours sur le REA la conversion d'horloge, les paramètres par défaut et les méthodes de génération. Les constructeurs définissent un intervalle de 30 secondes et six chiffres; la méthode d'horodatage transforme les secondes en un numéro de bloc.
// 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)
Le temps choisit le bloc. Les secondes 30 à 59 donnent toutes le bloc 1. À 60 secondes, le bloc devient 2.
La clé compte aussi. Le générateur combine la clé de compte avec le bloc. Un compte avec une clé différente peut afficher un code différent en même temps.
Gardez six chiffres. Le reste après division par 1 000 000 est complété par des zéros si nécessaire, de sorte qu'un code peut commencer par 0.
Extraits de plusieurs méthodes inspectées, avec retour à la ligne pour l'affichage. Le panneau de droite est un résumé explicatif. Le code Aegis est sous licence GPL-3.0.
À l'intérieur du générateur
Les mises APK publiées generateOTP dans kotlin.ExceptionsKt. REA suit l'appel de TotpInfo et renvoie ce corps; la source d'origine appelle l'assistant 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);
}
Le dernier octet de hachage sélectionne une position. Quatre octets à cette position fournissent un nombre positif de 31 bits; le formatage le réduit au nombre de chiffres demandé. Le dernier argument du constructeur sélectionne la branche de formatage de code introduite par la compilation.
Vérifiez la reconstruction
Nous avons assemblé les méthodes Java REA sélectionnées dans un petit programme de test. Leur sortie correspondait à une reconstruction indépendante sur 133 cas de test, y compris les limites des blocs de temps et les codes commençant par zéro.
| Exemple de temps | Bloquer | Code à six chiffres |
|---|---|---|
| 30 secondes | 1 | 287082 |
| 59 secondes | 1 | 287082 |
| 60 secondes | 2 | 359152 |
| 1 111 111 109 secondes | 37,037,036 | 081804 |
Le générateur correspond également aux six cas de référence SHA-1 publiés dans Référence RFC 6238. Vérifiez l'implémentation du navigateur par rapport à eux:
Les cas de référence utilisent huit chiffres. La vérification vérifie également leurs résultats à six chiffres.
La vérification exécute les méthodes Java extraites et la nouvelle démo. L'Android APK a été inspecté statiquement.
Inspectez vous-même le APK
Mettre en place REA sur macOS ou Linux, puis téléchargez ces deux fichiers dans le même dossier. Sur Windows, utilisez un Linux environnement tel que WSL.
L'analyse Android nécessite un JDK 17 complet ou une version ultérieure. Sélectionnez-le avec JAVA_HOME ou PATH. Cette affaire utilisait JDK 21.
Pointez REA sur le fichier fournisseur et inspectez le 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
Votre agent peut continuer via le REA de CLI en utilisant l'invite ci-dessus. Pour le modèle MCP, ajoutez REA_JADX_MCP_JAR à l'environnement du serveur REA et reconnectez-le.
Une question suivante: que se passe-t-il lorsqu'un compte utilise huit chiffres ou un intervalle de temps différent?
Sources
- Version officielle de Aegis 3.4.3 · Validation de la source correspondante · Licence GPL-3.0
- Cas de référence RFC 6238 · Données de test de démonstration
Inspecté avec REA 6.1.0 le 9 octobre 2026. Les extraits décompilés sont crédités à Aegis ; le diagramme, le résumé lisible et la reconstruction du navigateur sont de nouveaux supports pédagogiques.