说明:该程序是将用Flash编写的,并被发布成exe文件的小游戏(如早先的著名游戏《机械迷城》)剥离成SWF文件,纯属娱乐小游戏,写着玩的,算法就不讲了,看看代码就明白了。运行环境Visual Studio C++ 2005;直接上代码
#include "stdafx.h"
#include <windows.h>
// swf文件玩具
typedef struct tagswfID {
unsigned long int id;
unsigned long int swfFileSize;
} SWFID;
int _tmain(int argc, _TCHAR* argv[])
{
// 玩具程序2----将一个可执行档的exe转成swf文件;针对某些用Flash编写的游戏并被最终发布为exe文件,该程序可以自动剥离出swf文件
// 玩笑程序,愚人节礼物,但绝对可用
// 要转换的可执行swf文件(后缀名.exe)
const char iswfFileName[] = "Samorost2.exe"; //原始SWF文件
HANDLE hFile = CreateFile(iswfFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile != INVALID_HANDLE_VALUE)
{
int nFileSize = GetFileSize(hFile, NULL);
SetFilePointer(hFile, nFileSize - 8, NULL, FILE_BEGIN);
SWFID swfid;
DWORD NumberOfBytesRead;
if( ReadFile(hFile, &swfid, 8, &NumberOfBytesRead, NULL) )
{
if(NumberOfBytesRead == 8 && swfid.id == 0xFA123456 )
{
// 移动到该swf文件头,并生成新的swf文件
SetFilePointer(hFile, nFileSize - swfid.swfFileSize - 8, NULL, FILE_BEGIN);
unsigned char *buffer = NULL;
buffer = (unsigned char *)malloc(swfid.swfFileSize + 16);
ReadFile(hFile, buffer, swfid.swfFileSize, &NumberOfBytesRead, NULL);
const char outputFile[] = "outswffile.swf"; // 输出的SWF文件
HANDLE hswfFile = CreateFile(outputFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_WRITE_THROUGH, NULL);
if(hswfFile != INVALID_HANDLE_VALUE)
{
DWORD nWriteBytes;
WriteFile(hswfFile, buffer, swfid.swfFileSize, &nWriteBytes, NULL);
CloseHandle(hswfFile);
}
free(buffer);
}
}
CloseHandle(hFile);
}
return 1;
}
程序比较小白,纯属娱乐