程序源代码之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.
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.
相关文章推荐
- 保护你的flash(as3)程序 - 基于socket方式传送swf文件
- [转]保护你的flash(as3)程序基于socket方式传送swf文件
- (转)保护自己的Flash程序(AS3) -- 基于socket方式传送swf文件
- 深入研究socket编程(1)-----socket之TCP回射服务器/客户端程序
- ROS Learning-032 (提高篇-010 Launch)Launch 深入研究 --- (启动文件编程)ROS 的 XML语法简介
- 像VUE一样写微信小程序-深入研究wepy框架
- flash编程实例源代码下载
- java 编程思想之容器的深入研究
- 10-02 Java 形式参数和返回值的问题深入研究,链式编程
- 集体智慧编程 Programming Collective Intelligence 书中代码程序研究
- jsp扫描仪编程示例程序源代码下载
- 世界编程大赛头名程序源代码
- 深入研究socket编程(2)——I/O多路转接(select、pselect和poll)
- iOS5编程--UIApplication深入研究
- 我的 C#+flash socket 聊天程序(C#源代码)
- Linux内核源代码简单分析(如何深入研究源代码)(转)
- 《Java 编程思想》--第十七章:容器深入研究
- 运用加密技术保护Java源代码-Java基础-Java-编程开发
- java并发编程之:ReentrantLock实现原理与深入研究
- [导入]兼容ie,firefox的 播放flash swf文件的源代码