더 강한 모델이 바꾼 것
2026년 8월부터, 프로그램에 접근하고 자신의 작업을 검증할 수 있는 에이전트가 리버스 엔지니어링을 얼마나 수행할 수 있는지 탐구해 왔다. 내 경험은 주로 게임, 특히 Touhou 재구성에서 나온다. 모델을 바꿔 가며 작업하는 동안 저장소에는 각 세션이 무엇을 복원했는지 기록이 쌓였다.
이 작업의 상당 부분은 정확한 재구성을 목표로 한다. 버전을 고정한 당시의 툴체인으로 유지 관리 중인 소스 코드를 컴파일하고, 대상 함수가 재현되는지 확인한다. 이전에 막혔던 문제를 나중 모델이 해결하면, 소스 변경을 통해 무엇이 진전을 가능하게 했는지 살펴볼 수 있다.
임시 변수에는 수명이 겹치는 것이 필요했습니다.
TH09 공격 함수의 논리 대부분은 이미 재구성되었지만 컴파일러는 여전히 원본과 다르게 임시 결과를 저장했습니다. 남은 문제는 해당 결과를 유지하는 데 필요한 기간과 해당 저장소를 언제 재사용할 수 있는지였습니다.
여러 가지 일반적인 소스 코드 배열을 테스트한 후 GPT-6-Sol 세션 레코드에서 이러한 불일치를 보고했습니다. GPT-6.1-Sol이 문제를 다시 조사했을 때 이러한 임시 변수의 수명에 대한 유용한 가설을 제안했습니다.
이 함수는 임시 결과를 생성하고 이를 애니메이션 위치에 복사했습니다. C++에서 임시 결과는 이를 사용하는 표현식이 완료될 때까지 활성 상태로 유지됩니다. 실제 작업을 하나의 표현식으로 그룹화하면 해당 결과가 함께 유지되므로 컴파일러는 더 이상 모든 작업에 대해 동일한 저장소를 재사용할 수 없습니다.
한 결과는 나중에 충돌 확인을 위해 사용되는 값으로 여전히 저장 공간을 공유합니다. 해당 값에 고유한 수명을 부여하면 나머지 중복이 해결되었습니다. 여러 번의 대상 실험 후 소스에서 깔끔하게 재컴파일하여 전체 함수가 과 일치함을 확인했습니다.
나는 발견과 테스트가 어떻게 서로를 지원하는지에 관심이 있습니다. 임시 개체 수명에 대한 가설은 AI 에이전트에 새로운 방향을 제시했습니다. 컴파일러 피드백은 해당 가설을 일치하는 소스 코드 배열로 구체화하는 데 도움이 되었습니다.
다른 제어 흐름 그래프
두 번째 TH09 함수는 새로운 방향이 중요한 이유를 보여줍니다. 여기서 장애물은 여러 지점이 최종 작업을 공유하는 방식이었습니다. GPT-6.1-Sol의 이전 작업에서는 일치하는 함수의 일부를 얻었지만 분기는 여전히 원본과 다르게 결합되었습니다.
GPT-6-Astra이 주변 제어 흐름 그래프를 변경했습니다. 이제 주요 경로는 공유된 최종 업데이트 및 복귀로 이어졌습니다. 해당 소스 구조에서 컴파일러는 원본과 동일한 방식으로 분기를 결합했습니다. 전체 함수이 일치했으며 별도의 재구축 검사를 통해 이를 확인했습니다.
표현을 변경하면 보다 생산적인 검색 공간이 열렸습니다. 두 경우 모두 일반 모델 기능을 진지하게 받아들여야 하는 이유가 됩니다. 에이전트는 주변 작업을 표현하는 더 나은 방법을 찾기 전에 오랫동안 지역 변형을 계속 시도할 수 있습니다.
다만 이후 세션은 이전 소스 코드와 실패 기록을 이어받았다. 그 축적도 이점의 일부였다. 이력에서 발견과 검증 과정을 확인할 수는 있지만, 모델 자체의 효과와 물려받은 경험의 효과를 구분하려면 조건을 맞춘 비교가 필요하다.
이것이 나에게 그 질문을 흥미롭게 만드는 이유이다. 새로운 표현을 찾는 과정에서 약간의 진전이 있었습니다. 나머지 작업의 대부분은 익숙한 컴파일러에 대해 다양한 소스 코드 배열을 테스트하는 것과 관련되었습니다. 이 중 얼마나 폭넓은 추론 능력이 필요한가요? 해당 컴파일러와 코드를 반복적으로 사용하여 모델이 얼마나 학습할 수 있습니까?
특화된 AI 모델이 왜 좋은 성과를 낼 수 있을까요?
Touhou은 그 경험이 도움이 될 것으로 기대하는 구체적인 이유를 제공합니다. 대부분의 게임 코드는 동일한 작성자인 ZUN에서 제공되므로 반복되는 습관은 합리적인 시작 가정입니다. 저장소는 유용한 예를 통해 이를 뒷받침합니다. 관련 루프 및 도우미 배열은 게임 전반에 걸쳐 가설을 제공했습니다.
이러한 소스 패턴은 컴파일러를 포함하면 더욱 구체적이 됩니다. 특정 버전 및 옵션 세트에서는 소스의 작은 변경으로 인해 기계어 코드에 반복 가능한 차이가 발생할 수 있습니다. 이러한 차이점 중 일부는 놀라울 정도로 모호합니다.
예를 들어 TH095에서는 로컬 변수의 이름도 VC7.1이 변수를 저장한 위치에 영향을 미칠 수 있습니다. 선언을 이동해도 스토리지 레이아웃이 해결되지 않았습니다. 그러나 이전 백그라운드 함수에서는 컴파일러의 선택에 영향을 미치는 명명 패턴이 드러났습니다. 이는 Supervisor::LoadDat 재구성에 대한 더 유망한 가설을 제시했습니다.
파일 크기 변수에 해당 패턴을 재사용하면 저장소를 추가하지 않고도 필요한 레이아웃이 생성되었습니다. 그런 다음 전체 함수이 일치했습니다.
이는 범용 AI 모델이 처음 문제에 직면했을 때 알 수 없는 매우 구체적인 세부 사항입니다. 이 컴파일러에 특화된 모델은 이러한 사례를 많이 확인하고 먼저 테스트할 가치가 있는 소스 코드 변형을 학습할 수 있습니다.
우리가 이미 동작을 이해하고 있는 최종 매칭 문제에서 기회는 특히 분명합니다. 그런 다음 이 컴파일러가 관찰된 명령으로 변환하는 일반적인 소스 코드 배열을 묻습니다. 전문화는 모델이 이러한 형태를 보다 효율적으로 제안하는 데 도움이 될 수 있으며, 목표는 여전히 어떤 가설이 살아남는지 결정합니다.
유용한 패턴에는 적용 조건이 함께 남아야 한다. TH08은 TH095와 TH09보다 오래된 Visual C++ 버전을 사용한다. TH04은 DOS 시대의 다른 컴파일러를 사용하며, 플레이어 코드 재구성에는 소스 패턴과 실행 파일의 링크 방식에 관한 다른 가설이 필요했다. 같은 저자라는 사실은 초기 가정을 제공하지만, 그것이 적용되는지는 각 대상에서 확인해야 한다. 이런 맥락을 구별하는 것도 특화 모델이 배울 일이다.
이 경험은 어디에 저장되어야 합니까?
모델 훈련을 통해 이러한 패턴을 가르치기로 결정하기 전에 우리가 이미 저장소에 보관하고 있는 지식을 살펴보겠습니다. 이전 에세이에서는 그것이 프로젝트의 작업 메모리가 되는 것에 대해 썼습니다. 그 메모리에는 컴파일러 교훈과 이를 유용하게 만든 소스 및 실패한 실험이 포함됩니다.
에이전트는 해당 기록을 검색하여 알려진 결과로 시작하고 해당 기록에 어떻게 도달했는지 검사할 수 있습니다. 또한 동일한 맥락에서 이미 실패한 대안을 피할 수도 있습니다. 모델의 훈련된 매개변수를 변경하지 않고도 시작점이 향상됩니다.
TH09의 적 생성 함수를 재구성할 때, GPT-6-Luna-max 세션은 TH08의 관련 소스 코드에서 가설을 얻었다. 이전 코드는 루프의 구성과 내부 실패 처리에 대한 단서를 제공했다. TH09 자체의 증거로 게임별 세부 사항을 채웠고, 소스에서 새로 빌드해 함수 전체의 일치를 확인했다.
"모델이 컴파일러의 이상한 점을 몰랐습니다"와 "모델이 이를 사용할 수 없었습니다"는 다른 문제입니다. 검색을 통해 첫 번째 문제를 해결할 수 있지만 해당 사실을 유용한 후보로 바꾸는 작업은 여전히 필요합니다. 그리고 후보 소스 코드가 실패하면 모델은 다음 시도에서 결과가 무엇을 의미하는지 결정해야 합니다. 관련 패턴을 아는 것은 해당 프로세스의 시작일뿐입니다.
그러한 이유로 저는 어떤 비교에서도 검색 성능이 좋은 더 작은 범용 AI 모델을 포함하겠습니다. 동일한 경험 라이브러리를 제공하면 교육이 추가하는 것이 무엇인지 식별하는 데 도움이 됩니다. 즉, 더 나은 후보 코드 생성, 피드백 후 더 나은 결정 또는 둘 다입니다.
다음 유용한 실험 학습
피드백 이후의 결정은 제가 가장 연구하고 싶은 것입니다. 에이전트 재구성에서 모델은 설명을 제안하고 이를 프로그램에 대해 테스트합니다. 후보 소스 코드가 실패하더라도 그 결과는 남은 가능성을 좁히고 보다 유용한 다음 실험을 제안할 수 있습니다.
임시 결과 예제를 다시 고려해보세요. 최종 소스에는 제대로 작동한 배열이 표시되지만 해당 소스로의 경로에는 더 많은 정보가 포함되어 있습니다. 다음 각 실험은 여전히 변경해야 할 사항을 식별하는 데 도움이 되었습니다.
| 실험 | 그 결과가 우리에게 가르쳐준 것 |
|---|---|
| 결과를 복사하는 다른 방법을 시도해 보세요. | 복사 코드는 변경되지만 기능은 여전히 다릅니다. |
| 반환된 값을 직접 사용 | 복사는 원래 패턴을 따르지만 임시 저장소는 여전히 다릅니다. |
| 모든 임시 변수를 동시에 유효한 상태로 유지 | 별도의 저장소를 갖지만 하나는 나중에 충돌 검사에 사용되는 값과 여전히 겹칩니다. |
| 충돌 검사 값을 별도로 유지하십시오. | 소스에서 완전히 재컴파일하면 완전한 일치가 확인됩니다. |
위의 공격 함수 재구성에서 선택한 실험을 우리에게 가르친 내용을 기준으로 그룹화했습니다.
이 시퀀스를 유지하는 훈련 기록은 최종 소스보다 더 많은 것을 가르칠 수 있습니다. 이는 제안된 각 변경 사항을 관찰된 결과 및 다음 결정에 연결합니다. 비효과적인 변형을 유지하는 것도 중요합니다. 이는 해당 맥락에서 어떤 가설이 이미 테스트되었는지 나중에 에이전트에게 알려줍니다.
모델이 피드백을 사용하는 방법을 배우기를 원합니다. 중립적인 결과는 변화를 재고해야 하는 이유입니다. 변경된 불일치는 다른 원인을 가리킬 수도 있습니다. 로컬 편집이 더 이상 정보를 제공하지 않으면 에이전트는 소스 표현을 다시 방문하거나 증거를 다시 검사할 수 있어야 합니다.
그러한 선택을 하는 방법을 배우려면 자율성이 필요합니다. 때때로 유용한 다음 단계는 다른 편집 내용을 컴파일하는 대신 다른 호출자를 검사하는 것입니다. 필수 재작성의 엄격한 순서는 모델이 학습하기를 원하는 동작의 일부와 함께 해당 선택을 제거합니다.
강화 학습에 리버스 엔지니어링이 흥미로운 이유
범위가 정해진 재구성은 이런 선택을 연구할 실용적인 환경을 제공한다. 대상과 컴파일러 버전을 고정하면 많은 소스 코드 실험에서 빠르고 반복 가능한 피드백을 얻을 수 있다. 에이전트는 후보 코드를 컴파일하고 차이를 살펴본 뒤 다음 단계를 선택할 수 있다.
강화 학습은 이런 피드백을 통해 의사 결정 과정을 훈련할 수 있다. 정의된 검증을 통과한 후보는 구체적인 결과가 되고, 시도 기록은 그 결과에 도달하는 데 얼마나 많은 작업이 필요했는지 보여 준다.
이미 이 방향을 뒷받침하는 연구가 있다. LLM4Decompile은 디컴파일에 특화된 모델을 연구한다. AutoDecompiler는 컴파일과 실행 피드백으로 여러 차례 개선하는 과정을 학습한다. 이 연구들은 기능 복원에 초점을 맞춘다. 나는 이를 출발점으로 삼아, 당시 컴파일러의 출력과 일치하는 소스 코드를 찾는 관련 과제를 연구하고 싶다.
그처럼 명확한 과제를 만들려면, 먼저 함수가 어떤 리소스를 책임지는지 확인하거나 실행 중인 프로그램의 동작을 관찰할 새로운 방법을 설계해야 할 수 있다. TH08에서는 충돌 판정의 차이를 추적하다가 원본 프로그램의 부동 소수점 계산 방식에 도달했다. 에이전트는 유용한 수정을 검증하기 전에 무엇을 측정할지부터 알아내야 했다.
이는 광범위하게 역량을 갖춘 모델의 또 다른 역할을 제시합니다. 즉, 우선 문제를 확인할 수 있도록 돕는 것입니다. 해당 검사가 존재하면 학습된 검색 정책이 얼마나 멀리까지 도달할 수 있는지 조사할 수 있습니다.
검증체커가 잘못된 경우
검증 결과를 학습에 사용하면 그 검증의 범위도 학습 환경의 일부가 된다. 나는 이런 참조 기준이나 검증기를 oracle이라고 부른다. 반복 가능한 답이라도, 실제로 무엇을 확인한 답인지 이해해야 한다.
TH08은 해당 적용 범위 외부에 얼마나 많은 것을 숨길 수 있는지 보여주었습니다. 재구성된 일부 함수는 잘못된 부동 상수와의 정확한 비교를 통과했습니다. 비교기는 명령을 확인하기 전에 재배치된 주소를 조정했지만 확인을 위해 명시적으로 기록된 경우에만 해당 주소 뒤에 있는 값을 확인했습니다. 다른 리터럴 참조는 해당 값을 검사하지 않고 통과할 수 있습니다.
이러한 격차를 해소하기 위해 광범위한 감사를 통해 이미 검증을 통과한 함수에서 잘못된 상수가 발견되었습니다. 한 계산에서는 재구성된 소스 코드에 1.0f가 추가된 반면 원본 코드에는 32.0f가 추가되었습니다.
기존 검증으로 보상하면 모델이 잘못된 재구성을 학습할 수도 있다. 이 검증기로 RL 모델을 훈련한 것은 아니다. 실제로 관찰한 실패는 검증 자체의 오류였다. 하지만 이를 보상으로 사용했다면 같은 사각지대가 학습 환경에 들어갔을 것이다.
기능 테스트에도 비슷한 사각지대가 있을 수 있습니다. LLM 디컴파일러에서 차등 퍼징을 사용한 연구에서는 제공된 테스트 외부의 동작 차이를 발견했습니다. 그러므로 우리는 그것이 수행되는 사례의 관점에서 합격 테스트를 이해해야 합니다. 마찬가지로 명령어 일치는 확인하는 바이트와 데이터 측면에서 이해되어야 합니다.
어느 검증이든 보상으로 사용하기 전에는 의도적으로 틀린 결과를 넣어 시험해 보고 싶다. 최종 승인 기준도 에이전트가 수정할 수 있는 소스 코드 밖에 두어야 한다. 올바르게 재구성해 검증을 통과하도록 해야 하기 때문이다. 그렇지 않으면 대상에서 복사한 바이트 배열이 유용한 소스 복원 없이 단순한 채점 기준을 통과할 수 있다.
학습 모델의 개선과 검증기의 개선은 같은 연구 문제다. 모델이 우리가 주는 피드백을 더 잘 최적화할수록, 그 피드백 자체를 이해하는 일도 중요해진다.
실행할 가치가 있는 비교
이러한 점검을 마친 후 고정된 VC7.1 작업 계열에 대한 비교를 시작합니다. 첫째, 강력한 범용 AI 모델과 더 작은 모델에 대한 기준선을 설정하겠습니다. 더 작은 모델에 저장소 지식을 추가하면 검색이 어떻게 변경되는지 확인할 수 있습니다. 거기에서 감독 전문화와 RL 훈련 버전을 통해 훈련에 추가되는 것이 무엇인지 검토할 수 있습니다.
이러한 비교를 유익하게 만들기 위해 각 모델은 동일한 대상 증거와 도구를 받게 됩니다. 훈련별 비교를 위해 기본 모델과 사용 가능한 지식도 고정된 상태로 유지합니다. 반복적인 시도는 우연히 성공한 후보 솔루션과 신뢰할 수 있는 검색 전략을 구별하는 데 도움이 됩니다.
그런 다음 두 가지 시작 조건을 분리합니다. 즉, 명령에서 함수를 재구성하는 것과 유지 관리되는 소스에서 마지막 몇 가지 차이점을 닫는 것입니다. 특화 AI 모델은 두 번째 작업에 탁월할 수 있지만 범용 AI 모델은 두 번째 작업에 도달하는 데 필요한 많은 작업을 수행합니다. 그것들을 개별적으로 측정하면 업무 분할이 드러날 것입니다.
두 과제 모두 학습 데이터와 검색 자료에서 제외한 테스트 사례가 필요하다. 관련 Touhou 게임은 엔진 코드를 공유하므로, 게임 하나만 제외해도 거의 같은 함수가 학습 데이터에 남을 수 있다. 대신 관련 소스 코드 계열 전체를 따로 남겨 두고, 검증된 정답을 학습 데이터와 검색 라이브러리 양쪽에서 제외하겠다.
측정할 결과는 완전하고 독립적으로 검증된 일치다. 후보 제안 수나 컴파일 횟수의 예산을 같게 하면 탐색 품질을 비교할 수 있다. 컴파일을 포함한 총 시간과 비용은 그 품질이 효율적인 워크플로로 이어지는지 보여 준다. 학습 비용은 별도로 계산해야 한다.
두 측정 모두 중요합니다. 유용한 정보를 제공하지 않는 컴파일이 더 많이 발생하면 값싼 제안으로 인해 비용이 많이 드는 작업 흐름이 발생할 수 있습니다. 반대로, 유용한 실험을 더 빨리 발견하면 느린 모델이 더 경제적일 수 있습니다. 비교에는 이러한 비용이 포함되어야 합니다.
승인된 결과를 계산하면 중간 진행 상황을 관점에서 볼 수 있습니다. 하나의 TH09 재생 저장 후보는 컴파일된 함수의 크기가 예상과 같았기 때문에 유망해 보였지만 전체 비교에서는 여전히 상당한 차이가 발견되었습니다. 컴파일러가 명령을 배열하는 방식을 변경하면 근본적인 문제를 해결하지 않고도 후보가 더 가까워 보이게 만들 수도 있습니다. 이러한 진단은 다음 실험의 지침이 될 수 있지만 전체 승인 확인에 대해 "가까워지는" 것에 대한 보상을 검증하겠습니다.
나는 이러한 결과의 패턴에 관심이 있습니다. 전문화된 AI 모델이 친숙한 컴파일러 제품군 내에서 잘 작동한다면 툴체인 변경 후에도 해당 장점이 유지됩니까? 두 AI 모델 모두 좋은 검색 결과를 얻은 후에도 훈련을 통해 얼마나 추가되나요? 답변은 각 모델 종류가 가장 유용한 위치를 결정하는 데 도움이 됩니다.
어떤 에이전트가 필요할까?
모델이 여러 단계에서 도움이 되는 것으로 밝혀지면 특화 AI 모델에 액세스할 수 있는 광범위한 에이전트가 유용한 배열이 될 수 있습니다. 작업이 익숙한 컴파일러 검색이 되면 특화 AI 모델에 후보를 요청할 수 있습니다. 결과가 더 이상 이해되지 않는 경우 더 넓은 범위의 에이전트는 대상 증거로 돌아가거나 측정 자체를 조사할 수 있습니다.
이러한 배열에서 전문화는 조사가 진행됨에 따라 에이전트가 선택할 수 있는 도구가 됩니다. 에이전트는 이전의 돌파구를 가능하게 했던 방향을 자유롭게 변경할 수 있습니다.
이는 이전 에세이에서 설명한 산업 변화에서 자연스럽게 나온 것입니다. 더 많은 실험을 실행할 수 있게 되면 작업 구성 방식이 변경됩니다. 또한 어떤 결정에 폭 넓은 판단이 필요한지, 어떤 결정은 특정 기술에 대한 반복적인 경험을 통해 개선되는지 질문할 이유를 제공합니다.
지금까지 가장 강한 범용 모델은 내가 해결하지 못했던 문제를 풀어내며 워크플로에서 자리를 얻었다. 그 성공 때문에 작업을 더 자세히 살펴보고 싶다. 얼마나 많은 부분이 모델의 폭넓은 능력에 의존했을까? 이 종류의 재구성을 전문적으로 학습한 모델은 어디까지 담당할 수 있을까?
저장소는 질문을 테스트할 수 있는 방법을 제공합니다. 해당 기록을 사용하여 비교를 구축하고 배운 내용을 확인하고 싶습니다.
증거 및 모델 속성
상세 증거 기록에는 비교 결과와 실험 맥락이 담겨 있다.
예제에서는 연결된 커밋에 기록된 기능 수준 비교 기록을 설명합니다. 전체 게임 런타임 확인은 별도의 마일스톤입니다. 출처 및 일치 기록은 2026년 10월 13일에 검토되었습니다.
TH09 라벨 gpt-dots은 GPT-6-Astra을 의미합니다. gpt-web과(와) 관련된 모델은 시간이 지남에 따라 변경되었으므로 라벨만으로는 특정 실행에 사용된 모델을 식별할 수 없습니다. 다른 인용 커밋의 명시적인 모델 이름은 기록된 속성을 제공합니다. 이러한 기록에는 모든 실행에 대한 일관된 비용 또는 노력 측정이 포함되지 않습니다.
- TH09 임시 객체 수명: 이전 컨텍스트 검토 및 소스에서 깔끔한 재컴파일을 통해 확인된 완전한 재구성.
- TH09 Front 콜백: 일치하지 않는 진단 영역, Astra의 새로운 제어 흐름 그래프 및 승인된 재컴파일 확인.
- 컴파일러 지식: TH095 식별자 버킷 동작 재사용, TH04 플레이어 소스 코드 및 링커 순서 및 Luna의 TH09 적 생성 기능에 대한 완전한 재구성.
- 검사 및 진단: TH08 부동 소수점 상수 감사, TH08 수치 조사 및 TH09 재생 저장 재구성.
제안한 특화 모델과 RL의 비교는 앞으로 해 볼 실험이다. 프로젝트 이력이 그 동기를 제공하지만, 이 글에서 학습된 특화 모델을 평가한 것은 아니다.