미지의 바이너리 파일 형식을 분석하는 것은 종종 복잡하고 어려운 작업으로 여겨집니다. 특히 파일에 형식을 식별할 수 있는 '매직 바이트(magic byte)'나 공식 명세가 없는 경우 더욱 그렇습니다. 최근 공개된 글에서는 게임 FEZ의 독자적인 세이브 파일을 예시로, C# 코드 역컴파일부터 ImHex 패턴 작성을 통해 파일 형식을 리버스 엔지니어링(reverse engineering)하는 전 과정을 상세히 보여주며 이러한 난제를 해결하는 실용적인 방법을 제시했습니다.
분석 대상은 2012년에 출시된 게임 FEZ의 사용자 정의 바이너리 세이브 파일입니다. 이 파일은 압축되거나 암호화되지 않았지만, 시작 부분에 매직 문자열이 없어 ImHex 같은 도구로도 자동 판별이 어려웠습니다. 저자는 먼저 JetBrains Rider를 사용해 게임의 C# 바이너리를 역컴파일하여 파일을 읽고 쓰는 코드를 찾아냈습니다. 특히 `PCSaveDevice.Save()` 함수에서 파일이 `DateTime.Now.ToFileTime()`으로 현재 시각을 기록하고, `saveAction(writer)` 콜백으로 실제 게임 데이터를 기록하는 순서를 확인했습니다. 이 정보를 바탕으로 ImHex의 패턴 에디터에서 `FezSaveFile` 구조체를 정의하고, Windows `FILETIME` 같은 필드를 하나씩 매핑했습니다. `SaveFileOperations.Write()` 함수를 통해 세이브 데이터 필드가 바이너리에 기록되는 정확한 순서와 C# 자료형을 파악하여, 이를 `long`, `bool`, `string` 등 ImHex 패턴 언어 형식으로 옮겼습니다. 특히 선택적 객체, 길이 접두 문자열, 열거형 등 바이너리 형식에서 자주 나타나는 구조들을 패턴으로 표현하고 검증하는 방법을 구체적으로 설명했습니다.
이러한 리버스 엔지니어링 과정은 단순히 파일 내용을 들여다보는 것을 넘어, 파일의 내부 구조를 실행 가능한 문서이자 파일 검증기로 만들어준다는 점에서 큰 의미를 가집니다. 완성된 ImHex 패턴은 파일의 모든 바이트(패딩 제외)를 구조화하여 탐색하고 수정할 수 있게 하며, 호환되지 않는 파일을 패턴 단계에서 거부하는 등 강력한 검증 기능도 제공합니다. 이는 게임 모딩, 데이터 복구, 보안 분석 등 다양한 분야에서 미지의 바이너리 데이터를 다룰 때 매우 유용하게 활용될 수 있습니다. 또한, 이러한 분석 절차는 .NET, 네이티브 프로그램, JVM 언어 등 다양한 환경의 바이너리 파일에도 적용될 수 있어, 개발자와 연구자들에게 새로운 통찰과 도구를 제공합니다.