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

本文介绍了一个用于解析SWF文件的Delphi程序,通过读取文件头部信息来判断文件是否受保护,并允许用户移除保护。程序实现了打开、保存及退出等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下为程序代码:


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值