CleasbyCode/pdvzip-rs
GitHub: CleasbyCode/pdvzip-rs
pdvzip-rs 是一个将 ZIP/JAR 文件嵌入 PNG 图像以生成可推文且可执行的混合文件的 Rust 命令行工具。
Stars: 0 | Forks: 0
# pdvzip-rs
***这是我用 C++ 编写的多语言文件工具 [***pdvzip***](https://github.com/CleasbyCode/pdvzip) 的实验性 ***Rust*** 移植版***
将 ***ZIP*** 或 ***JAR*** 文件嵌入到 ***PNG*** 图像中,以创建可推文且“[***可执行***](https://github.com/CleasbyCode/pdvzip#extracting-your-embedded-files)”的 ***PNG*** 多语言文件。
在 ***X-Twitter*** 及其他几个兼容平台上分享图像,平台会保留嵌入的压缩包。
*注意:出于兼容性原因,请***不要***使用加密/受密码保护的 ZIP 文件。*
这里还提供了一个 [***网页版***](https://cleasbycode.co.uk/pdvzip/app/),你可以直接使用它,作为下载和编译 CLI 源代码的便捷替代方案。网页端文件上传限制为 **20MB**。
基于 [***David Buchanan***](https://www.da.vidbuchanan.co.uk/) 的类似想法,源自他最初的 ***Python*** 程序 [***tweetable-polyglot-png***](https://github.com/DavidBuchanan314/tweetable-polyglot-png),
***pdvzip-rs*** 使用了不同的方法来在 ***PNG*** 图像中[***存储***](https://github.com/CleasbyCode/pdvzip#png-image-requirements-for-arbitrary-data-preservation)和[***提取***](https://github.com/CleasbyCode/pdvzip#extracting-your-embedded-files)嵌入的文件。

***致谢:*** *图像* - [***@KCP228***](https://x.com/KCP228) *PowerShell 脚本* - [***@gierrofo***](https://x.com/gierrofo)
***Linux/Windows*** 提取脚本存储在 ***PNG*** 图像的 ***iCCP*** 块中。嵌入的 ***ZIP/JAR*** 文件存储在其自己的 ***IDAT*** 块中,该块将是图像文件的最后一个 ***IDAT*** 块。
使用 ***pdvzip-rs***,你可以嵌入最大 ***2GB*** 的 ***ZIP/JAR*** 文件(覆盖图像 + 压缩文件)。下面***列出***的兼容站点有各自***小得多***的大小限制。
## 兼容平台
*发布大小限制以覆盖图像 + 压缩数据文件的总大小为准。*
* ***X-Twitter*** (**5MB**), ***Flickr*** (**200MB**), ***ImgBB*** (**32MB**), ***PostImage*** (**32MB**), ***ImgPile*** (**8MB**)。
*图像尺寸限制:*
* ***PNG-32/24*** (*真彩色*) 最小 **68x68** - 最大 **900x900**。
* ***PNG-8*** (*索引颜色*) 最小 **68x68** - 最大 **4096x4096**。
## 用法 (Linux)
```
$ sudo apt install build-essential
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ cargo build --release
Build complete. Binary at 'target/release/pdvzip-rs'.
$ sudo cp target/release/pdvzip-rs /usr/bin
$ pdvzip-rs
Usage: pdvzip-rs
pdvzip-rs --info
$ pdvzip-rs my_cover_image.png document_pdf.zip
Created PNG-ZIP polyglot image file: pzip_55183.png (4038367 bytes).
Complete!
$ pdvzip-rs my_cover_image.png hello_world.jar
Created PNG-JAR polyglot image file: pjar_19662.png (1016336 bytes).
Complete!
```
## 提取你嵌入的文件
**重要提示:** 从 ***X-Twitter*** 保存图像时,请点击帖子中的图像将其***完全展开***,然后再保存。
以下部分介绍了如何提取嵌入的 ***ZIP*** 文件。***JAR*** 文件将在稍后介绍。
***pdvzip-rs*** (适用于 ***Linux***) 将尝试对新创建的多语言图像文件***自动设置可执行权限***。
对于从托管站点下载或从其他机器复制的这些多语言图像,你需要使用 ***chmod*** 手动设置可执行权限。
https://github.com/user-attachments/assets/8feca575-b135-4f58-839a-2159fce09b44
https://github.com/user-attachments/assets/77472a02-52dd-4a5c-a035-b30dcc842cce
https://github.com/user-attachments/assets/a143e694-31f5-4235-ace1-30217fe8ab41
***Linux - 使用 bash (或 sh) shell 环境。***
```
$ ./pzip_55183.png
```
**对于任何其他 Linux shell 环境,你可能需要调用 bash (或 sh) 来运行该图像文件。**
```
mx% bash ./pzip_55183.png
```
替代提取方法 (***Linux***)。使用 ***wget*** 直接从托管站点下载并运行图像。
***X-Twitter*** ***wget*** 示例:**内嵌 ***python*** 脚本的图像**。
```
$ wget -O Fibo.png "https://pbs.twimg.com/media/GLXTYeCWMAAA6B_.png";chmod +x Fibo.png;bash ./Fibo.png
```
**Windows** ***(将图像文件扩展名重命名为 '.cmd')***
```
G:\demo> ren pzip_55183.png pzip_55183.cmd
G:\demo> .\pzip_55183.cmd
```
替代提取方法 (***Windows***)。使用 ***iwr*** 直接从托管站点下载并运行图像。
***Flickr*** ***iwr*** 示例:**内嵌 mp4 视频文件的图像。**
```
iwr -o swing.cmd "https://live.staticflickr.com/65535/54025688614_2f9d474cba_o_d.png";.\swing.cmd
```
在桌面上首次运行打开 ***.cmd*** 文件时,***Windows*** 可能会显示安全警告。
通过点击“***更多信息***”然后选择“***仍要运行***”来清除它。
为避免安全警告,请像上述示例中所示,在 ***Windows 控制台*** 中运行该文件。
***ZIP 压缩包中位于文件记录首位的文件(或文件夹),决定了根据文件类型使用哪种提取脚本。***
对于常见的***视频和音频***文件,***Linux*** 将首先尝试使用媒体播放器 ***mpv***,如果没有 ***mpv*** 则使用 ***vlc***。***Firefox*** 作为最后的手段。***Windows*** 使用默认媒体播放器。
***PDF*** - ***Linux*** 将使用 ***evince*** 或 ***firefox***。***Windows*** 使用默认的 ***PDF*** 查看器。
***Python*** - ***Linux*** 和 ***Windows*** 使用 ***python3*** 来运行这些程序。
***PowerShell*** - ***Linux*** 使用 ***pwsh*** (如果已安装),***Windows*** 使用 ***powershell.exe*** 或 ***pwsh.exe*** 来运行这些脚本。
***文件夹*** - ***Linux*** 使用 ***xdg-open***,***Windows*** 使用带有 II (***Invoke-Item***) 命令的 ***powershell.exe*** 来打开压缩文件夹。
对于你的 ***ZIP*** 文件中的任何其他文件类型,***Linux*** 和 ***Windows*** 将依赖操作系统设置的默认方法/应用程序。显然,压缩/嵌入的文件需要与你运行它的操作系统兼容。
如果压缩文件是 ***JAR***,或者 ***ZIP*** 压缩包中的压缩文件类型是 ***PowerShell***、***Python***、***Shell Script*** 或 ***Windows/Linux Executable***,***pdvzip-rs*** 将允许你在需要时为你的文件提供命令行参数。
***命令行参数***将被添加到 ***Linux/Windows*** 提取脚本中,并嵌入到你的 ***PNG*** 覆盖图像的 ***iCCP*** 块内。
确保将包含空格的参数(例如文件和目录名)用“引号”括起来。例如:
```
$ ./pdvzip-rs my_cover_image.png jdvrif_linux_executable.zip
For this file type you can provide command-line arguments here, if required.
Linux: -e ../my_cover_image.jpg "../my document file.pdf"
```
此外,请注意,在为压缩的 ***ZIP*** 文件类型(非 ***JAR***)使用参数时,你始终是在一个已创建的子目录“***pdvzip_xxxxx (例如 pdvzip_51424)***”中工作的。
https://github.com/user-attachments/assets/e55e9671-423c-4439-89e6-356c0080b4c1
https://github.com/user-attachments/assets/8d6d97c1-4c70-4f60-bba5-b01fad08b60e
要仅访问 ***ZIP*** 压缩包中的文件,请将“***.png***”文件扩展名重命名为“***.zip***”。
将 ***ZIP*** 压缩包视为只读,不要在 ***PNG-ZIP*** 多语言文件中添加或删除文件。
## 执行嵌入的 Java 程序
***Linux 选项 1:***
```
$ java -jar pjar_19662.png
Note: If you use this method to run your embedded Java program, you will have to manually add command-line
arguments (if required) to the end of the command, as your embedded arguments will not work with
this method. e.g.
user1@mx:~/Desktop$ java -jar ./pjar_19662.png -u john_s -a 42 -f "John Smith"
```
***Linux 选项 2a,使用 bash (或 sh) shell 环境:***
```
$ ./pjar_19662.png
Note: This method will execute the embedded Java program and also use any embedded
command-line arguments with the Java program.
```
***Linux 选项 2b,使用任何其他 shell 环境,你需要调用 bash (或 sh) 来执行该图像:***
```
mx% bash ./pjar_19662.png
```
***Windows 选项 1:***
```
PS C:\Users\Nick\Desktop\jar_demo> java -jar .\pjar_19662.png
Note: If you use this method to run your embedded Java program, you will have to manually add command-line
arguments (if required) to the end of the command, as your embedded arguments will not work with
this method. e.g.
PS C:\Users\Nick\Desktop\jar_demo> java -jar .\pjar_19662.png -u john_s -a 42 -f "John Smith"
```
***Windows 选项 2:***
```
PS C:\Users\Nick\Desktop\jar_demo> ren .\pjar_19662.png .\pjar_19662.cmd
PS C:\Users\Nick\Desktop\jar_demo> .\pjar_19662.cmd
Note: This method will execute the embedded Java program and will also use any
embedded command-line arguments with the Java program.
```
https://github.com/user-attachments/assets/9451ad50-4c7c-4fa3-a1be-3854189bde00
## 保留任意数据的 PNG 图像要求
***PNG*** 文件大小(图像 + 压缩文件)不得超过平台的大小限制。
否则该站点将拒绝上传你的图像,或者会将你的图像转换为 ***jpg***(例如 ***X-Twitter***),
并且你将丢失嵌入的内容。
***尺寸:***
***PNG-32/24 (真彩色)***
图像尺寸可以设置为最小 **68 x 68** 到最大 **900 x 900** 之间。
***注意:*** *如果检测到覆盖图像为 ***PNG-32/24 真彩色 (颜色类型 6 或 2)***,
且颜色少于 257 种,
***pdvzip-rs*** 会将其转换为 ***PNG-8 索引颜色 (颜色类型 3)*** 图像。
这样做是出于兼容性原因,因为它应该能防止像 ***X-Twitter*** 这样的平台
也转换你的图像,从而导致丢失嵌入的压缩文件。*
***PNG-8 (索引颜色)***
图像尺寸可以设置为最小 **68 x 68** 到最大 **4096 x 4096** 之间。
***PNG 块:***
例如,在 ***X-Twitter*** 中,你可以用任意数据***过度填充***以下 ***PNG*** 块,
只要你保持在图像尺寸和文件大小限制内,平台就会保留这些数据。
***bKGD, cHRM, gAMA, hIST,*** *iCCP (大小受限的块。在 X-Twitter 上最大 10KB),*
***IDAT (在最终的图像 IDAT 块之后,作为最后一个 IDAT 块使用),
PLTE (仅与 ***PNG-32/24*** 图像一起使用),
pHYs, sBIT, sPLT, sRGB,*** *tRNS (仅与 PNG-32 图像一起使用)。*
*其他平台在保留哪些块以及你可以过度填充哪些块方面可能会有所不同。*
***pdvzip-rs*** 使用 ***iCCP*** (存储提取脚本) 和 ***IDAT*** (存储 ***ZIP/JAR*** 文件) 块来处理你的任意数据。
## ***ZIP/JAR*** 文件大小及其他重要信息
要计算出最大的 ***ZIP/JAR*** 文件大小,请从大小限制开始,减去图像大小,再减去 ***1500*** 字节(提取脚本大小)。
***X-Twitter*** 示例:(**5MB** 限制) **5,242,880** - (**307,200** [图像] + **1500** [提取脚本]) = **4,934,180 字节** 可用于你的 ***ZIP/JAR*** 文件。
* 确保你的 ***ZIP/JAR*** 文件是标准的 ***ZIP/JAR*** 压缩包,与 ***Linux*** unzip 和 ***Windows*** 资源管理器兼容。
* 不要在主 ***ZIP*** 压缩包中包含超过一个 ***.zip*** 文件。(包含 ***.rar*** 文件没问题)。
* 不要在主 ***ZIP*** 压缩包中包含其他由 ***pdvzip-rs*** 创建的 ***PNG*** 图像文件,因为它们本质上就是 ***.zip*** 文件。
* 请始终为 ***ZIP*** 压缩包中的文件使用文件扩展名:***my_doc.pdf***, ***my_video.mp4***, ***my_program.py*** 等。
在 ***ZIP*** 压缩包中没有扩展名的文件将被视为 ***Linux*** 可执行文件。
## 一个包含 8 个文件的可推文 PNG 多语言文件

https://github.com/user-attachments/assets/d1b5888c-fe91-4a58-8ad6-731d9165a57c
前些时候,我制作了一个包含 8 个文件的(可推文)PNG 多语言文件。我最近又找到了它,所以想在这里分享。
我对这个多语言文件进行了一些修改,例如改进了 PowerShell 脚本,并使用了嵌入在图像中的不同 MP4 视频文件(由 PowerShell 脚本提取并播放)。
这个 PNG 多语言文件由图像本身 - PNG、网页、ZIP 压缩包、MP3 音频文件、JAR(可执行 Java 程序)、RAR 压缩包、PDF 和 PS1 (PowerShell) 脚本组成。
要打开并查看 PNG 图像中的 PDF 文档,只需将文件扩展名更改为 .pdf,在 Windows 下你应该可以使用大多数网络浏览器(如 Brave、Chrome 和 Firefox)查看该 PDF。Linux 也是如此,包括大多数 Linux PDF 查看器。
要播放音频文件,请将扩展名更改为 .mp3,并在 Windows 下使用 VLC 媒体播放器或 Windows 旧版媒体播放器打开该文件。在 Linux 下,使用 VLC 媒体播放器。
要运行 Java 程序,请将扩展名更改为 .jar。在 Windows 和 Linux 的桌面上,你应该只需双击图标即可运行它。它应该会在你的桌面上打开并显示计算器应用程序。
要在 Windows 下访问 ZIP 压缩包,请扩展名更改为 .zip 并使用 Windows 资源管理器打开它。你也可以从 Windows 终端使用 Expand-Archive 命令。在 Linux 下使用 CLI 工具 ***unzip***。
要在 Windows 下访问 RAR 压缩包,请将扩展名更改为 .rar 并使用 WinRAR 应用程序。在 Linux 下使用 ***unrar*** CLI 工具(例如 $ unrar e image_file.rar)。
要查看嵌入的网页,只需将文件扩展名更改为 .htm,即可使用任何浏览器打开并查看它。
要在 Windows 上运行嵌入的 PowerShell 脚本,请将文件扩展名更改为 .ps1,并从终端运行以下命令:
```
PS C:\Users\Nick\Desktop> powershell -ExecutionPolicy Bypass -File .\image_file.ps1
```
要在 Linux 上运行 PowerShell 脚本,首先确保你已安装 PowerShell,因为它默认未安装。
同样,将文件扩展名更改为 .ps1。从 Linux 终端运行以下命令:
```
$ pwsh ./image_file.ps1
```
PowerShell 脚本将提取并播放嵌入在图像中的 MP4 视频文件。
视频致谢:PowerShell 示例中使用的视频文件是 [***@doopiidoop***](https://x.com/doopiidoop) 的作品
## 第三方库
本项目包含以下第三方库:
- **LodePNG**,作者 Lode Vandevenne
- 许可证:zlib/libpng(见 [***LICENSE***](https://github.com/lvandeve/lodepng/blob/master/LICENSE) 文件)
- 版权所有 (c) 2005-2024 Lode Vandevenne
##
标签:DNS 反向解析, Rust, 可视化界面, 多媒体工具, 多格式文件, 文件处理, 网络流量审计, 通知系统, 隐写术