blob: 3d2fda736576ba7021dce54cd970364023939ed1 [file] [log] [blame]
Ketut Putu Kumajaya63846372014-06-23 20:05:33 +07001#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <unistd.h>
5#include <fcntl.h>
6#include <errno.h>
7#include <limits.h>
8#include <libgen.h>
9
10#include "mincrypt/sha.h"
11#include "bootimg.h"
12
13typedef unsigned char byte;
14
15int read_padding(FILE* f, unsigned itemsize, int pagesize)
16{
17 byte* buf = (byte*)malloc(sizeof(byte) * pagesize);
18 unsigned pagemask = pagesize - 1;
19 unsigned count;
20
21 if((itemsize & pagemask) == 0) {
22 free(buf);
23 return 0;
24 }
25
26 count = pagesize - (itemsize & pagemask);
27
28 fread(buf, count, 1, f);
29 free(buf);
30 return count;
31}
32
33void write_string_to_file(char* file, char* string)
34{
35 FILE* f = fopen(file, "w");
36 fwrite(string, strlen(string), 1, f);
37 fwrite("\n", 1, 1, f);
38 fclose(f);
39}
40
41int usage() {
42 printf("usage: unpackbootimg\n");
43 printf("\t-i|--input boot.img\n");
44 printf("\t[ -o|--output output_directory]\n");
45 printf("\t[ -p|--pagesize <size-in-hexadecimal> ]\n");
46 return 0;
47}
48
49int main(int argc, char** argv)
50{
51 char tmp[PATH_MAX];
52 char* directory = "./";
53 char* filename = NULL;
54 int pagesize = 0;
55
56 argc--;
57 argv++;
58 while(argc > 0){
59 char *arg = argv[0];
60 char *val = argv[1];
61 argc -= 2;
62 argv += 2;
63 if(!strcmp(arg, "--input") || !strcmp(arg, "-i")) {
64 filename = val;
65 } else if(!strcmp(arg, "--output") || !strcmp(arg, "-o")) {
66 directory = val;
67 } else if(!strcmp(arg, "--pagesize") || !strcmp(arg, "-p")) {
68 pagesize = strtoul(val, 0, 16);
69 } else {
70 return usage();
71 }
72 }
73
74 if (filename == NULL) {
75 return usage();
76 }
77
78 int total_read = 0;
79 FILE* f = fopen(filename, "rb");
80 boot_img_hdr header;
81
82 //printf("Reading header...\n");
83 int i;
84 for (i = 0; i <= 512; i++) {
85 fseek(f, i, SEEK_SET);
86 fread(tmp, BOOT_MAGIC_SIZE, 1, f);
87 if (memcmp(tmp, BOOT_MAGIC, BOOT_MAGIC_SIZE) == 0)
88 break;
89 }
90 total_read = i;
91 if (i > 512) {
92 printf("Android boot magic not found.\n");
93 return 1;
94 }
95 fseek(f, i, SEEK_SET);
96 printf("Android magic found at: %d\n", i);
97
98 fread(&header, sizeof(header), 1, f);
99 printf("BOARD_KERNEL_CMDLINE %s\n", header.cmdline);
100 printf("BOARD_KERNEL_BASE %08x\n", header.kernel_addr - 0x00008000);
101 printf("BOARD_RAMDISK_OFFSET %08x\n", header.ramdisk_addr - header.kernel_addr + 0x00008000);
102 printf("BOARD_SECOND_OFFSET %08x\n", header.second_addr - header.kernel_addr + 0x00008000);
103 printf("BOARD_TAGS_OFFSET %08x\n",header.tags_addr - header.kernel_addr + 0x00008000);
104 printf("BOARD_PAGE_SIZE %d\n", header.page_size);
105 printf("BOARD_SECOND_SIZE %d\n", header.second_size);
106 printf("BOARD_DT_SIZE %d\n", header.dt_size);
107
108 if (pagesize == 0) {
109 pagesize = header.page_size;
110 }
111
112 //printf("cmdline...\n");
113 sprintf(tmp, "%s/%s", directory, basename(filename));
114 strcat(tmp, "-cmdline");
115 write_string_to_file(tmp, header.cmdline);
116
117 //printf("base...\n");
118 sprintf(tmp, "%s/%s", directory, basename(filename));
119 strcat(tmp, "-base");
120 char basetmp[200];
121 sprintf(basetmp, "%08x", header.kernel_addr - 0x00008000);
122 write_string_to_file(tmp, basetmp);
123
124 //printf("ramdisk_offset...\n");
125 sprintf(tmp, "%s/%s", directory, basename(filename));
126 strcat(tmp, "-ramdisk_offset");
127 char ramdisktmp[200];
128 sprintf(ramdisktmp, "%08x", header.ramdisk_addr - header.kernel_addr + 0x00008000);
129 write_string_to_file(tmp, ramdisktmp);
130
131 //printf("second_offset...\n");
132 sprintf(tmp, "%s/%s", directory, basename(filename));
133 strcat(tmp, "-second_offset");
134 char secondtmp[200];
135 sprintf(secondtmp, "%08x", header.second_addr - header.kernel_addr + 0x00008000);
136 write_string_to_file(tmp, secondtmp);
137
138 //printf("tags_offset...\n");
139 sprintf(tmp, "%s/%s", directory, basename(filename));
140 strcat(tmp, "-tags_offset");
141 char tagstmp[200];
142 sprintf(tagstmp, "%08x", header.tags_addr - header.kernel_addr + 0x00008000);
143 write_string_to_file(tmp, tagstmp);
144
145 //printf("pagesize...\n");
146 sprintf(tmp, "%s/%s", directory, basename(filename));
147 strcat(tmp, "-pagesize");
148 char pagesizetmp[200];
149 sprintf(pagesizetmp, "%d", header.page_size);
150 write_string_to_file(tmp, pagesizetmp);
151
152 total_read += sizeof(header);
153 //printf("total read: %d\n", total_read);
154 total_read += read_padding(f, sizeof(header), pagesize);
155
156 sprintf(tmp, "%s/%s", directory, basename(filename));
157 strcat(tmp, "-zImage");
158 FILE *k = fopen(tmp, "wb");
159 byte* kernel = (byte*)malloc(header.kernel_size);
160 //printf("Reading kernel...\n");
161 fread(kernel, header.kernel_size, 1, f);
162 total_read += header.kernel_size;
163 fwrite(kernel, header.kernel_size, 1, k);
164 fclose(k);
165
166 //printf("total read: %d\n", header.kernel_size);
167 total_read += read_padding(f, header.kernel_size, pagesize);
168
169
170 byte* ramdisk = (byte*)malloc(header.ramdisk_size);
171 //printf("Reading ramdisk...\n");
172 fread(ramdisk, header.ramdisk_size, 1, f);
173 total_read += header.ramdisk_size;
174 sprintf(tmp, "%s/%s", directory, basename(filename));
175 if(ramdisk[0] == 0x02 && ramdisk[1]== 0x21)
176 strcat(tmp, "-ramdisk.lz4");
177 else
178 strcat(tmp, "-ramdisk.gz");
179 FILE *r = fopen(tmp, "wb");
180 fwrite(ramdisk, header.ramdisk_size, 1, r);
181 fclose(r);
182
183 total_read += read_padding(f, header.ramdisk_size, pagesize);
184
185 sprintf(tmp, "%s/%s", directory, basename(filename));
186 strcat(tmp, "-second");
187 FILE *s = fopen(tmp, "wb");
188 byte* second = (byte*)malloc(header.second_size);
189 //printf("Reading second...\n");
190 fread(second, header.second_size, 1, f);
191 total_read += header.second_size;
192 fwrite(second, header.second_size, 1, r);
193 fclose(s);
194
195 total_read += read_padding(f, header.second_size, pagesize);
196
197 sprintf(tmp, "%s/%s", directory, basename(filename));
198 strcat(tmp, "-dt");
199 FILE *d = fopen(tmp, "wb");
200 byte* dt = (byte*)malloc(header.dt_size);
201 //printf("Reading dt...\n");
202 fread(dt, header.dt_size, 1, f);
203 total_read += header.dt_size;
204 fwrite(dt, header.dt_size, 1, r);
205 fclose(d);
206
207 fclose(f);
208
209 //printf("Total Read: %d\n", total_read);
210 return 0;
211}