Studi kasus * Pengautentikasi Aegis

Bagaimana cara kerja autentikator
buat kode masuk?

Kode enam digit berubah setiap 30 detik. Gunakan REA untuk menemukan perhitungan di Android APK, lalu bangun kembali dengan jam yang dapat Anda kendalikan.

Aegis 3.4.3 * Android * Rilis resmi APK * 6.9 MB

Lihat Aegis di GitHub

Dari APK ke kode yang dapat Anda reproduksi

  1. 01 * Temukan fitur tersebut3.077 kelas → REA mencari paket dan melacak kode yang digunakan oleh tindakan tampilan dan penyalinan.
  2. 02 * Baca perhitungannyaWaktu + kunci akun → REA mengembalikan metode dan default. Agen menjelaskan bagaimana mereka cocok bersama.
  3. 03 * Bangun kembali dan periksaGanti jam. Perhatikan kodenya.Demo browser baru mereproduksi aturan dan memeriksanya terhadap kasus referensi publik.

Tanyakan pada agen Anda

Aplikasi ini menampilkan kode login yang berubah. Kami ingin menemukan apa yang membuatnya berubah dan mereproduksi perilaku itu.

Agen pengkodean Anda

Analisis aegis-v3.4.3.apk dengan REA. Jelaskan cara kode login enam digit dibuat dan mengapa berubah setiap 30 detik. Buat demo kecil yang memungkinkan saya mengubah waktu.

Contoh prompt untuk APK yang diunduh, dengan analisis Android REA dikonfigurasi. Dapatkan APK dan pengaturan analisis ↓

Coba pembuat kode

Aplikasi mengelompokkan waktu menjadi blok 30 detik. Ini menggabungkan nomor blok dengan kunci akun untuk menghasilkan kode. Kunci dan blok yang sama menghasilkan kode yang sama.

Pindahkan jam melintasi 60 detik

  1. Waktu59 detikJam contoh kami yang dapat disesuaikan
  2. blok 30 detikBlok 1floor(59 / 30)
    30-59 detik
  3. Kode yang dihasilkan287082Kunci akun + blok →

Pada 59 detik: 287082. Pada 60 detik: 359152. Bergerak dalam satu blok membuat kode tidak berubah.

Kuncinya adalah tetap, publik RFC 6238 datasheet. Demo mengimplementasikan perhitungan yang dipulihkan dari APK .

Temukan kodenya dengan REA

  1. Persempit APK menjadi tiga kelas

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

    TotpInfo adalah kandidat perhitungan; dua lainnya menyangkut bilah kemajuan dan akun yang diimpor. TOTP berarti kata sandi satu kali berbasis waktu.

  2. Hubungkan generator ke tampilan aplikasi

    Agent → 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 → agen * metode dan fungsi pemanggil
    TotpInfo methods:
      getOtp()      · overload 0
      getOtp(long)  · overload 1
    
    OtpInfo.getOtp callers:
      ui.views.EntryHolder.getOtp
      ui.MainActivity.copyEntryCode

    REA mengidentifikasi kelebihan stempel waktu dan menemukan fungsi pemanggil metode dasar. Memeriksa EntryHolder.getOtp kemudian menampilkan panggilan tampilan TotpInfo.getOtp(timestamp).

Permintaan menunjukkan jalur input yang dipersingkat. Hasil nama kelas menghilangkan yang umum com.beemdevelopment.aegis awalan.

Baca perhitungannya

REA kembali konversi jam, pengaturan default, dan metode pembangkitan. Konstruktor menetapkan interval 30 detik dan enam digit; metode stempel waktu mengubah detik menjadi nomor blok.

REA * Java yang didekompilasi yang dipilih
// 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");
}
Ringkasan yang dapat dibaca * interpretasi agen
// 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)

Waktu memilih blok. Detik 30 hingga 59 semuanya memberikan blok 1. Pada 60 detik, blok menjadi 2.

Kuncinya juga penting. Generator menggabungkan kunci akun dengan blok. Akun dengan kunci yang berbeda dapat menampilkan kode yang berbeda secara bersamaan.

Simpan enam digit. Sisanya setelah pembagian dengan 1.000.000 diisi dengan angka nol bila diperlukan, sehingga kode dapat dimulai dengan 0.

Kutipan dari beberapa metode yang diinspeksi, dengan pembungkusan garis untuk tampilan. Panel kanan adalah ringkasan penjelasan. Kode Aegis adalah GPL-3.0.

Di dalam generator

APK yang dirilis menempatkan generateOTP dalam kotlin.ExceptionsKt. REA mengikuti panggilan dari TotpInfo dan mengembalikan badan ini; sumber aslinya memanggil helper HOTP.

REA * generateOTP, isi lengkap
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);
}

Byte hash terakhir memilih posisi. Empat byte pada posisi itu memberikan angka 31-bit positif; pemformatan menguranginya menjadi jumlah digit yang diminta. Argumen terakhir konstruktor memilih cabang pemformatan kode yang diperkenalkan oleh kompilasi.

Bandingkan dengan sumber rilis yang cocok.

Periksa rekonstruksi

Kami mengumpulkan metode Java yang dikembalikan REA yang dipilih dalam program pengujian kecil. Hasil mereka cocok dengan rekonstruksi independen pada 133 kasus uji, termasuk batas blok waktu dan kode yang dimulai dengan nol.

Contoh waktu Blok Kode enam digit
30 detik 1 287082
59 detik 1 287082
60 detik 2 359152
1.111.111.109 detik 37,037,036 081804

Generator juga cocok dengan enam kasus referensi SHA-1 yang diterbitkan di RFC 6238. Periksa implementasi browser terhadap mereka:

Baca perhitungan demo

Kasus referensi menggunakan delapan digit. Cek tersebut juga memverifikasi hasil enam digit mereka.

Verifikasi menjalankan metode Java yang diekstraksi dan demo baru. Android APK diperiksa secara statis.

Periksa sendiri APK

Siapkan REA di macOS atau Linux, lalu unduh kedua file ini ke dalam folder yang sama. Pada Windows, gunakan lingkungan Linux seperti WSL.

Analisis Android membutuhkan JDK 17 lengkap atau lebih baru. Pilih dengan JAVA_HOME atau PATH. Kasus ini menggunakan JDK 21.

Arahkan REA ke file penyedia dan periksa APK :

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

Agen Anda dapat melanjutkan melalui REA CLI menggunakan perintah di atas. Untuk MCP, tambahkan REA_JADX_MCP_JAR ke lingkungan server REA dan sambungkan kembali.

Pertanyaan selanjutnya: apa yang terjadi jika akun menggunakan delapan digit atau interval waktu yang berbeda?

Sumber

Diinspeksi dengan REA 6.1.0 pada 9 Oktober 2026. Kutipan yang didekompilasi dikreditkan ke Aegis; diagram, ringkasan yang dapat dibaca, dan rekonstruksi browser adalah bahan ajar baru.

Atas