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.
Segue uma versão do Python, para descompactar uma pasta inteira:
ResponderExcluir____________________ 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()