اسأل وكيلك
يعرض التطبيق رمز تسجيل دخول متغير. نريد أن نجد ما الذي يجعلها تتغير وإعادة إنتاج هذا السلوك.
استخدم REA لتحليل aegis-v3.4.3.apk. اشرح كيف يُنشأ رمز تسجيل الدخول المكوّن من ستة أرقام ولماذا يتغير كل 30 ثانية. أنشئ عرضًا صغيرًا أستطيع فيه تغيير الوقت.
هذا طلب نموذجي لتحليل ملف APK الذي نزّلته. اضبط تحليل Android في 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 الرمز هو غل-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 الحالات المرجعية في رك 6238. تحقق من تنفيذ المتصفح ضدهم:
تستخدم الحالات المرجعية ثمانية أرقام. يتحقق الشيك أيضا من نتائجهم المكونة من ستة أرقام.
يعمل التحقق استخراج أساليب جافا والتجريبي الجديد. Android APK تم تفتيشه بشكل ثابت.
فحص APK نفسك
إعداد REA على macOS أو Linux، ثم قم بتنزيل هذين الملفين في نفس المجلد. على Windows، استخدم أ Linux البيئة مثل وسل.
تحليل Android يحتاج جدك الكامل 17 أو في وقت لاحق. حدده مع JAVA_HOME أو PATH. هذه الحالة تستخدم جدك 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 الإصدار · مطابقة مصدر الالتزام · رخصة جي بي إل-3.0
- رك 6238 الحالات المرجعية · بيانات الاختبار التجريبي
تفتيشها مع REA 6.1.0 في 9 أكتوبر 2026. يتم إضافة مقتطفات غير مجمعة إلى Aegis; الرسم التخطيطي والملخص المقروء وإعادة بناء المتصفح هي مواد تعليمية جديدة.