مطالعه موردی * Aegis Authenticator

چگونه یک authenticator
یک کد ورود ایجاد کنید?

یک کد شش رقمی هر 30 ثانیه تغییر می کند. از REA برای یافتن محاسبه در یک APK Android استفاده کنید ، سپس آن را با ساعتی که می توانید کنترل کنید بازسازی کنید.

Aegis 3.4.3 * اندروید * انتشار رسمی APK * 6.9 MB

مشاهده Aegis در GitHub

از یک APK به یک کد شما می توانید تولید مثل

  1. 01 * ویژگی را پیدا کنید3,077 کلاس → روش های تولید REA بسته را جستجو می کند و کد مورد استفاده نمایش و کپی را ردیابی می کند.
  2. 02 * محاسبه را بخوانیدکلید زمان + حساب → شش رقمی REA روش ها و پیش فرض ها را باز می گرداند. مامور توضیح میده که چطور با هم جور میشن
  3. 03 * بازسازی و بررسیتغییر ساعت کد را تماشا کنیدیک نسخه ی نمایشی مرورگر جدید این قانون را بازتولید می کند و آن را با موارد مرجع عمومی بررسی می کند.

از نماینده خود بپرسید

برنامه یک کد ورود در حال تغییر را نشان می دهد. ما می خواهیم برای پیدا کردن چه چیزی باعث تغییر آن می شود ؟ و این رفتار را بازتولید کنید.

عامل برنامه نویسی شما

با REA فایل aegis-v3.4.3.apk را بررسی کن. توضیح بده کد ورود شش‌رقمی چگونه ساخته می‌شود و چرا هر ۳۰ ثانیه تغییر می‌کند. یک دموی کوچک بساز که بتوانم زمان را در آن تغییر دهم.

یک مثال برای APK دانلود شده ، با تجزیه و تحلیل اندروید REA پیکربندی شده است. APK و راه اندازی تجزیه و تحلیل را دریافت کنید ↓

ژنراتور کد را امتحان کنید

برنامه گروه زمان به بلوک های 30 ثانیه ای این شماره بلوک را با کلید حساب برای تولید یک کد ترکیب می کند. همان کلید و بلوک همان کد را تولید می کنند.

ساعت را در طول 60 ثانیه حرکت دهید

  1. زمان59 ثانیه هاساعت نمونه قابل تنظیم ما
  2. بلوک 30 ثانیه ایبلوک 1floor(59 / 30)
    30-59 ثانیه
  3. کد تولید شده287082کلید حساب + بلوک → شش رقمی

در 59 ثانیه: 287082. در 60 ثانیه: 359152. حرکت در یک بلوک کد را بدون تغییر می گذارد.

کلید ثابت است ، عمومی داده های تست rfc 6238. دمو محاسبه بازیابی شده از APK را اجرا می کند .

پیدا کردن کد با REA

  1. APK را به سه کلاس محدود کنید

    نماینده → 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 دو مورد دیگر مربوط به نوار پیشرفت و حساب های وارداتی است. TOTP به معنی یک رمز عبور یک بار مبتنی بر زمان است.

  2. ژنراتور را به صفحه نمایش برنامه وصل کنید

    نماینده → 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 → عامل * روش ها و تماس گیرندگان
    TotpInfo methods:
      getOtp()      · overload 0
      getOtp(long)  · overload 1
    
    OtpInfo.getOtp callers:
      ui.views.EntryHolder.getOtp
      ui.MainActivity.copyEntryCode

    REA اضافه بار مهر زمانی را شناسایی می کند و تماس گیرندگان روش پایه را پیدا می کند. بازرسی EntryHolder.getOtp سپس تماس نمایشگر را نشان می دهد TotpInfo.getOtp(timestamp).

درخواست ها یک مسیر ورودی کوتاه را نشان می دهند. نام کلاس های نتیجه مشترک را حذف می کنند com.beemdevelopment.aegis پیشوند.

محاسبه را بخوانید

REA باز می گردد تبدیل ساعت ، تنظیمات پیش فرض و روش های تولید. سازندگان یک فاصله 30 ثانیه ای و شش رقمی را تنظیم می کنند ؛ روش زمان بندی ثانیه ها را به یک عدد بلوک تبدیل می کند.

REA * جاوا تجزیه شده انتخاب شده
// 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)

زمان بلوک را انتخاب می کند. ثانیه 30 تا 59 همه بلوک 1 را می دهند. در 60 ثانیه ، بلوک 2 می شود.

کلید هم مهمه ژنراتور کلید حساب را با بلوک ترکیب می کند. یک حساب با یک کلید متفاوت می تواند یک کد متفاوت را در همان زمان نشان دهد.

شش رقمی نگه دارید. باقیمانده بعد از تقسیم به 1 ، 000 ، 000 با صفر در صورت نیاز ، بنابراین یک کد می تواند با 0 شروع شود.

گزیده هایی از چندین روش بازرسی شده ، با بسته بندی خط برای نمایش. پانل سمت راست یک خلاصه توضیحی است. کد Aegis GPL-3.0 است.

داخل ژنراتور

APK منتشر شده قرار می دهد generateOTP در kotlin.ExceptionsKt. REA به دنبال تماس از TotpInfo و این بدن را باز می گرداند ؛ منبع اصلی به کمک کننده زنگ می زند HOTP.

REA * generateOTP ، بدن کامل
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);
}

آخرین بایت هش یک موقعیت را انتخاب می کند. چهار بایت در آن موقعیت یک عدد مثبت 31 بیتی را فراهم می کند ؛ قالب بندی آن را به تعداد ارقام درخواست شده کاهش می دهد. آخرین استدلال سازنده شاخه قالب بندی کد را که توسط کامپایل معرفی شده است انتخاب می کند.

با منبع انتشار تطبیق یافته مقایسه کنید.

بازسازی را بررسی کنید

ما روش های جاوا انتخاب شده REA را در یک برنامه تست کوچک جمع آوری کردیم. خروجی آنها با بازسازی مستقل در 133 مورد آزمایش، شامل مرزهای بلوک زمانی و کد هایی که با صفر شروع می شوند.

زمان مثال بلوک کد شش رقمی
30 ثانیه 1 287082
59 ثانیه 1 287082
60 ثانیه 2 359152
1,111,111,109 ثانیه 37,037,036 081804

ژنراتور همچنین با شش مورد مرجع SHA-1 منتشر شده در RFC 6238. پیاده سازی مرورگر را با آنها بررسی کنید:

محاسبه دمو را بخوانید

موارد مرجع از هشت رقم استفاده می کنند. این چک همچنین نتایج شش رقمی آنها را تأیید می کند.

Verification روش های جاوا استخراج شده و دمو جدید را اجرا می کند. اندروید APK به صورت استاتیک بازرسی شد.

APK را خودتان بازرسی کنید

راه اندازی REA در macOS یا Linux ، سپس این دو فایل را در یک پوشه دانلود کنید. در Windows ، از یک محیط Linux مانند WSL استفاده کنید.

Analysis Android به JDK 17 کامل یا بالاتر نیاز دارد. انتخاب کنید با JAVA_HOME یا PATH. این مورد از JDK 21 استفاده کرد.

نقطه REA در فایل ارائه دهنده و بازرسی 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

نماینده شما می تواند از طریق REA CLI با استفاده از دستور بالا ادامه دهد. برای MCP ، اضافه کنید REA_JADX_MCP_JAR به محیط سرور REA و آن را دوباره متصل کنید.

سوال بعدی: چه اتفاقی می افتد وقتی یک حساب کاربری از هشت رقم یا یک فاصله زمانی متفاوت استفاده می کند ؟

منابع

بازرسی با REA 6.1.0 در 9 اکتبر 2026. گزیده های تجزیه شده به Aegis اعتبار داده می شوند ؛ نمودار ، خلاصه قابل خواندن و بازسازی مرورگر مواد آموزشی جدید هستند.

بالا