Örnek olay incelemesi * Aegis Kimlik Doğrulayıcı

Bir kimlik doğrulayıcı nasıl çalışır
bir giriş kodu oluşturun?

Altı basamaklı bir kod her 30 saniyede bir değişir. Hesaplamayı bir Android APK'da bulmak için REA kullanın, ardından kontrol edebileceğiniz bir saatle yeniden oluşturun.

Aegis 3.4.3 * Android * Resmi sürüm APK * 6.9 MB

Aegis'YU GitHub'DA görüntüleyin

Bir APK'DAN yeniden oluşturabileceğiniz bir koda

  1. 01 * Özelliği bulun 3,077 sınıflar → oluşturma yöntemleri REA paketi arar ve görüntüleme ve kopyalama eylemleri tarafından kullanılan kodu izler.
  2. 02 * Hesaplama Süresini + hesap anahtarını okuyun → altı basamaklı REA yöntemleri ve varsayılanları döndürür. Ajan nasıl bir araya geldiklerini açıklıyor.
  3. 03 * Saati yeniden oluşturun ve kontrol edin. Kurallara dikkat et.Yeni bir tarayıcı demosu kuralı yeniden üretir ve genel referans durumlarına karşı kontrol eder.

Temsilcinize sorun

Uygulama değişen bir giriş kodu gösterir. Onu neyin değiştirdiğini bulmak ve bu davranışı yeniden üretmek istiyoruz.

Kodlama aracınız

REA ile aegis-v3.4.3.apk dosyasını incele. Altı haneli giriş kodunun nasıl üretildiğini ve neden 30 saniyede bir değiştiğini açıkla. Zamanı değiştirebileceğim küçük bir demo yap.

REA'NUN Android analizi yapılandırılmış olarak indirilen APK için bir örnek istemi. APK ve analiz kurulumunu edinin ↓

Kod oluşturucuyu deneyin

Uygulama zamanı 30 saniyelik bloklar halinde gruplandırır. Bir kod oluşturmak için blok numarasını hesap anahtarıyla birleştirir. Aynı anahtar ve blok aynı kodu üretir.

Saati 60 saniye boyunca hareket ettirin

  1. Zaman59 saniyelerAyarlanabilir örnek saatimiz
  2. 30 saniyelik blokEngel 1floor(59 / 30)
    30-59 saniye
  3. Oluşturulan kod287082Hesap anahtarı + blok → altı basamak

59 Saniyede: 287082. 60 Saniyede: 359152. Bir blok içinde hareket etmek kodu değiştirmeden bırakır.

Anahtar sabit, genel RFC 6238 test verileridir. Demo, APK'dan kurtarılan hesaplamayı uygular.

Kodu REA ile bulun

  1. APK'YU üç sınıfa daraltın

    Ajan → REA
    inspect_android_package
    {"path": "aegis-v3.4.3.apk"}
    
    search_android_classes
    {"path": "aegis-v3.4.3.apk",
     "query": "Totp"}
    REA → temsilci * seçilen sonuçlar
    Package: com.beemdevelopment.aegis
    Version: 3.4.3
    Classes: 3,077
    
    Three matches:
      otp.TotpInfo
      ui.views.TotpProgressBar
      importers.TotpAuthenticatorImporter

    TotpInfo hesaplama adayıdır; diğer ikisi ilerleme çubuğu ve içe aktarılan hesaplarla ilgilidir. TOTP, zamana dayalı bir kerelik şifre anlamına gelir.

  2. Jeneratörü uygulamanın ekranına bağlayın

    Ajan → 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 → aracı * yöntemler ve arayanlar
    TotpInfo methods:
      getOtp()      · overload 0
      getOtp(long)  · overload 1
    
    OtpInfo.getOtp callers:
      ui.views.EntryHolder.getOtp
      ui.MainActivity.copyEntryCode

    REA, zaman damgası aşırı yüklenmesini tanımlar ve temel yöntemin arayanlarını bulur. Giriş Sahibini inceliyorumEntryHolder.getOtp daha sonra TotpInfo çağıran ekranı TotpInfo.getOtp(timestamp).

İstekler kısaltılmış bir giriş yolu gösterir. Sonuç sınıfı adları ortak com.beemdevelopment.aegis öneki.

Hesaplamayı okuyun

REA, saat dönüşümünü, varsayılan ayarları ve oluşturma yöntemlerini döndürür. Kurucular 30 saniyelik bir aralık ve altı basamak belirler; zaman damgası yöntemi saniyeleri bir blok numarasına dönüştürür.

REA * seçilen derlenmiş 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");
}
Okunabilir özet * temsilcinin yorumu
// 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)

Zaman bloğu seçer. 30'dan 59'a kadar olan saniyelerin tümü blok 1'i verir. 60 Saniyede blok 2 olur.

Anahtar da önemlidir. Jeneratör, hesap anahtarını blokla birleştirir. Farklı bir anahtara sahip bir hesap aynı anda farklı bir kod gösterebilir.

Altı rakamı sakla. 1.000.000'e bölündükten sonraki kalan, gerektiğinde sıfırlarla doldurulur, böylece bir kod 0 ile başlayabilir.

Ekran için çizgi sarma ile çeşitli denetlenen yöntemlerden alıntılar. Sağ panel açıklayıcı bir özettir. Aegis kodu GPL-3.0'dır.

Jeneratörün içinde

Piyasaya sürülen APK, generateotp'yi kotlin'e yerleştiriyorgenerateOTPkotlin.ExceptionsKt. REA, TotpInfo çağrısını TotpInfo ve bu gövdeyi döndürür; Orijinal kaynak yardımcı hotp'yi HOTP.

REA * generateOTP, komple gövde
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);
}

Son karma bayt bir konum seçer. Bu konumdaki dört bayt, pozitif bir 31 bitlik sayı sağlar; biçimlendirme, onu istenen basamak sayısına indirir. Yapıcının son argümanı, derleme tarafından tanıtılan kod biçimlendirme dalını seçer.

Eşleşen sürüm kaynağıyla karşılaştırın.

Yeniden yapılanmayı kontrol edin

Seçilen REA ile döndürülen Java yöntemlerini küçük bir test programında bir araya getirdik. Çıktıları, zaman bloğu sınırları ve sıfırdan başlayan kodlar da dahil olmak üzere 133 test vakasında bağımsız bir yeniden yapılandırmayla eşleşti.

Örnek zaman Engel Altı haneli kod
30 saniye 1 287082
59 saniye 1 287082
60 saniye 2 359152
1,111,111,109 saniye 37,037,036 081804

Jeneratör ayrıca RFC 6238'de yayınlanan altı SHA-1 referans durumuyla da eşleşir. Tarayıcı uygulamasını bunlara karşı kontrol edin:

Demonun hesaplamasını okuyun

Referans durumlarda sekiz basamak kullanılır. Kontrol ayrıca altı basamaklı sonuçlarını da doğrular.

Doğrulama, çıkarılan Java yöntemlerini ve yeni demoyu çalıştırır. Android APK statik olarak denetlendi.

APK'YU kendiniz inceleyin

REA'YU macOS veya Linux'DA ayarlayın, ardından bu iki dosyayı aynı klasöre indirin. Windows'DA WSL gibi bir Linux ortamı kullanın.

Android analizinin tam bir JDK 17 veya daha yenisine ihtiyacı var. JAVA_HOME veya PATH ile seçin. Bu durumda JDK 21 kullanıldı.

REA dosyasını sağlayıcı dosyasına yönlendirin ve APK dosyasını inceleyin :

macOS / Linux'NIN sohbeti
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

Aracınız yukarıdaki istemi kullanarak REA'NUN CLI'SU üzerinden devam edebilir. REA_JADX_MCP_JARMCP için REA sunucusunun ortamına REA_JADX_MCP_JAR ekleyin ve yeniden bağlayın.

Sıradaki soru: Bir hesap sekiz basamak veya farklı bir zaman aralığı kullandığında ne olur?

Kaynaklar

9 Ekim 2026'da REA 6.1.0 ile denetlendi. Derlenmiş alıntılar Aegis'YA yatırılır; diyagram, okunabilir özet ve tarayıcı yeniden yapılandırması yeni öğretim materyalleridir.

Üst