Temsilcinize sorun
Uygulama değişen bir giriş kodu gösterir. Onu neyin değiştirdiğini bulmak ve bu davranışı yeniden üretmek istiyoruz.
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
- Zaman saniyelerAyarlanabilir örnek saatimiz
-
30 saniyelik blokEngel
floor(59 / 30)
30-59 saniye - Oluşturulan kodHesap anahtarı + blok → altı basamak
59 Saniyede: 287082. 60 Saniyede: 359152. Bir blok içinde hareket etmek kodu değiştirmeden bırakır.
Kodu REA ile bulun
-
APK'YU üç sınıfa daraltın
Ajan → REAinspect_android_package {"path": "aegis-v3.4.3.apk"} search_android_classes {"path": "aegis-v3.4.3.apk", "query": "Totp"}REA → temsilci * seçilen sonuçlarPackage: com.beemdevelopment.aegis Version: 3.4.3 Classes: 3,077 Three matches: otp.TotpInfo ui.views.TotpProgressBar importers.TotpAuthenticatorImporterTotpInfohesaplama 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. -
Jeneratörü uygulamanın ekranına bağlayın
Ajan → 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 → aracı * yöntemler ve arayanlarTotpInfo methods: getOtp() · overload 0 getOtp(long) · overload 1 OtpInfo.getOtp callers: ui.views.EntryHolder.getOtp ui.MainActivity.copyEntryCodeREA, zaman damgası aşırı yüklenmesini tanımlar ve temel yöntemin arayanlarını bulur. Giriş Sahibini inceliyorum
EntryHolder.getOtpdaha 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.
// 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)
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.
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.
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:
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 :
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
- Resmi Aegis 3.4.3 sürümü * Eşleşen kaynak taahhüdü * GPL-3.0 lisansı
- RFC 6238 referans durumları * Demo test verileri
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.