REA로 할 수 있는 것, 조건이 맞아야 되는 것, 지원하지 않는 것
커밋을 고정한 공식 문서를 기준으로 REA의 능력을 표로 정리했습니다. 기본 제공 정적 경로, provider가 필요하거나 상태를 바꾸는 경로, 지원하지 않는 대상, Evidence와 '모름'을 읽는 법까지.
“Reverse Engineer Anything”은 이름이지 사양이 아닙니다. REA가 실제로 다루는 범위는 대상의 종류, 운영체제, 여러분이 설치하고 라이선스를 갖춘 외부 도구, 그리고 그 작업이 파일을 읽기만 하는지 무언가를 실행하는지에 따라 달라집니다. 이 글은 그것을 할 수 있는 것, 조건이 맞아야 되는 것, 지원하지 않거나 범위 밖인 것 세 묶음으로 나눕니다.
개요 글에 이어지는 네 편 중 두 번째 글입니다.
- 최근 글들은 실제로 무엇을 시험했나
- 할 수 있는 것과 한계 (이 글)
- 장점과 대가, 그리고 앞으로의 시나리오
- 안전하게 시작하기
확인 날짜는 2026년 10월 14일입니다. 아래 내용은 모두 main 브랜치의 커밋 29d3dcb에 고정한 REA 공식 문서와 6.4.0 릴리스에서 가져왔습니다. 프로젝트가 문서에 적은 내용이지 Motitory가 잰 결과가 아니며, 우리는 REA를 실행하지 않았습니다. 전체 목록과 최신 내용은 README의 능력 표에 있고, 이 글은 많은 사람이 마주칠 줄만 골랐습니다. 드문 대상은 원래 표를 보세요.
먼저, 여러분의 REA는 어느 것인가
표를 보기 전에 버전 문제가 있습니다. ’REA’가 동시에 세 가지를 뜻할 수 있기 때문입니다.
- npm 릴리스와 main은 같지 않습니다. 6.4.0 패키지와 main 브랜치는 내용이 다르고, main에만 있는 기능은 소스에서 빌드하거나 다음 릴리스를 기다려야 씁니다(설치: 릴리스 패키지와 main).
- MCP 설정은 설정할 때의 버전에 묶입니다.
@latest로 실행하면 그 순간 게시된 패키지를 고르지만, MCP 클라이언트 설정은 바꾸기 전까지 설정할 때의 버전을 계속 씁니다. - 목록에 있다고 쓸 수 있는 것은 아닙니다.
tools/list에 도구가 보여도 여러분의 컴퓨터에서 동작한다는 뜻은 아닙니다. 문서에 따르면 실제로 쓸 수 있는지는 연결된 세션의binary_session.result.tool_availability가 알려 주고, 이 값이 실제로 갖춘 provider와 플랫폼을 반영합니다(식별과 탐색).
그러니 이 글을 포함해 어떤 블로그가 “REA로 X를 할 수 있다”고 하면, 정직한 해석은 “어떤 커밋의 문서가, 어떤 provider가 있으면 X가 가능하다고 말한다”입니다. 여러분의 세션에서 직접 확인하세요.
능력 표
| 대상 또는 작업 | 상태 | 필요한 것 | 정적·런타임 | 상태 변경 | 모르는 채로 남을 수 있는 것 |
|---|---|---|---|---|---|
| JavaScript·Electron 번들 | 가능, 기본 제공 | 네이티브 provider 불필요 | 정적, 앱을 실행하지 않음 | 없음 | 압축된 코드, 동적 import, 계산된 경로, 없는 소스 맵, 네이티브 모듈 경계 |
| .NET 어셈블리 | 가능, 기본 제공 | 네이티브 provider 불필요 | 정적 메타데이터와 CIL | 없음 | 리플렉션, 실행 중에 만들어지는 코드, P/Invoke가 실제로 하는 일 |
| 네이티브 실행 파일의 깊은 의사 코드·상호 참조 | 조건부 | 직접 설치한 Hopper, Ghidra, IDA 중 하나(각자의 라이선스) | 정적 | 대상은 실행하지 않음, provider가 자체 프로젝트 파일을 남길 수 있음 | 디컴파일 결과는 소스가 아님, 타입과 간접 호출은 추론 |
| 네이티브 실행 파일의 가벼운 검사 | 조건부, 제한적 | GNU objdump 또는 Rizin | 정적 | 없음 | 디컴파일러보다 훨씬 얕음 |
| Android APK | 조건부 | JADX와 JDK | 정적 | 없음 | 난독화, 실행 중에 불러오는 코드, 네이티브 라이브러리 |
| Android 기기 | 조건부 | ADB와 직접 관리하는 기기 | 런타임 | 있음: 파일 넣기, 앱 설치·삭제, 시작·중지 | 관찰한 동안 일어난 일뿐 |
| 브라우저 시나리오 | 조건부 | CDP나 Playwright로 다루는 Chrome 계열 브라우저 | 런타임 | 있음: 이동, 클릭, 입력, 저장소·네트워크·앱 상태 변경 | 캡처한 구간뿐 |
| 이미 있는 HAR·SAZ 캡처 | 가능 | 갖고 있는 캡처 파일 | 정적 파싱 | 없음 | 캡처가 기록하지 않은 것 |
| 새 프록시 캡처 | 조건부 | 직접 구성한 프록시 경로 | 런타임 | 있음, 다른 사람의 데이터가 섞인 트래픽도 기록될 수 있음 | 캡처한 구간뿐 |
| 펌웨어 이미지 | 조건부 | Binwalk 또는 Unblob | 정적이지만 추출한 파일을 씀 | 추출 결과를 디스크에 씀 | 암호화되었거나 독자 형식인 파일 시스템 |
| Frida 계측 | 조건부, 고위험 | Frida | 런타임 | 있음: 주입한 스크립트가 대상 프로세스의 메모리·파일·네트워크 권한으로 실행됨 | 이후 대상의 상태가 불확실할 수 있음 |
| Windows 프로세스 캡처 | 이 커밋에서 미지원 | — | — | — | — |
| Windows x64의 Ghidra | 실험적, 읽기 전용 | Ghidra | 정적 | — | 문서에 실험적이라고 표시됨 |
각 줄의 출처는 능력 표, Hopper, Ghidra, IDA가 필요한가, MCP 계약 문서의 로컬 영향 절입니다.
두 줄은 다시 볼 만합니다. 아무것도 더 설치하지 않아도 되는 경로는 JavaScript·Electron과 .NET의 정적 분석뿐이고, 공개된 독립 실행 두 편이 건드린 것도 이 경로뿐이었습니다(1편). 그리고 네이티브 코드에서 REA는 Hopper, Ghidra, IDA를 대신하지 않고 그 도구들로 이어 주는 다리입니다. 셋 중 하나가 없으면 깊은 의사 코드와 상호 참조는 쓸 수 없고, objdump나 Rizin이 주는 것은 그보다 훨씬 적습니다.
도구와 상관없이 범위 밖인 것
REA의 책임 있는 사용 절은 다음을 지원하는 사용 범위 밖에 둡니다. DRM, 라이선스 검사, 안티치트 우회, 치트 제작, 허락 없는 인증·봇 방지 우회, 독점 코드나 에셋 복제입니다. 앞으로 어떤 provider가 생기면 풀릴 기술적 한계가 아니라, 프로젝트가 그런 용도를 지원하지 않는다고 밝힌 것입니다.
모든 줄에 걸치는 일곱 가지 조건
표는 대상마다 한 줄이지만, 여러분에게 실제로 되는지는 모든 줄을 가로지르는 조건들이 정합니다.
- provider. 많은 줄이 외부 도구에 기댑니다. REA는 큰 도구를 몰래 설치하지 않으므로, 설치하고 라이선스를 갖추고 업데이트하는 것은 여러분의 일입니다.
- 운영체제. 플랫폼마다 지원이 다릅니다. 이 커밋에서 Windows 프로세스 캡처는 지원하지 않고, Windows x64의 Ghidra 경로는 실험 단계입니다.
- 라이선스. REA의 MIT 라이선스는 REA에만 해당합니다. Hopper와 IDA는 상용 도구로 자체 조건을 따르고, 다른 provider도 각자의 조건이 있습니다(외부 도구와 라이선스). 그 어느 것도 분석 대상에 대한 권리를 주지 않습니다. 직접 소유했거나 명시적으로 허락받은 대상만 분석하세요. 이 글은 법률 조언이 아닙니다.
- 권한. 런타임 경로는 실제 권한으로 움직입니다. 브라우저는 여러분의 세션을 갖고 있고, ADB 연결은 기기를 제어하고, Frida 스크립트는 프로세스 안에서 돌아갑니다. REA의 보안 정책은 REA가 샌드박스가 아니라고 분명히 적습니다.
- 정적과 동적. 정적 경로는 바이트를 읽을 뿐 대상을 실행하지 않습니다. 동적 경로는 한 번의 실행을 관찰하므로, 그동안 일어난 일만 봅니다.
- 부작용. 동적 경로는 파일을 만들고 지우고, 앱을 설치하고 지우고, 요청을 보내고, 저장된 상태를 바꿀 수 있습니다.
destructive,executesForeignCode,mutatesDevice같은 MCP 주석은 클라이언트를 위한 힌트이고, 호출마다 승인을 받는 일은 REA가 아니라 클라이언트나 호스트가 강제합니다(로컬 영향). - 데이터의 흐름. 분석은 로컬에서 돌지만, 에이전트는 도구 결과(문자열, 디컴파일된 코드, 캡처한 트래픽 등)를 모델 제공자에게 보냅니다. ’로컬’은 도구가 도는 곳을 말할 뿐, 결과가 닿는 곳을 말하지 않습니다.
Evidence 읽기: 답이 말하지 않는 것
REA는 결과를 식별 정보, 커버리지, 한계, 모르는 것을 담은 Evidence 구조로 돌려줍니다(도구 결과). REA에서 가장 쓸모 있는 부분이면서 가장 잘못 읽기 쉬운 부분이기도 합니다.
- 빈 목록은 없다는 증거가 아닙니다. 어떤 면(facet)을 쓸 수 없거나 일부만 봤거나 커버리지를 밝히지 않았다면, 빈 배열은 들여다본 범위에서 찾지 못했다는 뜻일 뿐입니다. 일부만 보았거나 모르는 상태의 호출 목록이 비어 있다고 그 함수가 아무것도 호출하지 않는다는 뜻은 아닙니다.
- 함수 텍스트가 바뀌었다고 함수가 바뀐 것은 아닐 수 있습니다. 빌드 간 함수 텍스트를 비교하면 주소가 옮겨지거나 자동 생성 이름이 바뀌었을 뿐인 차이가 보일 수 있습니다. 반대로 관찰한 제어 흐름 속성이 같다고 동작이 같은 것도 아닙니다.
- 큰 답은 참조로 돌아옵니다. 기본 stdio 결과 한도는 10MiB입니다. 이를 넘으면 전체 Evidence는 보관되고, 호출은 자원 제약을 알리는 참조를 돌려주며, 요약이나 페이지 단위로 꺼내 봐야 합니다. 1편의 HackerNoon 실행이 바로 이 경우였습니다.
- 대상이 말을 걸 수 있습니다. 결과에는 대상이 정한 내용, 예컨대 문자열이나 provider의 오류 출력이 섞일 수 있습니다. 문서는 이를 에이전트에 대한 지시로 다루지 말라고 합니다(신뢰할 수 없는 대상 콘텐츠). 바이너리 안에 “이전 지시를 무시하라”는 문자열이 있어도 그건 데이터입니다.
어떤 결과도 증명하지 않는 것
데모가 은근히 암시하는 경우가 많아서, 분명히 적어 둡니다.
- 정적 분석은 런타임 동작을 증명하지 않습니다. 코드가 할 수 있는 일을 보여 줄 뿐, 어떤 실행에서 실제로 한 일을 보여 주지 않습니다.
- 의사 코드는 원래 소스가 아닙니다. 디컴파일러가 다시 짜 맞춘 것입니다.
- 일부 검사에서 같다는 것은 동등하다는 뜻이 아닙니다. 정적 속성이 일치하거나, 출력이 소스처럼 보이거나, 다시 구현한 코드가 규칙 검사를 통과해도 모든 경우에 똑같이 동작한다는 증명은 아닙니다. 같은 조사에서 만든 시험은 독립된 기준이 아닙니다.
- 누구의 것인지는 아무것도 말해 주지 않습니다. 동작 방식을 알아냈다고 그것에 대한 권리가 생기지는 않습니다.
3편에서는 같은 사실을 놓고 REA가 무엇에 강하고 무엇에 약한지, 앞으로 어디로 갈 수 있는지를 따져 봅니다.
참고 자료
- 커밋
29d3dcb의 REA: 분석할 수 있는 것, Hopper, Ghidra, IDA가 필요한가, 설치: 릴리스와 main - MCP 계약: 식별과 탐색, 도구 결과, 요청 범위와 로컬 영향, 신뢰할 수 없는 대상 콘텐츠
- 보안 경계, 고지 문서: 책임 있는 사용, 분석 결과와 생성물, 외부 도구와 라이선스
- 릴리스: rea-agents-6.4.0
링크와 내용은 2026년 10월 14일에 확인했습니다.