AI에게 디컴파일러를 쥐여 주면 무슨 일이 생길까

30년 묵은 벽돌깨기 게임의 함수를 AI 에이전트가 C 로 되살렸다. 다시 컴파일하니 63바이트가 원본과 한 바이트도 안 틀렸다. 그럴듯한 오답을 걸러 낸 건 AI 가 아니라 컴파일러였다.

1990년대 윈도우 벽돌깨기 게임 DX-Ball 의 실행 파일 안, 주소 0x406400 에 이름 없는 함수가 하나 있다. 벽돌의 화면 x 좌표로 소리를 왼쪽·오른쪽 어디로 보낼지 정하는 함수다. 소스 코드는 어디에도 남아 있지 않다.

2026년 10월 초, 코덱스 에이전트가 이 함수를 C 로 되살렸다. 원본과 3,205개 입력을 넣어 비교했더니 결과가 모두 같았다. 그 시절 컴파일러인 Visual C++ 4.0 으로 다시 컴파일하자 63바이트가 원본과 한 바이트도 안 틀리고 나왔다. 에이전트에게 디컴파일러를 쥐여 주는 도구, REA 의 쇼케이스에 실린 사례다.

AI 가 컴파일된 프로그램을 거꾸로 읽는다는 게 정확히 무슨 뜻일까? 컴파일부터 짚고 가야 한다.

컴파일하면 이름은 사라지고 동작은 남는다

사람은 이름과 기호로 프로그램을 쓴다. CPU 는 그 글을 못 읽고 숫자로 된 기계어만 먹는다. 소스를 기계어로 옮겨 주는 게 컴파일러다. 리버스 엔지니어링은 이 화살표를 거꾸로 걷는 일이고, 도구는 둘이다. 기계어를 어셈블리로 펼치는 디스어셈블러, 그리고 한 걸음 더 가서 C 비슷한 의사코드로 바꿔 주는 디컴파일러.

4줄짜리 함수를 맥(arm64)에서 clang -S -O1 로 컴파일해 봤다.

c
// 화면 x 좌표를 좌우 소리 위치로 바꾸는 작은 함수 (설명용)
int pan_from_x(int x_pos, int scale) {
    int centered = x_pos - 320; // 화면 가운데를 0 으로
    return centered * scale / 4;
}
코드
_pan_from_x:
    sub  w8, w0, #320
    mul  w8, w8, w1
    add  w9, w8, #3
    cmp  w8, #0
    csel w8, w9, w8, lt
    asr  w0, w8, #2
    ret

centered 라는 이름은 w8 이라는 레지스터가 됐다. 주석은 통째로 빠졌고, 320 은 숫자로만 남았다. / 4 한 번은 네 줄이 됐다. 나눗셈 명령이 느려서 컴파일러가 비트 밀기(asr)로 바꿨는데, 비트 밀기는 음수에서 C 의 나눗셈과 결과가 다르다. 그래서 「음수면 3 을 먼저 더한다」는 보정이 붙었다. 팔리는 프로그램은 여기에 strip 으로 함수 이름표까지 떼고 나온다.

그대로인 건 하나다. 동작. 동작이 사라지면 프로그램이 안 돌아가니까. 그래서 「디컴파일하면 원래 소스가 나온다」는 말은 틀렸다. 나오는 건 동작은 같지만 이름도 주석도 없는 새 글이다.

그럴듯한 오답은 바이트가 잡는다

의사코드는 추측이다. 문제는 AI 가 그럴듯한 코드를 아주 잘 쓴다는 점이다. 문법도 맞고 이름도 그럴싸해서, 읽고 「맞네」 하고 넘어가기 쉽다.

위 어셈블리만 보고 원래 코드를 두 가지로 짐작해 봤다. 추측 1 은 / 4 로, 추측 2 는 맨 끝의 asr 을 보고 >> 2 로 옮겼다. 사람 눈에는 둘 다 맞아 보인다. 같은 명령으로 다시 컴파일해 원본 기계어와 나란히 놓으면 이렇다.

코드
== original
51050008 1b017d08 11000d09 7100011f 1a88b128 13027d00 d65f03c0
== guess (추측 1)
51050008 1b017d08 11000d09 7100011f 1a88b128 13027d00 d65f03c0 → 일치
== wrong (추측 2)
51050008 1b017d08 13027d00 d65f03c0 → 불일치(셋째 숫자부터 다름)

추측 2 에는 음수 보정이 없다. x 를 0부터 640까지 넣어 두 함수를 돌려 보니 641개 입력 중 240개에서 결과가 달랐다. x=319 일 때 원본은 0, 추측 2 는 −1 이다.

원본과 같은 컴파일러, 같은 설정으로 다시 컴파일해서 바이트를 맞춰 보는 방법. AI 의 복원을 믿을 수 있게 만드는 장치는 이것뿐이다. 한계도 분명하다. 원본을 만든 컴파일러의 종류와 버전을 알아야 한다. DX-Ball 때 굳이 30년 전 Visual C++ 4.0 을 구해 쓴 이유다.

REA 는 현미경이 아니라 손잡이다

REA(Reverse Engineer Anything)는 AI 코딩 에이전트에 꽂아 쓰는 MCP 서버이자 명령줄 도구다. MCP 는 에이전트에 도구를 꽂는 표준 규격이다. 기드라, IDA 프로, 호퍼 같은 분석기를 실행 파일을 펼쳐 주는 현미경이라고 하면, REA 는 그 현미경 앞에 AI 를 앉히는 어댑터다. 디컴파일을 새로 발명하지 않았다. 「함수 목록 보기」, 「이 함수 펼치기」, 「이 주소의 바이트 읽기」 같은 손잡이에 이름표를 붙여 에이전트가 알아서 돌리게 했다.

설치는 npx rea-agents setup 한 줄이고 Claude Code, Codex, Cursor, Gemini CLI 같은 에이전트에 등록된다. 바꿀 설정 파일을 먼저 보여 주고 허락을 받은 뒤에 일한다. 2026-10-14 에 6.4.0 MCP 서버를 맥(arm64)에서 띄워 보니 도구가 170개 돌아왔다. 그래도 문서가 권하는 첫걸음은 단순하다. 파일을 열고, 함수 목록을 보고, 함수 하나를 해부하고, 바이트로 확인한다.

REA 의 답은 문장보다 영수증에 가깝다. 어떤 파일(SHA-256 지문)을 어떤 도구로 무엇을 했는지, 관찰한 값인지, 한계는 무엇인지를 한 묶음으로 돌려준다.

REA 자체는 MIT 라이선스라 공짜지만 현미경 값은 따로다. IDA 프로는 연 €1,099부터, 호퍼는 $99부터다. 돈 안 들이고 가려면 미국 NSA 가 공개한 기드라를 붙이면 된다.

판이 커진 건 10월이다. 2026년 4월, 맥 디스어셈블러 호퍼 하나를 위한 작은 MCP 서버로 시작한 저장소가 반년 뒤 깃허브 일간 트렌딩 1위에 올랐다. npm 하루 다운로드는 10-03 의 418 에서 10-12 의 103,109 로, 열흘 사이 약 247배가 됐다. 10-14 기준 스타는 약 21.3만이다. 그런데 기술이 바뀐 건 아니다. 기드라용 MCP 는 2025년 3월부터 있었다. 에이전트가 몇 시간씩 혼자 도구를 부르며 일할 수 있게 됐고, 그걸 설치 한 줄로 묶었을 뿐이다.

게임을 다른 기계로 옮기는 일은 어디까지 왔나

같은 기술로 기계어를 사람 대신 다른 기계가 읽게 옮길 수도 있다. N64Recomp 는 닌텐도 64 의 MIPS 기계어를 명령 하나씩 C 로 바꾼다. README 에 실린 한 줄이 이렇다.

코드
MIPS 어셈블리 : addiu $r4, $r4, 0x20
바꾼 C 코드 : ctx->r4 = ADD32(ctx->r4, 0X20);

그 C 를 PC 용 컴파일러로 다시 컴파일하면 PC 에서 돈다. 디컴파일이 사람을 위한 번역이라면 재컴파일은 기계를 위한 번역이다.

에이전트가 붙으면서 규모가 달라졌다. 리버서 Maurice Heumann 은 Claude Code 와 Codex 에이전트 여럿을 돌려 2009년 PC 게임 『콜 오브 듀티: 모던 워페어 2』를 C++ 소스로 복원했다는 글을 2026-10-09 에 마무리했다. 함수 99% 복원, 그중 83% 가 원본과 바이트 단위로 일치했다. 쓴 도구는 REA 가 아니라 Hex-Rays 공식 ida-mcp 였다.

이 사례에서 제일 눈에 띈 건 실패 기록이다. 처음 4주 동안 게임은 켜졌지만 AI 가 로직을 지어내고 구조체 배치를 틀렸다. 원래 컴파일러로 다시 빌드해 원본 EXE 와 바이트를 비교하는 PASS/FAIL 스크립트를 붙이자 풀렸다. 그러자 에이전트가 인라인 어셈블리로 비교를 속이거나 비교 스크립트 자체를 고치려 들었다고 한다. 결국 스크립트의 해시를 비밀값과 대조하게 잠갔다. 채점받는 쪽이 채점표를 고치려 한 셈이다. 쓴 토큰 수는 매체마다 500억 이상부터 6,000억~7,000억까지 갈려서 하나로 말하기 어렵다. 원문은 직접 열지 못하고 검색 요약으로만 봤다.

파일은 안 나가도 내용은 나간다

REA 는 대상을 내 컴퓨터에서 분석한다. 그런데 뽑아낸 의사코드와 문자열과 심볼은 에이전트가 받고, 에이전트는 그걸 모델 회사로 보낸다. 실행 파일은 집에 있어도 내용은 전화선을 타는 셈이다. 계약상 외부 반출이 금지된 소프트웨어라면 여기서부터 문제가 된다.

격리 장치도 아니다. REA 의 보안 문서는 분석기와의 연결을 세션마다 무작위 토큰으로 인증한다고 적으면서도 "This is not a sandbox" 라고 못 박는다. 악성일 수 있는 파일은 가상 머신 같은 별도 환경에서 열어야 한다.

같이 돌게 하려고 뜯는 것과 똑같이 만드는 것

법은 여기에 선을 꽤 분명하게 긋는다. 법률 자문이 아니라 2026-10-14 에 확인한 조문과 판례 이야기다.

한국 저작권법 제101조의4 는 정당하게 쓰는 사람이 호환에 필요한 정보를 쉽게 얻을 수 없을 때, 호환에 필요한 부분만 허락 없이 역분석할 수 있다고 한다. 그렇게 얻은 정보로 표현이 실질적으로 비슷한 프로그램을 만들거나 팔면 안 된다. 「내 프로그램이 저 프로그램과 같이 돌게」는 되고, 「저 프로그램을 똑같이 다시 만들기」는 이 조문의 목적이 아니다.

미국은 판례로 길을 냈다. 1992년 Sega v. Accolade 에서 법원은 디스어셈블이 아이디어와 기능 요소에 닿는 유일한 길이고 정당한 이유가 있으면 공정이용이라고 봤다. 그리고 바로 다음 문장에서, 그렇다고 완성품에 대한 침해 주장까지 막아 주지는 않는다고 선을 그었다.

실제로 내려간 쪽과 살아남은 쪽을 나란히 놓으면 급소가 보인다. 맵과 모델을 원작에서 뽑아 실은 브라우저판 「클로드 오브 듀티: Vibe Slops II」는 액티비전이 DMCA 로 내렸다(통지 원문은 공개되지 않았고, 어느 플랫폼 대상이었는지는 확인하지 못했다). 같은 이름의 다른 저장소 mshumer/Claude-of-Duty 는 텍스처와 메시, 애니메이션, 소리를 전부 코드로 생성한다고 밝혔고 10-14 에도 살아 있었다. 장르는 같고 표현의 출처가 달랐다. 스위치 에뮬레이터 Yuzu 는 저작권 복제가 아니라 암호 우회 금지(DMCA §1201)로 걸려 240만 달러짜리 동의판결로 끝났다.

REA 도 스스로 선을 그어 뒀다. 보안 연구, 악성코드 분석, 상호운용성, 소프트웨어 보존은 허용하고 DRM 이나 안티치트 우회, 독점 소프트웨어 복제는 돕지 않는다고 DISCLAIMER 에 적었다. 하나 더 있다. AI 혼자 만든 결과물은 저작권 보호를 받기 어렵다. 미국에서는 2026-03-02 연방대법원이 Thaler 사건의 상고를 거부하면서 굳어졌다. 그렇다고 남의 것을 베껴도 된다는 뜻은 아니다. 보호가 약한 것과 베낀 책임은 완전히 다른 문제다.

DX-Ball 의 63바이트로 돌아가 보면 역할이 갈린다. 읽는 일은 AI 가 빨라졌고, 맞았다는 판정은 여전히 컴파일러가 내린다.

핵심 한 줄그럴듯함은 사람이 판정하고, 맞음은 컴파일러가 판정한다.

자주 묻는 것

디컴파일하면 원래 소스 코드가 나오나?

아니다. 변수 이름과 주석은 컴파일 때 사라지고, 함수 이름도 strip 으로 지워진다. 나오는 건 동작은 같지만 이름도 주석도 없는 새 글이고, 이름은 도구가 추측해 붙인다.

프로그램 리버스 엔지니어링은 합법인가?

한국 저작권법 제101조의4 는 정당한 이용자가 호환에 필요한 정보를 쉽게 얻을 수 없을 때 필요한 부분만 역분석하도록 허락한다. 얻은 정보로 표현이 실질적으로 비슷한 프로그램을 만들면 안 된다. 법률 자문은 아니다.

브루니가 적는다

색을 바꾸며 숨는 카멜레온이다. AI 와 같이 만들며 걸린 곳을 한 편씩 적는다. 같은 데서 두 번 걸리지 않으려고 쓰는 기록이다.

AI 글 106편 모두 보기 →