Exemplo n.º 1
0
int main(int argc, char **argv)
{
    FILE *fp_in, *fp_out;
    int action = 0;

    if (argc != 4)
    {
        fprintf(stderr, "usage: %s [-a|-r] <input> <output>\n", argv[0]);
        return 1;
    }

    if (strcmp(argv[1], "-a") == 0)
    {
        action = 1;
    } else if (strcmp(argv[1], "-r") == 0)
    {
        action = 2;
    } else {
        fprintf(stderr, "usage: %s [-a|-r] <input> <output>\n", argv[0]);
    }

    fp_in = fopen(argv[2], "r");
    if (!fp_in)
    {
        fprintf(stderr, "can't open input file '%s': %s\n", argv[2], strerror(errno));
        return 1;
    }

    fp_out = fopen(argv[3], "w");
    if (!fp_out)
    {
        fprintf(stderr, "can't open output file '%s': %s\n", argv[3], strerror(errno));
        return 1;
    }

    switch (action)
    {
    case 1:
        pack_krnl(fp_in, fp_out);
        break;
    case 2:
        unpack_krnl(fp_in, fp_out);
        break;
    default:
        break;
    }

    return 0;
}
Exemplo n.º 2
0
int main(int argc, char **argv)
{
	FILE *fp_in, *fp_out;
	int action = 0;

	if (argc != 4)
	{
		fprintf(stderr, "Not enough arguments!");
		help(argv);
		return 1;
	}
	
	fp_in = fopen(argv[2], "rb");
	if (!fp_in)
	{
		fprintf(stderr, "can't open input file '%s': %s\n", argv[2], strerror(errno));
		return 1;
	}

	fp_out = fopen(argv[3], "wb");
	if (!fp_out)
	{
		fprintf(stderr, "can't open output file '%s': %s\n", argv[3], strerror(errno));
		return 1;
	}

	if (strcmp(argv[1],"-pack") == 0) 
	{
		pack_krnl(fp_in, fp_out);
	}
	else if (strcmp(argv[1],"-unpack") == 0) 
	{
		unpack_krnl(fp_in, fp_out);
	}
	else
	{
		help(argv);
		return 1;
	}

	return 0;
}
Exemplo n.º 3
0
int
main(int argc, char *argv[])
{
	off_t size;
	uint8_t *buf;
	int fd;

	if (argc != 2) {
		fprintf(stderr, "usage: %s image\n", argv[0]);
		exit(EXIT_FAILURE);
	}

	if ((fd = open(argv[1], O_RDONLY)) == -1)
		err(EXIT_FAILURE, "%s", argv[1]);

	if ((size = lseek(fd, 0, SEEK_END)) == -1)
		err(EXIT_FAILURE, "%s", argv[1]);

	if ((buf = mmap(NULL, size, PROT_READ, MAP_SHARED | MAP_FILE, fd, 0))
	    == MAP_FAILED)
		err(EXIT_FAILURE, "%s", argv[1]);

	if (memcmp(buf, "RKFW", 4) == 0)
		unpack_rkfw(argv[1], buf, size);
	else if (memcmp(buf, "RKAF", 4) == 0)
		unpack_rkaf(argv[1], buf, size);
	else if (memcmp(buf, "KRNL", 4) == 0 || memcmp(buf, "PARM", 4) == 0)
		unpack_krnl(argv[1], buf, size);
	else if (memcmp(buf, "ANDROID!", 8) == 0)
		unpack_android(argv[1], buf, size);
	else
		errx(EXIT_FAILURE, "invalid signature");

	printf("unpacked\n");

	munmap(buf, size);
	close(fd);

	return EXIT_SUCCESS;
}
Exemplo n.º 4
0
static void
unpack_rkaf(const char *path, uint8_t *buf, uint32_t size)
{
	uint32_t fsize, ioff, isize, noff, nsize;
	uint8_t *p;
	int count;
	const char *name, *fpath, *sep;
	char dir[PATH_MAX];

	fsize = (buf[4] | buf[5] << 8 | buf[6] << 16 | buf[7] << 24) + 4;

	if (fsize != size)
		fprintf(stderr, "invalid file size (should be %u bytes)\n",
		    fsize);

	printf("FIRMWARE_VER:%d.%d.%d\n", buf[0x87], buf[0x86], buf[0x84]);
	printf("MACHINE_MODEL:%s\n", &buf[0x08]);
	printf("MACHINE_ID:%s\n", &buf[0x2a]);
	printf("MANUFACTURER:%s\n", &buf[0x48]);

	count = buf[0x88] | buf[0x89] << 8 | buf[0x8a] << 16 | buf[0x8b] << 24;

	printf("\nunpacking %d files\n", count);
	printf("-------------------------------------------------------------------------------\n");

	for (p = &buf[0x8c]; count > 0; p += 0x70, count--) {
		name = (const char *)p;
		fpath = (const char *)&p[0x20];
		nsize = p[0x5c] | p[0x5d] << 8 | p[0x5e] << 16 | p[0x5f] << 24;
		ioff = p[0x60] | p[0x61] << 8 | p[0x62] << 16 | p[0x63] << 24;
		noff = p[0x64] | p[0x65] << 8 | p[0x66] << 16 | p[0x67] << 24;
		isize = p[0x68] | p[0x69] << 8 | p[0x6a] << 16 | p[0x6b] << 24;
		fsize = p[0x6c] | p[0x6d] << 8 | p[0x6e] << 16 | p[0x6f] << 24;

		if (memcmp(fpath, "SELF", 4) == 0)
			printf("----------------- %s:%s:0x%x@0x%x (%s)", name,
			    fpath, nsize, noff, path);
		else {
			printf("%08x-%08x %s:%s", ioff, ioff + isize - 1, name,
			    fpath);

			if (noff != 0xffffffffU)
				printf(":0x%x@0x%x", nsize, noff);

			if (memcmp(name, "parameter", 9) == 0) {
				ioff += 8;
				fsize -= 12;
			}

			sep = fpath;
			while ((sep = strchr(sep, '/')) != NULL) {
				memcpy(dir, fpath, sep - fpath);
				dir[sep - fpath] = '\0';
				if (mkdir(dir, 0755) == -1 && errno != EEXIST)
					err(EXIT_FAILURE, "%s", dir);
				sep++;
			}

			write_image(fpath, &buf[ioff], fsize);
			if (memcmp(&buf[ioff], "KRNL", 4) == 0 ||
			    memcmp(&buf[ioff], "PARM", 4) == 0)
				unpack_krnl(fpath, &buf[ioff], fsize);
		}

		printf(" %d bytes\n", fsize);
	}

	printf("-------------------------------------------------------------------------------\n");
}