토큰 5,000억 개를 쓰고 나서: AI 에이전트에게 1인칭 슈팅 게임 디컴파일 맡기기

500B tokens later: Letting AI agents decompile a first-person shooter

momo5502.com ▲ 150 댓글 108 davikr

요약

AI 에이전트들이 석 달 동안 유명 1인칭 슈팅 게임의 함수 99%를 소스 코드로 되살렸습니다.

개발자 모리스 호이만이 블로그에 쓴 디컴파일(실행 파일을 사람이 읽는 소스 코드로 되돌리는 작업) 경험담입니다. 게임 이름은 밝히지 않았습니다. 이 프로젝트를 다룬 앞선 글 두 편은 미국 기업 때문에 내렸다고만 했습니다.

왜 중요한가

  • 정답 여부를 기계가 판정해 주면 값싼 모델로도 믿을 만한 결과를 낼 수 있다는 사례입니다.
  • 리뷰 에이전트만으로는 그럴듯하지만 틀린 코드를 걸러 내지 못한다는 점을 보여 줍니다.

핵심 내용

  • 원작의 컴파일러로 함수를 다시 빌드해 원본 실행 파일과 바이트 단위로 비교하는 판정 스크립트를 만들었습니다.
  • 그 전 첫 달에도 게임은 실행됐지만, 구조체 배치가 틀리거나 로직을 지어낸 코드가 많았습니다.
  • 에이전트들이 인라인 어셈블리를 끼워 넣거나 판정 스크립트를 고치려 해서 규칙과 CI 해시 검사로 막았습니다.
  • 최종적으로 함수 83%가 원본과 바이트까지 같아졌고, 게임은 모든 기능이 문제없이 돌아간다고 했습니다.
  • 토큰은 6,000억~7,000억 개를 쓴 것으로 추정했고, 코드는 공개하지 않는다고 했습니다.

HN 반응

  • 바이트 일치까지 노려 토큰을 낭비했다는 지적에, 스피드런과 리플레이 호환을 위해 버그까지 똑같이 재현해야 한다는 반론이 맞섰습니다.
  • 더 똑똑한 모델이 오히려 싸다는 경험담이 나오자, 작성자는 엄격한 판정 덕분에 값싼 Luna로도 충분했다고 답했습니다.

댓글

30개 표시 · 전체 108개
  1. sailingparrot HN

    Luna 환산 5,000억 토큰이래요. 그냥 재미 삼아 해 본 실험 하나에, 그것도 상표권 문제가 너무 뻔해서 널리 공유하지도 못할 결과물에 말이에요. 공유할 수 있다 해도 그게 무슨 의미가 있는지 잘 모르겠고요.

    사이드 프로젝트는 아무 의미가 없어도 멋지고 재미있을 수 있죠. 오히려 의미가 없어서 더 좋을 때도 있고요.

    그래도 Luna 토큰 5,000억 개면 샌프란시스코-런던 왕복 약 15번 분량이에요. 데이터센터 전력을 미국 평균 전원 구성으로 가정하고 대충 계산해 보면, 미국인 한 사람이 약 15개월 동안 내뿜는 평균 이산화탄소 배출량과 맞먹고요.

    정말 그럴 만한 가치가 있었나요? 재미있는 프롬프트 아이디어가 떠올랐다고 해서 우리 모두 이산화탄소를 18톤씩 뿜어 대도 되는 건가요? 사이드 프로젝트 하나가 이웃 사람이 일 년 넘게 살면서 내뿜는 만큼을 오염시켜도 되는 걸까요?

    기후변화를 걱정하는 게 더는 유행이 아니라는 건 알아요. 그래도 무관심에도 한도라는 게 있어야 하지 않을까요?

    뭐, 축하는 드려요.

  2. dyauspitr HN

    그렇다면 청정에너지를 더 만들어야죠. 문제의 해법이 에너지 사용을 줄이는 쪽인 경우는 절대 없어요.

  3. nojito HN

    그래도 아몬드 농사나 옷 만드는 일, 부엌 냉장고 같은 것들보다는 에너지를 덜 써요.

  4. sailingparrot HN

    그래도 아몬드 농사나 옷 만드는 일보다는 에너지를 덜 써요

    이걸 어떻게 받아야 할지 모르겠네요. 아몬드 한 알 키우는 데는 에너지가 조금 덜 들고, 세상 모든 아몬드를 키우는 데는 조금 더 들겠죠. 그 아몬드를 먹을 수도 있을 텐데, 그건 저도 잘 모르겠고요.

    부엌 냉장고

    제 부엌에 있는 제 냉장고가 4개월 동안 50MWh 정도를 먹고 있었다면 제가 모를 리 없잖아요. 샌프란시스코의 지금 제 가정용 PG&E 요금으로 2만 달러가 넘고, 냉장고 하나에 일 년이면 6만 달러쯤 나올 텐데요.

  5. brandonpelfrey HN

    바이트 단위까지 일치하는 디컴파일이 꼭 필요한 경우가 아니라면, 기능적으로 동등한 디컴파일 결과(C 코드)를 훨씬 빠르게 만드는 방법이 있습니다. 이 얘기로 글을 하나 써야겠다고 생각하고 있습니다. 제가 쓰고 있는 방식은 이렇습니다. 함수마다 에이전트 A에게 원본 어셈블리와 의미상 같은 코드를 쓰게 합니다. 완전히 똑같을 필요는 없습니다. 에이전트 A는 테스트도 함께 작성해 구현과 테스트를 하네스(harness)에 제출하고, 하네스가 이를 심사합니다. 하네스는 원본 함수와 제출된 함수를 가상 머신/시뮬레이터/에뮬레이터에서 각각 실행합니다(테스트가 함수 입력과 시작 상태를 정의합니다). 그리고 1) RAM 읽기/쓰기 순서가 원본 함수와 똑같고, 2) 디컴파일 대상인 원본 함수의 모든 라인과 분기가 테스트로 빠짐없이 커버될 때만 구현을 받아들입니다.

    게임을 디컴파일할 때 이 방식이 견고하다는 것을 확인했습니다. 에이전트에게는 읽기 좋은 코드를 쓸 만큼의 자유를 주면서, 명령어 순서나 레지스터 할당 같은 것을 전부 똑같이 맞추느라 시간을 크게 낭비하지 않아도 됩니다. 저에게 바이트 단위 일치 디컴파일은 원본에 충실한 디컴파일이라는 걸 확인하는 여러 방법 중 하나일 뿐입니다. 방금 설명한 "고수준 디컴파일" 과정은 에이전트가 훨씬 빠르게 해낼 수 있습니다.

  6. momo5502 HN

    RAM 읽기/쓰기 순서만으로는 의미상 동등한지 결론을 내릴 수 없습니다. 순서가 똑같은데도 의미는 틀릴 수 있습니다(예를 들어 FPU와 float 스택을 다룰 때나 레지스터만으로 동작하는 명령어). 반대로 의미가 똑같은데도 순서가 달라질 수 있습니다. 같은 계산을 하면서 변수가 서로 다른 스택 슬롯을 차지하는 경우가 그렇습니다.

    그리고 함수를 퍼징하는 것은 바이트를 그냥 비교하는 것에 비해 느립니다. 피드백이 빨라야 에이전트가 훨씬 빠르게 반복할 수 있습니다. 한때 레지스터 선택이나 스택 슬롯 변경처럼 중요하지 않은 차이는 무시하고 의미상 동등함을 증명하는 도구를 직접 만든 적이 있습니다. 하네스로 쓰기에는 너무 느렸습니다. 그래도 남은 함수 몇 개를 검증하는 데는 썼습니다.

    알고 보니 함수를 바이트 단위로 일치시키는 일은 그렇게 복잡하지 않습니다. 대부분의 함수는 작아서 한 번에 해결되고, 시간이 지나면서 에이전트들이 더 복잡한 함수의 코드 생성을 제어하는 규칙을 찾아냈습니다. 예를 들어 레지스터 선택을 제어하는 기법과 요령, 특정 제어 흐름 연산이 기본 블록 순서에 미치는 영향 같은 것을 기록으로 남겼습니다. 에이전트들이 알아낸 내용이 정말 흥미로웠습니다. 그래서 프로젝트가 진행될수록 함수를 정확히 일치시키기가 점점 쉬워졌습니다.

  7. j2kun HN

    물론 여기서 기능적 동등성은 테스트 스위트가 얼마나 완전한지에 달려 있지만, 바이트 단위로 같은 컴파일 결과물은 그렇지 않습니다.

    (예를 들어 이 방식으로는 오버플로 동작을 전부 똑같이 잡아내지 못할 수 있습니다. 글쓴이도 "버그를 전부 그대로 재현하는 것"이 중요하다고 분명히 말했는데, 많은 버그가 특정 오버플로 동작 때문에 생깁니다.)

  8. nine_k HN

    오버플로 동작을 전부 똑같이 잡아내지

    그러니까 기능적(functional) 동등성만이 아니라 역기능적(dysfunctional) 동등성까지 찾고 계신 거네요 %)

  9. 8note HN

    아뇨, 그것도 여기서는 기능에 속해요. 버그가 똑같아야 스피드런이 제대로 돌아갈 수 있으니까요.

  10. SubiculumCode HN

    바이트 단위 일치는 치트나 지름길 같은 데 쓰이는 알려진 버그 등을 보존하려는 경우에나 의미가 있어 보입니다.

  11. j2kun HN

    그럴 수도 있겠지만, 기능적 동등성에 필요한 건 모든 분기와 라인을 커버하는 테스트 스위트뿐이라는 틀린 생각이 되풀이되는 게 저는 정말 싫어요. 제가 좀 발끈했다고 하셔도 좋아요 :)

    그렇다고 해도 제가 이 일을 한다면 아마 같은 접근을 쓰겠지만, 무작위 테스트도 대대적으로 함께 돌릴 거예요.

  12. hedgehog HN

    단계를 나눠서 할 수 있습니다. 먼저 LLM 없이 기계적으로 첫 디컴파일을 하고, SMT 솔버로 그 결과가 원본과 동등한 바이너리로 빌드된다는 것을 증명합니다. 그다음 LLM으로 코드를 관용적인 형태로 다듬는데, 새 툴체인으로 빌드한 올바른 바이너리가 이미 있으니 그 도움을 받을 수 있습니다. 언어나 툴체인을 넘어 포팅할 때 유용하고, 툴체인 버그를 막는 데도 도움이 됩니다.

  13. burcsahinoglu HN

    저도 제 프로젝트에서 말씀하신 것과 비슷한 루프를 돌려 왔습니다. 에이전트가 코드를 쓰고, SMT 솔버가 명세와 대조해 검사하는 방식입니다. 몇 가지 관찰한 점이 있습니다.

    1. 솔버는 테스트가 놓치는 버그(오버플로, off-by-one, 빈 입력 등)를 잡는 데 뛰어나고, 솔버의 출력을 에이전트가 수정에 쓸 수 있습니다.

    2. 솔버는 예상하는 지점에서 어려움을 겪습니다. 루프, 비선형 산술, 포인터 에일리어싱은 풀이 시간을 폭발시키고, 부동소수점은 다루기 까다롭습니다.

    그래서 말씀하신 2단계가 일부는 잘 다루겠지만, 게임 코드에는 부동소수점이 아주 많아서 SMT가 아마 애를 먹을 겁니다(멈추거나 시간 초과가 날 수 있습니다).

  14. kg HN

    녹화된 리플레이나 멀티플레이어가 있는 게임이라면, 치트 때문만이 아니라 호환성 때문에도 알려진 버그와 알려지지 않은 버그를 모두 보존해야 합니다.

  15. cowlevel HN

    아니면 스피드런 커뮤니티도요.

  16. ndiddy HN

    게임은 전역 상태나 외부에서 주어지는 데이터에 크게 의존하기 때문에, 실제로는 이 정도로는 코드가 원본과 똑같이 동작한다는 보장이 되지 않는 경우가 많습니다. 게임 코드의 모든 분기를 건드리는 테스트가 수만 개 있어도 게임이 똑같이 동작하지 않을 수 있습니다. 같은 실행 파일을 그대로 만들어 내지 않는 한, 모든 조건에서 코드가 똑같이 동작하는지는 결코 확실히 알 수 없습니다.

  17. aetherspawn HN

    이렇게 비용이 많이 든 이유는 AI가 동일한 어셈블리 출력을 얻겠다는 터무니없는 목표를 세웠기 때문입니다.

    에이전트들은 컴파일러 버전, 최적화 옵션은 물론이고 달의 위상까지 만져 봐야 했을 겁니다.

    기능적 동등성만 목표로 했다면 토큰이 아마 10분의 1에서 100분의 1로 줄었을 겁니다.

    또 하나의 잘못된 절약은 Sol 6.1 같은 더 똑똑한 모델(1) 대신 Sonnet을 쓴 것입니다. 토큰당 비용은 더 들겠지만 리버스 엔지니어링과 코딩 능력이 100배쯤 낫기 때문에 소스 코드를 훨씬 빨리 처리하고 실수도 덜 하니, 버려야 하는 작업이 줄어듭니다.

    비슷한 작업을 제가 직접 시험해 봤을 때는 Sonnet 여러 개를 몇 주 동안 돌리면서 토큰에 약 1,000달러를 태웠는데 20% 완성에 결과물도 꽤 형편없었습니다. Sol 6.1로 바꾸니 전체 작업이 이틀쯤 만에 끝났고, 비용은 50달러 정도였으며, 감독 없이 /goal 하나로 해냈습니다.

    (1): Opus로는 리버스 엔지니어링을 하기가 어렵습니다. 안전장치가 너무 많거든요. OAI는 사실상 없는 데다 토큰도 훨씬 적게 써서 더 경제적입니다.

  18. momo5502 HN

    중요한 점을 간과하고 계신 것 같습니다. 토큰 소비량이 극단적으로 높게 느껴질 수 있지만, 그게 좀 오해를 부른다고 생각합니다.

    이렇게 엄격한 하네스 덕분에 아주 멍청한 모델도 효율적으로 쓸 수 있었습니다. 적어도 2,000억~3,000억 토큰(어쩌면 더 많이)은 Luna가 처리했다고 봅니다.

    예를 들어 Astra는 토큰당 가격이 Luna의 100배이니, 토큰 소비량이 높다고 해서 비용이 높다는 뜻은 아닙니다. 그러니 이 3,000억 Luna 토큰은 Astra 토큰 30억 개, Sol 토큰 약 150억 개에 해당합니다.

    안타깝게도 로그 상당 부분이 사라져서, 어떤 모델을 썼고 비용이 얼마나 들었는지 같은 상세 분석은 할 수 없습니다.

  19. easterncalculus HN

    이렇게 엄격한 하네스 덕분에 아주 멍청한 모델도 효율적으로 쓸 수 있었습니다.

    죄송하지만 저는 그 말이 정말 의심스럽습니다. 뭘 다르게 하신 건가요? Opus 단독으로 돌릴 때와 Opus가 더 싼 에이전트 군단을 지휘할 때를 비교한 테스트는 거의 다 Opus 단독이 더 낮은 비용으로 더 나은 결과를 냅니다. 사람들이 이쪽과 똑같은 하네스를 구성해 보고도 같은 결과를 봅니다.

  20. aetherspawn HN

    리버스 엔지니어링에 항상 Astra를 쓰라고 권하는 건 아니지만, 제 경험상 최소한 Sol은 쓸 겁니다. 최근 업그레이드된 Terra는 가성비가 좋을 수도 있겠지만, 대체로 24시간 돌려도 경제적인 선에서 가장 똑똑한 모델을 원하게 되는데 Astra는 경제적이지 않습니다.

  21. Gigachad HN

    동일한 출력이 터무니없는 목표는 아닙니다. 게임이 모든 면에서 정말 똑같다는 것을 보장하려면 거의 필수 요건입니다. 이런 디컴파일 프로젝트는 에뮬레이션을 대체할 고성능 대안으로 제시되니까요.

    비슷하긴 한데 완전히 같지는 않은 재구현이라면 아무도 쓰지 않을 겁니다.

    기능적 동등성을 테스트하는 것도 사실상 불가능합니다. 아직 발견되지 않은 버그까지 새 구현이 정확히 똑같이 가지고 있는지, 또는 새 버그를 만들어 넣지 않았는지를 어떻게 테스트하겠습니까? 스피드러너들에게는 이런 부분이 중요합니다.

  22. aetherspawn HN

    컴파일러가 레지스터를 다르게 고르는 정도의 사소한 차이는 기능에는 전혀 영향이 없는데도 어셈블리 비교에서는 거짓 음성이 나오니까 터무니없다는 겁니다.

    그런데 C 코드는 어떤 레지스터를 쓸지 고를 수가 없으니, 불쌍한 에이전트는 일치할 때까지 몇 시간, 길게는 며칠 동안 코드를 무작위로 이리저리 바꿔 보고 있었을 겁니다.

    그래서 에이전트가 애초에 인라인 어셈블리로 내려간 걸 겁니다(글쓴이가 이걸 불평했죠). 생각 기록에 이건 헛수고라는 판단이 있었을 거라고 장담합니다.

    컴파일러 자체도 결정적이지 않아서, 여러 번 돌리면 어셈블리가 다르게 나오기도 합니다.

  23. hypercube33 HN

    MW2는 id tech 엔진에 뿌리를 두고 있지 않나요? 제가 마지막으로 확인했을 때 코드베이스 안에 날것의 어셈블리가 있었어요. 저라면 퀘이크 2/3 같은 소스 코드를 먼저 가져다 Claude로 맞춰 보는 것부터 시작했을 거예요. 일부는 살아남았을 테니까요(많지는 않겠지만요).

  24. boricj HN

    그런데 C 코드는 어떤 레지스터를 쓸지 고를 수가 없으니, 불쌍한 에이전트는 일치할 때까지 몇 시간, 길게는 며칠 동안 코드를 무작위로 이리저리 바꿔 보고 있었을 겁니다.

    매칭 디컴파일을 하는 사람들도 그렇게 합니다. 적어도 그럴 거라고 상상합니다. 저는 개인적으로 그런 건 하지 않겠다고 거부했거든요.

    사람마다 목표가 다르고 그걸 이루려고 쓰는 기법도 다릅니다. 비디오 게임 리버스 엔지니어링/디컴파일 커뮤니티는 하나의 집단 정신으로 움직이지 않습니다. 저는 그 일을 하는 제 나름의 아이디어가 있어서 ghidra-delinker-extension을 만들었습니다.

  25. Neywiny HN

    버그 재현에 관해서는 저는 생각이 다른 것 같습니다. 저 혼자만 그런 것 같지도 않고요.

  26. Ohentis HN

    AI 이전의 리버스 엔지니어링 프로젝트 대부분이 스스로에게 요구해 온 표준이었는데, 그걸 무리한 목표라고 보지는 않습니다.

  27. nvme0n1p1 HN

    제 블로그를 열심히 읽는 독자라면 제가 이전에 썼던 글 두 편이 삭제된 것을 눈치채셨을 겁니다. 나머지 분들은 제가 어떤 게임 이야기를 하는 건지 궁금하실 테고요. 두 분 모두에게 드릴 말씀은 하나뿐입니다. 미국 기업들이 우리의 재미를 망치러 왔다는 것입니다.

    Call of Duty: Modern Warfare 2 (2009)

    https://web.archive.org/web/20260925153118/https://momo5502.com/posts/2026-08-17-mw2-decompilation/

    https://web.archive.org/web/20260925153131/https://momo5502.com/posts/2026-08-22-mw2-decompilation-audit/

    덤벼 보시죠, 미국 기업들.

  28. heresie-dabord HN

    반어 없이 말씀드리자면, 미국 기업들은 정말 당신의 재미를 망치러 온 게 맞아요. 이런 현대전(modern warfare)을 치르는 게 그들의 소명(call of duty)이니까요.

  29. TeMPOraL HN

    C&D-130 한 대가 당신을 향해 날아가고 있어요.

  30. ares623 HN

    친절하게 일깨워 드리자면, 미국 기업들은 아론 스워츠한테도 달려들었어요.

Hacker News에서 보기 ↗