당신의 에이전트를 물어
응용 프로그램은 변화하는 로그인 코드를 보여줍니다. 우리는 찾고 싶어 무엇이 그것을 변화 시키는가 그리고 그 행동을 재현하십시오.
REA로 aegis-v3.4.3.apk을 분석해 주세요. 6자리 로그인 코드가 어떻게 생성되고 왜 30초마다 바뀌는지 설명한 뒤, 시간을 바꿔 볼 수 있는 작은 데모를 만들어 주세요.
다운로드한 APK를 분석하는 예시 프롬프트입니다. 먼저 REA의 Android 분석 환경을 설정하세요. APK와 분석 설정 받기 ↓
코드 생성기 사용해보기
앱은 시간을 30초 단위로 나눕니다. 시간 구간 번호와 계정 키를 결합해 코드를 생성합니다. 같은 키와 같은 시간 구간이면 같은 코드가 나옵니다.
60 초에 걸쳐 시계를 이동
- 시간 초우리의 조정 가능한 예제 시계
-
30 초 블록블록
floor(59 / 30)
30-59 초 - 생성된 코드계정 키+블록 6 자리 숫자
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 초 간격과 6 자리 숫자를 설정합니다.타임 스탬프 방법은 초를 블록 번호로 바꿉니다.
// 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.
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:
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;다이어그램,읽을 수 있는 요약 및 브라우저 재구성은 새로운 교육 자료입니다.