とりあえずファイルに適当なヘッダつけて騙してみようと言う事で
何かのファイル⇒bmp形式のファイル
に偽装(?)するプログラムを書いてみた。
完成した後でbmpは添付できないことを思い出した。
折角書いたのでコードだけは置いておきます;;
添付画像は偽装ファイルをエディタで覗いたものです。
#include
#include
#include
struct{
unsigned long Size;
long Width;
long Height;
unsigned short Planes;
unsigned short BitCount;
unsigned long Compression;
unsigned long SizeImage;
long XPixPerMeter;
long YPixPerMeter;
unsigned long ClrUsed;
unsigned long ClrImporant;
}INFO={40,0,0,1,24,0,0,0,0,0,0};
int main(int argc,char *argv[])
{
int i;
int namelen,fsize;
int width,height;
FILE *in,*out,*tmp;
char data;
if((tmp=tmpfile())==NULL)return -1;
fwrite("FILE2BMP",sizeof(char),strlen("FILE2BMP"),tmp);
for(i=1;argv[i]!=NULL;++i){
if((in=fopen(argv[i],"rb"))==NULL)continue;
printf("open : %s\n",argv[i]);
//ファイル名書き込み
namelen=strlen(argv[i]);
fwrite(&namelen,sizeof(int),1,tmp);
fwrite(argv[i],sizeof(char),namelen,tmp);
//ファイルサイズ書き込み
fseek(in,0,SEEK_END);
fsize=ftell(in);
fwrite(&fsize,sizeof(int),1,tmp);
//ファイル読み込み&書き込み
fseek(in,0,SEEK_SET);
while(fread(&data,sizeof(char),1,in))fwrite(&data,sizeof(char),1,tmp);
fclose(in);
}
if((fsize=ftell(tmp))>8){
if((out=fopen("f2b.bmp","wb"))==NULL){
fclose(tmp);
return -1;
}
i=(fsize%3)?fsize/3:fsize/3+1;
width=(int)sqrt(i)+1;
width+=(width%4)?4-(width%4):0;
height=(i%width)?i/width+1:i%width;
fsize=width*height*3+54;
//ファイルヘッダ書き込み
fseek(tmp,0,SEEK_SET);
fwrite("BM",sizeof(char),2,out);
fwrite(&fsize,sizeof(int),1,out);
i=0;
fwrite(&i,sizeof(int),1,out);
i=54;
fwrite(&i,sizeof(int),1,out);
fsize-=54;
//情報ヘッダ書き込み
INFO.Width=width;
INFO.Height=height;
INFO.SizeImage=fsize;
fwrite(&INFO,sizeof(INFO),1,out);
//画像データ書き込み
for(i=0;i<fsize;++i){
if(fread(&data,sizeof(char),1,tmp));
else data=0;
fwrite(&data,sizeof(char),1,out);
}
fclose(out);
}
fclose(tmp);
return 0;
}