REA로 앱 하나를 29분 만에 복제하기
영상 요약
REA(Reverse Engineer Anything)는 Hopper, Ghidra 같은 역공학 도구를 Claude Code 같은 AI 에이전트에 이어 주는 오픈소스다. 작은 C 프로그램으로 원리를 먼저 보고, 원본 소스가 공개된 맥 그림판 Paintbrush 를 실행 파일만으로 다시 만들게 했다. 29분 만에 나온 복제본은 원본과 거의 똑같아 보였고, 원본 소스로 채점하니 확인할 수 있던 판단 23개가 모두 맞았다. 다만 실행 파일에 없는 것은 베낄 수 없고, 라이선스와 배포는 따로 조심해야 한다.
REA 는 무엇인가
REA 는 4월 14일에 생긴 GitHub 저장소인데, 처음에는 별 관심을 못 받다가 지금은 스타가 30만 개 가까이 붙었다. 설치한 앱의 바이너리를 분석해서 그 안의 함수와 변수, 로직을 되살린다. 원래 개발자가 붙인 함수 이름까지 똑같이 돌아오지는 않지만, 로직은 다시 구현할 수 있다.
그래서 X 와 SNS 에는 "앱을 복제할 수 있으니 소프트웨어는 끝났다" 는 말까지 돈다. 역공학이 원래 전문가의 일이었는데, 바이브 코딩을 하는 일반인도 쉽게 할 수 있게 된 것이 이렇게 퍼진 이유로 보인다. 나도 역공학을 해 본 적은 없고 용어만 들어 본 정도라, 정말 그런지 직접 해 봤다.
바이너리를 코드로 되돌리는 원리
먼저 정답을 아는 작은 C 프로그램으로 시작했다. 인사를 찍는 greet 함수와, 회원이면 10% 할인해 주는 discount 함수가 있다.
#include <stdio.h>
void greet(void) { printf("Hello World\n"); }
int discount(int price, int is_member) {
if (is_member) return price * 90 / 100;
return price;
}
int main(void) {
greet();
printf("%d\n", discount(10000, 1));
return 0;
}
최적화를 끄고(clang -O0) 빌드하면 CPU 가 바로 실행하는 바이너리가 나온다. 실행하면 Hello World 와 9000 을 찍는다. 이 파일을 텍스트 에디터로 열면 글자가 깨져 보이지만, 그 사이에 Hello World 와 discount 라는 글자가 남아 있다. 배포되는 앱은 보통 이런 이름 정보(symbol)를 지운 채 나간다.
사람 눈으로 숫자 덩어리를 읽을 수는 없으니, 바이너리를 사람이 읽을 수 있는 코드 모양으로 되돌려 주는 도구를 쓴다.
| 도구 | 특징 |
|---|---|
| Ghidra | 미국 NSA 가 무료로 공개 |
| Hopper | 유료 앱, 체험판은 시간과 저장에 제한이 있음 |
| IDA | 업계 표준 |
이 도구들은 바이너리에서 어디가 함수인지 찾고, 원래 코드와 비슷한 모양의 pseudo code 로 다시 써 준다.

discount 라는 이름은 사라지고 sub_10000047c 같은 번호 이름이 붙는다. 그래도 안의 계산식, 0x5a(90) 를 곱하고 0x64(100) 로 나누는 부분은 그대로 남아 있다. 이름만 달라질 뿐 같은 결과를 내는 코드를 다시 짤 수 있다는 뜻이다.
REA 가 하는 일
REA 는 스스로 코드를 되돌리는 도구가 아니다. Hopper 같은 역공학 도구를 AI 에이전트와 연결해 주는 도구다.
- Claude Code 같은 에이전트가 묻는다.
- REA 가 Hopper 같은 도구로 바이너리를 열고 따라간다.
- 찾은 근거(pseudo code, 참조, 모르는 것)를 돌려준다.
- 에이전트가 그 근거로 코드를 짠다. 모자라면 다시 1번으로 돌아가 묻는다.
예전에는 사람이 수천 개의 함수를 하나씩 열어 보며 이름을 추측했는데, 이 고리를 반복해 그 일을 대신한다.
hello 바이너리(이름표를 지운 것)로 먼저 시험했다. Claude Code 에 준 지시를 줄이면 이렇다.
hello는 이름표를 뗀 작은 C 바이너리야. REA로 분석해서 무엇을 하는지 설명하고,
함수와 변수 이름을 추측해 C로 다시 짜 줘. 빌드해서 실행 결과가 원본과 같은지도 확인해 줘.
REA 를 11번 부르고 약 2분 만에 다시 짠 C 코드가 나왔다. 실행 결과는 원본과 같았고, 처음에는 할인 함수의 스택 배치가 달라 기계어가 조금 어긋났는데, 그걸 보고 return 을 두 번 쓰는 모양으로 고치자 기계어 47줄이 원본과 똑같아졌다. 원본 소스는 추측을 기록한 뒤에 열어 대조했다.
| 원본 이름 | AI 가 추측한 이름 |
|---|---|
main |
main |
greet |
say_hello |
discount |
apply_discount |
price |
price |
is_member |
is_member |
이름 다섯 개 중 셋은 글자까지 맞았고, 할인 함수는 핵심 낱말이 맞았다. 사라진 이름을 스스로 추측해서 채워 넣는다.
설치와 Hopper 준비
설치부터 분석 준비까지 사람이 할 일은 거의 없다. 터미널에서 npx rea-agents setup 을 실행하고 쓸 에이전트로 Claude Code 를 고르면 되는데, 이것도 Claude Code 에 시키면 알아서 처리한다.
Hopper 는 유료라 첫 실행 창에서 Try the Demo 를 누른다. 그러면 분석 단계를 돌고, REA 연결 스크립트를 실행하는 Executing Python Script 창까지 알아서 띄운다.
REA 이름을 베낀 가짜 저장소가 악성 파일을 퍼뜨렸다는 보도가 있으니, 설치는 꼭 공식 저장소에서 하는 게 좋다.
Paintbrush 분석과 복제
앱을 무엇으로 만들었는지에 따라 되돌리는 난이도가 다르다. Electron 앱은 코드가 거의 그대로 남고, C 나 C++ 는 이름표가 다 지워진다. 고른 Paintbrush 는 Objective-C 앱이라 기능 이름이 남는 편이어서, 난이도는 중간과 쉬움 사이다.
Paintbrush 는 Windows 그림판을 닮은 맥용 오픈소스 그림판이고, 소스가 SourceForge 에 GPLv3 로 공개돼 있다. 애플 기본 앱은 macOS 라이선스가 역공학을 막아서 고르지 않았다. 원본 소스가 공개된 앱이면 나중에 정답지로 쓸 수 있다는 장점도 있다.
Paintbrush 때 준 지시를 줄이면 이렇다. 무엇을 열지, 무엇이 궁금한지, 무엇을 만들지를 말했다.
Paintbrush 앱을 REA로 분석해서 같은 모양과 동작의 그림판을 Swift로 다시 만들어 줘.
소스 코드는 찾아보지 말고 바이너리만 근거로 써 줘.
특히 페인트 통 채우기가 어떻게 동작하는지 정확히 맞춰 줘.
바이너리를 열자 붓, 페인트 통, 지우개 같은 도구 이름이 줄줄이 나왔고, 화면만 봐서는 알 수 없는 숨은 코드도 드러났다. 페인트 통에는 색 허용 오차 기능이 만들어져 있는데 실제로는 부르는 곳이 없었고, 실행 파일 안에 Microsoft App Center 분석 SDK 가 들어 있었다. App Center 가 실제로 무엇을 보내는지는 확인하지 않았다.

Claude Code 는 필요한 기능을 묻고 또 묻는 고리를 17번 돌았고, 그 사이 REA 를 50번 정도 불렀다. 29분 만에 새 그림판 앱이 나왔고, 스스로 만든 테스트 11개를 모두 통과하며 빌드됐다.
원본과 복제본 비교

왼쪽이 원본, 오른쪽이 한 번에 만든 복제본이다. 네모를 그려 보면 거의 똑같다. 기능이 덜 된 곳도 있다.
| 돌아온 것 | 안 돌아온 것 |
|---|---|
| 도구 14개의 순서와 동작 규칙 | 도구 아이콘, 커서 (원본 이미지를 복사하지 않고 새로 그림) |
| 창과 팔레트 배치, 메뉴 제목과 단축키 | 도구를 글자 키로 바꾸는 단축키 |
| 640×480 캔버스, 되돌리기 10단계 같은 기본값 | Image Size, Crop 같은 일부 메뉴의 동작 (이름만 있음) |
| 페인트 통의 채우기 방식 | PNG 외의 저장 형식 |
보통은 AI 에게 앱의 기능 분석부터 시키고 구현하는데, 바이너리를 근거로 바로 구현하니 기능 분석을 따로 안 해도 엇비슷한 결과가 나온다. 이 상태에서 고쳐 나가는 건 훨씬 쉽다. 바이브 코딩을 하며 다른 앱을 참고하거나 특정 기능을 구현하고 싶을 때 REA 가 꽤 쓸모 있겠다.
원본 소스로 채점
Paintbrush 의 원본 소스로 분석 결과를 채점했다. 분석한 앱은 2.6.0 인데 2.6.0 소스는 공개된 적이 없어서, SourceForge 에 공개된 2.1 branch 소스를 정답지로 썼다. 가까운 옛 버전과의 대조라는 점은 감안해야 한다.

| 항목 | 결과 |
|---|---|
| 소스로 확인할 수 있던 판단 | 23개 모두 맞음 |
| 페인트 통 채우기 방식 | 맞음. 소스 주석에도 "four point connect" 라고 적혀 있다 |
| 안 쓰이는 허용 오차 비교 함수 | 맞음. 소스에서 그 함수를 부르는 줄이 주석으로 막혀 있다 |
| 도구 14개 순서 | 맞음 |
| 틀린 것 2개 | 직선과 곡선을 가장 가늘게 그릴 때의 반 픽셀 보정. 분석이 아니라 복제본에 옮기다 놓쳤다 |
바이너리가 소스 주석보다 정확했던 곳도 있다. 폭탄 도구의 주석은 "2 or 25" 인데 실제 코드는 50 이고, 바이너리 분석은 코드대로 50 을 읽었다. App Center 는 2.1 소스에 없어서 채점하지 못했다.
베낄 수 없는 것과 조심할 것
실행 파일 안에 없는 것은 당연히 베낄 수 없다.
- 서버에서 돌아가는 기능은 파일 안에 없다.
- 아이콘, 음악 같은 것은 가져다 쓰면 저작권 침해가 된다.
복제 앱 논란도 있었다. Adobe 대체 앱이라는 ArtCraft 는 디컴파일 증거가 없고 동작만 보고 새로 만든 앱이며, 호환 수준은 30% 정도라고 한다. 반대로 Call of Duty 나 Fallout 을 뜯어서 만든 사례들은 원작사 신고로 내려갔다고 한다.
- 앱마다 라이선스에서 역공학을 막는 경우가 있으니 먼저 확인한다.
- 복제한 앱을 배포하는 순간 문제가 커진다.
- REA 로 무엇을 만들었다고 SNS 에 잘못 올리면 문제가 될 수 있다.
직접 해 본 경위
이번 Paintbrush 는 역공학을 해도 되는지 메인테이너가 아니라 Opus 에게 물어보고 진행했다. GPLv3 오픈소스라 소스가 다 열려 있고 어차피 똑같이 만들 수 있는 앱이라 문제없다고 판단했다. 만든 복제본은 어디에도 배포하지 않았다. 이런 실험을 할 때는 배포는 안 하는 편이 좋다.
정리
- REA 는 디컴파일러가 아니라 Hopper 같은 역공학 도구와 AI 에이전트를 잇는 연결 도구다.
- 작은 C 프로그램은 기계어까지 원본과 같게 다시 짰고, 사라진 이름도 꽤 잘 추측했다.
- Paintbrush 는 29분 만에 거의 똑같은 복제본이 나왔고, 원본 소스로 확인한 판단 23개가 모두 맞았다.
- 서버 기능, 아이콘과 음악은 베낄 수 없고, 라이선스와 배포는 따로 조심해야 한다.
출처: REA 공식 저장소, Paintbrush (SourceForge, GPLv3), Hopper Disassembler, Ghidra
댓글
아직 댓글이 없습니다. 첫 댓글을 남겨보세요!