用 Python 学着网上的同学写一段小脚本。将 zip 文件嵌入 bmp(24bits)的数据区。可以将文件嵌入图像中。可是问题是图像的格式改为 zip 后不能解压了。需要再写一段脚本把 zip 提取出来?那样岂不是很麻烦。系统平台是 Linux 。 希望有朋友帮忙指点一下。什么方法才能直接修改后缀(文件直接读取)就 OK 呢?
1
theodorus OP 居然没人答 ==
|
2
aprikyblue 2016-08-11 15:36:11 +08:00 via Android
二进制数据直接顺序合并,图片在前,压缩文件在后
|
3
theodorus OP @aprikyblue 对的。我分别使用了 windows 的批处理和 Python 进行二进制重导向,可是改后缀后依然无法解压。提示是压缩文件已损坏。
|
4
imn1 2016-08-11 15:51:55 +08:00
文件头不同,当然不能
|
5
bigtan 2016-08-11 15:52:30 +08:00
还没学好编程的时候就弄过这个,似乎 windows 下面就是一条 copy 命令就行。
|
6
theodorus OP @bigtan 这个我在批处理下面尝试了好多次。 BMP 格式和 JPG 格式等,都能显示图片但是压缩包(改名字)损坏。
|
8
symeonchen 2016-08-11 16:01:26 +08:00
直接使用 ZIP 后缀解压的前提是其二进制包含 ZIP 的文件头标识,且后续文件结构较为完整。所以用二楼的办法就可以了。
嵌入 BMP 的数据区属于隐写术,实际上改变了完整的 ZIP 结构,当然不能直接解压。 |
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) |
10
theodorus OP #!/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 压缩原理。 |
11
aprikyblue 2016-08-11 16:14:51 +08:00
没深入研究过原理,可以看看那些软件是怎么判断文件格式并读取数据的。。
|
12
theodorus OP @symeonchen 请问有什么办法能让 ZIP 的结构头能够比较好呢。我看到的比较简单的方法一共是两种
1. 利用二进制追加 2. 将 ZIP 文件写到 BMP 文件的数据区 经过测试。改后缀的方法都不能正常将压缩文件还原。 想请教一下参阅哪方面的知识呢。我看到网络上大多是比较高级的 隐写。 |
13
xenme 2016-08-11 16:15:37 +08:00
A:图片
B:ZIP 文件 A+B ,等于 A 文件头,没法直接改成 ZIP 直接用 B+A ,等于 B 文件头,没法当成图片文件直接看。 |
14
shyling 2016-08-11 16:15:57 +08:00
试了试
copy /B src.png + src.zip dest.png 没问题 |
15
theodorus OP @aprikyblue 恩。我是无聊偶然看到这个的。结果发现各种形式都实现不了。打算弃坑用别人写好的软件。
|
16
theodorus OP |
17
wizardoz 2016-08-11 16:21:15 +08:00
在 linux ,扩展名只是给用户看的。大部分时候都是通过文件内容来识别。
|
18
theodorus OP @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 打包的形式。仍然不行。 |
19
hitmanx 2016-08-11 16:33:00 +08:00 via iPhone
普通的 zip 和 7z 会不会在格式上有些差别?你试过普通的 zip 吗?
|
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 ,也可以以此为关键词查找相关资料。 |
22
theodorus OP @symeonchen 谢谢。
|
23
sarikasama 2016-08-11 17:24:03 +08:00
我这里 python 和 bash 都没问题, jpg 、 png 、 zip 、 7z 也都没问题,额……
|
24
theodorus OP @symeonchen 打算持续研究原理。可是在你的网站上我右键保存之后,再修改后缀。没法解压提示文件名已经损坏。用的解压软件是 OS X 自带的软件。 WINDOWS10 的我也试了一下好像不行。
不过有原理查起来就容易多了。 |
25
theodorus OP |
26
SelFree 2016-08-11 17:30:37 +08:00
要想直接改后缀解压,应该是直接将压缩文件附加在图片后面。至于能不能解压,跟解压软件有关系,有的直接解析头部,肯定就不行。有的去搜索头部标识,这就没问题。试试 winrar 解压,如果还不行,试试 winrar+rar 格式。
|
27
theodorus OP @SelFree 恩。刚才看到了 @symeonchen 的指南清楚多了。谢谢。
|
28
imn1 2016-08-11 18:24:31 +08:00
如果只是简单合并,你应该用 jpg 而不是 bmp
bmp 的图像大小和字节数是要通过文件头计算的,数据部分可以是任何字符 但 jpg 则有很明显的头尾标志字节, jpg 结尾字节为 FFD9 ,并且整个 jpg 文件理应只有一个 FFD9 出现,就是结尾 在 FFD9 后面加入任何数据,读图软件都会无视,所以很适合附带数据 所以应该把其他文件添加到一个标准 jpg 后面,提取的时候以第一次读到 FF90 为准,舍弃前面读取余下部分另存或直接处理 当然这种方式无加密作用 如果想用图片加密其他文件,请搜索“ steganography ”或者“隐写术” |
29
symeonchen 2016-08-11 19:06:37 +08:00
@theodorus 抱歉,因为我链接中的图片放错了,所以无法解压,现已修复。如果无法用 7zip 等方式打开,可以尝试使用命令行 unzip XXX.zip 。
|
30
theodorus OP @symeonchen 请问你对微博监控有兴趣吗。就是一直监视某个 USER 的信息。
我最近对这个比较感兴趣。但是我发现网上好多写的有问题或者不兼容(纯 CLI 下无法运行),我打算写一个这样的程序。但是不知道怎么才能实现完全的自动化。(跳过验证码之类的) 请问你在这方面有研究没? |
31
theodorus OP |
32
symeonchen 2016-08-12 10:14:21 +08:00 via Android
|