Практичний приклад * аутентифікатор Aegis

Звідки Аутентифікатор
генерувати код авторизації?

Шестизначний код змінюється кожні 30 секунд. Використовуйте REA , щоб знайти обчислення в Android APK, а потім відновіть їх за допомогою годинника, яким ви можете керувати.

Aegis 3.4.3 * Android * офіційний реліз APK * 6,9 МБ

Переглянути Aegis на GitHub

Від APK до коду, який ви можете відтворити

  1. 01 * знайдіть функцію 3077 класи → методи генерації REA здійснює пошук у пакеті та відстежує код, який використовується для відображення та копіювання дій.
  2. 02 * Прочитайте час розрахунку + ключ облікового запису → шестизначний REA повертає методи та значення за замовчуванням. Агент пояснює, як вони поєднуються.
  3. 03 * перебудуйте і встановіть прапорець "Змінити час". Ознайомтеся з кодом.Нова демонстрація браузера відтворює правило і перевіряє його на відповідність загальнодоступним посиланням.

Запитайте свого агента

Додаток показує змінюється код для входу в систему. Ми хочемо з'ясувати, що змушує його змінюватися, і відтворити цю поведінку.

Ваш кодуючий агент

Досліди aegis-v3.4.3.apk за допомогою REA. Поясни, як створюється шестизначний код входу й чому він змінюється кожні 30 секунд. Зроби невеликий приклад, у якому можна змінювати час.

Приклад запиту для завантаженого APK з налаштованим аналізом REA для Android. Отримайте 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 обчислення використовується 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 * вибраний Декомпільований 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");
}
Читабельне резюме * інтерпретація агента
// 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-розрядне число; форматування зменшує його до необхідної кількості цифр. Останній аргумент конструктора вибирає гілку форматування коду, введену під час компіляції.

Порівняйте з відповідним джерелом випуску.

Перевірте реконструкцію

Ми зібрали вибрані методи Java, повернуті REA, у невелику тестову програму. Їх результати відповідали незалежній реконструкції 133 тестових прикладів, включаючи межі тимчасових блоків і коди, що починаються з нуля.

Приблизний час Блок Шестизначний код
30 секунд 1 287082
59 секунд 1 287082
60 секунд 2 359152
1,111,111,109 секунди 37,037,036 081804

Генератор також відповідає шести опублікованим посилальним варіантам SHA-1 в RFC 6238. Перевірте їх реалізацію в браузері:

Ознайомтеся з демонстраційним розрахунком

У контрольних випадках використовуються восьмизначні значення. Перевірка також підтверджує їх шестизначні результати.

Для перевірки використовуються витягнуті методи Java та нова демонстрація. Android APK був перевірений статично.

Перевірте APK самостійно

Налаштуйте REA на macOS або Linux , потім завантажте ці два файли в одну папку. У Windows використовуйте середовище Linux, таке як WSL.

Для аналізу 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

Ваш агент може продовжити роботу через CLI від REA, скориставшись наведеною вище інструкцією. Для MCP додайте REA_JADX_MCP_JAR у середу сервера REA і повторно підключіть його.

Наступне питання: що відбувається, коли в обліковому записі використовуються вісім цифр або інший інтервал часу?

Джерело

Перевірено за допомогою REA 6.1.0 9 жовтня 2026 року. Декомпільовані фрагменти додаються до Aegis; діаграма, читабельне резюме та реконструкція браузера-це новий навчальний матеріал.

Топ