• 2007-11-18

    抽取OFFICE文件中嵌入的SWF文件 - [技术]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://imthor.blogbus.com/logs/10855970.html

    记得几年前经常看见PAWA的妹妹发来的一些有趣的FLASH游戏和动画, 只是嵌入在OFFICE文档中发来的(可能是由于学校的机器只装了OFFICE的原因), 结果难倒了当年帝国整个研发的所有人... 当时的结论是此题无解, 后来找到了解决的方法, 前些时间, ALLAN同学也发来一个嵌入在OFFICE文档中的SWF, 于是将其抽出, 现将抽取方法的笔记文档贴在此, 有兴趣, 时间 和能力的朋友可以考虑出一个工具软件......

    1、需要一款16进制编辑工具WinHex(可省略此步骤)
    2、打开含有Flash的Word文档,点击“控件工具箱”的“设计模式”按钮进入设计模式,选择Word中的Flash,复制粘贴到任意文件夹,会看到一个“片段”文件。(可省略此步骤)
    3、打开WinHex,将该“片段”文件拉到WinHex中,单击下拉菜单“搜索”→“查找16进制值”,搜索“465753”,在搜索到的“465753”中的“4”位置上单击右键,选择“选块开始”。
    4、继续“搜索”→“查找16进制值”,搜索“3A5C”,然后按住F3,直到出现“3A5C未找到”,点击“是”,在最后搜索到的“3A5C”中“C”位置上单击右键,选择“选块结尾”。(注:少数情况可能会搜索不到“3A5C”,则改为搜索“3A”或“5C”,方法相同)。
    5、在选块内任意处点击右键→编辑→复制选块→进入新文件→输入文件名 (如test.swf) →保存。


    ----------------------------------------------------------

    6EDB7CD26DAECF1196B844455354000066556655

    ----------------------------------------------------------

    Sub ReadData()
    Dim tmpFileName As String, FileNumber As Integer, OldName As String
    Dim myFileId As Long
    Dim myArr() As Byte
    Dim i As Long
    Dim MyFileLen As Long, myIndex As Long
    Dim swfFileLen As Long
    Dim swfArr() As Byte
    tmpFileName = Application.GetOpenFilename("office File(*.doc;*.xls),*.doc;*.xls", , "确定要分析的office文件")
    If tmpFileName = "False" Then Exit Sub
    myFileId = FreeFile
    Open tmpFileName For Binary As #myFileId
    MyFileLen = LOF(myFileId)
    ReDim myArr(MyFileLen - 1)
    Get myFileId, , myArr()
    Close myFileId
    Application.ScreenUpdating = False
    OldName = Left(tmpFileName, Len(tmpFileName) - 4)
    i = 0
    Do While i < MyFileLen
    If myArr(i) = &H46 Then
    If myArr(i + 1) = &H57 And myArr(i + 2) = &H53 Then
    swfFileLen = CLng(&H1000000) * myArr(i + 7) + CLng(&H10000) * myArr(i + 6) + CLng(&H100) * myArr(i + 5) + myArr(i + 4)
    ReDim swfArr(swfFileLen - 1)
    For myIndex = 0 To swfFileLen - 1
    swfArr(myIndex) = myArr(i + myIndex)
    Next myIndex
    myFileId = FreeFile
    tmpFileName = OldName & i & ".swf"
    Open tmpFileName For Binary As #myFileId
    Put #myFileId, , swfArr
    Close myFileId
    i = i + swfFileLen + 8
    Else
    i = i + 3
    End If
    Else
    i = i + 1
    End If
    Loop
    MsgBox "以" & OldName & "1-n.swf 名字保存"
    End Sub


    收藏到:Del.icio.us

    评论

  • 佩服,佩服!知道了原理什么都好办呐...

发表评论

您将收到博主的回复邮件
记住我