browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

从复合文档中提取Flash游戏

Posted by on 2007 年 12 月 05 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

校友 juhong 发过来一个很有意思的 Flash 游戏,美中不足的是这个 Flash 是内嵌于一个 Excel 文档中的。于是便加以分析并将其提取出来,以下为简要过程记录。
首先,用 Visual Studio 自带的工具 DocFile Viewer 将这个 xls 文档打开,查看其复合文档结构。

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

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

C++代码
  1. typedef struct _tagSwfHdr {   
  2.     CHAR    chTag[3];     // "FWS"   
  3.     BYTE    byVer[1];   
  4.     DWORD   dwFileSize;   
  5. } SWFHDR;  

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

C++代码
  1. IStorage    *pStgRoot = NULL;   
  2. HRESULT     hr        = StgOpenStorage(L"C:\\1.xls", NULL,   
  3.     STGM_READ | STGM_SHARE_DENY_WRITE, 0, 0, &pStgRoot);   
  4.   
  5. IStream *pSwf = NULL;   
  6. hr = pStgRoot->OpenStream(L"Ctls", NULL, STGM_READ | STGM_SHARE_EXCLUSIVE,   
  7.     0, &pSwf);   
  8.   
  9. LARGE_INTEGER pos;   
  10. pos.HighPart = 0;   
  11. pos.LowPart  = 0x18;   
  12. pSwf->Seek(pos, STREAM_SEEK_SET, NULL);   
  13.   
  14. SWFHDR hdr;   
  15. pSwf->Read(&hdr, sizeof(hdr), NULL);   
  16.   
  17. LPBYTE buf = new BYTE[hdr.dwFileSize];   
  18. RtlCopyMemory(buf, &hdr, sizeof(SWFHDR));   
  19. pSwf->Read(buf + sizeof(SWFHDR), hdr.dwFileSize – sizeof(SWFHDR), NULL);   
  20.   
  21. HANDLE hFile = CreateFile(_T("C:\\1.swf"), GENERIC_WRITE, 0, NULL,   
  22.     CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);   
  23. DWORD dwWritten;   
  24. WriteFile(hFile, buf, hdr.dwFileSize, &dwWritten, NULL);   
  25. CloseHandle(hFile);   
  26.   
  27. delete [] buf;  

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

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

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

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

订阅本站

5 Comments

  • At 2007.12.05 13:18, z said:

    不错的游戏。。。。对我这种脑子不很灵光的人来说,难度很大。。。

    • At 2007.12.11 23:25, free2000fly said:

      俺就写了一个, 李马可以试用试用哈,
      http://blog.csdn.net/xierenhui/archive/2007/12/02/1912597.aspx

      • At 2007.12.21 19:51, wye-MIA kid C said:

        下载不了了,还想玩呢。哎~+

        • At 2008.07.08 22:23, sblisb said:

          什么好游戏呀,说说名字

          • At 2008.07.09 09:46, 李马 said:

            [quote=sblisb]什么好游戏呀,说说名字[/quote]
            搜索一下“bloxorz”。

            (Required)
            (Required, will not be published)