DX-Ball의 사운드
패닝 계산을 복구하세요

원본 명령어를 살펴 입력과 상수를 식별하고 복구한 C 코드를 검증합니다.

왼쪽/오른쪽 스테레오 사운드 위치 계산

DX-Ball에서는 벽돌에 맞으면 화면의 가로 위치를 전달합니다. 사운드 코드는 이를 좌우 패닝 값으로 변환합니다.

시작 함수 0x00406400의 디컴파일 결과는 __ftol() 호출 하나로 짧습니다. REA는 명령어와 호출 함수도 반환하므로, 에이전트가 빠진 연산을 추적할 수 있습니다.

이 용어들이 낯선가요?
  • 명령어: 프로세서가 실행하는 단계로, MOV나 ADD처럼 읽을 수 있는 형태로 표시합니다.
  • 디컴파일 결과 / 의사 코드: 분석 도구가 명령어를 C와 비슷한 코드로 복원한 결과입니다. 이 예제처럼 일부를 놓칠 수 있습니다.
  • 호출자: 이 함수를 호출하는 함수입니다. 어떤 값이 전달되는지 보여줍니다.
  • 주소: 프로그램 안의 위치로, 0x00406400처럼 16진수로 표기합니다.
  • 상수: 프로그램에 저장된 고정 숫자입니다. 원시 바이트를 읽어 값으로 해석합니다.

세 가지 증거, 하나의 계산

  1. 01 · 명령어정수 입력스택에서 읽은 값이 부동 소수점 명령어의 입력으로 쓰입니다.
  2. 02 · 호출 함수화면 좌표벽돌 충돌을 처리하는 호출 함수가 20 + 30 × tile_x를 전달합니다.
  3. 03 · 데이터 바이트수치 상수참조된 바이트를 해석하면 1.5625, 500.0, 배율 값이 나옵니다.

pan = (x × 1.5625 − 500.0) × scale

REA는 명령어, 호출 관계, 바이트를 제공합니다. 에이전트는 이 증거를 함께 해석합니다.

동작 질문하기

에이전트에 REA를 연결하고 네이티브 분석 도구를 설정한 뒤, 로컬 실행 파일과 질문을 전달하세요:

어떤 분석 도구를 쓰면 되나요?

REA로 네이티브 프로그램을 읽으려면 다음 중 하나가 필요합니다:

  • Hopper(macOS 또는 Linux): REA 설정이 기존 설치를 찾거나 설치를 제안합니다. macOS에서는 첫 분석 전에 Hopper를 한 번 열어 데모 모드를 선택하거나 라이선스를 활성화하세요.
  • Ghidra (macOS 또는 Linux, Windows에서는 실험적 지원): 무료이지만 기존 Ghidra 12.1.x 설치와 64비트 JDK 21 이상이 필요합니다.
  • IDA(Windows): MCP가 등록된 기존 IDA 환경에서 사용합니다.

절차는 네이티브 분석 설정을 참고하세요.

코딩 에이전트

REA로 DX-Ball의 사운드 패닝 계산 방식을 찾아줘. 계산을 설명하고 코드도 보여줘.

예제 프롬프트입니다. 에이전트에게 로컬 DX-Ball 1.07 실행 파일의 경로를 알려주세요. REA에는 DX-Ball이 포함되어 있지 않으므로 보유한 복사본을 사용하거나, 가지고 있는 다른 작은 Windows 프로그램에 같은 종류의 질문을 해 보세요.

파일의 전체 경로는 어떻게 얻나요?
  • Windows: 파일 탐색기에서 파일을 마우스 오른쪽 버튼으로 클릭하고 경로로 복사를 선택하세요. Windows 10에서는 Shift 키를 누른 채 마우스 오른쪽 버튼을 클릭하세요.
  • macOS: Finder에서 파일을 마우스 오른쪽 버튼으로 클릭한 뒤 Option을 누르고 “…”을(를) 경로 이름으로 복사를 선택하세요.
  • 모든 시스템: 파일을 터미널 창으로 드래그하면 해당 경로가 나타납니다.

REA 결과 읽기

입력 읽기

REA 명령어 발췌 · 0x406409
MOV EAX, dword ptr [EBP + 0x8]
MOV dword ptr [EBP + -0xc], EAX
FILD dword ptr [EBP + -0xc]

명령어는 정수 인수를 읽어 부동소수점 연산용으로 변환합니다. 첫 의사 코드에서 빠졌던 입력이 바로 이 값입니다.

호출 함수 추적

REA 호출 함수 발췌 · 0x411f5b
ADD EAX, 0x14
PUSH EAX
CALL 0x00406400

REA가 벽돌 충돌을 처리하는 호출 함수를 식별합니다. 앞선 명령어에서 타일 좌표에 30을 곱하고 0x14(20)을 더해 벽돌의 화면 위치를 구합니다.

참조된 상수 읽기

REA 바이트 결과 · 리틀 엔디언 double 값으로 해석
0x420068  000000000000f93f  → 1.5625
0x420070  0000000000407f40  → 500.0
0x4210a0  000000000000f03f  → 1.0

연산은 이 주소들을 참조합니다. 바이트를 읽으면 실제 값을 알 수 있고, 명령어 순서는 그 값을 어떻게 사용하는지 알려줍니다.

복구한 함수 작성 및 검증

복구된 C · 발췌
pan = (double)x;
pan = pan * 1.5625;
pan = pan - 500.0;
pan = pan * dxball_pan_scale;
return (DxBallInt)pan;

배율이 1.0이면 화면 위치 0, 320, 640은 정수 변환 전에 각각 −500, 0, 500이 됩니다. 화면 중앙이 스테레오 음장의 중앙에 대응하는 계산입니다.

에이전트는 REA의 분석 결과를 바탕으로 C 코드를 작성했습니다. 별도의 검사에서는 3,205개의 입력을 원래 x86 함수와 비교하고, 전체 함수의 컴파일된 63바이트를 모두 재현했습니다.

전체 조사와 어셈블리·C 비교 보기

직접 고른 바이너리로 시도하기

네이티브 분석 도구를 연결한 뒤, 로컬 실행 파일이나 라이브러리와 조사할 기능을 에이전트에게 전달하세요. “이 파일은 어떻게 파싱해?” 또는 “이 메뉴 동작은 어떤 함수가 처리해?” 같은 질문으로 시작할 수 있습니다.

함수 이름이나 주소를 이미 안다면 터미널에서 조회할 수 있습니다. Ghidra가 설정된 환경의 예:

함수 분석
npx -y rea-agents@latest function /absolute/path/to/program main \
  --provider ghidra --json

대상 경로와 main를 실제 함수 이름이나 주소로 바꾸세요. CLI는 호출할 때마다 바이너리를 가져와 분석한 뒤 세션을 닫습니다. 에이전트의 MCP 질의는 세션이 열려 있는 동안 가져온 바이너리를 재사용합니다.

의사 코드를 명령어, 참조와 함께 읽으세요. 확인되지 않은 호출이나 값이 있다면 그 위치를 다음 질문의 출발점으로 삼으세요.

상단