#include #include #include #include #include #include #include static const unsigned long BUFFER_SIZE = 65536; struct __attribute__ ((packed)) local_header { uint32_t signature; uint16_t version; uint16_t flags; uint16_t compression; uint16_t modtime; uint16_t moddate; uint32_t crc32; uint32_t compressed_size; uint32_t uncompressed_size; uint16_t filename_len; uint16_t extrafield_len; }; int main(int argc, char **argv, char **env) { int fd; unsigned char *buffer = NULL; unsigned char *filename, *extra_field; unsigned short *p; struct local_header *lhp; unsigned char ch; if (argc > 1) { if ((buffer = calloc(1, BUFFER_SIZE))) { if ((fd = open(argv[1], O_RDONLY)) != -1) { fprintf(stderr, "info: opened %s\n", argv[1]); read(fd, buffer, BUFFER_SIZE); lhp = (struct local_header *)buffer; printf("%s\n", "Local Header"); printf("Signature: \t%2s\n", (char*)&lhp->signature); printf("Version: \t%1.1f\n", ((float)(lhp->version))/10); printf("CRC32: \t%08X\n", lhp->crc32); printf("Compressed: \t%d\n", lhp->compressed_size); printf("Uncompressed: \t%d\n", lhp->uncompressed_size); printf("Filename length: \t%d\n", lhp->filename_len); printf("Extra length: \t%d\n", lhp->extrafield_len); filename = buffer + 0x1E; extra_field = filename + lhp->filename_len; ch = *extra_field; *extra_field = 0; printf("Filename: \t%s\n", filename); *extra_field = ch; printf("%s\n", "Extra fields"); for (p = (unsigned short *)extra_field; p < (unsigned short *)extra_field + lhp->extrafield_len; p+=2) { printf("Header: \t%04X\tData:\t%04X\n", (unsigned short)*p, (unsigned short)*(p+1)); } close(fd); } else fprintf(stderr, "error: failed to open %s\n", argv[1]); } else fprintf(stderr, "error: %s\n", "malloc failed"); } return 0; }