아트록스의 PAK 파일구조를 그림으로 제시하자면 대충 위 그림과 같습니다.
'Joy Max File Manager!'는 아트록스 파일인지 아닌지를 판별하는 역할을 하며 크기는 0x203으로 추측됩니다.
Directory header 부분은(0x204~0x7D1FF) 특정 오프셋을 통하여 그다음 파일헤더 가 어느 위치에 속하는지를 구할 수 있게 도와줍니다.
File header에는 파일과 헤더가 공존합니다. 파일의 헤더가 선 제시된 후 파일이 나오고 다음에 또 파일의 헤더와 파일이 제시됩니다.
이처럼 PAK는 마치 디스크의 파일 시스템처럼 체계적인 구조를 지니고 있습니다.
판별자 부분 중간에 나타나는 00E8 0300은 무엇을 하는 역할인지 아직 확실히 연구되지 않았습니다. 파일의 크기도 아니고 PAK의 사이즈도 아닌 것이 도통 알 수가 없네요.
Directory header 부분은 File header 부분을 설명하기 전에는 약간 난해하실 것입니다. File header 부분은 0x800 단위로 나뉩니다. 그러니까 '파일 헤더(0x800) ~ 파일들 ~ 파일 헤더(0x800) ~ 파일들' 이런 식으로 반복되는데 특이한 점은 파일의 오프셋 또한 0x800 이라는 숫자를 맞추기 위해 파일을 넣을 때 파일의 오프셋이 0x800 으로 나누어떨어지지 않으면 '0x00'을 더 삽입한다는 것입니다.
이 부분은 나중에 더 살펴보도록 하고, 일단 이제 PAK라는 것의 오프셋은 0x800 이라는 단위로 나누어떨어진다는 건 아셨을 것입니다. Directory header 부분은 바로 이점을 이용합니다.
Directory header는 '그다음파일헤더 ~ 파일헤더혹은파일의오프셋 ~ 그다음파일헤더 ~ 파일헤더혹은파일의오프셋' 이렇게 반복되는데, 먼저 그다음파일헤더를 선 제시합니다. 위의 사진으로 보자면 7CB7 0000이 되겠네요. 그렇다면 그다음에 나오는 파일헤더혹은파일의오프셋인 '0000 0000, 0400 0000, 0500 0000 ….' 들은 모두 7CB7 0000을 가리키겠지요.
이때, 0000 0000 이라든가 0400 0000 에서 0x800을 곱하면 그다음 File header 또는 파일의 위치 혹은 파일의 내부가 됩니다. 그러니까 Directory header에 자기의 오프셋/0x800을 한 값을 제시하면 그다음파일헤더가 튀어나오는 구조입니다.
그렇다면 그다음파일헤더는 왜 필요할까요? File header에서 한 파트는 0x800 단위로 떨어지는데 그렇다면 많은 파일은 담을 수가 없을 것이며, 실제로 PAK는 한 파일 헤더 당 16개의 파일만을 담습니다. 이때 파일헤더혹은파일의오프셋을 Directory header와 대응시키면(대응할 때 오프셋/0x800에서 0~4 정도의 자연수가 더해짐) 그다음파일헤더의 위치가 나오며, 이 헤더들은 그 전에 대응한 파일들과 같은 폴더에 속해있음을 의미합니다. 그래서 이 헤더의 이름이 Directory header인 것입니다.
File header의 시작은 원래는 0x7D200 부터 시작하지만, 편의상 0x7DA00 의 사진을 기준으로 설명하겠습니다. 헤더에서 파일의 정보 값들은 0x80의 길이를 가지며, 헤더의 한 파트가 0x800 사이즈이니 하나의 파일 헤더는 총 16개의 파일을 담을 수가 있습니다. 여기서 맨 앞은 0x01로 시작하고 그 뒤에서 0x00이 나올 때까지는 이름으로 삼습니다.
파일의 정보 값 + 0x70의 위치는(사진에서 1A00 0000) 파일의 오프셋을 나타내줍니다. 이 값은 오프셋/0x800을 한 값입니다. 폴더일 경우 파일의 오프셋으로 식별할 수 있는 특수한 값을 나타내줍니다.
파일의 정보 값 + 0x74의 위치는(사진에서 FE38 0000) 파일의 크기를 나타내줍니다.
파일의 정보 값 + 0x7C의 위치는(사진에서 01, 02) 파일의 포맷을 나타내줍니다. 이것은 0x01일 때는 폴더를, 0x02일 때는 파일로 여겨집니다.
마치 HTML에서 폴더를 나타낼 때처럼 파일 이름이 0x2E(.) 일 때는 파일의 오프셋은 현재 폴더를 나타내며, 파일 이름이 0x2E2E(..) 일 때는 이전 폴더를 나타냅니다. 이런 헤더 값으로 파일의 헤더들을 정리하고 디렉터리 헤더를 대응시켜서 모든 정보를 얻을 수가 있습니다.