#include <stdio.h>
#include <string.h>
#include <stdlib.h>

unsigned char fwstart[]={0x2a,0x03,0xe5,0xe0,0x00,0x07,0xf4,0xd0,0x01,0xc0,0x70,0xe0,0x00,0x07};
unsigned char fwstart2[]={0x2a,0x00,0xc3,0xe0,0x00,0x07,0xb9,0xf1,0x05,0x01,0x6e,0x82,0x02,0x82};

int main(int argc, char **argv){
	FILE *file;
	unsigned char buffer[1024];
	unsigned char *fwmem=0;
	int len;
	long fleng=0;
	int i;
	int x;
	int done=0;
	int d=0;
	int e=0;
	if(argc!=2){
		printf("./convert <filename>\n");
		exit(1);
	}
	file=fopen(argv[1],"r");
	fprintf(stderr,"Firmware extractor 0.1\n");
	while((len=fread(buffer,1,1024,file))){
		fleng+=len;
		fwmem=realloc(fwmem,fleng);
		memcpy(&fwmem[fleng-len],buffer,len);
	}
	fprintf(stderr,"Stored in memory: %ld\n",fleng);
	for(i=0;i<fleng&&done!=2;i++){
		if(fwstart[d]==fwmem[i]&&done!=1){
			if(d==13){
				fprintf(stderr,"FW part 1 found!\n");
				fprintf(stderr,"Length: 2480 bytes\n");
				for(x=1;x<=2480;x++){
					printf("%02x ",fwmem[i-13+x]);
					if(x%63==0){
						printf("\n");
					}
				}
				printf("\n\n");
				done++;
			}
			d++;
		} else {
			d=0;
		}
		if(fwstart2[e]==fwmem[i]){
			if(e==13){
				fprintf(stderr,"-------------------------------------------\n");
				fprintf(stderr,"FW part 2 found!\n");
				fprintf(stderr,"Length: 3876 bytes\n");
				for(x=1;x<=3876;x++){
					printf("%02x ",fwmem[i-13+x]);
					if(x%63==0){
						printf("\n");
					}
				}
				printf("\n");
				done++;
			}
			e++;
		} else {
			e=0;
		}
	}
	free(fwmem);
	fclose(file);
	exit(0);
}
