FastFile 형식 연구 #2 (Data Header) Black Ops

형식 연구 #1에서 풀어낸 Data Chunk를 헤더 부분부터 알아보자면...

일단... 헤더의 전체 크기는 총 36바이트(4바이트 값 9개)인데...
   
    DataChunkSize       (32bit Unsigned Integer)
    Unknown1              (32bit ???)
    Unknown2              (32bit ???)
    Unknown3              (32bit ???)
    Unknown4              (32bit ???)
    Unknown5              (32bit ???)
    DataSizeInMemory  (32bit Unsigned Integer)
    Unknown6              (32bit ???)
    Unknown7              (32bit ???)

위에서 보듯이 현재까지는 딱 2개만 알아냈다 -_-;

우선 DataChunkSize는 이름 그대로...
ff 컨테이너에서 zlib 부분의 압축을 전부 풀었을 때의 용량에서 헤더의 크기(36)를 뺀 값이다.
아마도 게임 내에서 ff 파일의 끝을 알아내기 위해 써먹지 않을까 생각 중...(아니면 말고...)

그 다음으로 DataSizeInMemory도 좀 헷갈렸는데...
일단 이 값이 DataChunkSize와 비슷하기는 한데... 거의 항상 이 값이 더 적게 적혀있다.
그래서 처음에는 전체 파일 크기에서 뭐 다른 값을 뺀 건가? 했었지만...
HxD로 Black Ops의 메모리 전체를 덤프시킨 다음에 해당 ff 파일이 저장된 부분만 싹 덤프해서 비교해보고 확실히 알았다.

이 DataSizeInMemory 항목은...
ff 파일을 실제 메모리에 올렸을 때의 용량을 나타내는 항목이었다. -_-;
문제라면 이놈을 메모리에 올릴 때 무슨 짓을 하길래 용량이 줄어드나 했는데,
실제로는 ff 파일 전체를 처음부터 끝까지 주욱 읽으면서 메모리 할당하고 내용을 하나씩 개별적으로 채워넣는 듯하다.
덕분에 나중에 정리해놓을 Data Node 별로 메모리에 올리는 형식이 달라진다. -_-;
일단은 ff 파일 내에서 FF FF FF FF로 되어 있는 부분은 거의 다 메모리에 안 올라간다고 보면 된다.
(참고로 FF FF FF FF는 C 언어 같은 프로그래밍 언어에서 사용하는 New와 유사한 표시이다.
  그냥 이건 메모리에 없을테니 새로 메모리를 할당하고 다음에 나오는 객체를 생성하라는 표시.)

예제) 실제로 Black Ops\zone\english\ 폴더에 있는 en_code_post_gfx.ff 파일의 Data Header를 분석해볼 경우
        (숫자는 모두 10진수이다)

        cFF_header::LoadData - DataChunkSize: 433619
        cFF_header::LoadData - Unknown1: 524288
        cFF_header::LoadData - Unknown2: 544
        cFF_header::LoadData - Unknown3: 0
        cFF_header::LoadData - Unknown4: 0
        cFF_header::LoadData - Unknown5: 0
        cFF_header::LoadData - DataSizeInMemory: 382668
        cFF_header::LoadData - Unknown6: 0
        cFF_header::LoadData - Unknown7: 0

        en_code_post_gfx.ff 파일에 있는 Data Chunk의 압축을 푼 용량: 433,655 bytes
        실제 용량 - 36(헤더 크기): 433,619 = DataChunkSize

        HxD로 Black Ops 실행 후 en_code_post_gfx.ff 파일 부분만 덤프했을 경우의 용량: 382,667 bytes
        메모리 용량 + 1: 382,668 = DataSizeInMemory
        내가 덤프를 잘못했는지는 몰라도... 항상 DataSizeInMemory 값이
        실제 메모리 상의 용량보다 1 byte 더 많이 적혀있다 -_-...

덧글

댓글 입력 영역