از نماینده خود بپرسید
برنامه یک کد ورود در حال تغییر را نشان می دهد. ما می خواهیم برای پیدا کردن چه چیزی باعث تغییر آن می شود ؟ و این رفتار را بازتولید کنید.
با REA فایل aegis-v3.4.3.apk را بررسی کن. توضیح بده کد ورود ششرقمی چگونه ساخته میشود و چرا هر ۳۰ ثانیه تغییر میکند. یک دموی کوچک بساز که بتوانم زمان را در آن تغییر دهم.
یک مثال برای APK دانلود شده ، با تجزیه و تحلیل اندروید REA پیکربندی شده است. 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دو مورد دیگر مربوط به نوار پیشرفت و حساب های وارداتی است. 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 بیتی را فراهم می کند ؛ قالب بندی آن را به تعداد ارقام درخواست شده کاهش می دهد. آخرین استدلال سازنده شاخه قالب بندی کد را که توسط کامپایل معرفی شده است انتخاب می کند.
بازسازی را بررسی کنید
ما روش های جاوا انتخاب شده 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 :
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 و آن را دوباره متصل کنید.
سوال بعدی: چه اتفاقی می افتد وقتی یک حساب کاربری از هشت رقم یا یک فاصله زمانی متفاوت استفاده می کند ؟
منابع
- نسخه رسمی Aegis 3.4.3 · تطبیق منبع commit · مجوز GPL-3.0
- پرونده های مرجع rfc 6238 · داده های تست دمو
بازرسی با REA 6.1.0 در 9 اکتبر 2026. گزیده های تجزیه شده به Aegis اعتبار داده می شوند ؛ نمودار ، خلاصه قابل خواندن و بازسازی مرورگر مواد آموزشی جدید هستند.