您的位置:首页 > 编程语言

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

2009-09-18 11:10 597 查看
以下为程序代码:

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: