程序源代码之Flash深入研究之一——编程解除SWF文件保护(转)

以下为程序代码:


unit SWFBlue_u1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ActnList, StdActns, StdCtrls;

type
  TMain = class(TForm)
    b_open: TButton;
    b_save: TButton;
    b_exit: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    procedure b_openClick(Sender: TObject);
    procedure b_saveClick(Sender: TObject);
    procedure b_exitClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    FileLength : LongWord;   //SWF文件尺寸
    FileBuf : Array of Byte; //将SWF文件读入内存存放
  end;

var
  Main: TMain;

implementation

{$R *.dfm}

procedure TMain.b_openClick(Sender: TObject);
var
  f : File;
  fws : string[3];      //标示信息
  version : Byte;       //SWF文件版本号
  b,b1,b2 : Byte;
  Buf : Array of Byte;
  FrameRate : real;     //速率
  FrameCount : Word;    //总帧数
  s : string;
  TagID : Word;         //Tag标示
  TagLength : LongWord; //Tag长度
  CurrentPos : integer; //CurrentPos记录当前读写位置
  FileLengthPos : integer; //FileLengthPos记录FileLength参数位置
  TagPos : Integer;     //TagPos记录当前TagID位置
  Found : Boolean;
begin
  if not OpenDialog1.Execute then exit;

  FileMode:=fmOpenRead;
  AssignFile(f,OpenDialog1.FileName); Reset(f,1);
  SetLength(FileBuf,FileSize(f));
  BlockRead(f,FileBuf[0],Filesize(f)); //将文件读入内存
  CloseFile(f);

  //下面为读取SWF文件的文件头Header部分
  CurrentPos:=0;
  //读取'FWS'标示
  SetLength(fws,3); Move(FileBuf[CurrentPos],fws[1],3); Inc(CurrentPos,3);
  if fws<>'FWS' then begin
    SetLength(FileBuf,0);
    ShowMessage('该文件不是Flash SWF文件!');
    exit;
  end;
  //读取版本号
  Move(FileBuf[CurrentPos],version,Sizeof(version)); Inc(CurrentPos,Sizeof(version));
  if Version<>5 then begin
    SetLength(FileBuf,0);
    ShowMessage('该SWF文件不是Flash 5版本,本程序当前仅识别Flash 5格式SWF文件!');
    exit;
  end;
  //读取SWF文件长度
  FileLengthPos:=CurrentPos;
  Move(FileBuf[CurrentPos],FileLength,Sizeof(FileLength)); Inc(CurrentPos,Sizeof(FileLength));
  //读取XMin,XMax,YMin,YMax
  //这里仅读出此四个值的存贮字节存放到Buf中,没有计算它们的实际值
  Move(FileBuf[CurrentPos],b,1); Inc(CurrentPos,1);
  b2:=b shr 3;  //得到Bit位数
  b2:=5+b2*4; while (b2 mod 8)<>0 do Inc(b2); //计算共有多少Bit位数
  b2:=(b2 div 8)-1; //计算共有多少字节Byte
  SetLength(Buf,b2+1); Buf[0]:=b;
  Move(FileBuf[CurrentPos],Buf[1],b2); Inc(CurrentPos,b2);
  //读取FrameRate,b2为小数点前部分,b1为小数点后部分
  Move(FileBuf[CurrentPos],b1,Sizeof(b1)); Inc(CurrentPos,Sizeof(b1));
  Move(FileBuf[CurrentPos],b2,Sizeof(b2)); Inc(CurrentPos,Sizeof(b2));
  s:=IntToStr(b2)+'.'+IntToStr(b1);
  FrameRate:=StrToFloat(s);
  //读取总帧数FrameCount
  Move(FileBuf[CurrentPos],FrameCount,Sizeof(FrameCount)); Inc(CurrentPos,Sizeof(FrameCount));

  //下面为读取SWF文件的文件内容Tag部分
  Found:=False;
  Repeat
    TagPos:=CurrentPos;
    //读取TagID并得到TagLength
    Move(FileBuf[CurrentPos],TagID,Sizeof(TagID)); Inc(CurrentPos,Sizeof(TagID));
    TagLength:=TagID and $3F;
    TagID:=TagID shr 6;
    //如果是LongTag则读取下面的TagLength
    if TagLength=$3F then begin
      Move(FileBuf[CurrentPos],TagLength,Sizeof(TagLength)); Inc(CurrentPos,Sizeof(TagLength));
    end;
    //是否有SWF保护设置
    if TagID=24 then begin
      Found:=True;
      //如果有则将该Tag去掉,将后面的Tag搬过来覆盖掉TagID为24的部分
      Move(FileBuf[CurrentPos+TagLength], FileBuf[TagPos], FileLength-(CurrentPos+TagLength)+1);
      //相应的,要减去文件长度FileLength
      FileLength:=FileLength-(Sizeof(TagID)+TagLength);
      CurrentPos:=TagPos;
    end else CurrentPos:=CurrentPos+TagLength;
  Until TagID=0;

  if Found then begin
    Move(FileLength,FileBuf[FileLengthPos],Sizeof(FileLength));
    Label5.Caption:=OpenDialog1.FileName;
    b_save.Enabled:=True;
    ShowMessage('发现有SWF保护设置,请选择文件另存解除保护!');
  end else begin
    SetLength(FileBuf,0);
    Label5.Caption:='无';
    b_save.Enabled:=False;
    ShowMessage('未发现SWF保护设置!');
  end;
end;

procedure TMain.b_saveClick(Sender: TObject);
var
  f : File;
begin
  if not SaveDialog1.Execute then exit;
  FileMode:=fmOpenWrite;
  AssignFile(f,SaveDialog1.Filename); Rewrite(f,1);
  BlockWrite(f,FileBuf[0],FileLength); //将内存信息生成文件
  CloseFile(f);
end;

procedure TMain.b_exitClick(Sender: TObject);
begin
  Close;
end;

end.

转载于:https://www.cnblogs.com/qingqiong/archive/2009/09/18/1569094.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在市场上,有许多软件可以用来将SWF文件换为Flash文件。以下是其中一些常用的软件: 1. Sothink SWF Decompiler:这是一款功能强大的软件,可以将SWF文件换为FLA或FLEX源文件。它支持批量换,并能够提取SWF文件中的各种资源,如图像、声音、视频等。 2. 4Easysoft Flash Video Converter :这是一款专业的换工具,可以将SWF文件换为FLV或其他常见的视频格式。它具有用户友好的界面和高速换速度。 3. Adobe Flash Professional:这是一款专业的多媒体创作软件,可以使用它来创建、编辑和SWF文件。它提供了丰富的创作工具和效果,适用于专业设计师和开发人员。 4. Eltima SWF to FLA Converter:这是一款专门用于将SWF文件换为FLA文件的工具。它支持将SWF文件中的资源完整提取,并能够保留换后的源文件的原始质量和结构。 以上仅是其中一部分常用的SWF换工具,还有其他一些软件也可以完成类似的操作。在选择软件时,可以根据自己的需求和预算来进行选择。 ### 回答2: swf文件换为flash文件的软件有很多,以下是一些常用的软件: 1. Adobe Animate:Adobe公司开发的专业动画制作软件,可以将swf文件换为flash文件。它提供了丰富的动画制作和交互功能,是最常用的换软件之一。 2. SWF Decompiler:一款功能强大的解编译工具,可以将swf文件反编译为FLA源文件。它具有丰富的功能和用户友好的界面,可以帮助用户重新编辑并导出flash文件。 3. Sothink SWF Decompiler:另一款强大的SWF解编译工具,可以将swf文件还原为flash文件。它支持多种版本的flash文件,可以提取和编辑其中的元素,包括动画、图形、声音等。 4. Eltima SWF to FLA Converter:一款专业的swffla换工具,可以帮助用户将swf文件换为flash文件。它支持批量换,可以保留原始文件的所有元素,并且提供了可视化的编辑界面。 5. Flash Decompiler Trillix:一款功能强大的swf反编译工具,可以将swf文件还原为flash文件。它具有简洁的界面和丰富的功能,可以提取和编辑swf文件中的元素,包括图形、动画、声音等。 总结起来,这些软件是市场上比较常见的swf换为flash文件的工具,用户可以根据自己的需求选择合适的软件进行换和编辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值