Запитайте свого агента
Додаток показує змінюється код для входу в систему. Ми хочемо з'ясувати, що змушує його змінюватися, і відтворити цю поведінку.
Досліди 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; діаграма, читабельне резюме та реконструкція браузера-це новий навчальний матеріал.