# TruePolyglot
TruePolyglot project website
Author: hackade

Truepolyglot is polyglot file generator project. This means that the generated file is composed of several file formats. The same file can be opened as a ZIP file and as a PDF file for example. The idea of this project comes from work of Ange Albertini, International Journal of Proof-of-Concept or Get The Fuck Out and Julia Wolf that explain how we can build a polyglot file.
Polyglot file can be fastidious to build, even more if you want to respect correctly file format. That's why I decided to build a tool to generate them.
My main motivation was the technical challenge.

## Features and changelog

Description | Version
--- | ---
Build a polyglot file valid as PDF and ZIP format and that can be opened with 7Zip and Windows Explorer | POC
Add a stream object in PDF part | POC
Polyglot file checked without warning with pdftocairo | >= 1.0
Polyglot file checked without warning with caradoc | >= 1.0
Rebuild PDF Xref Table | >= 1.0
Stream object with correct length header value | >= 1.0
Format "zippdf", file without offset after Zip data | >= 1.1
Polyglot file keep original PDF version | >= 1.1.1
Add "szippdf" format without offset before and after Zip data | >= 1.2
Fix /Length stream object value and PDF offset for szippdf format | >= 1.2.1
PDF object numbers reorder after insertion | >= 1.3

## Polyglot file compatibility

Software | Formats | status
--- | --- | ---
Acrobat Reader | pdfzip, zippdf | OK
Acrobat Reader | szippdf | KO
Sumatra PDF | pdfzip, zippdf, szippdf | OK
Edge | pdfzip, zippdf, szippdf | OK
Firefox | pdfzip, zippdf, szippdf | OK
7zip | pdfzip, zippdf | OK with warning
7zip | szippdf | OK
Explorer Windows | pdfzip, zippdf, szippdf | OK
Info-ZIP (unzip) | pdfzip, zippdf, szippdf | OK
Evince | pdfzip, zippdf, szippdf | OK
pdftocairo -pdf | pdfzip, zippdf, szippdf | OK
caradoc stats | pdfzip | OK
java | szippdf | OK

## Examples

- Polyglot files repository

PDF input file | Zip input file | Format | Polyglot | Comment
--- | --- | --- | --- | ---
doc.pdf | archive.zip | pdfzip | polyglot.pdf | PDF/ZIP polyglot - 122 Ko
orwell_1984.pdf | file-FILE5_32.zip | pdfzip | polyglot.pdf | PDF/ZIP polyglot - 1.3 Mo
x86asm.pdf | fasmw17304.zip | pdfzip | polyglot.pdf | PDF/ZIP polyglot - 1.8 Mo
doc.pdf | archive.zip | zippdf | polyglot.pdf | PDF/ZIP polyglot - 112 Ko
electronics.pdf | hello_world.jar | szippdf | polyglot.pdf | PDF/JAR polyglot - 778 Ko
hexinator.pdf | eicar.zip (scan virustotal.com) | pdfzip | polyglot.pdf (scan virustotal.com) | PDF/ZIP polyglot with Eicar test in Zip - 2.9 Mo

## Manual

    usage: truepolyglot format [options] output-file

    Generate a polyglot file.

    Formats availables:
    * pdfzip: Generate a file valid as PDF and ZIP. The format is closest to PDF.
    * zippdf: Generate a file valid as ZIP and PDF. The format is closest to ZIP.
    * szippdf: Generate a file valid as ZIP and PDF. The format is strictly a ZIP. Archive is modified.

    positional arguments:
      {pdfzip,zippdf,szippdf}
                            Output polyglot format
      output_file           Output polyglot file path

    optional arguments:
      -h, --help            show this help message and exit
      --pdffile PDFFILE     PDF input file
      --zipfile ZIPFILE     ZIP input file
      --verbose {none,error,info,debug}
                            Verbosity level  (default: info)

    TruePolyglot v1.3

## Code

    git clone https://git.hackade.org/truepolyglot.git/

## Contact

On IRC Freenode my nickname is hackade or by mail at truepolyglot@hackade.org.