From 77a9481cf914c4602c6c8dc8c5af8c98237b374a Mon Sep 17 00:00:00 2001 From: n1073645 Date: Thu, 7 Nov 2019 09:20:24 +0000 Subject: [PATCH 1/6] xz compression --- src/core/lib/FileSignatures.mjs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/core/lib/FileSignatures.mjs b/src/core/lib/FileSignatures.mjs index a6efb320..1c4c4924 100644 --- a/src/core/lib/FileSignatures.mjs +++ b/src/core/lib/FileSignatures.mjs @@ -1485,7 +1485,7 @@ export const FILE_SIGNATURES = { 4: 0x5a, 5: 0x0 }, - extractor: null + extractor: extractXZ }, { name: "Tarball", @@ -2808,6 +2808,21 @@ export function extractZlib(bytes, offset) { } +/** + * XZ extractor + * + * @param {Uint8Array} bytes + * @param {Number} offset + * @returns {string} + */ +export function extractXZ(bytes, offset) { + const stream = new Stream(bytes.slice(offset)); + stream.continueUntil([0x00, 0x00, 0x00, 0x00, 0x04, 0x59, 0x5a]); + stream.moveForwardsBy(7); + return stream.carve(); +} + + /** * ELF extractor. * From b83f6591bb7134b21ca18b2a0d30526ee08efdb0 Mon Sep 17 00:00:00 2001 From: n1073645 Date: Thu, 7 Nov 2019 10:13:40 +0000 Subject: [PATCH 2/6] XZ compression --- src/core/lib/FileSignatures.mjs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/core/lib/FileSignatures.mjs b/src/core/lib/FileSignatures.mjs index 1c4c4924..7783fd6e 100644 --- a/src/core/lib/FileSignatures.mjs +++ b/src/core/lib/FileSignatures.mjs @@ -2817,8 +2817,13 @@ export function extractZlib(bytes, offset) { */ export function extractXZ(bytes, offset) { const stream = new Stream(bytes.slice(offset)); + + // Move forward to EOF marker stream.continueUntil([0x00, 0x00, 0x00, 0x00, 0x04, 0x59, 0x5a]); + + // Move over EOF marker stream.moveForwardsBy(7); + return stream.carve(); } From 4f5e0c007d7a4f2b25e380b7fe474aa64312c9ff Mon Sep 17 00:00:00 2001 From: n1073645 Date: Thu, 7 Nov 2019 15:06:30 +0000 Subject: [PATCH 3/6] GIF extractor for GIF89a --- src/core/lib/FileSignatures.mjs | 34 +++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/core/lib/FileSignatures.mjs b/src/core/lib/FileSignatures.mjs index 7783fd6e..bcf3417f 100644 --- a/src/core/lib/FileSignatures.mjs +++ b/src/core/lib/FileSignatures.mjs @@ -40,7 +40,7 @@ export const FILE_SIGNATURES = { 4: [0x37, 0x39], // 7|9 5: 0x61 // a }, - extractor: null + extractor: extractGIF }, { name: "Portable Network Graphics image", @@ -2440,6 +2440,36 @@ export function extractJPEG(bytes, offset) { } +/** + * GIF extractor. + * + * @param {Uint8Array} bytes + * @param {Number} offset + * @returns {Uint8Array} + */ +export function extractGIF(bytes, offset) { + const stream = new Stream(bytes.slice(offset)); + stream.continueUntil([0x21, 0xff]); + stream.continueUntil([0x21, 0xf9]); + while (stream.hasMore()) { + stream.continueUntil(0x2c); + stream.moveForwardsBy(11); + while (stream.getBytes(2) !== [0x21, 0xf9]) { + stream.moveBackwardsBy(2); + stream.moveForwardsBy(stream.getBytes(1)[0]); + if (!stream.getBytes(1)[0]) + break; + stream.moveBackwardsBy(1); + } + if (stream.getBytes(1)[0] === 0x3b) + break; + stream.moveBackwardsBy(1); + } + stream.moveBackwardsBy(10); + return stream.carve(); +} + + /** * Portable executable extractor. * Assumes that the offset refers to an MZ header. @@ -2809,7 +2839,7 @@ export function extractZlib(bytes, offset) { /** - * XZ extractor + * XZ extractor. * * @param {Uint8Array} bytes * @param {Number} offset From f022440b4a505326621532bc20f0a2acd4da98c6 Mon Sep 17 00:00:00 2001 From: n1073645 Date: Thu, 7 Nov 2019 16:20:09 +0000 Subject: [PATCH 4/6] Tidied GIFextractor --- src/core/lib/FileSignatures.mjs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/core/lib/FileSignatures.mjs b/src/core/lib/FileSignatures.mjs index bcf3417f..34557305 100644 --- a/src/core/lib/FileSignatures.mjs +++ b/src/core/lib/FileSignatures.mjs @@ -2465,7 +2465,6 @@ export function extractGIF(bytes, offset) { break; stream.moveBackwardsBy(1); } - stream.moveBackwardsBy(10); return stream.carve(); } From 447a6d7524b4bc27391f5a8db9e1c2f17255a640 Mon Sep 17 00:00:00 2001 From: n1073645 Date: Thu, 7 Nov 2019 16:50:10 +0000 Subject: [PATCH 5/6] Comments for GIF. --- src/core/lib/FileSignatures.mjs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/core/lib/FileSignatures.mjs b/src/core/lib/FileSignatures.mjs index 34557305..c6672c68 100644 --- a/src/core/lib/FileSignatures.mjs +++ b/src/core/lib/FileSignatures.mjs @@ -2449,11 +2449,21 @@ export function extractJPEG(bytes, offset) { */ export function extractGIF(bytes, offset) { const stream = new Stream(bytes.slice(offset)); + + //Move to application extension block. stream.continueUntil([0x21, 0xff]); + + //Move to Graphic Control Extension for frame #1. stream.continueUntil([0x21, 0xf9]); while (stream.hasMore()) { + + //Move to Image descriptor. stream.continueUntil(0x2c); + + //Move past Image descriptor to the image data. stream.moveForwardsBy(11); + + //Loop until next Graphic Control Extension. while (stream.getBytes(2) !== [0x21, 0xf9]) { stream.moveBackwardsBy(2); stream.moveForwardsBy(stream.getBytes(1)[0]); @@ -2461,6 +2471,7 @@ export function extractGIF(bytes, offset) { break; stream.moveBackwardsBy(1); } + //When the end of the file is [0x00, 0x3b], end. if (stream.getBytes(1)[0] === 0x3b) break; stream.moveBackwardsBy(1); From 80362cfa84083f3c0550f39e180f5f77589329ba Mon Sep 17 00:00:00 2001 From: n1073645 Date: Fri, 8 Nov 2019 11:39:50 +0000 Subject: [PATCH 6/6] Bzip2 extractor completed --- src/core/lib/FileSignatures.mjs | 38 ++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/core/lib/FileSignatures.mjs b/src/core/lib/FileSignatures.mjs index c6672c68..8c0a3aff 100644 --- a/src/core/lib/FileSignatures.mjs +++ b/src/core/lib/FileSignatures.mjs @@ -1444,7 +1444,7 @@ export const FILE_SIGNATURES = { 1: 0x5a, 2: 0x68 }, - extractor: null + extractor: extractBZIP2 }, { name: "7zip", @@ -2817,6 +2817,42 @@ export function extractGZIP(bytes, offset) { } +/** + * @param {Uint8Array} bytes + * @param {Number} offset + * @returns {Uint8Array} + */ +export function extractBZIP2(bytes, offset){ + const stream = new Stream(bytes.slice(offset)); + + //The EOFs shifted between all possible combinations. + var lookingfor = [ + [0x77, 0x24, 0x53, 0x85, 0x09], + [0xee, 0x48, 0xa7, 0x0a, 0x12], + [0xdc, 0x91, 0x4e, 0x14, 0x24], + [0xb9, 0x22, 0x9c, 0x28, 0x48], + [0x72, 0x45, 0x38, 0x50, 0x90], + [0xbb, 0x92, 0x29, 0xc2, 0x84], + [0x5d, 0xc9, 0x14, 0xe1, 0x42], + [0x2e, 0xe4, 0x8a, 0x70, 0xa1], + [0x17, 0x72, 0x45, 0x38, 0x50]]; + + for(let i = 0; i < 9; i++){ + + //Continue until an EOF. + stream.continueUntil(lookingfor[i]); + if(stream.getBytes(5).join("") == lookingfor[i].join("")) + break; + + //Jump back to the start if invalid EOF. + stream.moveTo(0); + } + stream.moveForwardsBy(4); + + return stream.carve(); +} + + /** * Zlib extractor. *