De beste manier om dat aan te pakken lijkt me om als test twee bestanden te maken: je neemt een enkel (leeg) bestand en zipt dat zowel onder windows als GNU/Linux. Vervolgens kijk je welk stuk hetzelfde is (met behulp van een binary diff of een diff op de hexdump of zo). Dat moet dan het ingepakte (lege) bestand zijn. Alles ervóór moet dan van de header zijn, wat je los kunt maken met een simpel dd-commando. Dat zou kunnen werken, al is er vrees ik een probleem: sommige bestand-specifieke dingen zouden wel eens in de header opgeslagen kunnen worden, of in ieder geval ergens voor de eigenlijke data begint. Die zou je dan dus ook te pakken hebben, waardoor je zelfgemaakte zip niet meer zou kloppen.
Een tweede manier die ik verzin maar waarvan ik niet zeker weet of het kan is het gebruik van bijvoorbeeld Java of Perl. Deze talen hebben packages / classes voor zip. Zo heeft Java bijvoorbeeld java.util.zip.* met daarin een klasse ZipOutputStream. Die heeft weer een functie om te schrijven. Misschien zou je die kunnen gebruiken als je iets van Java weet, of anders van Perl.
Als je er echt niet uitkomt dat zou je altijd nog de documentatie van het zip-formaat kunnen zoeken en een programma schrijven dat die header zelf maakt...niet dat het simpel is, maar het werkt gegarandeerd

.
Leven is het meervoud van lef | In order to make an apple pie from scratch, you must first create the universe.