Практический пример · Аутентификатор 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; диаграмма, читаемое резюме и реконструкция браузера являются новым учебным материалом.

Топ