네이티브 / 체험형 사례 분석 / 읽는 시간: 22분

TH04: 총알 16발은 내 위치를 어떻게 알까요?

REA로 TH04의 원형 탄막을 분석하세요. 바이트 각도, 조준, 회전을 추적하고 체험형 도해에서 작은 재구현을 테스트합니다.

이 페이지의 내용

01. 분석하기 전에 직접 해 보기

중앙 주변으로 마름모를 끌어 이동한 뒤 원형 탄막을 발사하세요. 연한 광선은 첫 번째 총알을 표시합니다. 개수를 16에서 12로 바꾸면 정수 각도 간격으로 원을 균등하게 나눌 수 없게 됩니다. 키보드를 선호한다면 슬라이더를 사용하세요.

조준 실험체험 / 관찰 / 설명
바이트 각도 32한 바퀴 256
마름모를 끌어 조준하세요0 → / 64 ↓

16개 방향이 각도 단위 16씩 떨어져 있습니다.

게임 영상이 아닌 각도 도해입니다. 마우스 조준은 근사 atan2 변환을 사용하며 원본은 iatan2를 사용합니다.

만들 결과물

체험형 각도 도해와 반올림 및 순환 처리를 명시적으로 검증하는 작은 원형 배치 계산입니다.

분석하기 전에

도해는 바로 실행됩니다. 바이너리 분석을 직접 하려면 일치하는 TH04 MAIN.EXE와 설정된 Ghidra 프로바이더를 준비하세요. 아래에 연결된 고정 커밋의 재구현 소스도 필요합니다. REA 설정하기 →

02. 실행 파일의 주소 체계 정확히 파악하기

TH04는 PC-98 DOS 프로그램입니다. 함수 주소를 따라가기 전에 로더가 파일을 메모리에 매핑하는 방식을 확인하세요. 실행 파일 해시, 로드 세그먼트, 코드 모드, 주소-파일 매핑을 기록과 함께 저장하세요. 로드 프로필 없는 주소는 엉뚱한 바이트로 이어질 수 있습니다.

공식 보고서는 분석의 기준점이 될 알려진 헬퍼와 고정 커밋의 재구현을 제공합니다. 이 기준점을 사용하는 것은 안내에 따른 실습이며 에이전트가 프로그램 전체를 혼자 발견했다는 증거는 아닙니다.

이 분석 프롬프트 복사
REA로 내 TH04 MAIN.EXE를 Ghidra에서 여세요. 연결된 TH04 검증 보고서와 DOS MZ 로드 프로필 및 아티팩트 식별 정보가 일치하는지 확인하세요. 일치하면 보고서의 bullet_velocity_and_angle_set 헬퍼를 분석하고 해당 주소를 파일 바이트에 역매핑하세요. 아티팩트나 로드 프로필이 다르면 과거 주소 사용을 중단하고 동등한 헬퍼를 찾는 방법을 설명하세요.

03. 원을 그리기 전에 방향 하나부터 파악하기

핵심은 연산 순서입니다. 인덱스, 개수, 조준, 회전을 각각 살펴보세요. 이 원형 배치 분기를 읽기 쉽게 나타내면 floor(index × 256 / count)에 조준과 회전을 더하고 1바이트 범위로 순환시키는 모델입니다. 화면에서 각도는 시계 방향으로 증가합니다.

총알 12발로 해 보세요. 먼저 곱한 뒤 나누면 오프셋이 0, 21, 42, 64…가 됩니다. 인덱스에 floor(256 / count)를 곱하면 0, 21, 42, 63…이 됩니다. 처음에는 일치하지만 나중에는 어긋납니다. 시각적으로 그럴듯한 원이 오류를 감출 수 있습니다.

  • 총알 16발, 조준 없음: 0, 16, 32, …, 240.
  • 총알 12발: 인덱스 3은 63이 아니라 64여야 합니다.
  • 조준 250에 오프셋 16을 더하면 순환되어 10이 됩니다.
  • 오른쪽은 0, 아래쪽은 64, 왼쪽은 128, 위쪽은 192입니다.

04. 원형 배치 규칙과 조준 헬퍼 구분하기

플레이어와 원점 좌표가 방향 헬퍼의 어디로 들어가는지 추적하세요. 그런 다음 템플릿 회전이 더해지는 위치와 최종 바이트가 저장되는 위치를 찾으세요. 각 단계를 테스트할 수 있도록 별도의 분석 결과로 남기세요.

이 도해는 마우스 조준에 JavaScript atan2를 사용하고 가장 가까운 바이트 각도로 반올림합니다. 원본은 iatan2를 사용합니다. 모든 플레이어 좌표에서 정확히 일치하려면 해당 헬퍼도 파악하고 테스트해야 합니다. 이 도해는 그 동등성을 주장하지 않고 원형 배치 산술을 보여 줍니다.

이 분석 프롬프트 복사
조준형 원형 탄막 분기만 파악하세요. 나누기 전에 곱하는 명령어 순서, 조준 방향을 계산하는 호출, 템플릿 회전 덧셈, 최종 바이트 저장을 보여 주세요. 원형 배치 산술을 독립적으로 구현하세요. 원본 iatan2 동작을 별도로 확인하기 전까지 도해에는 근사 함수임을 명확히 표시한 조준 함수를 사용하세요. 총알 12발과 16발, 음수 회전, 순환 처리를 테스트하세요.

05. 그림을 판단하기 전에 각도 테스트하기

일부러 까다로운 입력 몇 가지를 골라 각도를 수치로 내보내세요. 스크린샷에서는 1단위 오류가 맞는 것처럼 보일 수 있습니다. 균등하게 나누어지지 않는 개수, 255에 가까운 조준값, 0을 넘나드는 회전을 테스트하세요. 간격뿐 아니라 최종 바이트 범위도 확인하세요.

첫 광선이 포인터에서 조금 벗어나면 원형 배치 계산을 바꾸기 전에 각도 양자화를 확인하세요. 도해가 위아래로 뒤집혀 보이면 좌표계 규칙을 확인하세요. 네이티브 호출 그래프가 일관되지 않아 보이면 리얼 모드 세그먼트 매핑과 명령어 근거를 살펴보세요.

06. 알려진 결과와 비교하기

다음을 명확한 검증 지점으로 활용하세요. 일치하더라도 이 작은 규칙만 뒷받침하며 앱 전체의 호환성을 입증하지는 않습니다.

입력값예상 각도검출하는 문제
개수 16; 조준 0; 회전 00, 16, 32, …, 240균등한 간격
개수 12; 조준 0; 회전 00, 21, 42, 64, …, 234나누기 전에 곱하기
개수 16; 조준 250; 회전 0250, 10, 26, …, 234바이트 순환 처리
개수 4; 조준 0; 회전 −1255, 63, 127, 191음수 회전 정규화

두 파일을 같은 폴더에 저장하고 Node.js로 검증을 실행하세요. 패키지 설치는 필요 없습니다.

터미널
node check-case-labs.mjs

07. 실제로 검증한 범위는?

이 사이트는 추출한 원형 배치 산술을 테스트하고 새 도해를 그립니다. 원본 DOS 프로그램 실행, iatan2 헬퍼 재현, 과거 컴파일러 검증 재실행은 하지 않습니다. 16은 학습용으로 선택한 개수이며 모든 게임 난이도나 발사 상태에 적용된다는 뜻은 아닙니다.

이 사이트의 수치 테스트 결과 보기 →

출처: REA의 TH04 검증 보고서 · 고정 커밋의 재구현 원형 배치 매크로. 튜토리얼, 도해, 브라우저 실험은 독립적으로 제작했습니다.

다음 실험벽돌이 어느 쪽에 있는지 소리로 알 수 있을까요? →

REA가 처음인가요? REA란? · 가이드 검증 방법