#include #include #include #include #include #include #include #include #include int main(int argc, char **argv) { int fd; struct stat sb; void *p; uint8_t *hdr; int setup_sectors; uint32_t compressed_payload_offset; uint32_t compressed_payload_length; if (argc != 2) errx(1, "usage: bzexplode "); fd = open(argv[1], O_RDONLY); if (fd < 0) err(1, "open"); if (fstat(fd, &sb) < 0) err(1, "fstat"); p = mmap(0, sb.st_size, PROT_READ, MAP_SHARED, fd, 0); if (p == MAP_FAILED) err(1, "mmap"); hdr = p; setup_sectors = hdr[0x1f1]; compressed_payload_offset = *(uint32_t*)&hdr[0x248]; fprintf(stderr, "setup sectors %d\n", setup_sectors); compressed_payload_offset += (setup_sectors+1) * 512; //compressed_payload_length = *(uint32_t*)(p + compressed_payload_offset - 4); compressed_payload_length = *(uint32_t*)&hdr[0x24c]; fprintf(stderr, "compressed_payload_offset %"PRIx32" (abs)\n", compressed_payload_offset); fprintf(stderr, "compressed_payload_length %"PRIx32"\n", compressed_payload_length); write(1, p + compressed_payload_offset, compressed_payload_length); return 0; }