//关于特征码我再说一下,就是GIF和BMP及JPG是不同的图像文件,他们的文件结构不同,扩展名不同,所以在BIN文件里表现的特征是不同的.通过这些特征,我们就可以把他们从BIN文件里挖出来.如下,是这三种文件的特征码,不理解的可以使用UE打开一个图片文件看看.
//const unsigned char BMP_HEAD[2] = {0x42,0x4D};
//const unsigned char GIF_HEAD[6] = {0x47,0x49,0x46,0x38,0x39,0x61};
//const unsigned char JPG_HEAD1[4] = {0xff,0xd8,0xff,0xe1};
//const unsigned char JPG_HEAD2[4] = {0xff,0xd8,0xff,0xe0};
//函数实现如下,由于整个过程已经写出,所以不再过多讲解:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const unsigned char BMP_HEAD[2] = {0x42,0x4D};
const unsigned char GIF_HEAD[6] = {0x47,0x49,0x46,0x38,0x39,0x61};
const unsigned char JPG_HEAD1[4] = {0xff,0xd8,0xff,0xe1};
const unsigned char JPG_HEAD2[4] = {0xff,0xd8,0xff,0xe0};
int main(int argc, char* argv[])
{
long i,j;
char ch;
FILE *pBF;
FILE *pPicF;
long bmp_file_len = 0;
long jpg_file_len = 0;
long gif_file_len = 0;
char filename[10];
int bmp_index,jpg_index,gif_index;
unsigned char *buffer;
long len;
int is_pic = 0;
//printf( "\n\n" );
printf( "\n\n=======================================================" );
//printf( "\n\n欢迎使用MTK平台手机的BIN文件图片资源提取器!\n\n\n\n" );
printf( "\n\n欢迎使用MTK平台手机的BIN文件图片资源提取器!" );
printf( "\n\n请把要解析的BIN文件放置在目录路径 f:\\pic\\ 下,并修改BIN名为MTK.BIN" );
printf( "\n\n程序会在当前 f:\\pic\\ 下创建bmp、gif、jpg目录,并解析相应图片保存在该目录下" );
printf( "\n\n=======================================================" );
printf( "\n\n" );
system("pause");
// mkdir("F:\\pic");
system("md F:\\pic\\bmp");
system("md F:\\pic\\gif");
system("md F:\\pic\\jpg");
//if( (pBF = fopen( "f:\\pic\\my.bin", "rb+" )) == NULL )
if( (pBF = fopen( "f:\\pic\\MTK.BIN", "rb+" )) == NULL )
{
printf( "没有找到可以使用的MTK平台手机的BIN文件!\n" );
return 0;
}
fseek(pBF,0,SEEK_END);
len=ftell(pBF);
fseek(pBF,0,SEEK_SET);
buffer = (unsigned char *)malloc((len+1)*sizeof(char));
ch = fgetc( pBF );
for(i=0; i < len+1; i++ )
{
buffer[i] = (char)ch;
ch = fgetc( pBF );
}
//提取gif
i = 0;
gif_index = 0;
while(i++ < len+1)
{
if(buffer[i] == GIF_HEAD[0]&&buffer[i+1] == GIF_HEAD[1]&&buffer[i+2] == GIF_HEAD[2]
&&(buffer[i+3] == GIF_HEAD[3]&&buffer[i+4] == GIF_HEAD[4])&&buffer[i+5] == GIF_HEAD[5])
{
for(j=0; j<1024*500; j++)
{
if(buffer[i+j]==0&&buffer[i+j+1]==0x3B)
{
is_pic =1;
bmp_file_len = j;
for(j = 1; j<1024; j++)
{
if(buffer[i+bmp_file_len+j] == GIF_HEAD[0]&&buffer[i+bmp_file_len+j+1] == GIF_HEAD[1]&&buffer[i+bmp_file_len+j+2] == GIF_HEAD[2])
{
is_pic = 1;
break;
}
if(buffer[i+bmp_file_len+j]==0&&buffer[i+bmp_file_len+j] ==0x3B)
{
is_pic = 2;
break;
}
}
if(is_pic>1)
bmp_file_len = bmp_file_len+j;
break;
}
}
if(is_pic>=1)
{
sprintf(filename,"F:\\pic\\gif\\%d.gif",gif_index);
printf("find gif %d.gif\n\n", gif_index);
pPicF = fopen(filename,"wb+");
for(j=0; j<bmp_file_len+2; j++)
{
fputc(buffer[i+j],pPicF);
}
fclose(pPicF);
gif_index++;
i = i+bmp_file_len-1;
}
is_pic =0;
}
}
//bmp
i = 0;
bmp_index = 0;
while(i++ < len+1)
{
if(buffer[i] == BMP_HEAD[0]&&buffer[i+1] == BMP_HEAD[1])
{
for(j=0; j<1024*500; j++)
{
if(buffer[i+j]==0 && buffer[i+j+1]==0x38)
{
is_pic =1;
bmp_file_len = j;
for(j = 1; j<1024; j++)
{
if(buffer[i+bmp_file_len+j] == BMP_HEAD[0]&&buffer[i+bmp_file_len+j+1] == BMP_HEAD[1])
{
is_pic = 1;
break;
}
if(buffer[i+bmp_file_len+j]==0&&buffer[i+bmp_file_len+j] ==0x3B)
{
is_pic = 2;
break;
}
}
if(is_pic>1)
bmp_file_len = bmp_file_len+j;
break;
}
}
if(is_pic>=1)
{
sprintf(filename,"F:\\pic\\bmp\\%d.bmp",bmp_index);
printf("find bmp %d.bmp\n\n", bmp_index);
pPicF = fopen(filename,"wb+");
for(j=0; j<bmp_file_len+2; j++)
{
fputc(buffer[i+j],pPicF);
}
fclose(pPicF);
bmp_index++;
i = i+bmp_file_len-1;
}
is_pic =0;
}
}
//jpg
i = 0;
jpg_index = 0;
while(i++ < len+1)
{
if((buffer[i] == JPG_HEAD1[0]&&buffer[i+1] == JPG_HEAD1[1]&&buffer[i+2] == JPG_HEAD1[2]&&buffer[i+3] == JPG_HEAD1[3])||
(buffer[i] == JPG_HEAD2[0]&&buffer[i+1] == JPG_HEAD2[1]&&buffer[i+2] == JPG_HEAD2[2]&&buffer[i+3] == JPG_HEAD2[3]))
{
for(j=0; j<1024*500; j++)
{
if(buffer[i+j]==0 && buffer[i+j+1]==0x38)
{
is_pic =1;
bmp_file_len = j;
for(j = 1; j<1024; j++)
{
if(buffer[i+bmp_file_len+j] == JPG_HEAD1[0]&&buffer[i+bmp_file_len+j+1] == JPG_HEAD1[1]&&
buffer[i+bmp_file_len+j+2] == JPG_HEAD1[2]&&buffer[i+bmp_file_len+j+3] == JPG_HEAD1[3])
{
is_pic = 1;
break;
}
if(buffer[i+bmp_file_len+j]==0&&buffer[i+bmp_file_len+j] ==0x3B)
{
is_pic = 2;
break;
}
}
if(is_pic>1)
bmp_file_len = bmp_file_len+j;
break;
}
}
if(is_pic>=1)
{
sprintf(filename,"F:\\pic\\jpg\\%d.jpg",jpg_index);
printf("find jpg %d.jpg\n\n", jpg_index);
pPicF = fopen(filename,"wb+");
for(j=0; j<bmp_file_len+2; j++)
{
fputc(buffer[i+j],pPicF);
}
fclose(pPicF);
jpg_index++;
i = i+bmp_file_len-1;
}
is_pic =0;
}
}
free(buffer);
return 0;
}