易码技术论坛

 找回密码
 加入易码
搜索
查看: 363240|回复: 11

一些很老的关于C的东西!

[复制链接]
发表于 2004-12-27 22:57:00 | 显示全部楼层
/************************************************
功  能:解除SWF文件的保护设置
始  于:2003.7.17
最  后:2003.7.18
编写者:空小子
规  则:Copyleft(自由)
声  明:解除SWF文件的保护设置,目的在于爱好者个人研
究,若随意公开或作商业用途,可能要受到法律
制裁!
************************************************/

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

FILE        *fp1,     /*来源文件*/
       *fp2;     /*目标文件*/
unsigned char FWS[3],     /*SWF文件标识*/
       ver;     /*版本信息*/
int        RECT_len,     /*RECT类型的长度*/
       Tag_ID = 1,   /*Tag标识*/
       Tag24_len,    /*标识为24的Tag的长度*/
       Tag24_pos;    /*标识为24的Tag的位置*/
long        f_len,     /*SWF文件长度*/
       TagData_len;  /*Tag数据部分的长度*/
main(int argc, char *argv[])
{
if(argc == 1)
  {
    printf("程序名 [来源文件名] [目标文件名]");
     exit(0);
  }
if((fp1 = fopen(argv[1],"rb")) == NULL)
{
  printf("不能打开文件!");
  exit(1);
}
/*读取SWF文件标识,并判断是不是SWF文件*/
fread(FWS, 3, 1, fp1);
if (strcmp(FWS, "FWS") != 0)
{
  printf("这不是SWF文件!");
  exit(1);
}
/*读取版本信息,并判断是不是版本5*/
/*据在下调试,其实版本4的也没问题!*/
ver = fgetc(fp1);
if (ver != 5)
{
  printf("程序只支持版本5!");
  exit(1);
}
/*读取SWF文件长度*/
fread(&f_len, 4, 1, fp1);
/*读取RECT类型的第一字节*/
RECT_len = fgetc(fp1);
/*以为其高五位存放每项帧长度,所以按位右移把它取出*/
RECT_len >>= 3;
/*算出RECT类型的长度*/
RECT_len = 5 + 4*RECT_len;
for (; (RECT_len % 8) != 0; RECT_len++);
RECT_len = RECT_len / 8 - 1;
/*跳过帧频和总帧数的字节,它们分别用两字节存放*/
fseek(fp1, RECT_len + 4, 1);
/*开始查找Tag24*/
for (; Tag_ID != 0; fseek(fp1, TagData_len, 1))
{
  Tag24_pos = ftell(fp1);
  /*读出Tag头*/
  fread(&Tag_ID, 2, 1, fp1);
  /*短型Tag长度,它存放在Tag头的低六位*/
  TagData_len = Tag_ID & 0x3F;
  Tag24_len = TagData_len + 2;
  /*若是长型Tag,则取出长度,它在Tag头的后四字节中*/
  if (TagData_len == 0x3F)
  {
   fread(&TagData_len, 4, 1, fp1);
   Tag24_len = TagData_len + 6;
  }
  /*Tag标识,它存放在Tag头的低六位*/
  Tag_ID >>= 6;
  /*判断是否有保护设置*/
  if (Tag_ID == 24)
  {
   if((fp2 = fopen(argv[2], "wb+")) == NULL)
   {
    printf("不能创建文件!");
    exit(1);
   }
   rewind(fp1);
   /*写入SWF文件标识和版本信息*/
   fwrite(FWS, 3, 1, fp2);
   fputc(ver,fp2);
   /*算出解保护后文件长度,再写入*/
   f_len -= Tag24_len;
   fwrite(&f_len, 4, 1, fp2);
   fseek(fp1, 8, 1);
   /*写入Tag24前面的数据*/
   for (; ftell(fp1) != Tag24_pos; fputc(fgetc(fp1),fp2));
   /*跳过Tag24*/
   fseek(fp1, Tag24_len, 1);
   printf("正在工作,请稍等......\n");
   /*写入Tag24后面的数据*/
   for (; ftell(fp2) != f_len; fputc(fgetc(fp1),fp2));
   fclose(fp2);
   printf("解除保护成功!可要注意别人的版权哦!");
   exit(1);
  }
}
printf("该SWF文件没有保护设置!");
fclose(fp1);
}
 楼主| 发表于 2004-12-27 22:58:00 | 显示全部楼层
/************************************************
功  能:将FLASH的EXE文件转换为SWF文件
始  于:2003.7.18/10:32
最  后:2003.7.18/11:14
编写者:空小子
规  则:Copyleft(自由)
************************************************/
#include<stdio.h>
#include<string.h>
FILE        *fp1,     /*来源文件*/
       *fp2;     /*目标文件*/
long Flag_pos,          /*标识所在的位置*/
     EXE_flag,              /*Macromedia的FLASH的EXE文件标识*/
     SWF_len;               /*SWF文件的长度*/
main(int argc,char *argv[])
{
if(argc == 1)
  {
    printf("程序名 [来源文件名] [目标文件名]");
     exit(0);
  }
if((fp1 = fopen(argv[1],"rb")) == NULL)
{
  printf("不能打开文件!");
  exit(1);
}
/*位置指针指到标识所在处*/
fseek(fp1, -8, 2);
Flag_pos = ftell(fp1);
/*读出标识*/
fread(&EXE_flag, 4, 1, fp1);
if (EXE_flag != 0xFA123456)
{
  printf("文件类型错误!");
  exit(1);
}
/*读出SWF数据的长度*/
fread(&SWF_len, 4, 1, fp1);
/*置指针指到SWF数据头部*/
fseek(fp1, -8 - SWF_len, 2);
if((fp2 = fopen(argv[2],"wb+")) == NULL)
{
  printf("不能创建文件!");
  exit(1);
}
printf("正在工作,请稍等......\n");
/*写出数据*/
for (; ftell(fp1) != Flag_pos; fputc(fgetc(fp1),fp2));
fclose(fp2);
fclose(fp1);
printf("成功转换!");
}

1849_7116_766.rar

25 KB, 下载次数: 125

7161_7116_2977.rar

4 KB, 下载次数: 140

 楼主| 发表于 2004-12-27 22:58:00 | 显示全部楼层
/************************************************
功  能:将FLASH的SWF文件转换为EXE文件
始  于:2003.7.18/11:18
最  后:2003.7.18/15:03
编写者:空小子
规  则:Copyleft(自由)
************************************************/
#include<stdio.h>
#include<string.h>
FILE        *fp1,     /*EXE播放器文件*/
       *fp2,     /*SWF文件*/
       *fp3;     /*目标文件*/
unsigned char FWS[3];     /*SWF文件标识*/
long SWF_len,               /*SWF文件的长度*/
     EXE_flag = 0xFA123456; /*Macromedia的FLASH的EXE文件标识*/
main(int argc,char *argv[])
{
if(argc == 1)
  {
    printf("程序名 [EXE播放器文件名] [SWF文件名] [目标文件名]");
     exit(0);
  }
if((fp1 = fopen(argv[1],"rb")) == NULL)
{
  printf("不能打开EXE播放器文件!");
  exit(1);
}

if((fp2 = fopen(argv[2],"rb")) == NULL)
{
  printf("不能打开SWF文件!");
  exit(1);
}
/*读取SWF文件标识,并判断是不是SWF文件*/
fread(FWS, 3, 1, fp2);
if (strcmp(FWS, "FWS") != 0)
{
  printf("这不是SWF文件!");
  exit(1);
}
if((fp3 = fopen(argv[3],"wb+")) == NULL)
{
  printf("不能创建文件!");
  exit(1);
}
/*写入FLASH播放器数据*/
for (; ! feof(fp1); fputc(fgetc(fp1),fp3));
fseek(fp3, -1,2);
fclose(fp1);
fseek(fp2, 4, 0);
/*读出SWF文件长度*/
fread(&SWF_len, 4, 1, fp2);
rewind(fp2);
printf("正在工作中,请稍等......\n");
/*写入SWF数据*/
for (; ! feof(fp2); fputc(fgetc(fp2),fp3));
fseek(fp3, -1,2);
fclose(fp2);
/*写入标识*/
fwrite(&EXE_flag, 4, 1, fp3);
/*写入SWF长度*/
fwrite(&SWF_len, 4, 1, fp3);
fclose(fp3);
printf("转换成功!");
}

这需要FLASH播放器文件!

 楼主| 发表于 2004-12-27 22:59:00 | 显示全部楼层
/************************************************
功  能:提取声音文件包括MP3,WAV
始  于:2003.7.19/8:30
最  后:2003.7.19/5:30
编写者:空小子
规  则:Copyleft(自由)
声  明:提取声音文件,目的在于爱好者个人研究,若随意
        公开或作商业用途,可能要受到法律制裁!
************************************************/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
FILE        *fp1,      /*来源文件*/
       *fp2;      /*目标文件*/
unsigned char FWS[3],      /*SWF文件标识*/
       *name = NULL,  /*文件名*/
       *strnum = NULL,/*转换成字符串的Event Sounds数目*/
       *suffix = NULL,/*后缀名*/
       Event_Info;    /*Event Sounds的信息*/
unsigned int  RECT_len,      /*RECT类型的长度*/
       Tag_ID = 1,    /*Tag标识*/
       Event_ID,      /*Event Sounds的标识*/
       Event_num = 0; /*Event Sounds的数目*/
unsigned long TagData_len,   /*Tag数据部分的长度*/
       Event_Startpos;/*Event Sound数据开始位置*/
main(int argc, char *argv[])
{
if(argc == 1)
  {
    printf("程序名 [来源文件名] [存放路径]");
     exit(0);
  }
/*缺省路径*/
if(argc == 2)
  {
    argv[2]="c:\\";
  }
if((fp1 = fopen(argv[1],"rb")) == NULL)
{
  printf("不能打开文件!");
  exit(1);
}
/*读取SWF文件标识,并判断是不是SWF文件*/
fread(FWS, 3, 1, fp1);
if (strcmp(FWS, "FWS") != 0)
{
  printf("这不是SWF文件!");
  exit(1);
}
/*跳过用来存放版本信息和文件长度的字节*/
fseek(fp1, 5, 1);
/*读取RECT类型的第一字节*/
RECT_len = fgetc(fp1);
/*以为其高五位存放每项帧长度,所以按位右移把它取出*/
RECT_len >>= 3;
/*算出RECT类型的长度*/
RECT_len = 5 + 4*RECT_len;
for (; (RECT_len % 8) != 0; RECT_len++);
RECT_len = RECT_len / 8 - 1;
/*跳过帧频和总帧数的字节,它们分别用两字节存放*/
fseek(fp1, RECT_len + 4, 1);
/*开始查找Tag*/
for (; Tag_ID != 0; fseek(fp1, TagData_len, 1))
{
  /*读出Tag头*/
  fread(&Tag_ID, 2, 1, fp1);
  /*短型Tag长度,它存放在Tag头的低六位*/
  TagData_len = Tag_ID & 0x3F;
  /*若是长型Tag,则取出长度,它在Tag头的后四字节中*/
  if (TagData_len == 0x3F) fread(&TagData_len, 4, 1, fp1);
  /*Tag标识,它在Tag头的高十位*/
  Tag_ID >>= 6;
  /*Event Sound的ID是14*/
  if(Tag_ID == 14)
  {
   Event_num++;
   /*读出Tag14的头两个字节,它是次Event Sound的标识*/
   fread(&Event_ID, 2, 1, fp1);
   Event_Startpos=ftell(fp1);
   /*读出Tag14的第三个字节,它的高四位存放声音的格式*/
   Event_Info = fgetc(fp1);
   switch(Event_Info >> 4)
   {
    case 0:
    case 1: suffix = ".WAV"; break;
    case 2: suffix = ".MP3";
   }
   /*转换,它把在下害惨了 */
   itoa(Event_num, strnum, 10);
   name=(char *)malloc(strlen(strnum) + strlen(argv[2]) + 10);
          strcpy(name,argv[2]);
   strcat(name,"Event_");
   strcat(name,strnum);
   strcat(name,suffix);
   printf("%s\n", name);
   if((fp2 = fopen(name, "wb+")) == NULL)
   {
    printf("不能创建文件!");
    exit(1);
   }
   fseek(fp1, -1, 1);
   /*读出*/
   for (; ftell(fp1) != Event_Startpos + TagData_len - 2;
                      fputc(fgetc(fp1),fp2));
   fseek(fp1, -(TagData_len), 1);
   free(name);
   fclose(fp2);
  }
}
if (Event_num !=0)
printf("一共有 %d 个Event Sound! GOOD LUCK!\n", Event_num);
else
printf("没有有发现Event Sound! SORRY!\n");
fclose(fp1);
}
 楼主| 发表于 2004-12-27 23:00:00 | 显示全部楼层
/************************************************功  能:提取声音文件MP3
始  于:2003.7.20/13:51
最  后:2003.7.20/16:08
编写者:空小子
规  则:Copyleft(自由)
声  明:提取声音文件,目的在于爱好者个人研究,若随意
        公开或作商业用途,可能要受到法律制裁!
************************************************/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
FILE        *fp1,      /*来源文件*/
       *fp2;         /*目标文件*/
unsigned char FWS[3],      /*SWF文件标识*/
       *name = NULL,  /*文件名*/
       *strnum = NULL,/*转换成字符串的Stream Sounds数目*/
       *suffix = NULL,/*后缀名*/
       Stream_Info;   /*Stream Sounds的信息*/
unsigned int  RECT_len,      /*RECT类型的长度*/
       Tag_ID = 1,    /*Tag标识*/
       Stream_num = 0; /*Stream Sounds的数目*/
unsigned long TagData_len,   /*Tag数据部分的长度*/
       Stream_Startpos;/*Stream Sound数据开始位置*/
/*Tag18与Tag45都是Stream Sound的标识,只有一点差异,所以一起处理*/
void case18_45(int ID)
{
/*读完一个Stream Sound就关闭*/
if (fp2!=NULL)
{free(name); fclose(fp2);}
/*跳过第一个信息*/
fseek(fp1, 1, 1);
/*得到第二个信息*/
Stream_Info = fgetc(fp1);
/*Tag18在这里有两个字节无用出,而Tag45则没有*/
if (ID == 18) fseek(fp1, 2, 1);
/*跳过长度信息*/
fseek(fp1, 2, 1);
/*得到后缀名*/
if (Stream_Info >> 4) suffix = ".MP3";
if (ID == 18) fseek(fp1, -2, 1);
fseek(fp1, -4, 1);
}
main(int argc, char *argv[])
{
if(argc == 1)
  {
    printf("程序名 [来源文件名] [存放路径]");
     exit(0);
  }
/*缺省路径*/
if(argc == 2)
  {
    argv[2]="c:\\";
  }
if((fp1 = fopen(argv[1],"rb")) == NULL)
{
  printf("不能打开文件!");
  exit(1);
}
/*读取SWF文件标识,并判断是不是SWF文件*/
fread(FWS, 3, 1, fp1);
if (strcmp(FWS, "FWS") != 0)
{
  printf("这不是SWF文件!");
  exit(1);
}
/*跳过用来存放版本信息和文件长度的字节*/
fseek(fp1, 5, 1);
/*读取RECT类型的第一字节*/
RECT_len = fgetc(fp1);
/*以为其高五位存放每项帧长度,所以按位右移把它取出*/
RECT_len >>= 3;
/*算出RECT类型的长度*/
RECT_len = 5 + 4*RECT_len;
for (; (RECT_len % 8) != 0; RECT_len++);
RECT_len = RECT_len / 8 - 1;
/*跳过帧频和总帧数的字节,它们分别用两字节存放*/
fseek(fp1, RECT_len + 4, 1);
/*开始查找Tag*/
for (; Tag_ID != 0; fseek(fp1, TagData_len, 1))
{
  /*读出Tag头*/
  fread(&Tag_ID, 2, 1, fp1);
  /*短型Tag长度,它存放在Tag头的低六位*/
  TagData_len = Tag_ID & 0x3F;
  /*若是长型Tag,则取出长度,它在Tag头的后四字节中*/
  if (TagData_len == 0x3F) fread(&TagData_len, 4, 1, fp1);
  /*Tag标识,它在Tag头的高十位*/
  Tag_ID >>= 6;
  /*Tag18,Tag45都是Stream Sound的标识*/
  switch(Tag_ID)
  {
   case 18: case18_45(18); break;
   case 45: case18_45(45); break;
   /*每个Tag19里存放着一段Stream Sound数据*/
   /*只要把它连接起来得出一个完整的Stream Sound*/
   case 19:
   {
    fseek(fp1, 4, 1);
    Stream_Startpos=ftell(fp1);
    /*打开第N个文件*/
    if (fp2 == NULL)
    {
    Stream_num++;
    itoa(Stream_num, strnum, 10);
    name=(char *)malloc(strlen(strnum) + strlen(argv[2]) + 11);
           strcpy(name,argv[2]);
    strcat(name,"Stream_");
    strcat(name,strnum);
    strcat(name,suffix);
    printf("%s\n", name);
    if((fp2 = fopen(name, "wb+")) == NULL)
    {
     printf("不能创建文件!");
     exit(1);
    }
    }
    /*一段一段的读出*/
    for (; ftell(fp1) != Stream_Startpos + TagData_len - 4;
                          fputc(fgetc(fp1),fp2));
    fseek(fp1, -(TagData_len), 1);
    break;
   }
   case 0 : if (fp2 != NULL)
     {free(name); fclose(fp2);}
  }
}
if (Stream_num !=0)
printf("一共有 %d 个Stream Sound! GOOD LUCK!\n", Stream_num);
else
printf("没有有发现Stream Sound! SORRY!\n");
fclose(fp1);
}
发表于 2005-1-7 18:51:00 | 显示全部楼层
最好是把flash的头文件结构列出来啊。
发表于 2005-5-23 22:23:00 | 显示全部楼层
好贴啊
发表于 2005-6-17 08:14:00 | 显示全部楼层
a

[此贴子已经被作者于2006-2-21 10:25:36编辑过]

发表于 2005-7-12 10:59:00 | 显示全部楼层
有个工具的,叫什么来着??好象是------RPGViewer吧.........不过是所有图鉴,
发表于 2005-10-23 10:08:00 | 显示全部楼层
谢谢你呀,我正需要这些东西呢!
发表于 2005-10-23 10:13:00 | 显示全部楼层
谢谢你呀,我正需要这些东西呢!
 楼主| 发表于 2004-12-27 22:56:55 | 显示全部楼层 |阅读模式
    记得很久以前,有个FLASH的BBS中公布了很多SWF元件的Tag~~当时那个帖子主要用列表的形式提供给大家(很多),没有具体的代码表现,当时在下也很喜欢FLASH,所以对着帖子学习了一下SWF的文件结构,正好有学C,所以编码了~~~最近又对WQX的一些文件结构有兴趣,但很多知识不记得了,于是向朋友要回了一些以前写的来复习一下~~顺便帖到这里(在TGCLC里也有,不过排版乱了)供喜欢的朋友看看,如果还想更多的TAG结构,可以去一些FLASH论坛,现在的FLASH技术已经很成熟了(真怀念以前玩FLASH的日子呀~~~)!

每个都有声明什么“法律责任”,其实主要是为了尊重那些FLASH设计者,但是提取那些资源自己学习是很爽的事情(但不要擅自公布他们的心血),记得以前总是研究小小的作品,呵呵~~
[此贴子已经被作者于2004-12-27 23:06:22编辑过]

您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-25 14:19 , Processed in 0.012983 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表