REA로 Claude Code가 배포본에서 버튼 동작을 찾게 하는 법

동딩
2026.10.14·3분 읽기·

붙이고 질문 앞에 스킬 이름을 적는다

REA는 소스 없는 배포본을 읽는 도구를 에이전트에게 내주는 MCP 서버입니다. 붙여 두면 Claude Code가 app.asar를 실행하지 않고 읽어, 버튼이 하는 일을 파일과 줄 위치를 달아 답합니다. app.asar는 Electron이 앱 파일을 한 덩어리로 묶은 아카이브입니다.

github.com
GitHub - morluto/rea: Reverse engineer anything with agents, from app behavior down to native binaries.
Reverse engineer anything with agents, from app behavior down to native binaries. - morluto/rea
bash
npx rea-agents setup

Node.js는 22.19+, 24.11+, 26 이상 중 하나가 필요합니다. 에이전트 목록에서 Claude Code를 Space로 고르고, Hopper 설치 질문에는 No를 고릅니다. Hopper는 네이티브 바이너리용이라 Electron 앱에는 필요 없습니다.

rea-agents 6.4.0 setup의 에이전트 선택과 변경 검토

검토 화면에 MCP 서버 등록과 스킬 설치, 두 변경이 나옵니다. Apply these 2 changes?에서 승인하고 Claude Code를 다시 켜면 끝입니다.

메모 앱 1.2.0을 쓰는 사용자가 "내보낸 파일이 어디 있나요?"라고 물으면, 그때 묶어 낸 app.asar가 있는 폴더에서 Claude Code를 열고 이렇게 보냅니다.

text
/reverse-engineer-anything app.asar 는 내가 만든 메모 앱 1.2.0 배포본이야. 내보내기 버튼을 누르면 메모가 어디에 어떤 파일로 저장되는지 근거와 함께 알려 줘.

스킬 이름 없이 같은 문장만 보내면 REA를 붙여 둔 세션도 REA 도구 대신 셸 명령으로 asar를 풀어 읽곤 합니다.

같은 질문을 REA 없이 보낸 답과 나란히 놓으면 결론은 같습니다. 둘 다 문서 폴더 아래 MemoExports/<제목>.md를 찾습니다.

REA 없이 받은 답은 근거로 asar에서 꺼낸 코드 조각을 그대로 옮깁니다. REA를 거친 답은 내보내기 버튼이 main 프로세스에 저장을 시키는 통로를 note:export로 짚고, 그 양 끝을 dist/preload.js 1행처럼 파일과 줄 위치로 답니다. 앱을 실행하지 않고 코드만 읽은 결과라는 한계 문장도 답 끝에 붙습니다.

배포본이 main 브랜치의 어느 커밋인지 알고 그 소스를 바로 꺼낼 수 있다면 REA 없이 소스를 읽게 두면 됩니다.

바뀔 파일을 먼저 보거나 한 프로젝트에만 붙이려면

setup은 ~/.claude.json에 mcpServers.rea를 더하고, ~/.claude/skills/reverse-engineer-anything에 스킬을 깝니다. 원래 설정은 ~/.claude.json.rea.backup으로 남습니다. 승인 전에 계획만 보려면 이렇게 돌립니다.

bash
npx rea-agents setup --client claude_code --dry-run

setup으로 등록하면 모든 프로젝트에 REA가 붙습니다. 한 프로젝트에서만 쓰려면 그 폴더에서 로컬 범위로 등록합니다. 이 방법은 MCP 도구만 붙이고 스킬은 깔지 않아서 스킬 이름으로 부를 수 없습니다.

bash
claude mcp add --scope local rea -- npx -y rea-agents@6.4.0 mcp

Codex·Cursor·Gemini CLI도 setup의 같은 목록에서 고릅니다.

에이전트 없이 터미널에서 같은 분석을 돌리려면

CLI로 같은 분석을 돌릴 수 있습니다. 결과 JSON이 크니 jq로 통로와 preload가 화면에 연 객체만 거릅니다.

bash
npx -y rea-agents@6.4.0 analyze-javascript-application "$PWD/app.asar" --json > memo.json
jq -r '.normalized_result.graph.nodes[]
| select(.kind | test("ipc|context-bridge"))
| .kind as $k | .observations[]
| "\($k) \(.label) \(.evidence.location.value.source):\(.evidence.location.value.start.line)"' memo.json | column -t

메모 앱에서는 화면에 열린 객체가 memo 하나이고, note:export를 받는 핸들러가 dist/main.js 4행에 있습니다.

업데이트 뒤 문의에는 두 배포본을 같이 준다

1.3.0을 낸 뒤 "내보낸 파일이 문서 폴더에 없다"는 문의가 오면 두 배포본을 같이 줍니다.

text
/reverse-engineer-anything v1.2.0/app.asar 와 v1.3.0/app.asar 는 내 메모 앱의 두 배포본이야. 1.3.0에서 내보내기 저장 위치가 어떻게 달라졌는지 근거와 함께 짧게 알려 줘.
두 배포본의 내보내기 위치 비교 답

REA가 두 배포본을 각각 분석한 뒤 버전 비교로 바뀐 곳을 note:export 핸들러로 좁힙니다. 1.3.0은 userData/exports에 날짜를 붙여 저장하니, 사용자에게 새 위치를 안내하거나 옛 폴더를 옮기는 코드를 넣으면 됩니다.

Electron 앱이 아닌 대상이나 남이 만든 앱이라면

네이티브 바이너리의 의사코드는 별도 분석 엔진이 있어야 나옵니다. 분석 대상 표에서 자주 쓰는 것만 추렸습니다.

대상돌려받는 것더 필요한 것
Electron·JS 앱(asar, 폴더)모듈, IPC, preload 관계와 위치없음
.NET 어셈블리메타데이터, CIL 명령없음
Go·Rust 바이너리빌드에 담긴 의존 모듈과 버전없음
네이티브 바이너리의사코드, 어셈블리, 문자열Hopper·Ghidra·IDA 중 하나
Android APK매니페스트, 클래스, 메서드JADX와 JDK

남이 만든 앱은 라이선스와 약관이 분석을 허락하는지 먼저 봅니다. DRM·라이선스 확인 우회는 허용된 용도가 아닙니다.

Comments

댓글

powered by giscus ↗