Nghiên cứu trường hợp * Aegis Authenticator

Làm thế nào để một authenticator
tạo mã đăng nhập?

Một mã gồm sáu chữ số thay đổi sau mỗi 30 giây. SỬ DỤNG REA để tìm phép tính Trong ANDROID APK , sau đó xây dựng lại nó bằng đồng hồ bạn có thể điều khiển.

Aegis 3.4.3 * Android * PHÁT HÀNH CHÍNH THỨC APK * 6.9 MB

Xem Aegis TRÊN GitHub

TỪ APK đến mã bạn có thể sao chép

  1. 01 * Xác định vị trí các tính năng3.077 lớp → phương pháp tạo REA tìm kiếm gói và theo dõi mã được sử dụng bởi các hành động hiển thị và sao chép.
  2. 02 * Đọc tính ToánThời gian + khóa tài khoản → sáu chữ số REA trả về các phương thức và mặc định. Các agent giải thích cách họ phù hợp với nhau.
  3. 03 * Xây dựng lại và kiểm traThay đổi đồng hồ. Xem mã.Một bản demo trình duyệt mới tái tạo quy tắc và kiểm tra nó đối với các trường hợp tham chiếu công khai.

Hỏi agent của bạn

Ứng dụng hiển thị mã đăng nhập thay đổi. Chúng tôi muốn tìm điều gì làm cho nó thay đổi và tái tạo hành vi đó.

Agent mã hóa của bạn

Dùng REA phân tích aegis-v3.4.3.apk. Giải thích cách tạo mã đăng nhập gồm sáu chữ số và vì sao mã thay đổi mỗi 30 giây. Tạo một bản demo nhỏ cho phép tôi thay đổi thời gian.

Một lời nhắc ví dụ cho APK đã tải xuống , VỚI PHÂN tích Android CỦA REA được định cấu hình. Nhận APK và thiết lập phân tích nhúng vào trang web hoặc blog của bạn ↓

Hãy thử trình tạo mã

Các nhóm ứng dụng thời gian vào Khối 30 giây. Nó kết hợp số khối với khóa tài khoản để tạo mã. Cùng một khóa và khối tạo ra cùng một mã.

Di chuyển đồng hồ qua 60 giây

  1. Thời gian59 giâyĐồng hồ ví dụ có thể điều chỉnh của chúng tôi
  2. Khối 30 giâyKhối 1floor(59 / 30)
    30-59 giây
  3. Mã được tạo287082Khóa tài khoản + khối → sáu chữ số

Lúc 59 giây: 287082. Lúc 60 giây: 359152. Di chuyển trong một khối không thay đổi mã.

Chìa khóa là cố định, công khai Dữ liệu thử NGHIỆM rfc 6238. Bản demo thực hiện tính toán được khôi phục từ APK .

Tìm mã VỚI REA

  1. Thu HẸP APK đến ba lớp

    Agent → REA
    inspect_android_package
    {"path": "aegis-v3.4.3.apk"}
    
    search_android_classes
    {"path": "aegis-v3.4.3.apk",
     "query": "Totp"}
    REA → agent · kết quả đã chọn
    Package: com.beemdevelopment.aegis
    Version: 3.4.3
    Classes: 3,077
    
    Three matches:
      otp.TotpInfo
      ui.views.TotpProgressBar
      importers.TotpAuthenticatorImporter

    TotpInfo là ứng cử viên tính toán; hai người còn lại liên quan đến thanh tiến trình và tài khoản nhập khẩu. TOTP có nghĩa là mật khẩu một lần dựa trên thời gian.

  2. Kết nối máy phát điện với màn hình của ứng dụng

    Agent → 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 → agent · phương pháp và hàm gọi
    TotpInfo methods:
      getOtp()      · overload 0
      getOtp(long)  · overload 1
    
    OtpInfo.getOtp callers:
      ui.views.EntryHolder.getOtp
      ui.MainActivity.copyEntryCode

    REA xác định quá tải dấu thời gian và tìm hàm gọi của phương thức cơ sở. Kiểm tra EntryHolder.getOtp sau đó hiển thị cuộc gọi hiển thị TotpInfo.getOtp(timestamp).

Yêu cầu hiển thị một đường dẫn đầu vào rút gọn. Tên lớp kết quả bỏ qua điểm chung com.beemdevelopment.aegis tiền tố.

Đọc tính toán

REA trả về chuyển đổi đồng hồ, cài đặt mặc định và phương pháp tạo. Các hàm tạo đặt khoảng thời gian 30 giây và sáu chữ số; phương thức dấu thời gian biến giây thành số khối.

REA * Đã chọn Java dịch ngược
// 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");
}
Tóm tắt có thể đọc được · giải thích của agent
// 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)

Thời gian chọn khối. Giây 30 đến 59 tất cả cho khối 1. Ở 60 giây, khối trở thành 2.

Các vấn đề chính quá. Trình tạo kết hợp khóa tài khoản với khối. Một tài khoản có khóa khác có thể hiển thị một mã khác cùng một lúc.

Giữ sáu chữ số. Phần còn lại sau khi chia cho 1.000.000 được đệm bằng số không khi cần, vì vậy mã có thể bắt đầu bằng 0.

Trích đoạn từ một số phương pháp được kiểm tra, với gói dòng để hiển thị. Bảng điều khiển bên phải là một bản tóm tắt giải thích. MÃ Aegis LÀ GPL-3.0.

Bên trong máy phát điện

APK phát hành đặt generateOTP trong kotlin.ExceptionsKt. REA thực hiện cuộc gọi từ TotpInfo và trả về cơ thể này; nguồn gốc gọi người trợ giúp HOTP.

REA * generateOTP · cơ thể hoàn chỉnh
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);
}

Byte băm cuối cùng chọn một vị trí. Bốn byte ở vị trí đó cung cấp số 31 bit dương; định dạng giảm nó xuống số chữ số được yêu cầu. Đối số cuối cùng của hàm tạo chọn nhánh định dạng mã được giới thiệu bằng cách biên dịch.

So sánh với nguồn phát hành phù hợp.

Kiểm tra việc tái thiết

Chúng tôi đã lắp ráp CÁC phương thức Java được chọn REA-returned trong một chương trình thử nghiệm nhỏ. Đầu ra của họ phù hợp với một tái thiết độc lập trên 133 trường hợp thử nghiệm, bao gồm ranh giới khối thời gian và mã bắt đầu bằng không.

Thời gian ví dụ Khối Mã sáu chữ số
30 giây 1 287082
59 giây 1 287082
60 giây 2 359152
1,111,111,109 giây 37,037,036 081804

Trình tạo cũng khớp với sáu trường hợp tham chiếu SHA-1 đã xuất bản trong RFC 6238. Kiểm tra việc triển khai trình duyệt chống lại chúng:

Đọc tính toán của bản demo

Các trường hợp tham chiếu sử dụng tám chữ số. Kiểm tra cũng xác minh kết quả sáu chữ số của họ.

Xác minh chạy các phương thức Java được trích xuất và bản demo mới. Android APK đã được kiểm tra tĩnh.

Tự kiểm tra APK

Thiết LẬP REA TRÊN macOS hoặc Linux, sau đó tải hai tệp này vào cùng một thư mục. TRÊN Windows, sử dụng MÔI trường Linux như WSL.

Phân tích Android cần MỘT jdk 17 đầy đủ hoặc mới hơn. Chọn nó với JAVA_HOME hoặc PATH. Trường hợp này sử DỤNG JDK 21.

Điểm REA tại tệp nhà cung cấp và kiểm TRA 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

Agent của bạn có thể tiếp tục THÔNG qua REA 'S CLI bằng cách sử dụng lời nhắc ở trên. ĐỐI VỚI MCP, thêm REA_JADX_MCP_JAR ĐẾN MÔI trường CỦA MÁY chủ REA và kết nối lại nó.

Một câu hỏi tiếp theo: điều gì xảy ra khi một tài khoản sử dụng tám chữ số hoặc một khoảng thời gian khác nhau?

Nguồn

KIỂM tra VỚI REA 6.1.0 vào ngày 9 tháng 10 năm 2026. Các đoạn trích dịch ngược được ghi có VÀO Aegis ; sơ đồ, tóm tắt có thể đọc được và tái tạo trình duyệt là tài liệu giảng dạy mới.

Hàng đầu