ケーススタディ·Aegis認証器

オーセンティケータはどのようにしていますか
ログインコードを生成しますか?

6桁のコードは30秒ごとに変更されます。 REAを使用してAndroid APKで計算を見つけ、制御できる時計で再構築します。

Aegis3.4.3·アンドロイド·公式リリースAPK*6.9MB

AegisをGitHubに表示する

APKから再現できるコードへ

  1. 01*機能を見つける3,077クラス→生成メソッド REAはパッケージを検索し、表示アクションとコピーアクションで使用されるコードをトレースします。
  2. 02*計算を読む時間+アカウントキー→6桁 REAは、メソッドとデフォルトを返します。 エージェントは、それらがどのように一緒に収まるかを説明します。
  3. 03*再構築とチェッククロックを変更します。 コードを見てください。新しいブラウザのデモでは、ルールを再現し、公開されている参照ケースと照合します。

あなたの代理店に尋ねる

アプリは変更されたログインコードを示しています。 私たちは見つけたい 何がそれを変えるのですか そしてその行動を再現します。

あなたのコーディングエージェント

REA で aegis-v3.4.3.apk を調べてください。6 桁のログインコードの生成方法と、30 秒ごとに変わる理由を説明し、時刻を変更できる小さなデモを作ってください。

ダウンロードしたAPKのプロンプトの例で、REAのAndroid分析が構成されています。 APKと解析セットアップを入手↓

コードジェネレータを試してみてください

アプリは時間を次のようにグループ化します 30秒のブロック。 ブロック番号とアカウントキーを組み合わせてコードを生成します。 同じキーとブロックは同じコードを生成します。

時計を60秒に移動する

  1. 時間59 秒私達の調節可能な例の時計
  2. 30秒ブロックブロック 1floor(59 / 30)
    30-59秒
  3. 生成されたコード287082アカウントキー+ブロック→6桁

時59秒): 287082. 60秒で: 359152. 1つのブロック内を移動すると、コードは変更されません。

キーは固定されており、公開されています RFC6238テストデータ. このデモでは、APKから回収された計算を実装しています。

REAでコードを見つける

  1. APKを3つのクラスに絞り込みます

    エージェント→REA
    inspect_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.TotpAuthenticatorImporter

    TotpInfo 他の2つは、プログレスバーとインポートされたアカウントに関するものです。 TOTPは、時間ベースのワンタイムパスワードを意味します。

  2. ジェネレータをアプリのディスプレイに接続します

    エージェント→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→エージェント*メソッドと呼び出し元
    TotpInfo methods:
      getOtp()      · overload 0
      getOtp(long)  · overload 1
    
    OtpInfo.getOtp callers:
      ui.views.EntryHolder.getOtp
      ui.MainActivity.copyEntryCode

    REAはタイムスタンプオーバーロードを識別し、基本メソッドの呼び出し元を検索します。 検査 EntryHolder.getOtp 次に、表示呼び出しを表示します TotpInfo.getOtp(timestamp).

要求には、入力パスが短縮されて表示されます。 結果クラス名は共通を省略します com.beemdevelopment.aegis プレフィクス...

計算を読む

REAを返します クロック変換、デフォルト設定、および生成方法。 コンストラクターは30秒の間隔と6桁を設定します。timestampメソッドは秒をブロック番号に変換します。

REA*選択された逆コンパイルされたJava
// 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.

REA*generateOTP、完全なボディ
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);
}

最後のハッシュバイトが位置を選択します。 その位置にある4バイトは、正の31ビット数を提供します。フォーマットすると、要求された桁数に減少します。 コンストラクタの最後の引数は、コンパイルによって導入されたコード書式分岐を選択します。

一致するリリースソースとの比較.

再構築を確認する

選択したREA-返されたJavaメソッドを小さなテストプログラムで組み立てました。 彼らの出力は、上の独立した再構成に一致しました 133件のテストケース、タイムブロック境界とゼロで始まるコードを含みます。

時間例 ブロック 6桁のコード
30秒 1 287082
59秒 1 287082
60秒 2 359152
1,111,111,109秒 37,037,036 081804

ジェネレータは、公開されている六つのSHA-1リファレンスケースにも一致します 6238. それらに対するブラウザの実装を確認してください:

デモの計算を読む

参照ケースは8桁を使用します。 このチェックでは、6桁の結果も確認されます。

検証は、抽出されたJavaメソッドと新しいデモを実行します。 Android APKは静的に検査されました。

APKを自分で調べてください

REAのセットアップ macOSまたはLinuxで、これら2つのファイルを同じフォルダーにダウンロードします。 Windowsでは、WSLなどのLinux環境を使用します。

Android analysisには完全なJDK17以降が必要です。 で選択します。 JAVA_HOME または PATH. このケースはJDK21を使用していました。

プロバイダーファイルでREAをポイントし、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

エージェントは、上記のプロンプトを使用してREAのCLIを続行できます。 MCPのために、加えて下さい REA_JADX_MCP_JAR REAサーバーの環境に接続し、再接続します。

次の質問: アカウントが8桁または異なる時間間隔を使用するとどうなりますか?

ソース

2026年10月9日にREA6.1.0で検査されました。 逆コンパイルされた抜粋はAegisにクレジットされています;図,読みやすい要約とブラウザの再構成は、新しい教材です.

トップ