A Linux, Python attempt at a universal extractor similar to the Windows UniExtract2.
The idea is to support the compressed archives that UniExtract2 supports but in a Linux environment with a Python API.
{
"name": "ACB",
"comment": "A DOS compression utility by George Buyanovsky - http://fileformats.archiveteam.org/wiki/ACB_(compressed_archive)",
"extensions": ["acb"],
"install": {
"method": "apt",
"packages": ["dosbox"],
"tool": "ACB.EXE",
"container": "dos/acb/acb_200c.zip"
},
"pack": {
"exe": "dosbox",
"cmdline": "$tool -noconsole -c \"mount d $tools\" -c \"mount e $(pwd)\" -c \"e:\" -c \"d:acb b $file.acb $file\" -c \"exit\"",
"type": "dosbox"
},
"unpack": {
"exe": "dosbox",
"cmdline": "$tool -noconsole -c \"mount d $tools\" -c \"mount e $destdir\" -c \"mount f $arcloc\" -c \"d:acb r f:$shortname e:\" -c \"exit\"",
"extension": "acb",
"force_extension": true
},
"test": {
"blob": "H4sIAACF0WEAA+Nq4GDosSx+OvP57Ps8j/mCX3MBABFWmRcSAAAA",
"file": "0",
"content": "ACB",
"padbyte": "0x41",
"padlen": 260,
"delete": true
},
"identification": {
"file": "None",
"trid": "None",
"idarc": "ACB"
}
}- Install methods supported:
apt(sudo apt install <packages[0]> <packages[1]> ...)pip(sudo pip install <packages[0]> <packages[1]> ...)source(git clone <repo>)- Adds more fields:
repo- the git repo - (currently only git is supported)build- build scriptexist_check- allows you to bypass cloning and installing if the tool is already on your system- Example:
"install": { "method": "source", "repo": "https://github.com/kubo/snzip", "build": "apt install libsnappy-dev && ./autogen.sh && ./configure --with-static-snappy && make && cp snzip $tools", "exist_check": ["snzip -h", "Usage: snzip"] },
- Adds more fields:
- Pack field types:
archiver- a packer we can run natively exists to generate a testable archive filedosbox- a packer we can run via DOSbox exists to generate a testable archive filewine- a packer we can run via Wine exists to generate a testable archive fileblob- no archiver we can run exists but we have an extractor we can test with a base64 blob of data- Adds another field:
blob- the base64 encoded archive- Example:
"pack":{ "type":"blob", "blob":"RUdHQQABpuPSNQAAAAAiguII45CFCgAAAAADAA==" },
- Representative Samples:
archivertype:- zip
- Pretty standard Linux CLI tool that keeps a record of the original filename and can archive many files in one archive.
- gzip
- Pretty standard Linux CLI tool that has no notion of the pre-compression file metadata.
- cru
- A CP/M archiver that is supported using deark. Deark is
an amazing extractor but its default output filename support is weird so even if the archive stores
the filename
0the output is like0.000.0or some incremental number up from there. There is a flag (-nonames) to support not doing this but I haven't experimented yet.
- A CP/M archiver that is supported using deark. Deark is
an amazing extractor but its default output filename support is weird so even if the archive stores
the filename
- zip
dosboxtype:winetype:- 777
- Standard Win32 CLI driven archiver, configuration was autogenerated using winearc.py
and tweaked slightly to use the
-o.flag.
- Standard Win32 CLI driven archiver, configuration was autogenerated using winearc.py
and tweaked slightly to use the
- 777
blobtype:- egg
- Windows 32/64bit archiver exists but nothing we can drive from the command line so a blob of an archive was created in windows. Linux extractors exist.
- squeeze2
- CP/M era archiver. CP/M binary executors exist on Linux like tnylpo but they weren't working for this use case somehow. So blobs it is.
- egg
See the schema.py for how we validate configurations with jsonschema at runtime.
-
Clone and install python requirements.
$ git clone https://github.com/sourcekris/uniextract $ cd uniextract $ pip install -r requirements.txt -
If you wish for any of the Wine based archivers to work, ensure you have a functional Wine installation. On my machine I needed to run:
dpkg --add-architecture i386 && apt-get update && apt-get install wine32:i386 -
Install and build pre-requisite archiver tools.
$ ./prereqs.py -
Use to extract whatever you want.
$ ./extract.py -e <archive> -d <destination_folder>
| Archive type | Common file extension(s) |
|---|---|
| 7-zip | 7z |
| 777 | 777 |
| ACB | acb |
| ACE | ace |
| ADF | adf |
| AFIO | afio, af |
| AIN | ain |
| ALZip | alz |
| AMG | amg, oop |
| AR | a, ar |
| AR7 | ar7 |
| ARC | arc, ark |
| ARG | arg |
| ARHANGEL | lg |
| ARJ | arj |
| ARJSoftwareJAR | j |
| ARQ | arq |
| ARX | arx |
| ASD | asd |
| AppleSingle | as |
| AppleiWork | iwa, snappy |
| BIX | bix |
| BLINK | bli |
| BSA | bsa |
| CAB | cab |
| CAR | car |
| CAZIPXP | caz |
| CPIO | cpio |
| CPShrink | cpz |
| CrLZH | yyy |
| Crunch | zzz |
| Crush | cru |
| DGCA | dgc, dgca |
| DWC | dwc |
| EGG | egg |
| ERI | eri |
| ESP | esp |
| FacebookZstandard | zst |
| FacebookZstandardLz4 | lz4 |
| GCA | gca |
| GSARCPAK | pak, arc |
| Gzip | gz, tgz |
| HA | ha |
| HAP | hap |
| HDF | hdf |
| HYP | hyp |
| Hex | hex, b16, base16 |
| IMP | imp |
| IntelHex | ihex |
| JARCS | jar |
| JRchive | jrc |
| KGB | kgb, kge |
| LArc | lzs |
| LBR | lbr |
| LHARK | lzh |
| LIMIT | lim |
| LZA | lza |
| LZOP | lzo, lzop |
| LZWCOM | lzw |
| LZX | lzx |
| LZZ | lzz |
| LotusCMZ | cmz |
| MAr | mar |
| MDCD | md |
| MPC | mp3 |
| MSI | msi |
| MSXiE | xie |
| MWSqueeze | mw |
| MacBinary | bin |
| MicrognosisCompressionArchiver | mar |
| NSK | nsk |
| PACKER | pak |
| PMArc | pma |
| PSA | psa |
| PUT | put |
| Quantum | q |
| RAR | rar, r00 |
| RAX | rax |
| RK | rk |
| RKV | rkv |
| SAR | sar |
| SITX | sitx, sit, sit5 |
| SKY | sky |
| SLIM | fb |
| SQX | sqx |
| SnappyFraming | sz, snappy |
| SnappyHadoop | snappy |
| SnappyJava | snappy |
| SnappyRaw | raw, snappy |
| SnappySnzip | snz, snappy |
| SquashARH | arh |
| Squeeze | qqq, sq, sqz |
| Squeeze2 | sq2, qqq, zsq |
| SqueezeIt | sqz |
| TSCOMP | tsc |
| Tar | tar, ctar |
| UFA | ufa |
| UltraCompressor | uc |
| X1 | x |
| XPACK | xpa |
| XXD | xxd |
| YAC | yac |
| YZ1 | yz1 |
| ZAR | zar |
| ZET | zet |
| ZIP | zip, jar, xpi, wz, exe, imz, apk, docx, docm, maff |
| ZPAQ | zpaq |
| ZPK | zpk |
| Zoo | zoo |
| base64 | b64, mme, mime |
| bzip2 | bz2 |
| compress | Z |
| lrzip | lrz |
| lzh | lzh, lha |
| lzip | lz |
| lzma | lzma |
| oPAQue | paq |
| packARC | pja |
| rzip | rz |
| uuencode | uue, uu |
| xxencode | xxe, xxenc, xx |
| xz | xz |
| yEnc | yenc |
- Q: Pre-reqs (
prereqs.py) fails to install tools, for example:$ ./prereqs.py -s 777 trying to install archiver: 777: error opening unarchived test data: [Errno 2] No such file or directory: '/tmp/tmpw71rxjc8/0' archiver test file content mismatch: got: b'' want: b'777' Failed - A: Ensure Wine works.
$ wine it looks like wine32 is missing, you should install it. multiarch needs to be enabled first. as root, please execute "dpkg --add-architecture i386 && apt-get update && apt-get install wine32:i386" $ dpkg --add-architecture i386 && apt-get update && apt-get install wine32:i386 ... $ wine Usage: wine PROGRAM [ARGUMENTS...] Run the specified program wine --help Display this help and exit wine --version Output version information and exit - Q: Wine is installed but I get an error 53:
$ ./prereqs.py -s 777 trying to install archiver: 777: error running unarchive of test data: Command 'cd /tmp/tmp2fr_bm3b && wine /root/uniextract/tools//777.exe e -o. z:/tmp/tmpcfq8vzqe.777' returned non-zero exit status 53. cmdline: cd /tmp/tmp2fr_bm3b && wine /root/uniextract/tools//777.exe e -o. z:/tmp/tmpcfq8vzqe.777 Failed - A: Rebuild your ~/.wine profile.
$ mv ~/.wine ~/.wineold $ ./prereqs.py -s 777 trying to install archiver: 777: OK
- Kris Hunt (@CTFKris)