Спросите своего агента
Приложение показывает изменяющийся код для входа в систему. Мы хотим выяснить, что заставляет его меняться, и воспроизвести это поведение.
Исследуй aegis-v3.4.3.apk с помощью REA. Объясни, как создаётся шестизначный код входа и почему он меняется каждые 30 секунд. Сделай небольшую демонстрацию, в которой можно менять время.
Пример запроса для загруженного APK с настроенным анализом REA для Android. Получите APK и настройки анализа ↓
Попробуйте воспользоваться генератором кода
Приложение группирует время в 30-секундные блоки. Для генерации кода номер блока объединяется с ключом учетной записи. Один и тот же ключ и блок генерируют один и тот же код.
Переведите стрелки часов на 60 секунд вперед
- Время секундНаши регулируемые примерные часы
-
30-секундный блокБлок
floor(59 / 30)
30-59 секунд - Сгенерированный кодКлюч учетной записи + блокировка → шесть цифр
На 59 секунде: 287082. На 60 секунде: 359152. При перемещении в пределах одного блока код остается неизменным.
Найдите код с помощью REA
-
Сократите APK до трех классов
Агент → REAinspect_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.TotpAuthenticatorImporterTotpInfoрасчета используется TotpInfo; два других параметра относятся к индикатору выполнения и импортированным учетным записям. TOTP означает одноразовый пароль, основанный на времени. -
Подключите генератор к дисплею приложения
Агент → 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 → агент · методы и вызывающие абонентыTotpInfo methods: getOtp() · overload 0 getOtp(long) · overload 1 OtpInfo.getOtp callers: ui.views.EntryHolder.getOtp ui.MainActivity.copyEntryCodeREA определяет перегрузку временной метки и находит вызывающих базовый метод. При проверке
EntryHolder.getOtpна дисплее отображается вызовTotpInfo.getOtp(timestamp).
Запросы показывают сокращенный путь ввода. В именах результирующих классов отсутствует распространенный префикс com.beemdevelopment.aegis.
Ознакомьтесь с расчетом
REA возвращает преобразование часов, настройки по умолчанию и методы генерации. Разработчики установили 30-секундный интервал и шесть цифр; метод временной метки преобразует секунды в номер блока.
// 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.
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 :
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 и повторно подключите его.
Следующий вопрос: что происходит, когда в учетной записи используются восемь цифр или другой интервал времени?
Источники
- Официальный релиз Aegis 3.4.3 · Соответствующий исходный код · Лицензия GPL-3.0
- Справочные примеры RFC 6238 · Демонстрационные тестовые данные
Проверено с помощью REA 6.1.0 9 октября 2026 года. Декомпилированные фрагменты добавлены в Aegis; диаграмма, читаемое резюме и реконструкция браузера являются новым учебным материалом.