Knowledge Dynamics LZW COMPRESSOR
Format type | Compression algorithm |
---|---|
Type | Stream |
I/O unit size | 1-bit |
Games |
Knowledge Dynamics LZW COMPRESSOR is a semi-known tool used to compress executable files by some early DOS games.
The program ("COMPRESSOR v1.01") was is some-what wide use around 1989-1991. Knowledge Dynamics Corp. were responsible for INSTALL.EXE redist package that was used by many games, so it is possible that it was part of the same suite.
The algorithm is very similar to LZEXE, however is different enough to be incompatible with any version of UNLZEXE tool.
Games compressed with this COMPRESSOR
- King's Bounty
- Tunnels And Trolls: Crusaders Of Khazan (1990)
- Lexi Cross (1991) by Interplay
- Sim City's settings.exe (1989) by Maxis
- Days of Thunder (1990) by Argonaut Software
File Format
offset length purpose 0 0x200 DOS exe header, with wrong block count 0x200 0x3 jump instruction to 0x29C 0x203 unpacker data -- copyright notice, or garbage 0x24D 0x10 unpacker data -- filename 0x25D unpacker data -- error message, or garbage 0x29C 0x3EE unpacker code 0x68a < garbage, will be used for variables in unpacker code > 0x699 0x25 packed header 0x6C0 special buffer, unknown purpose (old reloc. table?) "offset" packed exe offset to packed header = main_header.blocks * 512 + main_header.extra_bytes offset to packed exe = offset_to_packed_header + packed_header.headpars * 16 length of packed exe = filesize - offset_to_packed_exe length of unpacked exe = packed_header.blocks * 512 + packed_header.extra_bytes
- Filename is null-terminated and is padded with 0x24.
- In some games, copyright notice and error message are obfuscated/replaced with garbage.
- Copyright states: "Copyright(C) 1989 Knowledge Dynamics Corp.All rights reserved worldwide."
- Error message is: "Unable to find $..$"
Signature
It is hard to tell how many versions of COMPRESSOR existed and how much they differed. One possible approach is verifying that jump instruction ("e9 99 00") is at position 0x200.
As strings tend to be unreadable (see above), they could not be used reliably.
Decompression algorithm
- copies "packed header" into 0x68a
- copies "unpacker code" [0x200-0x680] to far location
- jumps to far location to execute that code
- opens file "filename"
- seeks to "offset to packed exe"
- unpacks into cs:0000
The compression is identical to the one used in CC_Format#Compression -- it is LZW_compression with dictionary reset.
The unpacked exe is written to offset 0 in memory (offset 0x20 in file).
Credits
Devised by openkb project with best regards to modding community.
Tools
https://sourceforge.net/p/openkb/code/ci/master/tree/src/tools/unexecomp.c uncompexe, open-source / public domain decompressor for this format