ImHex와 FEZ 저장 파일로 따라가는 미지의 바이너리 포맷 역공학
- 작성자는 FEZ의 사용자 정의 바이너리 저장 파일을 대상으로, 프로그램의 디컴파일 코드에서 읽기·쓰기 로직을 역추적해 ImHex Pattern Language 정의를 만드는 과정을 설명함
- 초기 SaveSlot2 파일에는
DOT_LOCKED_DOOR_A같은 평문 문자열이 보이며, 압축·암호화되지 않았고 파일 시작부의 매직 넘버도 없는 형식으로 판단함 - FEZ 최신 Steam 배포본은 2016년 12월 2일 버전이며, Linux에서는 저장 파일을
/home/werwolv/.local/share/FEZ/SaveSlot2에서 찾았음 - 게임 디렉터리의
System.Core.dll,mscorlib.dll을 근거로 C# 게임임을 확인하고, C# 바이너리는 디컴파일이 비교적 쉬워 파일 파서 코드를 찾는 출발점이 됨 - 글에서 쓰는 일부 기능은 정식판에 아직 없으며, ImHex v1.38.1 이하에서 문제가 나면 Nightly 빌드 사용을 권함
Hacker News opinions
게임 스포일러가 있다니 본문을 못 읽겠음. LLM에 넣어서 스포일러만 지우게 해볼까 생각 중임.
ImHex로 여러 바이너리 포맷과 파일 매직을 분석해봤는데 꽤 잘 맞았음. 오래된 포맷은 C struct와 1:1인 경우가 많아서 C 헤더를 왕복 변환할 수 있으면 좋겠음.
최신 Outlook 로컬 메일 바이너리 포맷에도 해볼 생각임. 왜 그냥 SQLite를 쓰지 않았는지 모르겠음.
대학 때 모텔 야간 근무 중 프런트 시스템 데이터 파일을 BASIC 헥스 덤프로 분석했음. 고객 이름이 일정 바이트 간격으로 반복되는 걸 보고 고정 길이 레코드임을 알아냈고, 필드 값을 바꿔가며 포맷을 기록한 뒤 분석과 오타 수정 프로그램까지 만들어 보너스를 받았음.
예전 Minecraft Legacy Console Edition 저장 파일을 ImHex로 분석 중인데 패턴 템플릿은 잘 작동함. 다만 런타임 크기 배열을 읽다가 파일 끝을 넘으면 앞서 디코드한 struct도 보여주지 않고 오류만 내서 디버깅이 고통스러움. LLM은 사람이 오래 걸려 찾는 패턴도 너무 잘 찾아냄.
정체불명 파일 포맷의 절반쯤은 ZIP 안에 SQLite DB가 들어 있는 경우더라.