Hola, tengo un archivo que fue comprimido con zlib y estoy tratando de averiguar el método que fue utilizado para comprimirlo.
Este archivo en particular usa un nivel 9 de compresión, y por lo que pude descifrar la entrada se divide en bloques de 8KiB, y se hace Z_SYNC_FLUSH luego de comprimir cada bloque, pero cada 8 bloques el algoritmo parece hacer otra cosa.
Este es el código que escribí para descomprimir y comprimir el archivo.
Para descomprimir funciona bien, pero solo comprime correctamente los primeros 7 bloques del archivo.
Archivo comprimido con zlib:
https://mega.nz/file/8a5C1SyQ#xqy9nCycTrWfrnwuvWa39xd128s9huSFuf8kOr6kK8Q
Este archivo en particular usa un nivel 9 de compresión, y por lo que pude descifrar la entrada se divide en bloques de 8KiB, y se hace Z_SYNC_FLUSH luego de comprimir cada bloque, pero cada 8 bloques el algoritmo parece hacer otra cosa.
Este es el código que escribí para descomprimir y comprimir el archivo.
Para descomprimir funciona bien, pero solo comprime correctamente los primeros 7 bloques del archivo.
Código (python) [Seleccionar]
import sys
import zlib
# python3 zlib-flate.py -d output.bin input.bin
# python3 zlib-flate.py -9 input.bin output_test.bin
def usage():
print("Usage:")
print(f"python3 {sys.argv[0]} -[1-9,d] input.bin output.bin")
exit()
def main():
argc = len(sys.argv)
if argc != 4:
usage()
try:
if sys.argv[1] == "-d":
# Decompress file
with open(sys.argv[2], "rb") as input_file, open(sys.argv[3], "wb") as output_file:
data = input_file.read()
comp_obj = zlib.decompressobj()
data_plain = comp_obj.decompress(data)
output_file.write(data_plain)
else:
# Compress file
level = -int(sys.argv[1])
if level < 1 or level > 9:
print("Invalid compression level")
with open(sys.argv[2], "rb") as input_file, open(sys.argv[3], "wb") as output_file, open("output.bin", "rb") as test_file:
comp_obj = zlib.compressobj(level)
data = input_file.read(8 * 1024) # Read block of 8KiB
i = 1
while data != b"":
data_zip = comp_obj.compress(data)
data_zip += comp_obj.flush(zlib.Z_SYNC_FLUSH)
# Check if compressed data differs
lenght = len(data_zip)
data_test = test_file.read(lenght)
if data_zip == data_test:
print(f"Block #{i}: correctly compressed")
else:
print(f"Block #{i}: invalid data")
exit()
output_file.write(data_zip)
data = input_file.read(8 * 1024)
i = i + 1
print("File compressed correctly!")
except (IOError, ValueError) as error:
print("Invalid parameters")
main()
Archivo comprimido con zlib:
https://mega.nz/file/8a5C1SyQ#xqy9nCycTrWfrnwuvWa39xd128s9huSFuf8kOr6kK8Q