从复合文档中提取Flash游戏

  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:本来想就此编写一个通用的提取工具,但貌似网上已经有了,所以作罢。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值