Skip to content

Commit 44ca640

Browse files
committed
I _think_ this is how I extracted the mission names
1 parent 752476d commit 44ca640

File tree

2 files changed

+337
-0
lines changed

2 files changed

+337
-0
lines changed

README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,26 @@ This is pulled from my bash history, so probably not complete or accurate, but m
6363

6464
Dependencies are JohnWickParse (I used the version from here: https://github.com/apocalyptech/JohnWickParse.git) and jq.
6565

66+
First extract the pak files to get the uexp files, I think this is how I did it (with quickbms):
67+
68+
```
69+
# First enter the game data folder
70+
71+
# Figure out which pak files contains mission data:
72+
for p in *.pak; do quickbms -l ~/path-to-this-repo/data/bl3.bms "$p" >> "$p-files.txt"; done
73+
# Look through the -files.txt files to see which contains useful files
74+
75+
# Then extract the relevant files
76+
quickbms -f "Missions/*" ~/path-to-this-repo/data/bl3.bms pakchunk4-WindowsNoEditor.pak
77+
quickbms -f "Missions/*" ~/path-to-this-repo/data/bl3.bms pakchunk7-WindowsNoEditor.pak
78+
# etc.
79+
```
6680

6781
Create json:
6882

6983
```
7084
# Paths to stuff needs to be adjusted, obviously
85+
cd Missions
7186
7287
pushd ProvingGrounds1/ # Enter first folder
7388
for file in *.uexp; do john-wick-parse serialize $(basename "$file" .uexp); done

data/bl3.bms

Lines changed: 322 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,322 @@
1+
# Unreal Engine 4 - Unreal Tournament 4 (*WindowsNoEditor.pak) (script 0.4.23)
2+
# script for QuickBMS http://quickbms.aluigi.org
3+
4+
math NO_TAIL_INFO = 0 # set it to 1 for archives with corrupt/missing tail information
5+
6+
quickbmsver "0.8.4"
7+
8+
math TOC_FILE = 0
9+
10+
# set your AES_KEY here as text or C string ("\x11\x22...") or umodel hex (0x1122...)
11+
#set AES_KEY binary ""
12+
#set AES_KEY h "0x115EE4F8C625C792F37A503308048E79726E512F0BF8D2AD7C4C87BC5947CBA7"
13+
string AES_KEY h "0x115EE4F8C625C792F37A503308048E79726E512F0BF8D2AD7C4C87BC5947CBA7"
14+
putarray 10 -1 "KIWIKIWIKIWIKIWIKIWIKIWIKIWIKIWI" # first beta of Street Fighter V
15+
putarray 10 -1 "_aS4mfZK8M5s5KWC2Lz2VsFnGKI7azgl" # current version of Street Fighter V
16+
putarray 10 -1 "bR!@nbR0wnc@rychR!$d@nd@v3d3R3kj!mj0$hk3v!nm!ch@3lm!k3s3@nst3v3t!m" # Victory: The Culling
17+
putarray 10 -1 "casd#55@#$%323!$^#b%05sa5W|hhaf4365s52ss51|55m!|{55s^@@36f233|-|0w@%3g8hssDk35/!Nm|_|%ds23%a32d5&23as3%12p|-|y$t3ds562d23fav3c@dyw38#49" # Victory: The Culling
18+
putarray 10 -1 "C8C4847F3B4FA52D4AAD57A52358CDBC" # Injustice 2 (iOS)
19+
putarray 10 -1 "k14z0ZLR8a7jNm49uyBzxXYY9LpTHcehLSNiC3jAkzBsffPuy8YsTa72RLD9KWIn" # Gal*Gun VR
20+
putarray 10 -1 "E7@[dZfoYCW;+YWR;0JK^{9tt:yU0_T&" # Marvel VS Capcom - Infinite
21+
putarray 10 -1 "E1A1F2E4AA066C54BD5090F463EDDF58D01684243672B3CE809FF47FF473B04A" # OverHit
22+
putarray 10 -1 "I0vV6wr0TFbg3m23QuSIwnYC1sI0AIDq" # Fernbus
23+
putarray 10 -1 "y298qjSb115NqQ3Agad30DWn2QYrTI8CT6aP05l2PBV9Qe92S94PdoVCCy06A38L" # Fortnite
24+
putarray 10 -1 "b9uW0RKNY91be8HN3Lemi68j6Xsi2l7fQJYsp5oR4al4C4c9kY5E0l90411l9P3L" # Dragonball FighterZ
25+
putarray 10 -1 "45DD15D6DD2DA50AEB71CE7A5284CF8EA498B2EC3D52B7E336F3EA0071CE44B3"
26+
putarray 10 -1 "MRZpemumg6t2AXExrMQs6TSoZRG+YSABK338oc6F8kTXu4k6QffJgYAzKl65Tk2L"
27+
putarray 10 -1 "0x9D8C9A4A4FA082F213EED604B6E756237181685EEDA82216437617D7AA5231AF"
28+
putarray 10 -1 ""
29+
math AES_KEY_IS_SET = 1
30+
31+
math ALTERNATIVE_MODE = 0
32+
33+
get ARCHIVE_NAME basename
34+
get ARCHIVE_PATH FILEPATH
35+
36+
math VERSION = 0
37+
38+
math CHUNK_OFFSET_ABSOLUTE = -1 # default, enabled
39+
40+
# 1 = HIT
41+
math WORKAROUND = 0
42+
43+
if NO_TAIL_INFO != 0
44+
get OFFSET asize
45+
math ALTERNATIVE_MODE = 1
46+
else
47+
goto -0xac # for version 8
48+
savepos MAGIC_OFF
49+
get MAGIC long #idstring "\xe1\x12\x6f\x5a" # 0x5a6f12e1
50+
51+
if MAGIC != 0x5a6f12e1
52+
goto -0x2c # previous versions 3-6
53+
savepos MAGIC_OFF
54+
get MAGIC long
55+
else
56+
math WORKAROUND = 4
57+
endif
58+
59+
if MAGIC == 0
60+
goto -0xcc # Fortnite iOS
61+
savepos MAGIC_OFF
62+
get MAGIC long
63+
math WORKAROUND = 3
64+
endif
65+
66+
endian guess MAGIC # 0x5a6f12e1:le, 0xe1126f5a:be
67+
if MAGIC == 0x1233a # HIT game
68+
math WORKAROUND = 1
69+
elif MAGIC == 0x1066a # OverHit
70+
math WORKAROUND = 1
71+
elif MAGIC == 0x13aed # OverHit
72+
math WORKAROUND = 1
73+
elif ARCHIVE_NAME & "OverHit"
74+
math WORKAROUND = 1
75+
elif ARCHIVE_NAME == "0" # HIT
76+
math WORKAROUND = 1
77+
elif ARCHIVE_PATH & "Gears of War 4"
78+
math WORKAROUND = 2
79+
endif
80+
get VERSION long
81+
endian guess VERSION
82+
get OFFSET longlong
83+
get SIZE longlong
84+
getdstring HASH 20
85+
if WORKAROUND == 1
86+
math VERSION = 3
87+
endif
88+
89+
if VERSION >= 3
90+
goto MAGIC_OFF
91+
goto -1 0 SEEK_CUR
92+
get ENCRYPTED byte
93+
if ENCRYPTED != 0
94+
callfunction SET_AES_KEY 1
95+
log MEMORY_FILE10 OFFSET SIZE
96+
encryption "" ""
97+
math TOC_FILE = -10 # MEMORY_FILE10 is -10
98+
endif
99+
endif
100+
101+
goto OFFSET # don't use TOC_FILE
102+
callfunction GET_NAME 1
103+
endif
104+
105+
if ALTERNATIVE_MODE == 0
106+
get FILES long TOC_FILE
107+
else
108+
math FILES = 0x7fffffff
109+
math MAX_OFF = OFFSET
110+
goto 0
111+
set NAME string ""
112+
endif
113+
114+
math CHUNK_SIZE = 0x10000 # just in case...
115+
for i = 0 < FILES
116+
if ALTERNATIVE_MODE == 0
117+
callfunction GET_NAME 1
118+
if NAMESZ == 0 # lame work-around for Conan Exiles
119+
callfunction GET_NAME 1
120+
endif
121+
endif
122+
savepos TMP_OFF TOC_FILE
123+
124+
get OFFSET longlong TOC_FILE
125+
if WORKAROUND == 2
126+
get ZSIZE long TOC_FILE
127+
get SIZE long TOC_FILE
128+
get ZIP byte TOC_FILE
129+
elif WORKAROUND == 4
130+
get ZSIZE longlong TOC_FILE
131+
get SIZE longlong TOC_FILE
132+
get ZIP byte TOC_FILE
133+
else
134+
get ZSIZE longlong TOC_FILE
135+
get SIZE longlong TOC_FILE
136+
get ZIP long TOC_FILE
137+
endif
138+
if WORKAROUND == 1
139+
getdstring HASH 20 TOC_FILE
140+
elif VERSION <= 1
141+
get TSTAMP longlong TOC_FILE
142+
endif
143+
if WORKAROUND == 2
144+
else
145+
getdstring HASH 20 TOC_FILE
146+
endif
147+
math CHUNKS = 0
148+
math ENCRYPTED = 0
149+
if VERSION >= 3
150+
if ZIP != 0
151+
get CHUNKS long TOC_FILE
152+
for x = 0 < CHUNKS
153+
get CHUNK_OFFSET longlong TOC_FILE
154+
get CHUNK_END_OFFSET longlong TOC_FILE
155+
putarray 0 x CHUNK_OFFSET
156+
putarray 1 x CHUNK_END_OFFSET
157+
next x
158+
endif
159+
if WORKAROUND == 2
160+
else
161+
get ENCRYPTED byte TOC_FILE
162+
endif
163+
get CHUNK_SIZE long TOC_FILE
164+
endif
165+
if WORKAROUND == 1
166+
if ARCHIVE_NAME == "0" # HIT game only!
167+
math ENCRYPTED = 0
168+
endif
169+
endif
170+
if ALTERNATIVE_MODE != 0
171+
savepos TMP_OFF TOC_FILE
172+
math OFFSET + TMP_OFF
173+
endif
174+
175+
#comtype copy # for AES, do not enable or quickbms 0.9.2 will fail
176+
if ZIP == 3 # JoyfunRPG / Faith of Danschant
177+
comtype oodle
178+
elif ZIP & 1
179+
comtype zlib
180+
elif ZIP & 2
181+
comtype gzip
182+
elif ZIP & 4
183+
comtype snappy
184+
if VERSION >= 6
185+
comtype oodle
186+
endif
187+
if WORKAROUND == 2
188+
comtype lz4
189+
endif
190+
elif ZIP & 0x10
191+
comtype oodle
192+
else
193+
math ZIP = 0
194+
endif
195+
196+
if CHUNKS > 0
197+
log NAME 0 0
198+
append
199+
math TMP_SIZE = SIZE
200+
if CHUNK_OFFSET_ABSOLUTE < 0 && OFFSET != 0
201+
getarray CHUNK_OFFSET 0 0
202+
if CHUNK_OFFSET u< OFFSET
203+
math CHUNK_OFFSET_ABSOLUTE = 0
204+
else
205+
math CHUNK_OFFSET_ABSOLUTE = 1
206+
endif
207+
endif
208+
for x = 0 < CHUNKS
209+
getarray CHUNK_OFFSET 0 x
210+
getarray CHUNK_END_OFFSET 1 x
211+
math CHUNK_ZSIZE = CHUNK_END_OFFSET
212+
math CHUNK_ZSIZE - CHUNK_OFFSET
213+
math CHUNK_XSIZE = CHUNK_ZSIZE
214+
if ENCRYPTED != 0
215+
callfunction SET_AES_KEY 1
216+
math CHUNK_XSIZE x 16
217+
endif
218+
if TMP_SIZE u< CHUNK_SIZE
219+
math CHUNK_SIZE = TMP_SIZE
220+
endif
221+
if CHUNK_OFFSET_ABSOLUTE == 0
222+
math CHUNK_OFFSET + OFFSET
223+
endif
224+
if ZIP == 0
225+
log NAME CHUNK_OFFSET CHUNK_SIZE 0 CHUNK_XSIZE
226+
else
227+
clog NAME CHUNK_OFFSET CHUNK_ZSIZE CHUNK_SIZE 0 CHUNK_XSIZE
228+
endif
229+
math TMP_SIZE - CHUNK_SIZE
230+
next x
231+
append
232+
else
233+
# the file offset points to an entry containing
234+
# the "same" OFFSET ZSIZE SIZE ZIP HASH ZERO fields,
235+
# just an additional backup... so let's skip them
236+
savepos BASE_OFF TOC_FILE
237+
math BASE_OFF - TMP_OFF
238+
math OFFSET + BASE_OFF
239+
math XSIZE = ZSIZE
240+
if ENCRYPTED != 0
241+
callfunction SET_AES_KEY 1
242+
math XSIZE x 16
243+
endif
244+
if ZIP == 0
245+
log NAME OFFSET SIZE 0 XSIZE
246+
else
247+
clog NAME OFFSET ZSIZE SIZE 0 XSIZE
248+
endif
249+
endif
250+
encryption "" ""
251+
252+
if ALTERNATIVE_MODE != 0
253+
math OFFSET + ZSIZE
254+
goto OFFSET
255+
if OFFSET == MAX_OFF
256+
break
257+
endif
258+
if VERSION >= 4
259+
padding 0x800 # necessary for WitchIt
260+
endif
261+
endif
262+
next i
263+
264+
startfunction SET_AES_KEY_ASK
265+
math AES_KEY_IS_SET = 1
266+
print "The archive is encrypted, select the number of the key to use or type yours:"
267+
for z = 0
268+
getarray KEY 10 z
269+
if KEY == ""
270+
break
271+
endif
272+
print "%z%: %KEY%"
273+
next z
274+
print "%z%: press RETURN for no encryption (Lineage 2 Revolution)"
275+
set KEY unknown "???"
276+
strlen TMP KEY
277+
if KEY == ""
278+
math AES_KEY_IS_SET = -1
279+
set AES_KEY string "no key, encryption disabled"
280+
elif TMP <= 2
281+
getarray AES_KEY 10 KEY
282+
if AES_KEY strncmp "0x"
283+
string AES_KEY << 2
284+
string AES_KEY h AES_KEY
285+
endif
286+
elif KEY strncmp "0x"
287+
string KEY << 2
288+
string AES_KEY h KEY
289+
else
290+
set AES_KEY binary KEY
291+
endif
292+
print "KEY: %AES_KEY%"
293+
endfunction
294+
295+
startfunction SET_AES_KEY
296+
if AES_KEY_IS_SET == 0
297+
callfunction SET_AES_KEY_ASK 1
298+
endif
299+
if AES_KEY_IS_SET > 0
300+
encryption aes AES_KEY "" 0 32
301+
endif
302+
endfunction
303+
304+
startfunction GET_NAME
305+
get NAMESZ signed_long TOC_FILE
306+
if NAMESZ >= 0
307+
if NAMESZ > 0x200
308+
math ALTERNATIVE_MODE = 1
309+
else
310+
getdstring NAME NAMESZ TOC_FILE
311+
endif
312+
else
313+
math NAMESZ n NAMESZ
314+
if NAMESZ > 0x200
315+
math ALTERNATIVE_MODE = 1
316+
else
317+
math NAMESZ * 2
318+
getdstring NAME NAMESZ TOC_FILE
319+
set NAME unicode NAME
320+
endif
321+
endif
322+
endfunction

0 commit comments

Comments
 (0)