import struct
import hashlib

# PHP serialized payload - just stdClass for testing
# O:8:"stdClass":0:{}
serialized_meta = b'O:8:"stdClass":0:{}'

# Create minimal PHAR structure
# Start with GIF89a header as stub
stub = b'GIF89a<?php __HALT_COMPILER(); ?>\r\n'

# Pad stub to align
stub_len = len(stub)

# PHAR manifest
manifest_version = struct.pack('<H', 0x0100)  # Version 1.0.0
api_version = struct.pack('<H', 0x1000)  # API version
flags = struct.pack('<I', 0)  # No flags
alias_len = struct.pack('<I', 4)  
alias = b'test'
meta_len = struct.pack('<I', len(serialized_meta))
meta = serialized_meta

# Number of files
num_files = struct.pack('<I', 1)

# File entry: dummy.txt
filename = b'dummy.txt'
filename_len = struct.pack('<I', len(filename))
file_size = struct.pack('<I', 4)  # "test"
file_timestamp = struct.pack('<I', 0)
file_compressed_size = struct.pack('<I', 4)  
file_crc32 = struct.pack('<I', 0xD87F7E0C)  # CRC32 of "test"
file_flags = struct.pack('<I', 0)  # No compression
file_meta_len = struct.pack('<I', 0)  # No file metadata

# Build file entry
file_entry = filename_len + filename + file_size + file_timestamp + file_compressed_size + file_crc32 + file_flags + file_meta_len

# Build manifest
manifest = num_files + manifest_version + api_version + flags + alias_len + alias + meta_len + meta + file_entry
manifest_len = struct.pack('<I', len(manifest))

# File content
file_content = b'test'

# Build complete PHAR
phar = stub + manifest_len + manifest + file_content

# Calculate signature (SHA1)
sig = hashlib.sha1(phar).digest()
sig_type = struct.pack('<I', 0x0002)  # SHA1
sig_magic = b'GBMB'

# Final PHAR
final_phar = phar + sig + sig_type + sig_magic

with open('/tmp/phar_gif.gif', 'wb') as f:
    f.write(final_phar)

print(f"Created /tmp/phar_gif.gif, size: {len(final_phar)} bytes")
print(f"First bytes: {final_phar[:10].hex()}")
