← 목록으로
복사되었습니다

REA로 앱 하나를 29분 만에 복제하기

· 약 10분
#rea #reverse-engineering #hopper #claude-code #paintbrush #youtube

영상 요약

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 로 다시 써 준다.

이름표를 뗀 hello 바이너리를 Hopper 로 연 pseudo code. discount 대신 sub_10000047c 라는 번호 이름이 붙었다

discount 라는 이름은 사라지고 sub_10000047c 같은 번호 이름이 붙는다. 그래도 안의 계산식, 0x5a(90) 를 곱하고 0x64(100) 로 나누는 부분은 그대로 남아 있다. 이름만 달라질 뿐 같은 결과를 내는 코드를 다시 짤 수 있다는 뜻이다.

REA 가 하는 일

REA 는 스스로 코드를 되돌리는 도구가 아니다. Hopper 같은 역공학 도구를 AI 에이전트와 연결해 주는 도구다.

  1. Claude Code 같은 에이전트가 묻는다.
  2. REA 가 Hopper 같은 도구로 바이너리를 열고 따라간다.
  3. 찾은 근거(pseudo code, 참조, 모르는 것)를 돌려준다.
  4. 에이전트가 그 근거로 코드를 짠다. 모자라면 다시 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 가 실제로 무엇을 보내는지는 확인하지 않았다.

REA 고리 17번, 약 29분, 자체 테스트 11개 통과. REA 호출 50번의 도구별 횟수

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

원본과 복제본 비교

왼쪽 원본 Paintbrush, 오른쪽 REA 로 만든 복제본. 아이콘은 새로 그렸고 일부 메뉴는 이름만 있다

왼쪽이 원본, 오른쪽이 한 번에 만든 복제본이다. 네모를 그려 보면 거의 똑같다. 기능이 덜 된 곳도 있다.

돌아온 것 안 돌아온 것
도구 14개의 순서와 동작 규칙 도구 아이콘, 커서 (원본 이미지를 복사하지 않고 새로 그림)
창과 팔레트 배치, 메뉴 제목과 단축키 도구를 글자 키로 바꾸는 단축키
640×480 캔버스, 되돌리기 10단계 같은 기본값 Image Size, Crop 같은 일부 메뉴의 동작 (이름만 있음)
페인트 통의 채우기 방식 PNG 외의 저장 형식

보통은 AI 에게 앱의 기능 분석부터 시키고 구현하는데, 바이너리를 근거로 바로 구현하니 기능 분석을 따로 안 해도 엇비슷한 결과가 나온다. 이 상태에서 고쳐 나가는 건 훨씬 쉽다. 바이브 코딩을 하며 다른 앱을 참고하거나 특정 기능을 구현하고 싶을 때 REA 가 꽤 쓸모 있겠다.

원본 소스로 채점

Paintbrush 의 원본 소스로 분석 결과를 채점했다. 분석한 앱은 2.6.0 인데 2.6.0 소스는 공개된 적이 없어서, SourceForge 에 공개된 2.1 branch 소스를 정답지로 썼다. 가까운 옛 버전과의 대조라는 점은 감안해야 한다.

정답지 대조: 원본 소스로 확인한 판단 23개 모두 맞음, 틀린 2개는 옮기다 생긴 0.5px 실수

항목 결과
소스로 확인할 수 있던 판단 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

댓글

아직 댓글이 없습니다. 첫 댓글을 남겨보세요!

0 / 1000