BlackTDN :: Descompactando arquivos includes .ch e .th



 O pessoal da Imsys já tinha criado uma versão para descompactar arquivos include. Mas, por algum motivo a versão deles não estã funcionando. Sendo assim. Disponibilizo, aqui, duas novas versões.

*decompress.py

import zlib
import sys

with open(sys.argv[1], 'rb') as f:
    content = f.read()

decompress = zlib.decompressobj(-zlib.MAX_WBITS)
inflated = decompress.decompress(content[14:])
inflated += decompress.flush()

print(inflated[:-1].decode('utf-8', errors='ignore'))

Exemplo (python):

./decompress.py .\includes\sigawin.ch > sigawin.ch

*decompress.ps1

param (
    [string]$filePath
)

Add-Type -AssemblyName System.IO.Compression

$bytes = [System.IO.File]::ReadAllBytes($filePath)
$compressedContent = $bytes[14..($bytes.Length - 1)]
$stream = New-Object System.IO.MemoryStream
$stream.Write($compressedContent, 0, $compressedContent.Length)
$stream.Position = 0

$decompressor = New-Object System.IO.Compression.DeflateStream($stream, [System.IO.Compression.CompressionMode]::Decompress)
$reader = New-Object System.IO.StreamReader($decompressor, [System.Text.Encoding]::UTF8)

$inflated = $reader.ReadToEnd()
$reader.Close()

Write-Output ($inflated.Trim())

Exemplo (pwsh):

pwsh .\decompress.ps1 -filePath ".\includes\sigawin.ch" > .\sigawin.ch

[]s.

Comentários

  1. Segue uma versão do Python, para descompactar uma pasta inteira:

    ____________________ decompress_ch.py

    import logging
    import sys
    import zlib
    import os

    logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")

    def loop_input_directory(input_directory: str, output_directory: str) -> None:
    try:
    valid_paths(input_directory, output_directory)
    for item_name in os.listdir(input_directory):
    input_item: str = os.path.join(input_directory, item_name)
    output_item: str = os.path.join(output_directory, item_name)
    if os.path.isfile(input_item):
    extract_include_file(input_item, output_item)
    elif os.path.isdir(input_item):
    loop_input_directory(input_item, output_item)
    except Exception as e:
    logging.error(f"{e}")


    def valid_paths(input_directory: str, output_directory: str) -> None:
    if not os.path.isdir(input_directory):
    logging.error(f"Erro: O diretório de entrada '{input_directory}' não foi encontrado.")
    sys.exit(1)
    elif not os.path.isdir(output_directory):
    try:
    os.makedirs(output_directory, exist_ok=True)
    logging.info(f"Diretório criado '{output_directory}'.")
    except PermissionError:
    logging.error(f"Permissão negada: {e}.")
    except Exception as e:
    logging.error(f"{e}")


    def extract_include_file(input_filename: str, output_filename: str) -> None:
    input_filename_lower:str = input_filename.lower()
    if not input_filename_lower.endswith('.ch') and not input_filename_lower.endswith('.th'):
    return

    try:
    with open(input_filename, 'rb') as f:
    content = f.read()

    decompress = zlib.decompressobj(-zlib.MAX_WBITS)
    inflated = decompress.decompress(content[14:])
    inflated += decompress.flush()

    with open(output_filename, 'xb') as f:
    f.write(inflated[:-1])
    except FileNotFoundError as e:
    logging.error(f"{e}.")
    return
    except zlib.error as e:
    logging.error(f"Erro de descompressão Zlib: '{input_filename}' - {e}")
    return
    except Exception as e:
    logging.error(f"{e}")
    return
    logging.info(f"Dados descompactados em '{output_filename}'.")


    def main():
    if len(sys.argv) < 3:
    logging.info("Erro: Faltam argumentos de diretórios.")
    logging.info(f"Uso: python {sys.argv[0]} ")
    sys.exit(1)

    input_directory = sys.argv[1]
    output_directory = sys.argv[2]
    loop_input_directory(input_directory, output_directory)

    logging.info(f"Rotina finalizada.")


    if __name__ == "__main__":
    main()

    ResponderExcluir

Postar um comentário

Postagens mais visitadas