从复合文档中提取Flash游戏

来源:互联网 发布:新浪博客加js代码 编辑:程序博客网 时间:2024/05/01 12:17
 http://www.titilima.cn/readblog.php?id=141

校友juhong发过来一个很有意思的Flash游戏,美中不足的是这个Flash是内嵌于一个Excel文档中的。于是便加以分析并将其提取出来,以下为简要过程记录。

首先,用Visual Studio自带的工具DocFile Viewer将这个xls文档打开,查看其复合文档结构。

其中流Ctls就是我们要找的swf文件流,那么查看其二进制数据。

在偏移量0x18处发现SWF标志,并根据网上查得的SWF文件头定义以下结构:

typedef struct _tagSwfHdr {
    CHAR    chTag[3];     // "FWS"
    BYTE    byVer[1];
    DWORD   dwFileSize;
} SWFHDR;

偏移量、流大小的信息至此都已获得,可以做最后的编码工作了,如下。

    IStorage    *pStgRoot = NULL;
    HRESULT     hr        = StgOpenStorage(L"C://1.xls", NULL,
        STGM_READ | STGM_SHARE_DENY_WRITE, 0, 0, &pStgRoot);

    IStream *pSwf = NULL;
    hr = pStgRoot->OpenStream(L"Ctls", NULL, STGM_READ | STGM_SHARE_EXCLUSIVE,
        0, &pSwf);

    LARGE_INTEGER pos;
    pos.HighPart = 0;
    pos.LowPart  = 0x18;
    pSwf->Seek(pos, STREAM_SEEK_SET, NULL);

    SWFHDR hdr;
    pSwf->Read(&hdr, sizeof(hdr), NULL);

    LPBYTE buf = new BYTE[hdr.dwFileSize];
    RtlCopyMemory(buf, &hdr, sizeof(SWFHDR));
    pSwf->Read(buf + sizeof(SWFHDR), hdr.dwFileSize - sizeof(SWFHDR), NULL);

    HANDLE hFile = CreateFile(_T("C://1.swf"), GENERIC_WRITE, 0, NULL,
        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    DWORD dwWritten;
    WriteFile(hFile, buf, hdr.dwFileSize, &dwWritten, NULL);
    CloseHandle(hFile);

    delete [] buf;

----------传说中的分隔线----------

以下给出本篇Blog中的1.xls和1.swf供大家实验或娱乐,有效期一周。

点这里下载XLS文件(提取码178c19e8)

点这里下载SWF文件(提取码a71bbcde)

PS:本来想就此编写一个通用的提取工具,但貌似网上已经有了,所以作罢。