diff options
-rw-r--r-- | PolyglotFile/__init__.py | 1 | ||||
-rw-r--r-- | PolyglotFile/polyglotpdfany.py | 2 | ||||
-rw-r--r-- | PolyglotFile/polyglotzipany.py | 42 | ||||
-rwxr-xr-x | truepolyglot | 24 |
4 files changed, 61 insertions, 8 deletions
diff --git a/PolyglotFile/__init__.py b/PolyglotFile/__init__.py index e6f6416..4ece820 100644 --- a/PolyglotFile/__init__.py +++ b/PolyglotFile/__init__.py @@ -5,4 +5,5 @@ from .polyglotpdfzip import PolyglotPdfZip from .polyglotpdfany import PolyglotPdfAny from .polyglotzippdf import PolyglotZipPdf from .polyglotszippdf import PolyglotSZipPdf +from .polyglotzipany import PolyglotZipAny diff --git a/PolyglotFile/polyglotpdfany.py b/PolyglotFile/polyglotpdfany.py index 8b7289f..a441f2c 100644 --- a/PolyglotFile/polyglotpdfany.py +++ b/PolyglotFile/polyglotpdfany.py @@ -34,8 +34,6 @@ class PolyglotPdfAny(): with open(payload2filename, "rb") as f: self.payload2 = f.read() - self.buffer = bytearray() - def generate(self): k2stream = self.payload1 if len(k2stream) > 0: diff --git a/PolyglotFile/polyglotzipany.py b/PolyglotFile/polyglotzipany.py new file mode 100644 index 0000000..133db4a --- /dev/null +++ b/PolyglotFile/polyglotzipany.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +import logging + +''' + |-------------------------------| - + |---------- Payload 1 ----------K1 | J1 + |-------------------------------| - + |---- ZIP Local File Header ----K2 | + |-------------------------------| - + |---------- Payload 2-----------K3 | J2 + |-------------------------------| - + |---- ZIP Central Directory ----K4 | + |-------------------------------| | + |--- End of Central Directory --K5 | + |-------------------------------| | +''' + + +class PolyglotZipAny(): + from ZipFileTransformer import Zip + + def __init__(self, Zip, payload1filename, payload2filename): + self.buffer = bytearray() + self.zip = Zip + self.payload1 = bytearray() + if payload1filename is not None: + with open(payload1filename, "rb") as f: + self.payload1 = f.read() + self.payload2 = bytearray() + if payload2filename is not None: + with open(payload2filename, "rb") as f: + self.payload2 = f.read() + + def generate(self): + self.zip.add_data_to_file(self.payload1, self.payload2, True) + self.buffer = self.zip.buffer + + def write(self, filename): + fd = open(filename, "wb") + fd.write(self.buffer) + fd.close() diff --git a/truepolyglot b/truepolyglot index bd187a1..23f0c7e 100755 --- a/truepolyglot +++ b/truepolyglot @@ -10,6 +10,8 @@ from PolyglotFile import PolyglotZipPdf from PolyglotFile import PolyglotPdfZip from PolyglotFile import PolyglotSZipPdf from PolyglotFile import PolyglotPdfAny +from PolyglotFile import PolyglotZipAny + def main(): @@ -19,13 +21,18 @@ def main(): '* zippdf: Generate a file valid as ZIP and PDF.' + ' The format is closest to ZIP.\n' + '* szippdf: Generate a file valid as ZIP and PDF.' + - ' The format is strictly a ZIP.' + - ' Archive is modified.\n' + + ' The format is strictly a ZIP.\n' + + ' Archive is modified.\n' + '* pdfany: Generate a valid PDF file with payload1' + - ' file content as first object or/and payload2 file' + - ' content as last oject.\n') + ' file content as first object\n' + + ' or/and payload2 file' + + ' content as last oject.\n' + + '* zipany: Generate a valid ZIP file with payload1' + + ' file content at start of file\n' + + ' or/and payload2 file content beetween' + + ' LFH and CD.\n') usage_str = '%(prog)s format [options] output-file' - epilog_str = 'TruePolyglot v1.5.3' + epilog_str = 'TruePolyglot v1.6' frm = argparse.RawTextHelpFormatter parser = argparse.ArgumentParser(description=description_str, epilog=epilog_str, @@ -34,7 +41,8 @@ def main(): parser.add_argument('format', nargs='+', choices=["pdfzip", "zippdf", "szippdf", - "pdfany"], + "pdfany", + "zipany"], help='Output polyglot format') parser.add_argument('--pdffile', dest='pdffile', help='PDF input file') @@ -91,6 +99,10 @@ def main(): if args.format[0] == "pdfany": p = Pdf(args.pdffile) a = PolyglotPdfAny(p, args.payload1file, args.payload2file) + if args.format[0] == "zipany": + z = Zip(args.zipfile) + a = PolyglotZipAny(z, args.payload1file, args.payload2file) + a.generate() a.write(args.output_file[0]) |