버전: 3.2.0.537 EN 32/64bit
용도: MPQ 파일형식 편집
제작자: Ladislav Zezula (ladik@zezula.net)
제작사이트: http://www.zezula.net

[1] 필요 파일
STORM.DLL
- 읽기 전용 MPQ파일을 읽어야 할 경우 옵션에서 설정합니다.
- 파일은 각 게임의 폴더 내에 있습니다.
목록파일(*.txt)
- 알려진 MPQ파일의 파일의 목록을 알려주며, MPQ파일을 열 때 사용해야 할 파일입니다.
[2] 설치
첨부한 MPQEditen.7z파일을 다운받고 압축해제하여 나온 MPQEditen폴더를 C:\에 넣습니다.
C:\MPQEditen폴더로 이동하여 MPQEditor.exe를 실행합니다.
그러면 레지스트리를 추가할 것이냐 묻는데 필요하다면 Yes를 누릅니다.
[3] 사용법
아래에서 설명한 MPQ파일이란 mpq,scm,scx,exe,snp,w3x,w3m등의 확장자를 나타냅니다.
File
-> New MPQ archives ... (Ctrl+N) - 새 MPQ파일을 만듭니다.
-> Open MPQ archives ... (Ctrl+O) - MPQ파일을 불러들입니다.
-> Reopen MPQ archives - 새로고침합니다.
-> Close MPQ archives - 열었던 MPQ파일을 닫습니다.
-> Exit (Alt+F4) - MPQEditor를 종료합니다.
View
-> Toolbar - 도구모음을 봅니다.
-> Status Bar - 상태바를 봅니다.
-> Large Icons - 큰 아이콘으로 봅니다.
-> Small Icons - 작은 아이콘으로 봅니다.
-> List - 목록만을 봅니다.
-> Details - 자세한 정보를 봅니다.
Operations
-> Open (Enter) - 선택한 파일을 다른 프로그램으로 불러들입니다.
-> Extract (Ctrl+E) - 선택한 파일을 추출합니다.
-> Rename ... - 선택한 파일의 이름을 변경합니다.
-> Delete ... (Del) - 선택한 파일을 삭제합니다.
-> New Folder ... - 새 폴더를 만듭니다.
-> Add file(s) ... (Ctrl+A) - 파일을 추가합니다.
-> Properties ... (Alt+Enter) - 파일의 속성을 봅니다.
-> Extract listfile - 목록 파일을 추출합니다.
-> Extract whole archive ... - 전체 내용을 추출합니다.
-> Build MPQ from directory ... - 폴더를 MPQ파일로 만듭니다.
-> Compact archive - MPQ전체를 압축합니다.
Tools
-> Name breaker ... - 나타나지 않은 파일이름을 찾습니다.
-> Merge listfiles ... - 목록파일을 병합합니다.
-> Script console -
-> Run MPQ2K Script ... - MPQ2k 스크립트를 사용합니다.
-> Options ... - MPQEditen에 대한 설정을 합니다.
-> Add file options ... - 파일 추가에 대한 설정을 합니다.
Help
-> Command line arguments ... - 부가기능을 추가하여 MPQEditor.exe를 열때 필요한 명령어를 봅니다.
-> About MPQEditor... - 제작자 정보를 봅니다.
[4] 추가 기능
파일 추가/추출시, 드래그 앤 드롭 기능을 지원합니다.
파일 이름을 찾을 때, Hex나 Text내용을 미리 볼 수 있습니다.
파일을 선택하고 오른쪽 클릭 -> Open with를 사용하여 파일을 열 프로그램을 지정합니다.
목록파일이 없는 파일에 Autodetect기능을 사용할 수 있습니다.
[5] Name Breaking
일반적으로, MPQ압축파일에는 내부의 파일명은 없고 해쉬값으로만 저장된다.
해쉬값을 계산해 주는 알고리즘은 단방향 방식뿐이기 때문에, 해쉬값만으로 본래의 파일명을 역추적하는 것은 불가능하다.
몇몇 파일은 Storm.dll의 SFileOpenFileEx를 통해 알아낼 수는 있으나, 내부 파일 자체가 게임상에서 실행되지 않는 파일은 알아낼 수 없다.
그렇다면 MPQ압축파일로부터 완전한 목록파일을 추출하려면 어떻게 해야할까?
그 중 한 가지는 Name Breaking으로, 해쉬값밖에 없는 파일의 이름을 억지로 찾아내기 위해 MPQ파일에 저장된 내부 파일의 이름을 임의로 설정하여 찾는 방식이다.
왜 이 어려운 방식인 Name Breaking을 써야 할까?
블리자드는 디아블로1 때부터 MPQ압축방식을 사용하여 내부파일의 목록을 포함하기 시작했다.
그 이전인 워크1,2에서는 대부분의 데이터를 WAR라는 파일에 저장하고, 맵은 PUD로 저장했는데 이 PUD는 스타맵의 CHK와 매우 유사하다.
(PUD에 대한 내용은 스타에디트 게시판-Hex로 보는 scenario.chk 3편을 참고)
기존의 MPQ내부를 들여다 보면, 전체 목록파일을 담고 있는 것처럼 보이는 파일을 볼 수 있다.
그것이 (listfile)이라는 파일인데, 이를 사용하여 MPQ파일을 열면 약 10%정도의 파일이 유실된 상태임을 알 수 있다.
현재 나와 있는 블리자드의 게임 중, 디아2, 워크3, 와우는 MPQ내부에 저장되어 있는 목록파일인 (listfile)이 완전한 상태이나, 그 이전의 게임에서는 완전치 못하다.
Name Breaking하기 어려운 이유
압축파일 내의 파일은 폴더\파일명.확장자 식으로 나타나게 되는데, 여기서 생각해야 할 것은 파일명의 길이에 따른 경우의 수이다.
파일명에 사용할 문자를 영어 26개, 숫자 10개만을 사용한다고 가정하고 계산한다 하더라도 1글자일 때, 36가지의 경우의 수가 생기게 된다.
이 파일이 8글자였다면 36^8+36^7+36^6+36^5+36^4+36^3+36^2+36^1 = 2,901,713,047,668개 라는 엄청난 경우의 수가 발생한다. (2조 9천억개)
1가지 조합을 검사하는 시간을 microsecond(100만분의 1초)로 계산하면 8글자 조합으로 된 파일의 모든 조합을 확인하는데에 약 33일이 소요된다.
파일명의 8글자에 걸리는 시간이 이 정도나 되니, 폴더나 확장자, 나머지 문자를 더 넣는다면 얼마나 걸릴지는 각자 상상해보길 바란다.
다행히도 Name Breaking을 적용할 게임에서는 MPQ내부 파일명의 길이가 8자를 넘지 않는다.
워크3에서는 이 8자 제한이 20~30자로 늘어나게 되지만, 목록파일이 완전한 상태이다.
펜티엄4 2.4GHz 533MHz FSB, DDRAM 333MHz (512MB) 기준으로 계산한 시간
5글자: 6초
6글자: 4분
7글자: 2시간
8글자: 3일 20시간
Name Breaking을 쉽게 하기 위한 것들
파일의 크기를 보고 파일의 쓰임새를 추측할 수 있다.
추출된 파일의 원래 속성은 변하지 않으므로, 확장자가 가지게 되는 공통 부분을 알고 있으면 좋다.
(예: WAV는 앞부분이 RIFF로 시작하고 그 뒤는 전체 길이, WAVEfmt로 구성)
같은 폴더에 있다면 이름이나 확장자가 비슷할 가능성이 크다.
해쉬값이 비슷하다면 폴더의 위치, 이름이나 확장자가 비슷할 가능성이 크다.
헥스로 열었을 때, 그 용도나 파일명이 나와 있는 경우도 있다.
Ladiks_Listfiles.zip
mpqediten32.zip
mpqediten64.zip