사례 연구·Aegis인증

인증자는 어떻게
로그인 코드를 생성 하시겠습니까?

6 자리 코드는 30 초마다 변경됩니다. 사용 REA 안드로이드에서 계산을 찾으려면 APK,그리고 당신이 제어할 수 있는 시계로 다시 만들죠.

Aegis3.4.3·안드로이드·공식 출시APK·6.9MB

보기 Aegis 시작 GitHub

에서APK코드를 재현할 수 있습니다

  1. 01*기능 찾기3,077 개의 클래스 생성 메소드 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. 한 블록 내에서 이동하면 코드가 변경되지 않습니다.

키는 고정,공개 6238 테스트 데이터. 데모에서 복구 된 계산을 구현 APK.

코드를 찾으로REA

  1. 좁은 APK 세 가지 클래스

    에이전트→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 계산 후보입니다.다른 두 개는 진행률 표시줄과 가져온 계정에 관한 것입니다. 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 자리 숫자를 설정합니다.타임 스탬프 방법은 초를 블록 번호로 바꿉니다.

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 가 됩니다.

핵심 문제도 마찬가지입니다. 생성기는 계정 키와 블록을 결합합니다. 키가 다른 계정은 동시에 다른 코드를 표시할 수 있습니다.

6 자리 숫자를 유지하십시오. 1,000,000 으로 나눈 후의 나머지 부분은 필요할 때 0 으로 채워져 있습니다.그래서 코드는 0 으로 시작할 수 있습니다.

여러 검사 방법에서 발췌,디스플레이 라인 포장. 오른쪽 패널은 설명 요약입니다. Aegis 코드는 다음과 같습니다.

발전기 내부

석방 된 사람 들 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-작은 테스트 프로그램에서 자바 메소드를 반환했습니다. 그들의 출력은 독립적인 재구성과 일치했습니다. 133 테스트 케이스 시간 블록 경계와 0 으로 시작하는 코드를 포함합니다.

예제 시간 블록 6 자리 코드
30 초 1 287082
59 초 1 287082
60 초 2 359152
1,111,111,109 초 37,037,036 081804

발전기는 또한 6 개의 발표된 것과 일치합니다. SHA-1 참조 사례 6238. 그들에 대한 브라우저 구현을 확인하십시오:

데모 계산 읽기

참조 케이스는 8 자리 숫자를 사용합니다. 이 검사는 또한 6 자리 결과를 확인합니다.

검증은 추출 된 자바 메소드와 새로운 데모를 실행합니다. 안드로이드APK검열되었으로 합니다.

검사 APK 너 자신

설정 REA 시작 macOS 또는 Linux 그런 다음 이 두 파일을 동일한 폴더에 다운로드합니다. 시작 Windows,사용 Linux 같은 환경.

안드로이드 분석은 전체 17 이상 필요합니다. 함께 선택 JAVA_HOME 또는 PATH. 이 사건은 21 번을 사용했습니다.

포인트 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 자리 또는 다른 시간 간격을 사용할 때 어떤 일이 발생합니까?

출처

로 검열하는 REA 6.1.0 2026 년 10 월 9 일 분해된 부분들은 Aegis;다이어그램,읽을 수 있는 요약 및 브라우저 재구성은 새로운 교육 자료입니다.

상단