YouMind
로그인

Opus 5.5 를 리버스 엔지니어링 기계로 만드는 8 단계 풀 코스

@hanakoxbt
영어2026년 10월 13일
194K
139
14
15
332

TL;DR

이 가이드는 REA 도구와 Opus 5.5 를 활용한 소프트웨어 리버스 엔지니어링을 위한 8 단계 워크플로우를 상세히 설명합니다. 타겟 라우팅, 설치, 정찰, 디컴파일, 난독화 처리, 스웜 분석, 클린룸 재구축 및 검증 과정을 다룹니다.

2026년 10월 8일, 석 달 전만 해도 아무도 몰랐던 리포지토리가 GitHub 트렌딩 1위를 차지했다.

이름은 REA(Reverse Engineer Anything)이며, 에이전트에게 진짜 디스어셈블러를 쥐여준다.

**북마크해 두자 - 더 긴 버전이 필요하다면, 이 주제를 다룬 20개 레슨 전체 코스가 지금 라이브로 열려 있다:**

reacourse.xyz

빈 터미널에서 시작해 자체 동등성(parity) 테스트를 통과하는 재구축까지, 모든 명령과 프롬프트를 빠짐없이 적어두며 안내한다. 여기서 시작하자.

그 주 반응은 어디서나 똑같았다.

Matthew Berman은 세 단어로 요약했고, 360만 명이 그것을 봤다.

https://x.com/MatthewBerman/status/2108245653843509415

REA는 오픈소스 MCP 서버와 CLI로, Claude Code, Codex, Cursor, Gemini CLI에 바로 연결된다.

MIT 라이선스, morluto가 제작, 2026년 7월 12일 첫 릴리스, 그리고 석 달 뒤 GitHub 스타 10만 개 돌파.

모든 것은 로컬에서 실행되며, 모든 결론은 관찰(observation), 추론(inference), 미확인(unknown) 중 하나로 태그되고 그 근거가 되는 주소나 호출 위치가 함께 붙는다.

봉인된 바이너리부터 온전히 내 것이 된 재구축까지, 여덟 단계로 이어지는 전체 경로다.

Hanako - inline image

단계에 앞서: 사람들이 이미 이것으로 무엇을 출시했는가

이야기의 주인공은 도구가 아니라, 4주 만에 나온 결과물이다.

ArtCraft는 Adobe 앱 일곱 개를 무료 오픈소스 대안으로 재구축한 뒤, WordCraft, GridCraft, DeckCraft로 Office까지 겨냥했다.

현재 앱 12개, 전부 Rust로 처음부터 새로 작성되었고, 세 플랫폼 모두 네이티브로 동작하며 하나를 제외하고는 WebAssembly를 통해 브라우저 탭에서도 돌아간다.

게임 쪽 증거는 더 구체적이다:

  • Super Mario Sunshine 네이티브 PC 포트: Claude와 Codex를 함께 사용해 약 365 에이전트 시간, 173억 토큰 소모
  • 공식 REA 블로그에서 에이전트로 재구축한 동방 프로젝트(Touhou) 게임: 함수 697개 중 696개 정확히 일치, 약 12일 만에 플레이 가능
  • Aegis 인증 앱(클래스 3,077개) 분해 및 재구축, 테스트 케이스 133개 전량 통과
  • DX-Ball의 사운드 팬(sound-pan) 함수를 C로 재구축해 원래 x86 테스트 케이스 3,205개를 통과시키고 컴파일된 63바이트 전부를 재현

이 목록이 '아닌 것'을 주목하자.

아무도 라이선스 검증을 뚫지 않았고, 남의 소스코드를 공개하지 않았다.

저것들은 전부 행동을 복원하고, 기록한 뒤, 새 코드로 다시 만든 결과다.

01. 무언가를 열기 전에 타깃을 분류하라

이것이 퍼진 이유는 한 가지를 잘 읽어서가 아니다. 거의 모든 것을 읽고, 자신이 내리는 주장마다 증거를 보여주기 때문이다.

https://x.com/RoundtableSpace/status/2109165852578992582

그 목록은 당신이 내리는 첫 번째 결정이기도 하다. 오후를 통째로 날리는 가장 흔한 방법은, JavaScript가 그대로 노출된 Electron 앱을 두고 디스어셈블러부터 켜는 것이다.

REA를 Electron에 향하게 하면 엔진 없이도 몇 초 만에 모듈, 임포트, IPC 경계를 얻지만, 네이티브 Mach-O나 ELF라면 Hopper 데이터베이스를 열게 되는데 이는 더 깊고 더 느린 길이다.

지금 어느 쪽에 있는지 아는 것만으로 몇 시간을 아끼므로, 첫 프롬프트의 역할로 삼자.

markdown
1[절대 경로]에 있는 [앱]에서 [기능]이 어떻게 작동하는지 이해하고 싶어.
2 먼저 이 타깃이 어떤 종류인지(네이티브, Electron/JS, .NET, Go, APK, WASM) 알려주고
3 그에 맞는 REA 도구를 골라 열어줘. 아직 심층 분석은 시작하지 마.
4 그런 다음 한 문단으로 지도를 그려줘: 무엇으로 만들어졌는지, 크기는 어느 정도인지,
5 [기능]을 찾으려면 어디부터 봐야 하는지. 관찰, 추론, 미확인은 서로 분리해서 정리해.
Hanako - inline image

거의 아무도 언급하지 않는 부분: 많은 Unity 게임이 로직을 .NET으로 배포하는데, REA는 추가 엔진 없이 .NET을 읽는다.

구매한 Steam 게임을 30분 안에 바이너리에서 편집 가능한 C#으로 바꾸는 이유가 바로 이것이다.

그리고 당신 기기에 있는 모든 Electron 앱은 실행조차 하지 않고 당장 읽을 수 있다:

bash
1# JavaScript가 있는 위치
2macOS: /Applications/<App>.app/Contents/Resources/app.asar
3Windows: C:\Users\<you>\AppData\Local\Programs\<App>\resources\app.asar
4 npx -y rea-agents@latest analyze-javascript-application /absolute/path/to/app --json

02. 5분 만에 설치하고, 엔진 하나만 추가하라

이것이 작동하는 비결은 영리한 프롬프트가 아니다. 에이전트에 직접 연결된 진짜 디스어셈블리 엔진이며, 어느 개발자도 정확히 그렇게 표현했다.

https://x.com/techNmak/status/2108431092462338178

설정은 MCP 서버를 에이전트에 등록하고 대응하는 워크플로 스킬을 설치한다.

무언가를 쓰기 전에 모든 변경 사항을 보여주며, 건드리는 파일은 백업한다.

node -v # Node 22.19+, 24.11+ 또는 26+. 23과 25 버전은 지원되지 않음

bash
1npx rea-agents@latest setup # MCP 서버를 등록하고, 쓰기 전에 물어봄
2npm install --global rea-agents # 짧은 rea 명령어를 영구적으로 사용
3rea --help
4# 에이전트를 재시작한 뒤 확인. doctor는 검사만 하고 절대 아무것도 바꾸지 않음
5npx -y rea-agents@latest doctor --client claude_code --json

재시작은 생각보다 중요하다. 터미널 세션은 새로 시작해야 하고, 데스크톱 앱은 완전히 종료해야 한다. 창만 닫아서는 부족하다.

그런 다음 실제로 읽고 싶은 대상에만 엔진을 추가하자.

첫 번째 진짜 타깃을 다루기 전에 써둘 만한 파일이 하나 있다. claude-md에 넣는 하우스 룰(house rules)이다.

내가 소유한 것만 분석하고, 모든 주장은 관찰·추론·미확인으로 태그하며, 근거가 되는 주소를 인용하고, 통과하는 테스트 없이는 복원된 행동을 완료로 처리하지 않게 한다.

bash
1# 네이티브 프로그램 및 게임: Ghidra 12.1.x 와 JDK 21 이상
2 export GHIDRA_INSTALL_DIR=/absolute/path/to/ghidra_12.1.4_PUBLIC
3 export JAVA_HOME=/absolute/path/to/jdk-21
4 npx -y rea-agents@latest doctor --provider ghidra --json
5
6 # Android 앱: JDK 17+ 와 jadx-headless-mcp 0.7.1
7 export REA_JADX_MCP_JAR=/absolute/path/jadx-headless-mcp-0.7.1-all.jar
8 rea inspect-android-package /path/App.apk
9
10 # 스마트 컨트랙트 바이트코드, 현재는 Linux x64만 지원
11 rea inspect-evm-interface ./runtime.hex hex --json

03. 정찰: 지도가 코드보다 먼저다

아직 함수 하나도 열지 마라.

명령어 하나로 바이너리가 어떤 머신에서 돌아가는지, 내부에 함수가 몇 개인지, 묻혀 있는 읽기 가능한 텍스트가 무엇인지 알 수 있다.

그 텍스트는 하루 종일 얻을 수 있는 가장 빠른 단서다. 엔드포인트, 오류 문자열, 기능 이름이 로직을 읽기 전에 앱을 설명해 준다.

json
1rea.open_binary { path: "/Applications/Target.app/Contents/MacOS/Target" }
2rea.binary_overview {}
3 arch: arm64
4 functions: 1,284 identified
5 entry: _main @ 0x1000051c0
6
7rea.search { query: "http" }
8 0x10004a2c0 "https://api.target.app/v3/sync"
9 0x10004a300 "Authorization: Bearer "
10
11rea.xrefs { address: "0x100012ab0" }
12 147 references -> core config loader, called everywhere
Hanako - inline image

REA는 각 함수가 몇 번 호출되는지 세며, 그 횟수가 곧 교차 참조(cross-reference) 숫자다.

147번 호출되는 함수는 앱의 뼈대이고, 두 번 호출되는 함수는 나중에 봐도 되는 헬퍼다.

그 숫자로 정렬해 위에서부터 내려가라. 절대 파일 순서대로 보지 마라. 파일 순서는 흥미로운 함수가 네 개뿐인 바이너리 안에서 주말을 통째로 잃어버리는 방법이기 때문이다.

04. 함수 하나를 디컴파일하고, Opus에게 그 안의 모든 것에 이름을 붙이게 하라

디컴파일러는 날것의 기계어 명령을 C에 가까운 형태로 되돌린다.

결과물은 투박하다. var_28 같은 이름, 곳곳의 캐스트, 엉킨 분기. 하지만 투박해도 괜찮다. 모델에게는 읽을 수 있다는 것만 필요하기 때문이다.

bash
1# 주소로 함수 하나를 지정해 저장하고 재사용할 수 있는 JSON으로 출력
2rea decompile /path/to/Target 0x100012ab0 --provider hopper --json > fn_config.json
3
4# 또는 이름으로 찾아 참조를 따라가기
5rea function /path/to/Target parseConfig --provider hopper --json
6rea xrefs /path/to/Target 0x100012ab0 --provider hopper --json

그런 다음 그 출력을 Opus 5.5에 넘겨, 디스어셈블러가 할 수 없는 부분을 맡기자:

markdown
1교차 참조가 147개인 함수의 디컴파일된 의사코드가 여기 있어.
2
31. 변수가 어떻게 쓰이는지에 따라 모든 변수명을 바꾸고, 목적을 한 문장으로 설명해.
42. 이 함수가 읽고 쓰는 자료구조를 나열하고, 따르고 있는 패턴에 이름을 붙여.
53. 호출 규약이 암시하는 언어로 깔끔하고 자연스러운 코드로 다시 작성해.
64. 누락된 오류 처리, 입력 검증, 보안 검사가 있다면 표시해.
7
8답변하기 전에 xhigh 노력 수준으로 생각해. 확신이 없는 부분은 표시해 둬.
Hanako - inline image

Opus 5.5에는 low, medium, high, xhigh, max 다섯 가지 노력(effort) 수준이 있다.

Medium은 살펴보고 탐색하며, high는 일반적인 함수에 주석을 달고, max는 난독화된 코드와 무거운 포인터 연산용이다.

노력 수준은 이 파이프라인에서 품질을 좌우하는 가장 큰 다이얼인데, 대부분 기본값에 둔 채 모델을 탓한다.

디컴파일은 코드가 '무엇을' 하는지 알려주고, 모델은 '왜' 하는지와 재구축에 필요한 이름을 알려준다.

05. 난독화: 깰 가치가 있는 것만 깨고, 나머지는 예산을 정하라

어떤 앱은 당신이 하려는 일을 막으려고 설계되었다. 로직을 섞고, 문자열을 암호화하고, 오직 당신의 주의력을 낭비시키기 위해 가짜 분기를 넣는다.

최고의 모델조차 고전하는 유일한 영역이며, 이를 보여주는 수치도 있다.

Elastic Security Labs가 20개 과제에 걸쳐 Tigress 스크램블러를 대상으로 Claude Opus를 시험했는데, 두 가지 교훈이 명확히 나왔다.

실패한 시도는 성공한 시도의 약 두 배 비용이 든다. 모델이 포기하기 전까지 계속 밀어붙이기 때문이다. 또한 다중 계층 난독화는 성공률 0%로 돌아왔으므로, 억지로 파고드는 것은 아무것도 배우지 못하는 가장 비싼 방법이다.

Hanako - inline image

실용적인 규칙은 세션 단위가 아니라 함수 단위로 예산을 정하는 것이다.

먼저 군더더기를 제거하자. Caveman이라는 무료 도구가 디컴파일된 쓰레기의 약 75%를 걷어내 주며, 그러면 모델은 진짜 로직에 집중력을 쓴다.

markdown
1이 함수는 난독화된 것 같아. max 노력 수준으로 작업해.
2
31. 사용된 기법(제어 흐름 평탄화, 불투명 술어, 데드 코드, 문자열 암호화, 함수 분할)을 식별하고 각각을 여기서 짚어줘.
42. 해결해: 죽은 분기를 제거하고, 불투명 술어를 평가하며, 디스패치를 평탄화 해제하고, 키를 복구할 수 있다면 인라인 문자열을 복호화해. 남은 것을 보여줘.
53. 신뢰도를 1~10으로 매겨. 6 미만이면 불확실한 부분과 그것을 해결할 맥락이 무엇인지 밝혀. 조용히 추측하지 마.

06. 스웜: 컨트롤러 하나, 워커 여러 개

채팅 하나로는 함수 500개를 제대로 읽을 수 없다.

마흔 개 전 함수에서 본 것을 잊고, 같은 구조체에 세 가지 다른 이름을 붙이며, 슬쩍 자기 자신과 모순되기 시작한다.

해법은 컨텍스트를 늘리는 것이 아니라 역할을 나누는 것이다. 일을 배분하는 컨트롤러와, 함수 하나씩만 맡고 멈추는 워커들.

Hanako - inline image
markdown
1당신은 역공학 컨트롤러야. 함수 맵은 functions.json에 있어
2(주소, 이름, 크기, xref_count).
3
41. 호출 그래프 근접성으로 함수를 군집화하고, 군집을 교차 참조 수로 정렬해.
52. 각 군집을 워커에게 배정해. 절대 스스로 함수를 분석하지 마.
63. 이미 해결된 구조체를 각 지시문에 주입해서 이름이 일관되게 유지되게 해.
74. 신뢰도 6 미만은 해결된 이웃 함수의 맥락을 더해 두 번째 패스를 돌려.
85. 누적 토큰 소모량을 추적하고 각 군집이 끝날 때마다 보고해.
9
10당신은 워커야. 디컴파일된 함수 하나와 지금까지 해결된 구조체를 받습니다.
11정확히 다음을 반환하세요: 주소, 목적, 신뢰도(1~10), structs_used, structs_new,
12clean_source, flags. 기존 구조체 이름을 재사용하고, 컨트롤러가 이미 준 구조체에
13두 번째 이름을 절대 만들지 마세요. 함수는 하나만. 끝나면 멈추세요.

REA에는 대부분의 사람이 열어보지도 않는, MCP 서버에 내장된 가이드 워크플로도 있다:

  • - investigate_feature - 발견부터 정확한 함수까지 기능을 추적
  • - compare_application_versions - 두 릴리스를 비교해 실제로 무엇이 바뀌었는지 확인
  • - verify_reconstruction - 저장된 증거와 대조해 재구축을 검증
  • - audit_residual_unknowns - 아직 증명되지 않은 항목을 나열

07. 클린룸: 두 컨텍스트 사이의 벽이 곧 제품이다

클린룸 재구축이란 앱이 '무엇을' 하는지는 복사하되 그 안의 코드는 절대 복사하지 않는다는 뜻이다.

잘하면 출시하는 것은 온전히 당신의 것이 되고, 잘못하면 남의 저작권을 당신의 리포지토리 안에 품게 된다.

이것은 2026년의 발명이 아니라 40년 된 방법론이다.

80년대 초반 Compaq은 이 방식으로 IBM BIOS를 약 100만 달러에 재구축했고, 그것이 다른 브랜드의 PC가 존재하는 유일한 이유다.

1992년 Sega v. Accolade 판결에서 법원은 코드를 분해하는 것이 작동 방식을 이해할 유일한 방법일 때 공정 이용이 될 수 있다고 밝혔고, 2000년 Sony v. Connectix에서 Sony는 0-3으로 패소했는데 완성된 에뮬레이터에 Sony 코드가 전혀 들어 있지 않았기 때문이다.

경계선의 반대편도 마찬가지로 명확하다. 2011년 George Hotz는 PS3 루트 키가 공개된 후 Sony와 합의하며 중단하기로 했다.

Hanako - inline image

네 가지 규칙이 당신을 올바른 편에 있게 해주며, ArtCraft 팀은 모든 빌드에서 이 네 가지를 자동으로 검사한다:

  • - 관찰하되 복사하지 마라. 타깃을 블랙박스로 실행하고, 자기 창만 스크린샷 찍으며, 그 코드를 절대 프로젝트에 붙여넣지 마라
  • - 소스가 아닌 명세. 파일 형식은 공개 표준(OOXML은 ECMA-376 / ISO 29500, 여기에 공개된 RTF 및 ODF 명세)에서 가져오고, 절대 경쟁사의 파서를 읽어오지 마라
  • - 오리지널 자산만. 모든 아이콘, 폰트, 템플릿, 사운드는 코드로 그리거나 퍼블릭 도메인·오픈 라이선스를 사용하며, 저작자 표시 파일에 한 줄씩 기록한다
  • - 두 작업을 분리하라. 한 에이전트는 행동을 복원해 명세를 쓰고, 다른 컨텍스트는 그 명세만으로 구현한다

사람들이 건너뛰는 마지막 규칙이 바로 진짜 경계다.

조사하는 에이전트는 정의상 오염되어 있다. 디컴파일을 읽었기 때문이다. 반면 구축하는 에이전트는 오염되어선 안 된다.

markdown
1완료된 분석을 바탕으로 재구현을 위한 클린룸 명세를 작성해.
2
3오직 '행동'만 설명해: 모든 공개 인터페이스, 데이터 모델, 사용자 눈에 보이는 각 기능을
4테스트 가능한 요구사항으로, 읽고 쓰는 파일 형식, 오류 처리.
5
6주소, 오프셋, 디컴파일된 변수명, 어셈블리, 원본에서 복사한 어떤 것도 포함하지 마.
7바이너리를 한 번도 본 적 없는 개발자가 이 문서만으로 호환되는 버전을 구현할 수 있어야 해.
8
9섹션: 아키텍처, 데이터 모델, 공개 API, 파일 형식, 테스트 케이스.

설명서대로 작업하는 것은 법적 방패만이 아니다.

누군가 20년 전에 내린 결정을 물려받는 대신, 당신이 쓰는 언어에 맞는 올바른 선택을 할 수 있게 해준다. WordCraft가 일부 영역에서 Word보다 빠른 이유다.

08. 동등성을 검증하고, MCP로 출시하라

원본 소스는 애초에 없었으니 한 줄씩 diff를 볼 수 없다.

행동을 비교한다. 두 빌드에 같은 입력을 넣고, 같은 출력이 나오는지 본다.

markdown
1원본 바이너리와 내 재구축을 비교하는 행동 기반 테스트 하네스를 만들어.
2
3입력 50개를 생성해: 정상 30개, 엣지 10개(빈 값, 최대 크기, 유니코드), 오류 10개(형식 오류, 손상).
4각각을 양쪽에 돌리고, 가능하면 바이트 단위, 아니면 의미 단위로 비교해.
5일치율, 차이점, 각 차이의 심각도(표면적 / 행동적 / 치명적)를 보고해. report.md에 저장해.

"일치하는 것 같다"는 증거가 아니지만, 일치율은 증거다. 그리고 그 보고서는 릴리스 글 맨 위에 올릴 수 있는 가장 설득력 있는 자료다.

그다음 REA와 Craft 앱들이 그랬듯, 재구축을 MCP 서버로 출시하라. 그래야 다음 사람의 에이전트가 당신이 REA를 조종했던 것처럼 당신의 도구를 조종할 수 있다.

모든 함수에 명확한 이름과 한 줄 설치를 부여하면, 모든 액션은 클릭, 단축키, 에이전트가 동일하게 트리거할 수 있는 이름 붙은 명령이 된다.

bash
1claude mcp add wordcraft -- wordcraft-cli mcp
2
3> report.docx를 열고, 모든 제목을 14pt 굵게 만든 뒤 PDF로 내보내
4 ok select.all-headings -> 12 selected
5 ok format.font-size 14 . format.bold
6 ok export report.pdf (selectable text, bookmarks kept)

한계, 그리고 주말을 날리는 다섯 가지 실수

REA는 서버에는 손댈 수 없다. 당신 기기에 있는 것을 읽는 도구이며, 회사 서버에서 돌아가는 코드는 애초에 당신에게 배포된 적이 없기 때문이다.

디컴파일된 코드는 원본 소스가 아니라 재구성이며, 08단계가 존재하는 이유가 바로 이것이다.

심볼이 제거된 C++ 바이너리는 Unity .NET 게임보다 훨씬 어렵고, 상용 엔진은 여전히 정식 라이선스가 필요하다.

  • - JavaScript가 그대로 있는데 Electron 앱에 디스어셈블러를 여는 것
  • - 요약을 읽기 전에 바이너리 전체를 덤프하는 것. 로직은 묻히고 비용만 폭증한다
  • - 교차 참조 수가 아닌 파일 순서대로 함수를 읽는 것
  • - 모델이 재구축에 코드를 복사하게 두는 것. 붙여넣기 한 번으로 클린룸이 무너진다
  • - 동등성 보고서 없이 출시하는 것

X의 절반이 일주일 내내 불법 복제라고 소리쳤으니 법적 측면의 솔직한 선을 긋자. 자기 컴퓨터에서 앱을 읽는 것은 학습이고, 행동으로부터 기능을 재구축하는 것은 80년대부터 업계가 일해온 방식이며, 코드를 복사하거나 유료 기능을 뚫는 것이 소송을 부르는 부분이다.

원본을 연구하고, 당신만의 것을 출시하라.

이 여덟 단계 각각에는 다음 사이트의 레슨이 뒷받침되어 있습니다:

reacourse.xyz , 정확한 프롬프트, 실패 사례, 그리고 이 방법이 더 이상 통하지 않는 지점까지 담겨 있습니다.

예전에 클로즈드 소스는 '영영 알 수 없다'는 뜻이었다.

이제는 '증거를 보여달라'는 뜻이다.

대부분의 사람은 오후 한나절이면 이해하고 주말이면 재구축할 수 있는 기능에 매달 구독료를 계속 낼 것이다.

소프트웨어를 읽는 법을 배운 소수는 원하는 무엇이든 만들 것이다.

나를 팔로우하고 텔레그램 채널을 구독하세요:

https://t.me/+75nMf005jRpjMDU1

원클릭 저장

YouMind로 바이럴 글을 AI 심층 읽기

소스를 저장하고, 핵심 질문을 던지고, 주장을 요약해 바이럴 글을 다시 활용할 수 있는 노트로 바꾸세요. 하나의 AI 워크스페이스에서 모두 할 수 있습니다.

YouMind 둘러보기
크리에이터를 위해

당신의 Markdown을 깔끔한 𝕏 글로

직접 쓴 장문을 올릴 때 이미지, 표, 코드 블록을 𝕏에 맞게 정리하는 일은 번거롭습니다. YouMind는 전체 Markdown 초안을 깔끔하고 바로 게시할 수 있는 𝕏 글로 바꿔 줍니다.

Markdown → 𝕏 사용해 보기

분석할 패턴 더 보기

최근 바이럴 아티클

더 많은 바이럴 아티클 보기