#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
typedef unsigned char byte_t;
typedef unsigned int dword_t;
#ifdef _BIG_ENDIAN
#define swapdword(word) ((((dword_t)(word)&0xFF000000) >> 24)|\
(((dword_t)(word)&0x00FF0000) >> 8)|\
(((dword_t)(word)&0x0000FF00) << 8)|\
(((dword_t)(word)&0x000000FF) << 24))
#else
#define swapdword(word) ((dword_t)(word))
#endif
void dumpdata(FILE *fp, long length) {
byte_t buf[512];
long readsize = 512;
readsize = (length > readsize) ? readsize : length;
while(length>0) {
errno=0;
if(fread(buf,1,readsize,fp)!=readsize) {
fprintf(stderr,"failed readding: %s\n",strerror(errno));
exit(-1);
}
if(fwrite(buf,1,readsize,stdout)!=readsize) {
fprintf(stderr,"failed writting: %s\n",strerror(errno));
exit(-1);
}
length -= readsize;
readsize = (length > readsize) ? readsize : length;
}
}
void usage(void) {
fprintf(stderr,"usage: exe2swf source.exe > output.swf\n");
exit(0);
}
int main (const int argc, const char **argv) {
dword_t val = 0;
FILE *fp;
if(argc<2) {
usage();
}
fp = fopen(argv[1],"r");
if(!fp) {
fprintf(stderr,"failed to open %s\n",argv[1]);
usage();
}
if(fseek(fp,-8l,SEEK_END)) {
fprintf(stderr,"failed to read %s: [%s]\n",argv[1],strerror(errno));
exit(-1);
}
if(!fread((byte_t *)(&val),4,1,fp)) {
fprintf(stderr,"failed to read %s: [%s]\n",argv[1],strerror(errno));
exit(-1);
}
if(val != 0x563412FA) {
fprintf(stderr,"%s is not a valid Flash projector file\n",argv[1]);
exit(0);
}
if(!fread((byte_t *)(&val),4,1,fp)) {
fprintf(stderr,"failed to fread %s: [%s]\n",argv[1],strerror(errno));
exit(-1);
}
val = swapdword(val);
fprintf(stderr,"%s: %d bytes\n",argv[1],val);
if(fseek(fp,-(val+8),SEEK_END)) {
fprintf(stderr,"failed to read %s: [%s]\n",argv[1],strerror(errno));
exit(-1);
}
dumpdata(fp,val);
fclose(fp);
return 0;
}
不曉得過了這麼久,Flash Projector 的格式有沒有改過...



























































































