V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
theodorus
V2EX  ›  Python

使用 Python 将文件嵌入图像文件的困惑

  •  
  •   theodorus · 2016-08-11 14:28:25 +08:00 · 2713 次点击
    这是一个创建于 2818 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用 Python 学着网上的同学写一段小脚本。将 zip 文件嵌入 bmp(24bits)的数据区。可以将文件嵌入图像中。可是问题是图像的格式改为 zip 后不能解压了。需要再写一段脚本把 zip 提取出来?那样岂不是很麻烦。系统平台是 Linux 。 希望有朋友帮忙指点一下。什么方法才能直接修改后缀(文件直接读取)就 OK 呢?

    theodorus
        1
    theodorus  
    OP
       2016-08-11 15:00:49 +08:00
    居然没人答 ==
    aprikyblue
        2
    aprikyblue  
       2016-08-11 15:36:11 +08:00 via Android
    二进制数据直接顺序合并,图片在前,压缩文件在后
    theodorus
        3
    theodorus  
    OP
       2016-08-11 15:48:48 +08:00
    @aprikyblue 对的。我分别使用了 windows 的批处理和 Python 进行二进制重导向,可是改后缀后依然无法解压。提示是压缩文件已损坏。
    imn1
        4
    imn1  
       2016-08-11 15:51:55 +08:00
    文件头不同,当然不能
    bigtan
        5
    bigtan  
       2016-08-11 15:52:30 +08:00
    还没学好编程的时候就弄过这个,似乎 windows 下面就是一条 copy 命令就行。
    theodorus
        6
    theodorus  
    OP
       2016-08-11 15:56:16 +08:00
    @bigtan 这个我在批处理下面尝试了好多次。 BMP 格式和 JPG 格式等,都能显示图片但是压缩包(改名字)损坏。
    theodorus
        7
    theodorus  
    OP
       2016-08-11 15:56:52 +08:00
    @imn1 请问有什么好的方法实现吗?我以前看到有实现成功的。
    symeonchen
        8
    symeonchen  
       2016-08-11 16:01:26 +08:00
    直接使用 ZIP 后缀解压的前提是其二进制包含 ZIP 的文件头标识,且后续文件结构较为完整。所以用二楼的办法就可以了。

    嵌入 BMP 的数据区属于隐写术,实际上改变了完整的 ZIP 结构,当然不能直接解压。
    aprikyblue
        9
    aprikyblue  
       2016-08-11 16:03:11 +08:00
    bin = open('theImg.png','rb').read() + open('theCompr.zip','rb').read()
    open('thefile.png', 'wb').write(bin)
    theodorus
        10
    theodorus  
    OP
       2016-08-11 16:11:05 +08:00
    #!/usr/bin/python
    import sys
    f=open(sys.argv[3], "wb")
    f.write(file(sys.argv[1], "rb").read())
    f.write(file(sys.argv[2],"rb").read())

    f.close()

    我的这个代码和你的差不多。这样的方法不通用。想了解 ZIP 压缩原理。
    aprikyblue
        11
    aprikyblue  
       2016-08-11 16:14:51 +08:00
    没深入研究过原理,可以看看那些软件是怎么判断文件格式并读取数据的。。
    theodorus
        12
    theodorus  
    OP
       2016-08-11 16:14:54 +08:00
    @symeonchen 请问有什么办法能让 ZIP 的结构头能够比较好呢。我看到的比较简单的方法一共是两种
    1. 利用二进制追加
    2. 将 ZIP 文件写到 BMP 文件的数据区

    经过测试。改后缀的方法都不能正常将压缩文件还原。
    想请教一下参阅哪方面的知识呢。我看到网络上大多是比较高级的 隐写。
    xenme
        13
    xenme  
       2016-08-11 16:15:37 +08:00
    A:图片
    B:ZIP 文件
    A+B ,等于 A 文件头,没法直接改成 ZIP 直接用
    B+A ,等于 B 文件头,没法当成图片文件直接看。
    shyling
        14
    shyling  
       2016-08-11 16:15:57 +08:00
    试了试
    copy /B src.png + src.zip dest.png

    没问题
    theodorus
        15
    theodorus  
    OP
       2016-08-11 16:18:13 +08:00
    @aprikyblue 恩。我是无聊偶然看到这个的。结果发现各种形式都实现不了。打算弃坑用别人写好的软件。
    theodorus
        16
    theodorus  
    OP
       2016-08-11 16:20:33 +08:00
    @shyling 为啥我的不能复现?(⊙v⊙)嗯?!
    我的文件是 copy /b bed.jpg + test.7z tttttt.jpg

    把后缀该成 7z 后解压不了啊。你确定你能解压?
    wizardoz
        17
    wizardoz  
       2016-08-11 16:21:15 +08:00
    在 linux ,扩展名只是给用户看的。大部分时候都是通过文件内容来识别。
    theodorus
        18
    theodorus  
    OP
       2016-08-11 16:24:10 +08:00
    @wizardoz 这个我倒是比较清楚。主要问题是合并后为什么使用解压软件如 gzip 等命令解压。会提示
    [root@CentOS localbin]$tar -xf test.tar
    tar: This does not look like a tar archive
    tar: Skipping to next header
    tar: Exiting with failure status due to previous errors
    我也试了 tar 打包的形式。仍然不行。
    hitmanx
        19
    hitmanx  
       2016-08-11 16:33:00 +08:00 via iPhone
    普通的 zip 和 7z 会不会在格式上有些差别?你试过普通的 zip 吗?
    theodorus
        20
    theodorus  
    OP
       2016-08-11 16:36:23 +08:00
    @hitmanx 我都试过了。 7z 和 ZIP 和 jpg 和 BMP 。然而都不行。
    symeonchen
        21
    symeonchen  
       2016-08-11 16:57:50 +08:00   ❤️ 1
    @theodorus 二进制追加的办法对 Rar 和 Zip 都有效, 7z 和 tar 我倒是没试过。
    原理我大概写过一点,见![这里]( https://symeonchen.com/2016/07/11/%E4%BD%BF%E7%94%A8Python%E5%B0%86%E6%96%87%E4%BB%B6%E9%9A%90%E8%97%8F%E4%BA%8E%E5%9B%BE%E7%89%87%E4%B8%AD/)
    关于 zip 和 rar 的文件头可以参考英文版的维基百科。
    这种格式的文件又叫 Poyglot ,也可以以此为关键词查找相关资料。
    theodorus
        22
    theodorus  
    OP
       2016-08-11 17:16:51 +08:00
    @symeonchen 谢谢。
    sarikasama
        23
    sarikasama  
       2016-08-11 17:24:03 +08:00
    我这里 python 和 bash 都没问题, jpg 、 png 、 zip 、 7z 也都没问题,额……
    theodorus
        24
    theodorus  
    OP
       2016-08-11 17:25:27 +08:00
    @symeonchen 打算持续研究原理。可是在你的网站上我右键保存之后,再修改后缀。没法解压提示文件名已经损坏。用的解压软件是 OS X 自带的软件。 WINDOWS10 的我也试了一下好像不行。
    不过有原理查起来就容易多了。
    theodorus
        25
    theodorus  
    OP
       2016-08-11 17:27:17 +08:00
    @sarikasama 能不能把代码给我一下。我代码应该没错吧。如果愿意的话能不能把文件发给我下。我试了好多文件不可以。难道是我系统软件问题?
    邮箱是 [email protected]
    谢谢。
    SelFree
        26
    SelFree  
       2016-08-11 17:30:37 +08:00
    要想直接改后缀解压,应该是直接将压缩文件附加在图片后面。至于能不能解压,跟解压软件有关系,有的直接解析头部,肯定就不行。有的去搜索头部标识,这就没问题。试试 winrar 解压,如果还不行,试试 winrar+rar 格式。
    theodorus
        27
    theodorus  
    OP
       2016-08-11 17:46:48 +08:00
    @SelFree 恩。刚才看到了 @symeonchen 的指南清楚多了。谢谢。
    imn1
        28
    imn1  
       2016-08-11 18:24:31 +08:00
    如果只是简单合并,你应该用 jpg 而不是 bmp
    bmp 的图像大小和字节数是要通过文件头计算的,数据部分可以是任何字符
    但 jpg 则有很明显的头尾标志字节, jpg 结尾字节为 FFD9 ,并且整个 jpg 文件理应只有一个 FFD9 出现,就是结尾
    在 FFD9 后面加入任何数据,读图软件都会无视,所以很适合附带数据

    所以应该把其他文件添加到一个标准 jpg 后面,提取的时候以第一次读到 FF90 为准,舍弃前面读取余下部分另存或直接处理

    当然这种方式无加密作用
    如果想用图片加密其他文件,请搜索“ steganography ”或者“隐写术”
    symeonchen
        29
    symeonchen  
       2016-08-11 19:06:37 +08:00
    @theodorus 抱歉,因为我链接中的图片放错了,所以无法解压,现已修复。如果无法用 7zip 等方式打开,可以尝试使用命令行 unzip XXX.zip 。
    theodorus
        30
    theodorus  
    OP
       2016-08-12 00:15:16 +08:00 via iPhone
    @symeonchen 请问你对微博监控有兴趣吗。就是一直监视某个 USER 的信息。
    我最近对这个比较感兴趣。但是我发现网上好多写的有问题或者不兼容(纯 CLI 下无法运行),我打算写一个这样的程序。但是不知道怎么才能实现完全的自动化。(跳过验证码之类的)
    请问你在这方面有研究没?
    theodorus
        31
    theodorus  
    OP
       2016-08-12 00:18:22 +08:00 via iPhone
    @symeonchen 请问你对微博监控感兴趣没?或者有过研究没?
    我最近考虑写一个监控微博的自动脚本。但是网络上参考的有的代码太粗暴了或者无法在纯 CLI 下实现。
    你有什么好的方法来实现这个功能没?
    symeonchen
        32
    symeonchen  
       2016-08-12 10:14:21 +08:00 via Android
    @theodorus 可参考 http://www.jikexueyuan.com/course/995_5.html
    现在多了验证码,稍加修改即可使用。
    如果有监控新微博的需求,可考虑开通微博会员。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1024 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 19:09 · PVG 03:09 · LAX 12:09 · JFK 15:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.