Fragen Sie Ihren Agenten
Die App zeigt einen sich ändernden Login-Code an. Wir wollen finden was verändert es reproduzieren Sie dieses Verhalten.
Untersuche aegis-v3.4.3.apk mit REA. Finde heraus, wie der sechsstellige Anmeldecode entsteht und warum er sich alle 30 Sekunden ändert. Baue eine kleine Demo, in der ich die Zeit ändern kann.
Eine Beispielaufforderung für den heruntergeladenen APK mit konfigurierter Android-Analyse von REA. Holen Sie sich das APK und das Analyse-Setup ↓
Probieren Sie den Codegenerator aus
Die App gruppiert die Zeit in 30-sekunden-Blöcke. Es kombiniert die Blocknummer mit dem Kontoschlüssel, um einen Code zu generieren. Derselbe Schlüssel und derselbe Block erzeugen denselben Code.
Bewegen Sie die Uhr über 60 Sekunden
- Zeit SekundenschnelleUnsere verstellbare Beispieluhr
-
30-sekunden-BlockBlock
floor(59 / 30)
30-59 sekunden - Generierter CodeKontoschlüssel + Sperre → sechs Ziffern
Bei 59 Sekunden: 287082. Bei 60 Sekunden: 359152. Wenn Sie sich innerhalb eines Blocks bewegen, bleibt der Code unverändert.
Finden Sie den Code mit REA
-
Grenzen Sie den APK auf drei Klassen ein
Vertreter → REAinspect_android_package {"path": "aegis-v3.4.3.apk"} search_android_classes {"path": "aegis-v3.4.3.apk", "query": "Totp"}REA → Agent * ausgewählte ErgebnissePackage: com.beemdevelopment.aegis Version: 3.4.3 Classes: 3,077 Three matches: otp.TotpInfo ui.views.TotpProgressBar importers.TotpAuthenticatorImporterTotpInfoist der Berechnungskandidat; Die anderen beiden betreffen den Fortschrittsbalken und importierte Konten. TOTP bedeutet ein zeitbasiertes Einmalpasswort. -
Verbinden Sie den Generator mit dem Display der App
Vertreter → 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 → Agent · Methoden und aufrufende FunktionenTotpInfo methods: getOtp() · overload 0 getOtp(long) · overload 1 OtpInfo.getOtp callers: ui.views.EntryHolder.getOtp ui.MainActivity.copyEntryCodeREA identifiziert die Zeitstempelüberladung und findet die Aufrufer der Basismethode. Inspizieren
EntryHolder.getOtpzeigt dann das Display an, das anruftTotpInfo.getOtp(timestamp).
Anfragen zeigen einen verkürzten Eingabepfad. Ergebnisklassennamen lassen das Gemeinsame weg com.beemdevelopment.aegis Präfix.
Lesen Sie die Berechnung
REA kehrt zurück die Taktumwandlung, Standardeinstellungen und Generierungsmethoden. Die Konstruktoren legen ein Intervall von 30 Sekunden und sechs Ziffern fest; Die Zeitstempelmethode wandelt Sekunden in eine Blocknummer um.
// 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)
Die Zeit wählt den Block. Die Sekunden 30 bis 59 geben alle Block 1 an. Nach 60 Sekunden wird der Block 2.
Auch die Schlüsselfragen. Der Generator kombiniert den Kontoschlüssel mit dem Block. Ein Konto mit einem anderen Schlüssel kann gleichzeitig einen anderen Code anzeigen.
Behalte sechs Ziffern bei. Der Rest nach der Division durch 1.000.000 wird bei Bedarf mit Nullen aufgefüllt, sodass ein Code mit 0 beginnen kann.
Auszüge aus mehreren geprüften Methoden mit Zeilenumbruch zur Anzeige. Das rechte Feld ist eine erläuternde Zusammenfassung. Der Code von Aegis ist GPL-3.0.
Im Inneren des Generators
Der freigegebene APK setzt generateOTP in kotlin.ExceptionsKt. REA folgt dem Anruf von TotpInfo und gibt diesen Körper zurück; Die ursprüngliche Quelle ruft den Helfer auf 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);
}
Das letzte Hash-Byte wählt eine Position aus. Vier Bytes an dieser Position ergeben eine positive 31-Bit-Zahl; Die Formatierung reduziert sie auf die angeforderte Anzahl von Ziffern. Das letzte Argument des Konstruktors wählt den durch die Kompilierung eingeführten Codeformatierungszweig aus.
Überprüfen Sie die Rekonstruktion
Wir haben die ausgewählten REA -zurückgegebenen Java-Methoden in einem kleinen Testprogramm zusammengestellt. Ihre Ausgabe entsprach einer unabhängigen Rekonstruktion auf 133 testfälle, einschließlich Zeitblockgrenzen und Codes, die mit Null beginnen.
| Beispiel zeit | Block | Sechsstelliger Code |
|---|---|---|
| 30 sekunden | 1 | 287082 |
| 59 sekunden | 1 | 287082 |
| 60 sekunden | 2 | 359152 |
| 1,111,111,109 sekunden | 37,037,036 | 081804 |
Der Generator entspricht auch den sechs veröffentlichten SHA-1-Referenzfällen in RFC6238. Überprüfen Sie die Browser-Implementierung gegen sie:
Die Referenzfälle verwenden acht Ziffern. Die Überprüfung überprüft auch ihre sechsstelligen Ergebnisse.
Die Überprüfung führt extrahierte Java-Methoden und die neue Demo aus. Das Android APK wurde statisch inspiziert.
Überprüfen Sie den APK selbst
Einrichten von REA laden Sie diese beiden Dateien auf macOS oder Linux in denselben Ordner herunter. Verwenden Sie auf Windows eine Linux-Umgebung wie WSL.
Android Analysis benötigt ein vollständiges JDK 17 oder höher. Wählen Sie es mit JAVA_HOME oder PATH. In diesem Fall wurde JDK 21 verwendet.
Zeigen Sie mit REA auf die Providerdatei und überprüfen Sie den 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
Ihr Agent kann mit dem CLI von REA über die obige Eingabeaufforderung fortfahren. Für MCP fügen Sie hinzu REA_JADX_MCP_JAR mit der Umgebung des REA-Servers und verbinden Sie ihn erneut.
Eine nächste Frage: was passiert, wenn ein Konto acht Ziffern oder ein anderes Zeitintervall verwendet?
Hauptquellen
- Offizielle Version von Aegis 3.4.3 · Übereinstimmendes Quell-Commit · Lizenz GPL-3.0
- Referenzfälle zu RFC 6238 · Demo-Testdaten
Am 9. Oktober 2026 mit REA 6.1.0 inspiziert. Dekompilierte Auszüge werden Aegis gutgeschrieben; Das Diagramm, die lesbare Zusammenfassung und die Browserrekonstruktion sind neues Lehrmaterial.