Fallstudie * Aegis Authentifikator

Wie funktioniert ein Authentifikator
einen Login-Code generieren?

Ein sechsstelliger Code ändert sich alle 30 Sekunden. Verwenden Sie REA, um die Berechnung in einem Android APK zu finden, und erstellen Sie sie dann mit einer Uhr neu, die Sie steuern können.

Aegis 3.4.3 * Android * Offizielle Veröffentlichung APK · 6,9 MB

Sehen Sie sich Aegis auf GitHub an

Von einem APK zu einem Code, den Sie reproduzieren können

  1. 01 * Suchen Sie die Funktion3.077 klassen → Methoden generieren REA durchsucht das Paket und verfolgt den von den Anzeige- und Kopieraktionen verwendeten Code.
  2. 02 * Lesen Sie die BerechnungZeit + Kontoschlüssel → sechs Ziffern REA gibt die Methoden und Standardwerte zurück. Der Agent erklärt, wie sie zusammenpassen.
  3. 03 * Umbauen und überprüfenÄndere die Uhr. Beobachten Sie den Code.Eine neue Browserdemo reproduziert die Regel und vergleicht sie mit öffentlichen Referenzfällen.

Fragen Sie Ihren Agenten

Die App zeigt einen sich ändernden Login-Code an. Wir wollen finden was verändert es reproduzieren Sie dieses Verhalten.

Ihr Codierungsagent

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

  1. Zeit59 SekundenschnelleUnsere verstellbare Beispieluhr
  2. 30-sekunden-BlockBlock 1floor(59 / 30)
    30-59 sekunden
  3. Generierter Code287082Kontoschlüssel + Sperre → sechs Ziffern

Bei 59 Sekunden: 287082. Bei 60 Sekunden: 359152. Wenn Sie sich innerhalb eines Blocks bewegen, bleibt der Code unverändert.

Der Schlüssel ist fest, öffentlich RFC 6238-Testdaten. Die Demo implementiert die vom APK wiederhergestellte Berechnung.

Finden Sie den Code mit REA

  1. Grenzen Sie den APK auf drei Klassen ein

    Vertreter → REA
    inspect_android_package
    {"path": "aegis-v3.4.3.apk"}
    
    search_android_classes
    {"path": "aegis-v3.4.3.apk",
     "query": "Totp"}
    REA → Agent * ausgewählte Ergebnisse
    Package: com.beemdevelopment.aegis
    Version: 3.4.3
    Classes: 3,077
    
    Three matches:
      otp.TotpInfo
      ui.views.TotpProgressBar
      importers.TotpAuthenticatorImporter

    TotpInfo ist der Berechnungskandidat; Die anderen beiden betreffen den Fortschrittsbalken und importierte Konten. TOTP bedeutet ein zeitbasiertes Einmalpasswort.

  2. Verbinden Sie den Generator mit dem Display der App

    Vertreter → 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 → Agent · Methoden und aufrufende Funktionen
    TotpInfo methods:
      getOtp()      · overload 0
      getOtp(long)  · overload 1
    
    OtpInfo.getOtp callers:
      ui.views.EntryHolder.getOtp
      ui.MainActivity.copyEntryCode

    REA identifiziert die Zeitstempelüberladung und findet die Aufrufer der Basismethode. Inspizieren EntryHolder.getOtp zeigt dann das Display an, das anruft TotpInfo.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.

REA * ausgewähltes dekompiliertes Java
// 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");
}
Lesbare Zusammenfassung * Interpretation des Agenten
// 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.

REA * generateOTP, kompletter Körper
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.

Vergleichen Sie mit der passenden Release-Quelle.

Ü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:

Lesen Sie die Berechnung der Demo

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 :

MODELL: 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

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

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.

Oberen