<未完成>python使用oletools提取docx文件中的嵌入文件(指word中的插入对象)

发布时间 2023-06-02 14:57:40作者: 海_纳百川

上午在帮一个同事实现题目中的功能,主要参考的是这篇博客https://zhuanlan.zhihu.com/p/530612244

但是在复现的过程中失败了,下面详细说说。

首先我的环境是centos,参考的博客是在windows中实现的。

博客的实现的步骤主要有两个,一个是将docx文件中的嵌入文件导出为bin文件,此时用的方法为:(需要安装pip install python-docx)

import os

from docx import Document  # pip install python-docx

is_debug = True

if __name__ == '__main__':
    # 需要导出的Word文档路径
    target_file = r'paper\HBase试题.docx'
    # 导出文件所在目录
    output_dir = r'paper\output'

    # 加载Word文档
    doc = Document(target_file)
    # 遍历Word包中的所有文件
    dict_rel = doc.part.rels
    # r_id:文件身份码,rel:文件对象 
    for r_id, rel in dict_rel.items():
        if not ( # 如果文件不是在media或者embeddings中的,直接跳过
                str(rel.target_ref).startswith('media')
                or str(rel.target_ref).startswith('embeddings')
        ):
            continue
        
        # 如果文件不是我们想要的后缀,也直接跳过
        file_suffix = str(rel.target_ref).split('.')[-1:][0]
        if file_suffix.lower() not in ['png', 'jpg', 'bin']:
            continue

        # 如果输出目录不存在,创建
        if not os.path.exists(output_dir):
            os.makedirs(output_dir)
        
        # 构建导出文件的名字和路径
        file_name = r_id + '_' + str(rel.target_ref).replace('/', '_')
        file_path = os.path.join(output_dir,file_name)
        
        # 将二进制数据写入到新位置的文件中
        with open(file_path, "wb") as f:
            f.write(rel.target_part.blob)
        
        # 打印结果
        if is_debug:
            print('导出文件成功:', file_name)

 

其次在使用oletools包(pip install oletools)的oleobj.py文件将bin文件转为真正的文件(docx,pptx,或者excel文件):

python oleobj.py rId12_embeddings_oleObject1.bin
#注意此处的oleobj.py文件可以自己搜索一下找到位置。

但是我使用上面的命令转换失败,主要是卡在了oleobj.py的此行代码 if path_parts[-1].lower() == '\x01ole10native':

我将path_parts[-1].lower()打印出来以后是

objinfo
package

这就导致后面的代码不能被处理,具体原因尚未得知。