While you might not have a need for it anymore, I am sure others do. I will share my research for those who want to know.
One of the things that are being used in conjunction with this is what I believe to be a Partminer Lib file.
This .bhl file could contain the shared key / password cipher for the data.
Inspected: .bhl & .lpq files. While some of the ones from Fairyland game (for example) have some file name references in there, but don't let that fool you. It is nothing more than a binary array of objects. This TOC for the packed array is not found anywhere externally, so my guess is it is compiled internally into the PE or ciphered into the .bhl.
Tested: (un)zpaq102.exe did not find anything even after removing detection for EOF.
Peazip - Nothing found either. I use this, since it supports *PAQ files... however I selected to use the .bhl file as the keyfile, null/anonymous/<guessed a couple> passwords to try & match it. The question is why would the 'BM..' signatures remain with filename target strings visible in raw data? Also, various layout associations for GUI formatting in plain text also reside in the 'interface.lpq'. If this was a compressed archive, don't you think those would have been included? Perhaps some but not all.
Test case: Assuming only the images where bundled together and used a generic file type + proprietary signature to identify, cut out the block section of each file and save it as its corresponding file type. Ex.) For .bmp - use
this as reference. Find your EOF. There are .DDS, .ico, and other format types that are in these as well. Remember, it is just an object array. Ideally, finding a TOC with the file name associations to the compressed packed array would be nice to have.
Next step: Disassemble the libraries (did that already) &| PE and write some hooks to dump out the content when loading the game. Shouldn't be too difficult, just time consuming to trace the binary out and write your patch.
I found there to be a table def for a bunch of constants.
It then goes through and loops $PWD\*.lpq where it checks also for any *update.lpq of Array[%d].
Code: Select all
Array {
ecx
aMesh_stuff ; "MESH_STUFF"
aMesh ; "mesh"
aMesh_0 ; "mesh/"
aInterface_stuf ; "INTERFACE_STUFF"
aInterface ; "interface"
aInterface_0 ; "interface/"
aEffect_path ; "EFFECT_PATH"
aEffect ; "effect"
aEffect_0 ; "effect/"
aMapdata_path ; "MAPDATA_PATH"
aMapdata ; "mapdata"
aMapdata_0 ; "mapdata/"
aMap_path ; "MAP_PATH"
off_852CD4
aMap ; "map/"
aShore_path ; "SHORE_PATH"
aShore ; "shore"
aShore_0 ; "shore/"
aConfig_path ; "CONFIG_PATH"
aConfig ; "config"
aConfig_0 ; "config/"
aIcons_path ; "ICONS_PATH"
aIcons ; "icons"
aIcons_0 ; "icons/"
aLight_data ; "LIGHT_DATA"
aLights ; "lights"
aLights_0 ; "lights/"
aThread_speed_t ; "THREAD_SPEED_TREE"
aSpeedtree ; "speedtree"
aSpeedtree_0 ; "speedtree/"
aAudio_path ; "AUDIO_PATH"
aAudio ; "audio"
aAudio_0 ; "audio/"
aShader_path ; "SHADER_PATH"
aShader ; "shader"
aShader_0 ; "shader/"
aShadowmap_path ; "SHADOWMAP_PATH"
aShadowmap ; "shadowmap"
aShadowmap_0 ; "shadowmap/"
aCttw_path ; "CTTW_PATH"
aCttw ; "cttw"
aCttw_0 ; "cttw/"
}
Then it comes to the processing of the types once all the data has been loaded into memory.
loc_61341F:
TextureFromFileInMemory:
Source is in plain view with the virtual file path associated @ 006135AA.
Need to dump the register to a file with the name provided.
'xcptlib.dll' is derived from crashrpt.dll and imports from kernel32.dll. It then goes to dump the crash report into the necessary files with information used to identify the general area in the game code where the fault happened. Acts as if it runs in its own process monitor virtual debugger. It is no wonder that this library is nothing more than a wrapper for everything you can think of for std lib calls, etc... to trap. E.g. nothing special or of importance in this file.
After a segfault, it then bundles up all the related files into a .zip archive and is using 'zlib.dll' I am sure for this. The symbol tables are found on where to export '_s_Crash_s_zip' = "%s\Crash%s.zip" where 1st arg specifies the relative game path + dump_folder .. 2nd argument is timestamp-to-text.
'BMGlib.dll' is just a utility library that has routines for managing image type files, also supports various compression schemas, and conversions to GreyScale, etc. This is a common file for various games, and is unpacked. I didn't find anything relating to the pack or assembly of the .lpq file itself. Just a straight drop in from other games. This is to be used after you get the binary data out of the array and mapped to its corresponding file name.
See also.. Project64 & Rice Video plugin, MSVCP71.DLL
Manifest for KOK3:
File: WE.exe
LegalCopyright: Copyright (C) 2004
Comments: Lager